def windows(result_fun, prefix_complete=False, homogenous=False, current_desk=False): global currentPrompt desks = range(0, ewmh.get_number_of_desktops().reply()) names = ewmh.get_desktop_names().reply() content = {} for d in desks: if current_desk and state.desktop != d: continue name = d if d < len(names): name = names[d] content[name] = [] clients = ewmh.get_client_list_stacking().reply() for c in reversed(clients): nm = ewmh.get_wm_desktop(c).reply() if nm < len(names): nm = names[nm] if nm in content: wm_name = ewmh.get_wm_name(c).reply() if not wm_name: wm_name = icccm.get_wm_name(c).reply() if not wm_name or not isinstance(wm_name, basestring): wm_name = 'N/A' content[nm].append((wm_name, c)) currentPrompt = Prompt(content, result_fun, prefix_complete, homogenous)
def get_desk(i_or_name): if isinstance(i_or_name, int): return i_or_name assert isinstance(i_or_name, basestring) nextdesk = None names = ewmh.get_desktop_names().reply() ci = ewmh.get_current_desktop().reply() visibles = ewmh.get_visible_desktops().reply() cname = names[ci] if ci < len(names) else '' fnames = names[:] if visibles: not_cur_or_vis = lambda (i, nm): i not in visibles or i == ci fnames = [nm for i, nm in filter(not_cur_or_vis, enumerate(fnames))] fnames = filter(lambda n: n.lower().startswith(i_or_name.lower()), fnames) fnames = sorted(fnames) if cname in fnames: posInPrefix = (fnames.index(cname) + 1) % len(fnames) nextdesk = names.index(fnames[posInPrefix]) elif len(fnames): nextdesk = names.index(fnames[0]) return nextdesk
def fun(name): names = ewmh.get_desktop_names().reply() if name not in names: names.append(name) ewmh.set_desktop_names_checked(names).check() num_desks = ewmh.get_number_of_desktops().reply() ewmh.request_number_of_desktops_checked(num_desks + 1).check() ewmh.request_wm_desktop_checked(activewin, names.index(name), 2).check()
def set_or_add_desktop(name): names = ewmh.get_desktop_names().reply() if name not in names: names.append(name) ewmh.set_desktop_names_checked(names).check() num_desks = ewmh.get_number_of_desktops().reply() ewmh.request_number_of_desktops_checked(num_desks + 1).check() ewmh.request_current_desktop_checked(names.index(name)).check()
def desktops(result_fun, prefix_complete=True, homogenous=True): global currentPrompt desks = range(0, ewmh.get_number_of_desktops().reply()) names = ewmh.get_desktop_names().reply() lst = [] for d in desks: nm = names[d] if d < len(names) else d lst.append((nm, nm)) currentPrompt = Prompt({ None: sorted(lst) }, result_fun, prefix_complete, homogenous)
def cb_prop_change(widget, e): global activewin, desk_names, desk_num, desktop, stacking, visibles if e.atom == '_NET_DESKTOP_GEOMETRY': root_geom = ewmh.get_desktop_geometry().reply() update_monitor_area() elif e.atom == '_NET_ACTIVE_WINDOW': activewin = ewmh.get_active_window().reply() elif e.atom == '_NET_CURRENT_DESKTOP': desktop = ewmh.get_current_desktop().reply() elif e.atom == '_NET_CLIENT_LIST_STACKING': stacking = ewmh.get_client_list_stacking().reply() elif e.atom == '_NET_VISIBLE_DESKTOPS': visibles = ewmh.get_visible_desktops().reply() elif e.atom in ('_NET_DESKTOP_NAMES', '_NET_NUMBER_OF_DESKTOPS'): desk_num = ewmh.get_number_of_desktops().reply() desk_names = ewmh.get_desktop_names().reply() # This works around what I think is weird behavior in Openbox. # Sometimes Openbox will "fix" the desktop names... please don't! if len(desk_names) > desk_num: names = desk_names[0:desk_num] ewmh.set_desktop_names_checked(names).check() desk_names = ewmh.get_desktop_names().reply()
def cli(): ARGS = sys.argv[1:] bus = SessionBus() rofi_bus = bus.get('pro.wizardsoftheweb.pyrofibus') if ARGS and ARGS[0]: rofi_bus.ActivateWindow(int(ARGS[0].split(' ')[-1])) exit(0) window_ids = rofi_bus.GetWindowList() desktops = get_desktop_names().reply() items = [] max_desktop = 0 max_class = 0 max_name = 0 for window_id in window_ids: new_item = [ desktops[get_wm_desktop(window_id).reply()], get_property( window_id, 'WM_CLASS').reply().value.to_string().split('\x00')[1], get_wm_name(window_id).reply().encode('utf-8'), window_id, ] max_desktop = len( new_item[0]) if len(new_item[0]) > max_desktop else max_desktop max_class = len( new_item[1]) if len(new_item[1]) > max_class else max_class max_name = len( new_item[2]) if len(new_item[2]) > max_name else max_name items.append(new_item) items.append(items.pop(0)) for item in items: print("{:{max_desktop}} {:{max_class}} {:{max_name}} {}".format( *item, max_desktop=max_desktop + 2, max_class=max_class + 2, max_name=max_name))
def remove_empty_current_desktop(): # This isn't as straight-forward as decrementing _NET_NUMBER_OF_DESKTOPS. # We need to make sure we remove the right name, too. # AND only do it if there are no clients on this desktop. clients = ewmh.get_client_list().reply() cur = ewmh.get_current_desktop().reply() for c in clients: if ewmh.get_wm_desktop(c).reply() == cur: return names = ewmh.get_desktop_names().reply() if cur < len(names): names.pop(cur) ewmh.set_desktop_names_checked(names).check() # Subtract one from every client's desktop above the current one for c in clients: cdesk = ewmh.get_wm_desktop(c).reply() if cdesk > cur and cdesk != 0xffffffff: ewmh.set_wm_desktop_checked(c, cdesk - 1).check() ndesks = ewmh.get_number_of_desktops().reply() ewmh.request_number_of_desktops_checked(ndesks - 1).check()
def getDesktopNames(): return ewmh.get_desktop_names().reply()
import xpybutil.util as util import xpybutil.xinerama as xinerama c.core.ChangeWindowAttributes(root, xcb.xproto.CW.EventMask, [xcb.xproto.EventMask.PropertyChange]) c.flush() sleep = False visibles = None while visibles is None: if sleep: time.sleep(1) currentdesk = ewmh.get_current_desktop().reply() visibles = ewmh.get_visible_desktops().reply() names = ewmh.get_desktop_names().reply() deskcnt = ewmh.get_number_of_desktops().reply() sleep = True def do_output(visibles, currentdesk, names, deskcnt): out_visible = [] out_hidden = [] for visible in visibles: if visible == currentdesk: out_visible.append(markup['current'] % names[visible]) else: out_visible.append(markup['visible'] % names[visible]) clients = ewmh.get_client_list().reply() nonemptydesks = set()
from xpybutil.util import get_property from py_rofi_bus.components import Script # https://github.com/DaveDavenport/rofi/blob/next/doc/rofi.1.markdown#window-switcher-settings WINDOW_FORMAT_PATTERN = re_compile( r'(?:/\*)?\s*window-format\s*:\s*(?P<window_format>[\s\S]*?)?\s*;\s*(?:\*/)?', ) # man rofi | awk '/-window-format format/{ on = 1; } \ # /-window-command cmd/{ on = 0; exit; } \ # on { print $0; }' DEFAULT_WINDOW_FORMAT = '{w} {c} {t}' DESKTOP_NAMES = get_desktop_names().reply() class OrderedWindowScript(Script): MAP_FORMAT_TO_CALLBACK = { 'w': 'get_rofi_desktop_name', 't': 'get_rofi_window_title', 'n': 'get_rofi_window_name', 'r': 'get_rofi_window_role', 'c': 'get_rofi_window_class', } def __init__(self, *args, **kwargs): self.bus = SessionBus() self.remote = self.bus.get(
# Is this a horizontal or vertical pager? if config.width > config.height: orient = 'H' elif config.width < config.height: orient = 'V' else: # weirdo, could go either way orient = 'V' # Grab keybindings for key_string, fun in keybinds.iteritems(): if not keybinder.bind(key_string, fun): print >> sys.stderr, 'could not bind %s' % key_string # Start loading information desk_num = ewmh.get_number_of_desktops().reply() desk_names = ewmh.get_desktop_names().reply() root_geom = ewmh.get_desktop_geometry().reply() activewin = ewmh.get_active_window().reply() desktop = ewmh.get_current_desktop().reply() stacking = ewmh.get_client_list_stacking().reply() visibles = ewmh.get_visible_desktops().reply() clients = {} monitors = [] xtophys = [] def get_desk_name(i): if i < len(desk_names): return desk_names[i]
import sys from xpybutil import conn, root import xpybutil.ewmh as ewmh if len(sys.argv) == 2 and sys.argv[1] == '--help': print("Usage: ") print(" set_desktop_name NAME_OF_NEW_DESKTOP - sets current desktop name") print(" set_desktop_name NR NAME_OF_NEW_DESKTOP - sets name of NRth desktop") if len(sys.argv) > 2: desktop_offset = int(sys.argv[1]) new_name = sys.argv[2] else: desktop_offset = ewmh.get_current_desktop().reply() new_name = sys.argv[1] current_names = ewmh.get_desktop_names().reply() current_names[desktop_offset] = new_name # Not sure why I have to do it twice - somehow # doesn't work if I only call it once c = ewmh.set_desktop_names(current_names) c = ewmh.set_desktop_names(current_names) ewmh.set_current_desktop(0)
#!/usr/bin/env python "Helper for setting current desktop's name" import sys import xpybutil.ewmh as ewmh if len(sys.argv) == 2 and sys.argv[1] == '--help': print(""" Usage:\n set_desktop_name NAME_OF_NEW_DESKTOP - sets current desktop name set_desktop_name NR NAME_OF_NEW_DESKTOP - sets name of NRth desktop """) if len(sys.argv) > 2: desktop_offset = int(sys.argv[1]) new_name = sys.argv[2] else: desktop_offset = ewmh.get_current_desktop().reply() new_name = sys.argv[1] current_names = ewmh.get_desktop_names().reply() current_names[desktop_offset] = new_name # Not sure why I have to do it twice - somehow # doesn't work if I only call it once c = ewmh.set_desktop_names(current_names) c = ewmh.set_desktop_names(current_names)