]> git.eshelyaron.com Git - emacs.git/commitdiff
Gently nudge Xt into always setting size hints
authorPo Lu <luangruo@yahoo.com>
Wed, 31 Aug 2022 02:17:20 +0000 (10:17 +0800)
committerPo Lu <luangruo@yahoo.com>
Wed, 31 Aug 2022 02:17:43 +0000 (10:17 +0800)
* src/widget.c (update_wm_hints): Force a resource to change
every time this function is called.  (bug#57475)
(EmacsFrameInitialize): Initialize new field.
* src/widgetprv.h (EmacsFramePart): New field `size_switch'.
* src/xterm.c (x_wm_set_size_hint): Don't change flags if flags
is 0.

src/widget.c
src/widgetprv.h
src/xterm.c

index b125b4caeed45aeb0a5e71671d6d9465a9a3ed0d..5a75cdaca8ec057752f133d2a3e64f073586bd08 100644 (file)
@@ -292,18 +292,20 @@ update_wm_hints (Widget wmshell, EmacsFrame ew)
   base_height = (wmshell->core.height - ew->core.height
                 + (rounded_height - (char_height * ch)));
 
-  /* This is kind of sleazy, but I can't see how else to tell it to
-     make it mark the WM_SIZE_HINTS size as user specified.
-   */
-/*  ((WMShellWidget) wmshell)->wm.size_hints.flags |= USSize;*/
+  /* Ensure that Xt actually sets window manager hint flags specified
+     by the caller by making sure XtNminWidth (a relatively harmless
+     resource) always changes each time this function is invoked.  */
+  ew->emacs_frame.size_switch = !ew->emacs_frame.size_switch;
 
   XtVaSetValues (wmshell,
                 XtNbaseWidth, (XtArgVal) base_width,
                 XtNbaseHeight, (XtArgVal) base_height,
                 XtNwidthInc, (XtArgVal) (frame_resize_pixelwise ? 1 : cw),
                 XtNheightInc, (XtArgVal) (frame_resize_pixelwise ? 1 : ch),
-                XtNminWidth, (XtArgVal) base_width,
-                XtNminHeight, (XtArgVal) base_height,
+                XtNminWidth, (XtArgVal) (base_width
+                                         + ew->emacs_frame.size_switch),
+                XtNminHeight, (XtArgVal) (base_height
+                                          + ew->emacs_frame.size_switch),
                 NULL);
 }
 
@@ -355,6 +357,8 @@ EmacsFrameInitialize (Widget request, Widget new,
       exit (1);
     }
 
+  ew->emacs_frame.size_switch = 1;
+
   update_from_various_frame_slots (ew);
   set_frame_size (ew);
 }
index 960f814e16fd6a2476ab2a2085dcaffbeb8d6138..fe960326b038180a949c6d52a143f3ec8c63649d 100644 (file)
@@ -49,6 +49,8 @@ typedef struct {
 
   Boolean      visual_bell;            /* flash instead of beep */
   int          bell_volume;            /* how loud is beep */
+  int          size_switch;            /* hack to make setting size
+                                          hints work correctly */
 
   /* private state */
 
index 3c05bc7807d632f2f26282ab3ed5144c17ebcbba..e8c56d68ea89db4b7ea964cb6ced7485f64929fb 100644 (file)
@@ -27484,8 +27484,11 @@ x_wm_set_size_hint (struct frame *f, long flags, bool user_position)
       eassert (XtIsWMShell (f->output_data.x->widget));
       shell = (WMShellWidget) f->output_data.x->widget;
 
-      shell->wm.size_hints.flags &= ~(PPosition | USPosition);
-      shell->wm.size_hints.flags |= flags & (PPosition | USPosition);
+      if (flags)
+       {
+         shell->wm.size_hints.flags &= ~(PPosition | USPosition);
+         shell->wm.size_hints.flags |= flags & (PPosition | USPosition);
+       }
 
       if (user_position)
        {