Example #1
0
    def __init__(self, icon_size):
        gobject.GObject.__init__(self)

        self.icon_size = icon_size

        self.conn = ooxcb.connect()
        self.screen = self.conn.setup.roots[self.conn.pref_screen]
        self.root = self.screen.root
        self.pywmctrl = Screen(self.conn, self.root)

        self.ignore_window_types = map(
            lambda name: self.conn.atoms['_NET_WM_WINDOW_TYPE_%s' % name].
            get_internal(), IGNORE_WINDOW_TYPES)

        self.windows_by_desktop = self.collect_windows()

        with self.conn.bunch():
            self.root.change_attributes(
                event_mask=xproto.EventMask.PropertyChange)
        self.root.push_handlers(on_property_notify=self.on_property_notify)

        self._setup_mainloop()
Example #2
0
    def __init__(self, icon_size):
        gobject.GObject.__init__(self)

        self.icon_size = icon_size

        self.conn = ooxcb.connect()
        self.screen = self.conn.setup.roots[self.conn.pref_screen]
        self.root = self.screen.root
        self.pywmctrl = Screen(self.conn, self.root)

        self.ignore_window_types = map(
                lambda name: self.conn.atoms['_NET_WM_WINDOW_TYPE_%s' % name].get_internal(),
                IGNORE_WINDOW_TYPES)

        self.windows_by_desktop = self.collect_windows()

        with self.conn.bunch():
            self.root.change_attributes(event_mask=xproto.EventMask.PropertyChange)
        self.root.push_handlers(on_property_notify=self.on_property_notify)

        self._setup_mainloop()
Example #3
0
class Windows(gobject.GObject):
    __gsignals__ = {
        'windows-changed': (gobject.SIGNAL_RUN_LAST, gobject.TYPE_PYOBJECT, ())
        }

    def __init__(self, icon_size):
        gobject.GObject.__init__(self)

        self.icon_size = icon_size

        self.conn = ooxcb.connect()
        self.screen = self.conn.setup.roots[self.conn.pref_screen]
        self.root = self.screen.root
        self.pywmctrl = Screen(self.conn, self.root)

        self.ignore_window_types = map(
                lambda name: self.conn.atoms['_NET_WM_WINDOW_TYPE_%s' % name].get_internal(),
                IGNORE_WINDOW_TYPES)

        self.windows_by_desktop = self.collect_windows()

        with self.conn.bunch():
            self.root.change_attributes(event_mask=xproto.EventMask.PropertyChange)
        self.root.push_handlers(on_property_notify=self.on_property_notify)

        self._setup_mainloop()


    def collect_windows(self):
        windows_by_desktop = {}
        for window in self.screen.ewmh_get_client_list():
            if not self.ignore_window(window):
                desktop = get_desktop(window)

                if desktop in windows_by_desktop:
                    windows_by_desktop[desktop].append(Window(window, self.icon_size))
                else:
                    windows_by_desktop[desktop] = [Window(window, self.icon_size)]
        return windows_by_desktop


    def on_property_notify(self, event):
        if event.atom == self.conn.atoms['_NET_CLIENT_LIST'] \
            and event.state == xproto.Property.NewValue:
                self.windows_by_desktop = self.collect_windows()
                self.emit('windows-changed')


    def ignore_window(self, window):
        state = window.get_property('_NET_WM_STATE', 'ATOM').reply().value
        if self.conn.atoms['_NET_WM_STATE_SKIP_TASKBAR'].get_internal() in state:
            return True
        type = window.get_property('_NET_WM_WINDOW_TYPE', 'ATOM').reply().value
        if any(t for t in type if t in self.ignore_window_types):
            return True
        return False

    def toggle_window(self, window):
        with self.conn.bunch():
            self.pywmctrl._send_clientmessage(
                window._window,
                '_NET_ACTIVE_WINDOW',
                32,
                [1, window._window.get_internal(), 0]
            )
            self.conn.flush()
        #self.pywmctrl._send_clientmessage(
            #window._window,
            #'_NET_WM_STATE',
            #32,
            #[2, 0, 0, 1]
        #)

    def _ooxcb_cb(self, source, cb_condition):
        while self.conn.alive:
            event = self.conn.poll_for_event()
            if event is not None:
                event.dispatch()
            return True

    def _setup_mainloop(self):
        gobject.io_add_watch(
                    self.conn.get_file_descriptor(),
                    gobject.IO_IN,
                    self._ooxcb_cb
        )

    @property
    def all(self):
        return self.windows_by_desktop


    @property
    def on_current_desktop(self):
        current_desktop = get_current_desktop(self.screen)
        return self.windows_by_desktop[current_desktop]
Example #4
0
class Windows(gobject.GObject):
    __gsignals__ = {
        'windows-changed': (gobject.SIGNAL_RUN_LAST, gobject.TYPE_PYOBJECT, ())
    }

    def __init__(self, icon_size):
        gobject.GObject.__init__(self)

        self.icon_size = icon_size

        self.conn = ooxcb.connect()
        self.screen = self.conn.setup.roots[self.conn.pref_screen]
        self.root = self.screen.root
        self.pywmctrl = Screen(self.conn, self.root)

        self.ignore_window_types = map(
            lambda name: self.conn.atoms['_NET_WM_WINDOW_TYPE_%s' % name].
            get_internal(), IGNORE_WINDOW_TYPES)

        self.windows_by_desktop = self.collect_windows()

        with self.conn.bunch():
            self.root.change_attributes(
                event_mask=xproto.EventMask.PropertyChange)
        self.root.push_handlers(on_property_notify=self.on_property_notify)

        self._setup_mainloop()

    def collect_windows(self):
        windows_by_desktop = {}
        for window in self.screen.ewmh_get_client_list():
            if not self.ignore_window(window):
                desktop = get_desktop(window)

                if desktop in windows_by_desktop:
                    windows_by_desktop[desktop].append(
                        Window(window, self.icon_size))
                else:
                    windows_by_desktop[desktop] = [
                        Window(window, self.icon_size)
                    ]
        return windows_by_desktop

    def on_property_notify(self, event):
        if event.atom == self.conn.atoms['_NET_CLIENT_LIST'] \
            and event.state == xproto.Property.NewValue:
            self.windows_by_desktop = self.collect_windows()
            self.emit('windows-changed')

    def ignore_window(self, window):
        state = window.get_property('_NET_WM_STATE', 'ATOM').reply().value
        if self.conn.atoms['_NET_WM_STATE_SKIP_TASKBAR'].get_internal(
        ) in state:
            return True
        type = window.get_property('_NET_WM_WINDOW_TYPE', 'ATOM').reply().value
        if any(t for t in type if t in self.ignore_window_types):
            return True
        return False

    def toggle_window(self, window):
        with self.conn.bunch():
            self.pywmctrl._send_clientmessage(
                window._window, '_NET_ACTIVE_WINDOW', 32,
                [1, window._window.get_internal(), 0])
            self.conn.flush()
        #self.pywmctrl._send_clientmessage(
        #window._window,
        #'_NET_WM_STATE',
        #32,
        #[2, 0, 0, 1]
        #)

    def _ooxcb_cb(self, source, cb_condition):
        while self.conn.alive:
            event = self.conn.poll_for_event()
            if event is not None:
                event.dispatch()
            return True

    def _setup_mainloop(self):
        gobject.io_add_watch(self.conn.get_file_descriptor(), gobject.IO_IN,
                             self._ooxcb_cb)

    @property
    def all(self):
        return self.windows_by_desktop

    @property
    def on_current_desktop(self):
        current_desktop = get_current_desktop(self.screen)
        return self.windows_by_desktop[current_desktop]