Ejemplo n.º 1
0
 def set_workspace(self):
     if not CAN_SET_WORKSPACE or self._been_mapped:
         return -1
     workspace = self._client_properties.get("workspace", -1)
     log("set_workspace() workspace=%s", workspace)
     if workspace < 0 or workspace == self.get_current_workspace():
         return -1
     try:
         from wimpiggy.lowlevel import sendClientMessage, const  #@UnresolvedImport
         from wimpiggy.error import trap
         root = gdk_window(self).get_screen().get_root_window()
         ndesktops = xget_u32_property(root, "_NET_NUMBER_OF_DESKTOPS")
         log("set_workspace() ndesktops=%s", ndesktops)
         if ndesktops is None or ndesktops <= 1:
             return -1
         workspace = max(0, min(ndesktops - 1, workspace))
         event_mask = const["SubstructureNotifyMask"] | const[
             "SubstructureRedirectMask"]
         trap.call_synced(sendClientMessage, root, gdk_window(self), False,
                          event_mask, "_NET_WM_DESKTOP", workspace,
                          const["CurrentTime"], 0, 0, 0)
         return workspace
     except Exception, e:
         log.error("failed to set workspace: %s", e)
         return -1
Ejemplo n.º 2
0
    def set_workspace(self):
        if not CAN_SET_WORKSPACE or self._been_mapped:
            return -1
        workspace = self._client_properties.get("workspace", -1)
        log("set_workspace() workspace=%s", workspace)
        if workspace < 0 or workspace == self.get_current_workspace():
            return -1
        try:
            from wimpiggy.lowlevel import sendClientMessage, const  # @UnresolvedImport
            from wimpiggy.error import trap

            root = gdk_window(self).get_screen().get_root_window()
            ndesktops = xget_u32_property(root, "_NET_NUMBER_OF_DESKTOPS")
            log("set_workspace() ndesktops=%s", ndesktops)
            if ndesktops is None or ndesktops <= 1:
                return -1
            workspace = max(0, min(ndesktops - 1, workspace))
            event_mask = const["SubstructureNotifyMask"] | const["SubstructureRedirectMask"]
            trap.call_synced(
                sendClientMessage,
                root,
                gdk_window(self),
                False,
                event_mask,
                "_NET_WM_DESKTOP",
                workspace,
                const["CurrentTime"],
                0,
                0,
                0,
            )
            return workspace
        except Exception, e:
            log.error("failed to set workspace: %s", e)
            return -1
Ejemplo n.º 3
0
 def do_wimpiggy_client_message_event(self, event):
     if event.message_type == "_NET_SYSTEM_TRAY_OPCODE" and event.window == self.tray_window and event.format == 32:
         opcode = event.data[1]
         SYSTEM_TRAY_REQUEST_DOCK = 0
         SYSTEM_TRAY_BEGIN_MESSAGE = 1
         SYSTEM_TRAY_CANCEL_MESSAGE = 2
         if opcode == SYSTEM_TRAY_REQUEST_DOCK:
             xid = event.data[2]
             trap.call_synced(self.dock_tray, xid)
         elif opcode == SYSTEM_TRAY_BEGIN_MESSAGE:
             timeout = event.data[2]
             mlen = event.data[3]
             mid = event.data[4]
             log.info(
                 "tray begin message timeout=%s, mlen=%s, mid=%s - not handled yet!",
                 timeout, mlen, mid)
         elif opcode == SYSTEM_TRAY_CANCEL_MESSAGE:
             mid = event.data[2]
             log.info("tray cancel message for mid=%s - not handled yet!",
                      mid)
     elif event.message_type == "_NET_SYSTEM_TRAY_MESSAGE_DATA":
         assert event.format == 8
         log.info("tray message data - not handled yet!")
     else:
         log.info("do_wimpiggy_client_message_event(%s)", event)
Ejemplo n.º 4
0
def prop_get(target, key, type, ignore_errors=False):
    if isinstance(type, list):
        scalar_type = type[0]
    else:
        scalar_type = type
    (pytype, atom, format, serialize, deserialize,
     terminator) = _prop_types[scalar_type]
    try:
        #print(atom)
        data = trap.call_synced(XGetWindowProperty, target, key, atom)
        #print(atom, repr(data[:100]))
    except NoSuchProperty:
        log.debug("Missing property %s (%s)", key, type)
        return None
    except (XError, PropertyError):
        if not ignore_errors:
            log.info(
                "Missing window or missing property or wrong property type %s (%s)",
                key, type)
            import traceback
            traceback.print_stack()
        return None
    try:
        return _prop_decode(target, type, data)
    except:
        log.warn(
            "Error parsing property %s (type %s); this may be a\n" +
            "  misbehaving application, or bug in Wimpiggy\n" +
            "  Data: %r[...?]", key, type, data[:100])
        raise
