text: #!/usr/bin/env python3
  
  import subprocess
  import sys
  from collections import Counter, OrderedDict
  
  
  # update GUIs
  GUI = True
  
  # update processes
  PROCESS = True
  
  
  # program/process names and corresponding gylphs
  guis = OrderedDict({
      'terminals': '#',
      'chromes': '#',
      'firefox': '#',
      'skypeforlinux': '#',
      'filemanager': '#',
      'remote-desktop': '#',
      'pdfviewer': '#',
      'image': '#',
  })
  
  processes = OrderedDict({
      'vims': '#',
      'ssh': '#',
      'updater': '#',
  })
  
  # combine counts of program/process names in the tuple
  # the resulting glpyh used will be that of the corresponding key
  combine_guis = {
      'terminals': ('termite', 'terminator', 'urxvt'),
      'chromes': ('chromium', 'chrome'),
      'filemanger': ('nemo', 'thunar', 'dolphin', 'nautilus', 'pcmanfm'),
      'remote-desktop': ('TeamViewer', ),
      'pdfviewer': ('evince', 'okular', 'zathura'),
      'image': ('gthumb', 'shotwell', 'deepin-image-vi'),
  }
  
  combine_proccesses = {
      'vims': ('nvim', 'vim'),
      'updater': ('pacman', 'yay', 'trizen', 'yaourt'),
  }
  
  
  gui_output = ''
  process_output = ''
  
  if GUI:
  
      def get_running_guis():
          try:
              listed = sys.argv[1]
          except IndexError:
              listed = []
  
          get = lambda cmd: subprocess.check_output(cmd).decode("utf-8").strip()
  
          def check_wtype(w_id):
              # check the type of window, only list "NORMAL" windows
              return "_NET_WM_WINDOW_TYPE_NORMAL" in get(["xprop", "-id", w_id])
  
          def get_process(w_id):
              # get the name of the process, owning the window
              proc = get(["ps", "-p", w_id, "-o", "comm="])
              return proc
  
          wlist = [l.split() for l in subprocess.check_output(["wmctrl", "-lp"])\
                   .decode("utf-8").splitlines()]
          validprocs = [
              get_process(w[2]) for w in wlist if check_wtype(w[0]) == True
          ]
  
          return validprocs
  
      # get list of running GUI programs
      gui_counts = Counter(get_running_guis())
  
      # combine programs in program combine list
      for k, lst in combine_guis.items():
          count = 0
          for i in lst:
              try:
                  count += gui_counts.pop(i)
              except KeyError:
                  pass
          if count:
              gui_counts[k] += count
  
      # generate program output
      for k, v in guis.items():
          try:
              c = gui_counts[k]
              if c:
                  gui_output += '%s %i ' % (v, c)
          except:
              pass
  
  if PROCESS:
  
      def get_running_proc(process_name_list):
          counts = [None] * len(process_name_list)
  
          for i, p in enumerate(process_name_list):
              try:
                  count = int(
                      subprocess.check_output(['pgrep', '-c', '-x',
                                               p]).decode('utf-8'))
              except subprocess.CalledProcessError:
                  count = 0
              counts[i] = (p, count)
  
          return dict(counts)
  
      # count running proccesses
      process_counts = get_running_proc(processes.keys())
      combine_counts = get_running_proc(
          list(sum(combine_proccesses.values(), ())))
      process_counts.update(combine_counts)
  
      # combine processes in process combine list
      for k, lst in combine_proccesses.items():
          count = 0
          for i in lst:
              try:
                  count += process_counts.pop(i)
              except KeyError:
                  pass
          if count:
              process_counts[k] += count
  
      # generate process output
      for k, v in processes.items():
          try:
              c = process_counts[k]
              if c:
                  process_output += '%s %i ' % (v, c)
          except:
              pass
  
  print(gui_output + process_output)
  