Example #1
0
 def resize_corral_window(self, x, y, w, h, border):
     #the client window may have been resized or moved (generally programmatically)
     #so we may need to update the corral_window to match
     cox, coy, cow, coh = self.corral_window.get_geometry()[:4]
     #size changes (and position if any):
     hints = self.get_property("size-hints")
     w, h = calc_constrained_size(w, h, hints)
     geomlog("resize_corral_window() new constrained size=%ix%i", w, h)
     if cow != w or coh != h:
         #at least resized, check for move:
         if (x, y) != (0, 0):
             geomlog("resize_corral_window() move and resize from %s to %s",
                     (cox, coy, cow, coh), (x, y, w, h))
             self.corral_window.move_resize(x, y, w, h)
             self.client_window.move(0, 0)
         else:
             #just resize:
             geomlog("resize_corral_window() resize from %s to %s",
                     (cow, coh), (w, h))
             self.corral_window.resize(w, h)
     #just position change:
     elif (x, y) != (0, 0):
         geomlog(
             "resize_corral_window() moving corral window from %s to %s",
             (cox, coy), (x, y))
         self.corral_window.move(x, y)
         self.client_window.move(0, 0)
Example #2
0
 def process_client_message_event(self, event):
     if event.message_type == "_NET_MOVERESIZE_WINDOW":
         #TODO: honour gravity, show source indication
         geom = self.corral_window.get_geometry()
         x, y, w, h, _ = geom
         if event.data[0] & 0x100:
             x = event.data[1]
         if event.data[0] & 0x200:
             y = event.data[2]
         if event.data[0] & 0x400:
             w = event.data[3]
         if event.data[0] & 0x800:
             h = event.data[4]
         self._internal_set_property("set-initial-position",
                                     (event.data[0] & 0x100)
                                     or (event.data[0] & 0x200))
         #honour hints:
         hints = self.get_property("size-hints")
         w, h = calc_constrained_size(w, h, hints)
         geomlog(
             "_NET_MOVERESIZE_WINDOW on %s (data=%s, current geometry=%s, new geometry=%s)",
             self, event.data, geom, (x, y, w, h))
         with xswallow:
             X11Window.configureAndNotify(self.xid, x, y, w, h)
         return True
     return BaseWindowModel.process_client_message_event(self, event)
Example #3
0
    def do_child_configure_request_event(self, event):
        geomlog("do_child_configure_request_event(%s) client=%#x, corral=%#x, value_mask=%s", event, self.xid, self.corral_window.xid, configure_bits(event.value_mask))
        if event.value_mask & CWStackMode:
            geomlog(" restack above=%s, detail=%s", event.above, event.detail)
        # Also potentially update our record of what the app has requested:
        ogeom = self.get_property("geometry")
        x, y, w, h = ogeom[:4]
        rx, ry = self.get_property("requested-position")
        if event.value_mask & CWX:
            x = event.x
            rx = x
        if event.value_mask & CWY:
            y = event.y
            ry = y
        self._updateprop("requested-position", (rx, ry))

        rw, rh = self.get_property("requested-size")
        if event.value_mask & CWWidth:
            w = event.width
            rw = w
        if event.value_mask & CWHeight:
            h = event.height
            rh = h
        self._updateprop("requested-size", (rw, rh))

        hints = self.get_property("size-hints")
        w, h = calc_constrained_size(w, h, hints)
        #update the geometry now, as another request may come in
        #before we've had a chance to process the ConfigureNotify that the code below will generate
        self._updateprop("geometry", (x, y, w, h))
        geomlog("do_child_configure_request_event updated requested geometry from %s to  %s", ogeom, (x, y, w, h))
        # As per ICCCM 4.1.5, even if we ignore the request
        # send back a synthetic ConfigureNotify telling the client that nothing has happened.
        with xswallow:
            X11Window.configureAndNotify(self.xid, x, y, w, h)
Example #4
0
 def resize_corral_window(self, x, y, w, h, border):
     #the client window may have been resized or moved (generally programmatically)
     #so we may need to update the corral_window to match
     cox, coy, cow, coh = self.corral_window.get_geometry()[:4]
     #size changes (and position if any):
     hints = self.get_property("size-hints")
     w, h = calc_constrained_size(w, h, hints)
     geomlog("resize_corral_window() new constrained size=%ix%i", w, h)
     cx, cy, cw, ch = self.get_property("geometry")
     if cow!=w or coh!=h:
         #at least resized, check for move:
         if (x, y) != (0, 0):
             self._internal_set_property("set-initial-position", True)
             geomlog("resize_corral_window() move and resize from %s to %s", (cox, coy, cow, coh), (x, y, w, h))
             self.corral_window.move_resize(x, y, w, h)
             self.client_window.move(0, 0)
             self._updateprop("geometry", (x, y, w, h))
         else:
             #just resize:
             geomlog("resize_corral_window() resize from %s to %s", (cow, coh), (w, h))
             self.corral_window.resize(w, h)
             self._updateprop("geometry", (cx, cy, w, h))
     #just position change:
     elif (x, y) != (0, 0):
         self._internal_set_property("set-initial-position", True)
         geomlog("resize_corral_window() moving corral window from %s to %s", (cox, coy), (x, y))
         self.corral_window.move(x, y)
         self.client_window.move(0, 0)
         self._updateprop("geometry", (x, y, cw, ch))