Ejemplo n.º 5
0
def prop_get(target, key, etype, ignore_errors=False, raise_xerrors=False):
    if isinstance(etype, list):
        scalar_type = etype[0]
    else:
        scalar_type = etype
    (_, atom, _, _, _, _) = _prop_types[scalar_type]
    try:
        data = trap.call_synced(XGetWindowProperty, target, key, atom)
    except NoSuchProperty:
        log.debug("Missing property %s (%s)", key, etype)
        return None
    except XError:
        if raise_xerrors:
            raise
        log.info("Missing window %s or wrong property type %s (%s)", target, key, etype)
        traceback.print_exc()
        return None
    except PropertyError:
        if not ignore_errors:
            log.info("Missing property or wrong property type %s (%s)", key, etype)
            traceback.print_exc()
        return None
    try:
        return _prop_decode(target, etype, data)
    except:
        if not ignore_errors:
            log.warn("Error parsing property %s (type %s); this may be a"
                     + " misbehaving application, or bug in Wimpiggy\n"
                     + "  Data: %r[...?]",
                     key, etype, data[:160])
            traceback.print_exc()
        raise
Ejemplo n.º 6
0
def prop_get(target, key, etype, ignore_errors=False, raise_xerrors=False):
    if isinstance(etype, list):
        scalar_type = etype[0]
    else:
        scalar_type = etype
    (_, atom, _, _, _, _) = _prop_types[scalar_type]
    try:
        data = trap.call_synced(XGetWindowProperty, target, key, atom)
    except NoSuchProperty:
        log.debug("Missing property %s (%s)", key, etype)
        return None
    except XError:
        if raise_xerrors:
            raise
        log.info("Missing window %s or wrong property type %s (%s)", target,
                 key, etype)
        traceback.print_exc()
        return None
    except PropertyError:
        if not ignore_errors:
            log.info("Missing property or wrong property type %s (%s)", key,
                     etype)
            traceback.print_exc()
        return None
    try:
        return _prop_decode(target, etype, data)
    except:
        if not ignore_errors:
            log.warn(
                "Error parsing property %s (type %s); this may be a" +
                " misbehaving application, or bug in Wimpiggy\n" +
                "  Data: %r[...?]", key, etype, data[:160])
            traceback.print_exc()
        raise
Ejemplo n.º 7
0
def prop_get(target, key, type, ignore_errors=False):
    if isinstance(type, list):
        scalar_type = type[0]
    else:
        scalar_type = type
    (pytype, atom, format, serialize, deserialize, terminator) = _prop_types[scalar_type]
    try:
        #print(atom)
        data = trap.call_synced(XGetWindowProperty, target, key, atom)
        #print(atom, repr(data[:100]))
    except NoSuchProperty:
        log.debug("Missing property %s (%s)", key, type)
        return None
    except (XError, PropertyError):
        if not ignore_errors:
            log.info("Missing window or missing property or wrong property type %s (%s)", key, type)
            import traceback
            traceback.print_stack()
        return None
    try:
        return _prop_decode(target, type, data)
    except:
        log.warn("Error parsing property %s (type %s); this may be a"
                 + " misbehaving application, or bug in Wimpiggy\n"
                 + "  Data: %r[...?]",
                 key, type, data[:160])
        raise
Ejemplo n.º 8
0
    def acquire(self, when):
        old_owner = self._owner()
        if when is self.IF_UNOWNED and old_owner != const["XNone"]:
            raise AlreadyOwned

        self.clipboard.set_with_data([("VERSION", 0, 0)],
                                     self._get,
                                     self._clear,
                                     None)

        # Having acquired the selection, we have to announce our existence
        # (ICCCM 2.8, still).  The details here probably don't matter too
        # much; I've never heard of an app that cares about these messages,
        # and metacity actually gets the format wrong in several ways (no
        # MANAGER or owner_window atoms).  But might as well get it as right
        # as possible.

        # To announce our existence, we need:
        #   -- the timestamp we arrived at
        #   -- the manager selection atom
        #   -- the window that registered the selection
        # Of course, because Gtk is doing so much magic for us, we have to do
        # some weird tricks to get at these.

        # Ask ourselves when we acquired the selection:
        ts_data = self.clipboard.wait_for_contents("TIMESTAMP").data
        ts_num = unpack("@i", ts_data[:4])[0]
        # Calculate the X atom for this selection:
        selection_xatom = get_xatom(self.atom)
        # Ask X what window we used:
        self._xwindow = myGetSelectionOwner(self.clipboard, self.atom)

        root = self.clipboard.get_display().get_default_screen().get_root_window()
        sendClientMessage(root, root, False, const["StructureNotifyMask"],
                          "MANAGER",
                          ts_num, selection_xatom, self._xwindow, 0, 0)

        if old_owner != const["XNone"] and when is self.FORCE:
            # Block in a recursive mainloop until the previous owner has
            # cleared out.
            def getwin():
                window = get_pywindow(self.clipboard, old_owner)
                window.set_events(window.get_events() | gtk.gdk.STRUCTURE_MASK)
                return window
            try:
                window = trap.call_synced(getwin)
                log("got window")
            except XError:
                log("Previous owner is already gone, not blocking")
            else:
                log("Waiting for previous owner to exit...")
                add_event_receiver(window, self)
                gtk.main()
                log("...they did.")
        window = get_pywindow(self.clipboard, self._xwindow)
        window.set_title("Xpra-ManagerSelection")
