focuslog("Giving focus to %#x", self.xid) # Have to fetch the time, not just use CurrentTime, both because ICCCM # says that WM_TAKE_FOCUS must use a real time and because there are # genuine race conditions here (e.g. suppose the client does not # actually get around to requesting the focus until after we have # already changed our mind and decided to give it to someone else). now = gdk.x11_get_server_time(self.corral_window) # ICCCM 4.1.7 *claims* to describe how we are supposed to give focus # to a window, but it is completely opaque. From reading the # metacity, kwin, gtk+, and qt code, it appears that the actual rules # for giving focus are: # -- the WM_HINTS input field determines whether the WM should call # XSetInputFocus # -- independently, the WM_TAKE_FOCUS protocol determines whether # the WM should send a WM_TAKE_FOCUS ClientMessage. # If both are set, both methods MUST be used together. For example, # GTK+ apps respect WM_TAKE_FOCUS alone but I'm not sure they handle # XSetInputFocus well, while Qt apps ignore (!!!) WM_TAKE_FOCUS # (unless they have a modal window), and just expect to get focus from # the WM's XSetInputFocus. if bool(self._input_field): focuslog("... using XSetInputFocus") X11Window.XSetInputFocus(self.xid, now) if "WM_TAKE_FOCUS" in self.get_property("protocols"): focuslog("... using WM_TAKE_FOCUS") send_wm_take_focus(self.client_window, now) self.set_active() gobject.type_register(WindowModel)
class SystemTrayWindowModel(CoreX11WindowModel): __gproperties__ = CoreX11WindowModel.__common_properties__.copy() __gproperties__.update({ "tray": (gobject.TYPE_BOOLEAN, "Is the window a system tray icon", "", False, gobject.PARAM_READABLE), }) __gsignals__ = CoreX11WindowModel.__common_signals__.copy() _property_names = CoreX11WindowModel._property_names + ["tray"] _MODELTYPE = "Tray" def __init__(self, client_window): super(SystemTrayWindowModel, self).__init__(client_window) self._updateprop("tray", True) def __repr__(self): return "SystemTrayWindowModel(%#x)" % self.xid def _read_initial_X11_properties(self): self._internal_set_property("has-alpha", True) super(SystemTrayWindowModel, self)._read_initial_X11_properties() def move_resize(self, x, y, width, height): #Used by clients to tell us where the tray is located on screen log("SystemTrayModel.move_resize(%s, %s, %s, %s)", x, y, width, height) self.client_window.move_resize(x, y, width, height) self._updateprop("geometry", (x, y, width, height)) gobject.type_register(SystemTrayWindowModel)
class SystemTrayWindowModel(CoreX11WindowModel): __gproperties__ = CoreX11WindowModel.__common_properties__.copy() __gproperties__.update({ "tray": (gobject.TYPE_BOOLEAN, "Is the window a system tray icon", "", False, gobject.PARAM_READABLE), }) __gsignals__ = CoreX11WindowModel.__common_signals__.copy() _property_names = CoreX11WindowModel._property_names + ["tray"] _MODELTYPE = "Tray" def __init__(self, client_window): super(SystemTrayWindowModel, self).__init__(client_window) self._updateprop("tray", True) def __repr__(self): return "SystemTrayWindowModel(%#x)" % self.xid def _read_initial_X11_properties(self): self._internal_set_property("has-alpha", True) super(SystemTrayWindowModel, self)._read_initial_X11_properties() def move_resize(self, x, y, width, height): #Used by clients to tell us where the tray is located on screen log("SystemTrayModel.move_resize(%s, %s, %s, %s)", x, y, width, height) self.client_window.move_resize(x, y, width, height) self._updateprop("geometry", (x, y, width, height)) gobject.type_register(SystemTrayWindowModel)
focuslog("Giving focus to %#x", self.xid) # Have to fetch the time, not just use CurrentTime, both because ICCCM # says that WM_TAKE_FOCUS must use a real time and because there are # genuine race conditions here (e.g. suppose the client does not # actually get around to requesting the focus until after we have # already changed our mind and decided to give it to someone else). now = gtk.gdk.x11_get_server_time(self.corral_window) # ICCCM 4.1.7 *claims* to describe how we are supposed to give focus # to a window, but it is completely opaque. From reading the # metacity, kwin, gtk+, and qt code, it appears that the actual rules # for giving focus are: # -- the WM_HINTS input field determines whether the WM should call # XSetInputFocus # -- independently, the WM_TAKE_FOCUS protocol determines whether # the WM should send a WM_TAKE_FOCUS ClientMessage. # If both are set, both methods MUST be used together. For example, # GTK+ apps respect WM_TAKE_FOCUS alone but I'm not sure they handle # XSetInputFocus well, while Qt apps ignore (!!!) WM_TAKE_FOCUS # (unless they have a modal window), and just expect to get focus from # the WM's XSetInputFocus. if bool(self._input_field): focuslog("... using XSetInputFocus") X11Window.XSetInputFocus(self.xid, now) if "WM_TAKE_FOCUS" in self.get_property("protocols"): focuslog("... using WM_TAKE_FOCUS") send_wm_take_focus(self.client_window, now) self.set_active() gobject.type_register(WindowModel)