Example #5
0
    def setup(self):
        super(WindowModel, self).setup()

        x, y, w, h, _ = self.client_window.get_geometry()
        # We enable PROPERTY_CHANGE_MASK so that we can call
        # x11_get_server_time on this window.
        self.corral_window = gtk.gdk.Window(
            self.parking_window,
            x=x,
            y=y,
            width=w,
            height=h,
            window_type=gtk.gdk.WINDOW_CHILD,
            wclass=gtk.gdk.INPUT_OUTPUT,
            event_mask=gtk.gdk.PROPERTY_CHANGE_MASK,
            title="CorralWindow-%#x" % self.xid)
        log("setup() corral_window=%#x", self.corral_window.xid)
        prop_set(self.corral_window, "_NET_WM_NAME", "utf8",
                 u"Xpra-CorralWindow-%#x" % self.xid)
        X11Window.substructureRedirect(self.corral_window.xid)
        add_event_receiver(self.corral_window, self)

        # The child might already be mapped, in case we inherited it from
        # a previous window manager.  If so, we unmap it now, and save the
        # serial number of the request -- this way, when we get an
        # UnmapNotify later, we'll know that it's just from us unmapping
        # the window, not from the client withdrawing the window.
        if X11Window.is_mapped(self.xid):
            log("hiding inherited window")
            self.last_unmap_serial = X11Window.Unmap(self.xid)

        log("setup() adding to save set")
        X11Window.XAddToSaveSet(self.xid)
        self.in_save_set = True

        log("setup() reparenting")
        X11Window.Reparent(self.xid, self.corral_window.xid, 0, 0)
        self.client_reparented = True

        log("setup() geometry")
        w, h = X11Window.geometry_with_border(self.xid)[2:4]
        hints = self.get_property("size-hints")
        log("setup() hints=%s size=%ix%i", hints, w, h)
        nw, nh = calc_constrained_size(w, h, hints)
        if nw >= MAX_WINDOW_SIZE or nh >= MAX_WINDOW_SIZE:
            #we can't handle windows that big!
            raise Unmanageable(
                "window constrained size is too large: %sx%s (from client geometry: %s,%s with size hints=%s)"
                % (nw, nh, w, h, hints))
        self._updateprop("geometry", (x, y, nw, nh))
        log("setup() resizing windows to %sx%s", nw, nh)
        self.corral_window.resize(nw, nh)
        self.client_window.resize(nw, nh)
        self.client_window.show_unraised()
        #this is here to trigger X11 errors if any are pending
        #or if the window is deleted already:
        self.client_window.get_geometry()
Example #6
0
 def _do_update_client_geometry(self, window_size_cb, window_position_cb):
     allocated_w, allocated_h = window_size_cb()
     geomlog("_do_update_client_geometry: allocated %ix%i", allocated_w, allocated_h)
     hints = self.get_property("size-hints")
     w, h = calc_constrained_size(allocated_w, allocated_h, hints)
     geomlog("_do_update_client_geometry: size(%s)=%ix%i", hints, w, h)
     x, y = window_position_cb(w, h)
     geomlog("_do_update_client_geometry: position=%ix%i", x, y)
     self.corral_window.move_resize(x, y, w, h)
     self._updateprop("geometry", (x, y, w, h))
     with xswallow:
         X11Window.configureAndNotify(self.xid, 0, 0, w, h)
Example #7
0
 def _do_update_client_geometry(self, window_size_cb, window_position_cb):
     allocated_w, allocated_h = window_size_cb()
     geomlog("_do_update_client_geometry: allocated %ix%i", allocated_w, allocated_h)
     hints = self.get_property("size-hints")
     w, h = calc_constrained_size(allocated_w, allocated_h, hints)
     geomlog("_do_update_client_geometry: size(%s)=%ix%i", hints, w, h)
     x, y = window_position_cb(w, h)
     geomlog("_do_update_client_geometry: position=%ix%i", x, y)
     self.corral_window.move_resize(x, y, w, h)
     self._updateprop("geometry", (x, y, w, h))
     with xswallow:
         X11Window.configureAndNotify(self.xid, 0, 0, w, h)