Ejemplo n.º 9
0
def apply_xmodmap(instructions):
    import gtk.gdk
    try:
        unset = trap.call_synced(set_xmodmap, gtk.gdk.get_default_root_window(), instructions)
    except:
        log.error("apply_xmodmap", exc_info=True)
        unset = instructions
    if unset is None:
        #None means an X11 error occurred, re-do all:
        unset = instructions
    return unset
Ejemplo n.º 10
0
def apply_xmodmap(instructions):
    import gtk.gdk
    try:
        unset = trap.call_synced(set_xmodmap, gtk.gdk.get_default_root_window(), instructions)
    except:
        log.error("apply_xmodmap", exc_info=True)
        unset = instructions
    if unset is None:
        #None means an X11 error occurred, re-do all:
        unset = instructions
    return unset
Ejemplo n.º 11
0
 def do_wimpiggy_client_message_event(self, event):
     if event.message_type=="_NET_SYSTEM_TRAY_OPCODE" and event.window==self.tray_window and event.format==32:
         opcode = event.data[1]
         SYSTEM_TRAY_REQUEST_DOCK = 0
         SYSTEM_TRAY_BEGIN_MESSAGE = 1
         SYSTEM_TRAY_CANCEL_MESSAGE = 2
         if opcode==SYSTEM_TRAY_REQUEST_DOCK:
             xid = event.data[2]
             trap.call_synced(self.dock_tray, xid)
         elif opcode==SYSTEM_TRAY_BEGIN_MESSAGE:
             timeout = event.data[2]
             mlen = event.data[3]
             mid = event.data[4]
             log.info("tray begin message timeout=%s, mlen=%s, mid=%s - not handled yet!", timeout, mlen, mid)
         elif opcode==SYSTEM_TRAY_CANCEL_MESSAGE:
             mid = event.data[2]
             log.info("tray cancel message for mid=%s - not handled yet!", mid)
     elif opcode=="_NET_SYSTEM_TRAY_MESSAGE_DATA":
         assert event.format==8
         log.info("tray message data - not handled yet!")
     else:
         log.info("do_wimpiggy_client_message_event(%s)", event)
Ejemplo n.º 12
0
        buf.append(data)

    buf = []
    pixbuf.save_to_callback(save_to_memory, "png", {}, buf)
    rowstride = w * 3
    return w, h, "png", rowstride, "".join(buf)


def has_compositor(display):
    try:
        from wimpiggy.lowlevel.bindings import const, myGetSelectionOwner  # @UnresolvedImport
        from wimpiggy.error import trap, XError  # @UnresolvedImport
    except Exception, e:
        raise Exception("failed to load bindings: %s" % e)
    try:
        owner = trap.call_synced(myGetSelectionOwner, display, "_NET_WM_CM_S0")
        log("compositor: %s", owner)
        return owner and owner != const["XNone"]
    except XError, e:
        raise Exception("error testing for compositing window manager: %s" % e)


class RootWindowModel(object):
    def __init__(self, root_window):
        self.window = root_window

    def is_managed(self):
        return True

    def is_tray(self):
        return False
Ejemplo n.º 13
0
 def make_screenshot_packet(self):
     return trap.call_synced(self.do_make_screenshot_packet)
Ejemplo n.º 14
0
def prop_set(target, key, etype, value):
    trap.call_synced(XChangeProperty, target, key,
                       _prop_encode(target, etype, value))
Ejemplo n.º 15
0
 def make_screenshot_packet(self):
     return trap.call_synced(self.do_make_screenshot_packet)
Ejemplo n.º 16
0
def prop_set(target, key, etype, value):
    trap.call_synced(XChangeProperty, target, key,
                     _prop_encode(target, etype, value))
Ejemplo n.º 17
0
 def _manage_client(self, gdkwindow):
     try:
         if gdkwindow not in self._windows:
             trap.call_synced(self.do_manage_client, gdkwindow)
     except Exception, e:
         log("failed to manage client %s: %s", gdkwindow, e)
Ejemplo n.º 18
0
 def _manage_client(self, gdkwindow):
     try:
         if gdkwindow not in self._windows:
             trap.call_synced(self.do_manage_client, gdkwindow)
     except Exception, e:
         log("failed to manage client %s: %s", gdkwindow, e)