]> git.eshelyaron.com Git - emacs.git/commitdiff
c:/Temp/gtk-window-move/ChangeLog.txt
authorMartin Rudalics <rudalics@gmx.at>
Thu, 23 Mar 2017 06:51:19 +0000 (07:51 +0100)
committerMartin Rudalics <rudalics@gmx.at>
Thu, 23 Mar 2017 06:51:19 +0000 (07:51 +0100)
src/gtkutil.c
src/xterm.c

index 3a00e362221cbdfeb15c404e088ebe14e346d941..63f014364132597f47bdda4c2408a8d45e4381ec 100644 (file)
@@ -783,33 +783,55 @@ xg_set_geometry (struct frame *f)
 {
   if (f->size_hint_flags & (USPosition | PPosition))
     {
-      int left = f->left_pos;
-      int xneg = f->size_hint_flags & XNegative;
-      int top = f->top_pos;
-      int yneg = f->size_hint_flags & YNegative;
-      char geom_str[sizeof "=x--" + 4 * INT_STRLEN_BOUND (int)];
-      guint id;
-
-      if (xneg)
-        left = -left;
-      if (yneg)
-        top = -top;
-
-      sprintf (geom_str, "=%dx%d%c%d%c%d",
-               FRAME_PIXEL_WIDTH (f),
-               FRAME_PIXEL_HEIGHT (f),
-               (xneg ? '-' : '+'), left,
-               (yneg ? '-' : '+'), top);
-
-      /* Silence warning about visible children.  */
-      id = g_log_set_handler ("Gtk", G_LOG_LEVEL_WARNING | G_LOG_FLAG_FATAL
-                              | G_LOG_FLAG_RECURSION, my_log_handler, NULL);
-
-      if (!gtk_window_parse_geometry (GTK_WINDOW (FRAME_GTK_OUTER_WIDGET (f)),
-                                      geom_str))
-        fprintf (stderr, "Failed to parse: '%s'\n", geom_str);
-
-      g_log_remove_handler ("Gtk", id);
+      if (x_gtk_use_window_move)
+       {
+         /* Handle negative positions without consulting
+            gtk_window_parse_geometry (Bug#25851).  The position will
+            be off by scrollbar width + window manager decorations.  */
+         if (f->size_hint_flags & XNegative)
+           f->left_pos = (x_display_pixel_width (FRAME_DISPLAY_INFO (f))
+                          - FRAME_PIXEL_WIDTH (f) + f->left_pos);
+
+         if (f->size_hint_flags & YNegative)
+           f->top_pos = (x_display_pixel_height (FRAME_DISPLAY_INFO (f))
+                         - FRAME_PIXEL_HEIGHT (f) + f->top_pos);
+
+         gtk_window_move (GTK_WINDOW (FRAME_GTK_OUTER_WIDGET (f)),
+                          f->left_pos, f->top_pos);
+
+         /* Reset size hint flags.  */
+         f->size_hint_flags &= ~ (XNegative | YNegative);
+       }
+      else
+       {
+         int left = f->left_pos;
+         int xneg = f->size_hint_flags & XNegative;
+         int top = f->top_pos;
+         int yneg = f->size_hint_flags & YNegative;
+         char geom_str[sizeof "=x--" + 4 * INT_STRLEN_BOUND (int)];
+         guint id;
+
+         if (xneg)
+           left = -left;
+         if (yneg)
+           top = -top;
+
+         sprintf (geom_str, "=%dx%d%c%d%c%d",
+                  FRAME_PIXEL_WIDTH (f),
+                  FRAME_PIXEL_HEIGHT (f),
+                  (xneg ? '-' : '+'), left,
+                  (yneg ? '-' : '+'), top);
+
+         /* Silence warning about visible children.  */
+         id = g_log_set_handler ("Gtk", G_LOG_LEVEL_WARNING | G_LOG_FLAG_FATAL
+                                 | G_LOG_FLAG_RECURSION, my_log_handler, NULL);
+
+         if (!gtk_window_parse_geometry (GTK_WINDOW (FRAME_GTK_OUTER_WIDGET (f)),
+                                         geom_str))
+           fprintf (stderr, "Failed to parse: '%s'\n", geom_str);
+
+         g_log_remove_handler ("Gtk", id);
+       }
     }
 }
 
@@ -1406,6 +1428,13 @@ x_wm_set_size_hint (struct frame *f, long int flags, bool user_position)
   else if (win_gravity == StaticGravity)
     size_hints.win_gravity = GDK_GRAVITY_STATIC;
 
+  if (x_gtk_use_window_move)
+    {
+      if (flags & PPosition) hint_flags |= GDK_HINT_POS;
+      if (flags & USPosition) hint_flags |= GDK_HINT_USER_POS;
+      if (flags & USSize) hint_flags |= GDK_HINT_USER_SIZE;
+    }
+
   if (user_position)
     {
       hint_flags &= ~GDK_HINT_POS;
index 7856793f8dc8b5f6330c1cd02b42c150b0c60740..4f9eff6c5e6a0e02118d1aad5c1177b08c662c83 100644 (file)
@@ -10056,11 +10056,26 @@ x_set_offset (struct frame *f, register int xoff, register int yoff, int change_
        f->size_hint_flags |= YNegative;
       f->win_gravity = NorthWestGravity;
     }
+
   x_calc_absolute_position (f);
 
   block_input ();
   x_wm_set_size_hint (f, 0, false);
 
+#ifdef USE_GTK
+  if (x_gtk_use_window_move)
+    {
+      /* When a position change was requested and the outer GTK widget
+        has been realized already, leave it to gtk_window_move to DTRT
+        and return.  Used for Bug#25851 and Bug#25943.  */
+      if (change_gravity != 0 && FRAME_GTK_OUTER_WIDGET (f))
+       gtk_window_move (GTK_WINDOW (FRAME_GTK_OUTER_WIDGET (f)),
+                        f->left_pos, f->top_pos);
+      unblock_input ();
+      return;
+    }
+#endif /* USE_GTK */
+
   modified_left = f->left_pos;
   modified_top = f->top_pos;
 
@@ -12905,4 +12920,11 @@ state.
 Set this variable only if your window manager cannot handle the
 transition between the various maximization states.  */);
   x_frame_normalize_before_maximize = false;
+
+  DEFVAR_BOOL ("x-gtk-use-window-move", x_gtk_use_window_move,
+    doc: /* Non-nil means rely on gtk_window_move to set frame positions.
+If this variable is t, the GTK build uses the function gtk_window_move
+to set or store frame positions and disables some time consuming frame
+position adjustments.  */);
+  x_gtk_use_window_move = false;
 }