]> git.eshelyaron.com Git - emacs.git/commitdiff
Reduce some data dependencies between X calls
authorKen Raeburn <raeburn@raeburn.org>
Sat, 7 Nov 2015 08:06:32 +0000 (03:06 -0500)
committerKen Raeburn <raeburn@raeburn.org>
Thu, 12 Nov 2015 08:58:08 +0000 (03:58 -0500)
Gains nothing in the traditional-Xlib code, but more closely aligns
with how the XCB version will work.

* src/xfns.c (x_real_pos_and_offsets): When translating coordinates,
send coordinates (0,0) to the X server and add in the real coordinates
after getting the response.  Move XGetGeometry for outer window inside
error-trapping block.  Use DPY variable more, since it's available.

src/xfns.c

index db87fcc94fce9c6844dcbb740318036fbcaee731..c55e6fee168935aa870f519d5cd91ac8a9a3ab49 100644 (file)
@@ -194,6 +194,7 @@ x_real_pos_and_offsets (struct frame *f,
   unsigned char *tmp_data = NULL;
   Atom target_type = XA_CARDINAL;
   unsigned int ow IF_LINT (= 0), oh IF_LINT (= 0);
+  unsigned int fw, fh;
 
   block_input ();
 
@@ -223,10 +224,10 @@ x_real_pos_and_offsets (struct frame *f,
       unsigned int tmp_nchildren;
       int success;
 
-      success = XQueryTree (FRAME_X_DISPLAY (f), win, &rootw,
+      success = XQueryTree (dpy, win, &rootw,
                            &wm_window, &tmp_children, &tmp_nchildren);
 
-      had_errors = x_had_errors_p (FRAME_X_DISPLAY (f));
+      had_errors = x_had_errors_p (dpy);
 
       /* Don't free tmp_children if XQueryTree failed.  */
       if (! success)
@@ -246,7 +247,7 @@ x_real_pos_and_offsets (struct frame *f,
       Window child, rootw;
 
       /* Get the real coordinates for the WM window upper left corner */
-      XGetGeometry (FRAME_X_DISPLAY (f), win,
+      XGetGeometry (dpy, win,
                     &rootw, &real_x, &real_y, &ow, &oh, &bw, &ign);
 
       if (outer_border)
@@ -262,18 +263,21 @@ x_real_pos_and_offsets (struct frame *f,
          | -----------------         v y
          | |  our window
       */
-      XTranslateCoordinates (FRAME_X_DISPLAY (f),
+      XTranslateCoordinates (dpy,
 
                             /* From-window, to-window.  */
                             FRAME_DISPLAY_INFO (f)->root_window,
                              FRAME_X_WINDOW (f),
 
                             /* From-position, to-position.  */
-                             real_x, real_y, &win_x, &win_y,
+                             0, 0, &win_x, &win_y,
 
                             /* Child of win.  */
                             &child);
 
+      win_x += real_x;
+      win_y += real_y;
+
       if (FRAME_X_WINDOW (f) == FRAME_OUTER_WINDOW (f))
        {
           outer_x = win_x;
@@ -281,20 +285,23 @@ x_real_pos_and_offsets (struct frame *f,
        }
       else
         {
-          XTranslateCoordinates (FRAME_X_DISPLAY (f),
+          XTranslateCoordinates (dpy,
 
                                  /* From-window, to-window.  */
                                  FRAME_DISPLAY_INFO (f)->root_window,
                                  FRAME_OUTER_WINDOW (f),
 
                                  /* From-position, to-position.  */
-                                 real_x, real_y, &outer_x, &outer_y,
+                                 0, 0, &outer_x, &outer_y,
 
                                  /* Child of win.  */
                                  &child);
+
+         outer_x += real_x;
+         outer_y += real_y;
        }
 
-      had_errors = x_had_errors_p (FRAME_X_DISPLAY (f));
+      had_errors = x_had_errors_p (dpy);
     }
 
   if (!had_errors && dpyinfo->root_window == f->output_data.x->parent_desc)
@@ -319,6 +326,16 @@ x_real_pos_and_offsets (struct frame *f,
       if (tmp_data) XFree (tmp_data);
     }
 
+  if (right_offset_x || bottom_offset_y)
+    {
+      int xy_ign;
+      unsigned int ign;
+      Window rootw;
+
+      XGetGeometry (dpy, FRAME_OUTER_WINDOW (f),
+                   &rootw, &xy_ign, &xy_ign, &fw, &fh, &ign, &ign);
+    }
+
   x_uncatch_errors ();
 
   unblock_input ();
@@ -334,17 +351,8 @@ x_real_pos_and_offsets (struct frame *f,
   if (xptr) *xptr = real_x;
   if (yptr) *yptr = real_y;
 
-  if (right_offset_x || bottom_offset_y)
-    {
-      int xy_ign;
-      unsigned int ign, fw, fh;
-      Window rootw;
-
-      XGetGeometry (FRAME_X_DISPLAY (f), FRAME_OUTER_WINDOW (f),
-                   &rootw, &xy_ign, &xy_ign, &fw, &fh, &ign, &ign);
-      if (right_offset_x) *right_offset_x = ow - fw + outer_x;
-      if (bottom_offset_y) *bottom_offset_y = oh - fh + outer_y;
-    }
+  if (right_offset_x) *right_offset_x = ow - fw + outer_x;
+  if (bottom_offset_y) *bottom_offset_y = oh - fh + outer_y;
 }
 
 /* Store the screen positions of frame F into XPTR and YPTR.