Example #8
0
    def setup(self):
        super(WindowModel, self).setup()

        x, y, w, h, _ = self.client_window.get_geometry()
        # We enable PROPERTY_CHANGE_MASK so that we can call
        # x11_get_server_time on this window.
        self.corral_window = gtk.gdk.Window(self.parking_window,
                                            x = x, y = y, width =w, height= h,
                                            window_type=gtk.gdk.WINDOW_CHILD,
                                            wclass=gtk.gdk.INPUT_OUTPUT,
                                            event_mask=gtk.gdk.PROPERTY_CHANGE_MASK,
                                            title = "CorralWindow-%#x" % self.xid)
        log("setup() corral_window=%#x", self.corral_window.xid)
        prop_set(self.corral_window, "_NET_WM_NAME", "utf8", u"Xpra-CorralWindow-%#x" % self.xid)
        X11Window.substructureRedirect(self.corral_window.xid)
        add_event_receiver(self.corral_window, self)

        # The child might already be mapped, in case we inherited it from
        # a previous window manager.  If so, we unmap it now, and save the
        # serial number of the request -- this way, when we get an
        # UnmapNotify later, we'll know that it's just from us unmapping
        # the window, not from the client withdrawing the window.
        if X11Window.is_mapped(self.xid):
            log("hiding inherited window")
            self.last_unmap_serial = X11Window.Unmap(self.xid)

        log("setup() adding to save set")
        X11Window.XAddToSaveSet(self.xid)
        self.in_save_set = True

        log("setup() reparenting")
        X11Window.Reparent(self.xid, self.corral_window.xid, 0, 0)
        self.client_reparented = True

        log("setup() geometry")
        w, h = X11Window.geometry_with_border(self.xid)[2:4]
        hints = self.get_property("size-hints")
        log("setup() hints=%s size=%ix%i", hints, w, h)
        nw, nh = calc_constrained_size(w, h, hints)
        if nw>=MAX_WINDOW_SIZE or nh>=MAX_WINDOW_SIZE:
            #we can't handle windows that big!
            raise Unmanageable("window constrained size is too large: %sx%s (from client geometry: %s,%s with size hints=%s)" % (nw, nh, w, h, hints))
        self._updateprop("geometry", (x, y, nw, nh))
        log("setup() resizing windows to %sx%s", nw, nh)
        self.corral_window.resize(nw, nh)
        self.client_window.resize(nw, nh)
        self.client_window.show_unraised()
        #this is here to trigger X11 errors if any are pending
        #or if the window is deleted already:
        self.client_window.get_geometry()
Example #9
0
    def do_child_configure_request_event(self, event):
        hints = self.get_property("size-hints")
        geomlog(
            "do_child_configure_request_event(%s) client=%#x, corral=%#x, value_mask=%s, size-hints=%s",
            event, self.xid, self.corral_window.xid,
            configure_bits(event.value_mask), hints)
        if event.value_mask & CWStackMode:
            geomlog(" restack above=%s, detail=%s", event.above, event.detail)
        # Also potentially update our record of what the app has requested:
        ogeom = self.get_property("geometry")
        x, y, w, h = ogeom[:4]
        rx, ry = self.get_property("requested-position")
        if event.value_mask & CWX:
            x = event.x
            rx = x
        if event.value_mask & CWY:
            y = event.y
            ry = y
        if event.value_mask & CWX or event.value_mask & CWY:
            self._internal_set_property("set-initial-position", True)
            self._updateprop("requested-position", (rx, ry))

        rw, rh = self.get_property("requested-size")
        if event.value_mask & CWWidth:
            w = event.width
            rw = w
        if event.value_mask & CWHeight:
            h = event.height
            rh = h
        if event.value_mask & CWWidth or event.value_mask & CWHeight:
            self._updateprop("requested-size", (rw, rh))

        if VALIDATE_CONFIGURE_REQUEST:
            w, h = calc_constrained_size(w, h, hints)
        #update the geometry now, as another request may come in
        #before we've had a chance to process the ConfigureNotify that the code below will generate
        self._updateprop("geometry", (x, y, w, h))
        geomlog(
            "do_child_configure_request_event updated requested geometry from %s to  %s",
            ogeom, (x, y, w, h))
        # As per ICCCM 4.1.5, even if we ignore the request
        # send back a synthetic ConfigureNotify telling the client that nothing has happened.
        with xswallow:
            X11Window.configureAndNotify(self.xid, x, y, w, h)
Example #10
0
 def process_client_message_event(self, event):
     if event.message_type=="_NET_MOVERESIZE_WINDOW":
         #TODO: honour gravity, show source indication
         geom = self.corral_window.get_geometry()
         x, y, w, h, _ = geom
         if event.data[0] & 0x100:
             x = event.data[1]
         if event.data[0] & 0x200:
             y = event.data[2]
         if event.data[0] & 0x400:
             w = event.data[3]
         if event.data[0] & 0x800:
             h = event.data[4]
         #honour hints:
         hints = self.get_property("size-hints")
         w, h = calc_constrained_size(w, h, hints)
         geomlog("_NET_MOVERESIZE_WINDOW on %s (data=%s, current geometry=%s, new geometry=%s)", self, event.data, geom, (x,y,w,h))
         with xswallow:
             X11Window.configureAndNotify(self.xid, x, y, w, h)
         return True
     return BaseWindowModel.process_client_message_event(self, event)