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
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
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)
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
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
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
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
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")
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
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)
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
def make_screenshot_packet(self): return trap.call_synced(self.do_make_screenshot_packet)
def prop_set(target, key, etype, value): trap.call_synced(XChangeProperty, target, key, _prop_encode(target, etype, value))
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)