Example #1
0
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 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 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 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()
Example #8
0
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)
Example #9
0
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()
Example #10
0
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()
Example #11
0
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 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()
Example #14
0
def getDesktopNames():
    return ewmh.get_desktop_names().reply()
Example #15
0
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(
Example #18
0
# 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]
Example #19
0
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)
Example #20
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)