emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master 543ae215c1: Add support for _NET_WM_STATE_SHADED


From: Po Lu
Subject: master 543ae215c1: Add support for _NET_WM_STATE_SHADED
Date: Wed, 23 Feb 2022 20:41:54 -0500 (EST)

branch: master
commit 543ae215c111e175871c6efc891d7816c2dd0f8c
Author: Po Lu <luangruo@yahoo.com>
Commit: Po Lu <luangruo@yahoo.com>

    Add support for _NET_WM_STATE_SHADED
    
    * doc/lispref/frames.texi (Management Parameters): Document new
    frame parameter `shaded'.
    * etc/NEWS: Announce new frame parameter.
    
    * src/frame.c (frame_parms) [HAVE_X_WINDOWS]: New frame
    parameter `shaded'.
    (syms_of_frame): New symbol `shaded'.
    * src/xfns.c (x_frame_parm_handlers): Install handler
    `x_set_shaded'.
    * src/xterm.c (x_set_shaded): New frame parameter handler.
    (x_get_current_wm_state): New parameter `shaded'.  All callers
    changed.
    (x_net_wm_state):
    (x_handle_net_wm_state): Handle shaded state.
    (x_term_init): Intern new atom `shaded'.
    * src/xterm.h: Update prototypes.
---
 doc/lispref/frames.texi |  5 +++++
 etc/NEWS                |  5 +++++
 src/frame.c             |  4 ++++
 src/xfns.c              |  1 +
 src/xterm.c             | 42 ++++++++++++++++++++++++++++++++----------
 src/xterm.h             | 10 ++++++----
 6 files changed, 53 insertions(+), 14 deletions(-)

diff --git a/doc/lispref/frames.texi b/doc/lispref/frames.texi
index f8188708e5..bae8eb3c70 100644
--- a/doc/lispref/frames.texi
+++ b/doc/lispref/frames.texi
@@ -2168,6 +2168,11 @@ prevent hanging with those window managers.
 If non-@code{nil}, the frame is visible on all virtual desktops on systems
 with virtual desktops.
 
+@vindex shaded@r{, a frame parameter}
+@item sticky
+If non-@code{nil}, tell the window manager to display the frame in a
+way that its contents are hidden, leaving only the title bar.
+
 @vindex inhibit-double-buffering@r{, a frame parameter}
 @item inhibit-double-buffering
 If non-@code{nil}, the frame is drawn to the screen without double
diff --git a/etc/NEWS b/etc/NEWS
index b08bdc6451..76a9ecdbc0 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -232,6 +232,11 @@ resource "synchronizeResize" to "off".
 This controls the opacity of the text background when running on a
 composited display.
 
++++
+** New frame parameter 'shaded'.
+On supported window managers, this controls whether or not a frame's
+contents will be hidden, leaving only the title bar.
+
 ---
 ** New user option 'x-gtk-use-native-input'.
 This controls whether or not GTK input methods are used by Emacs,
diff --git a/src/frame.c b/src/frame.c
index 8750fe4889..b7ff7fd1fc 100644
--- a/src/frame.c
+++ b/src/frame.c
@@ -3908,6 +3908,9 @@ static const struct frame_parm_table frame_parms[] =
   {"override-redirect",                SYMBOL_INDEX (Qoverride_redirect)},
   {"no-special-glyphs",                SYMBOL_INDEX (Qno_special_glyphs)},
   {"alpha-background",          SYMBOL_INDEX (Qalpha_background)},
+#ifdef HAVE_X_WINDOWS
+  {"shaded",                   SYMBOL_INDEX (Qshaded)},
+#endif
 #ifdef NS_IMPL_COCOA
   {"ns-appearance",            SYMBOL_INDEX (Qns_appearance)},
   {"ns-transparent-titlebar",  SYMBOL_INDEX (Qns_transparent_titlebar)},
@@ -6084,6 +6087,7 @@ syms_of_frame (void)
   DEFSYM (Qfullheight, "fullheight");
   DEFSYM (Qfullboth, "fullboth");
   DEFSYM (Qmaximized, "maximized");
+  DEFSYM (Qshaded, "shaded");
   DEFSYM (Qx_resource_name, "x-resource-name");
   DEFSYM (Qx_frame_parameter, "x-frame-parameter");
 
diff --git a/src/xfns.c b/src/xfns.c
index b2e3615fcf..977096c13c 100644
--- a/src/xfns.c
+++ b/src/xfns.c
@@ -8900,6 +8900,7 @@ frame_parm_handler x_frame_parm_handlers[] =
   x_set_override_redirect,
   gui_set_no_special_glyphs,
   x_set_alpha_background,
+  x_set_shaded,
 };
 
 /* Some versions of libX11 don't have symbols for a few functions we
diff --git a/src/xterm.c b/src/xterm.c
index aee36b1101..66b5dce73c 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -600,7 +600,7 @@ static void x_wm_set_window_state (struct frame *, int);
 static void x_wm_set_icon_pixmap (struct frame *, ptrdiff_t);
 static void x_initialize (void);
 
-static bool x_get_current_wm_state (struct frame *, Window, int *, bool *);
+static bool x_get_current_wm_state (struct frame *, Window, int *, bool *, 
bool *);
 static void x_update_opaque_region (struct frame *, XEvent *);
 
 /* Flush display of frame F.  */
@@ -9354,9 +9354,9 @@ x_net_wm_state (struct frame *f, Window window)
 {
   int value = FULLSCREEN_NONE;
   Lisp_Object lval = Qnil;
-  bool sticky = false;
+  bool sticky = false, shaded = false;
 
-  x_get_current_wm_state (f, window, &value, &sticky);
+  x_get_current_wm_state (f, window, &value, &sticky, &shaded);
 
   switch (value)
     {
@@ -9375,7 +9375,8 @@ x_net_wm_state (struct frame *f, Window window)
     }
 
   store_frame_param (f, Qfullscreen, lval);
-/**   store_frame_param (f, Qsticky, sticky ? Qt : Qnil); **/
+  store_frame_param (f, Qsticky, sticky ? Qt : Qnil);
+  store_frame_param (f, Qshaded, shaded ? Qt : Qnil);
 }
 
 /* Flip back buffers on any frames with undrawn content.  */
@@ -10043,8 +10044,9 @@ handle_one_xevent (struct x_display_info *dpyinfo,
         {
          bool iconified = FRAME_ICONIFIED_P (f);
          int value;
-         bool sticky;
-          bool not_hidden = x_get_current_wm_state (f, event->xmap.window, 
&value, &sticky);
+         bool sticky, shaded;
+          bool not_hidden = x_get_current_wm_state (f, event->xmap.window, 
&value, &sticky,
+                                                   &shaded);
 
          if (CONSP (frame_size_history))
            frame_size_history_extra
@@ -14143,6 +14145,18 @@ x_set_sticky (struct frame *f, Lisp_Object new_value, 
Lisp_Object old_value)
                 dpyinfo->Xatom_net_wm_state_sticky, None);
 }
 
+void
+x_set_shaded (struct frame *f, Lisp_Object new_value, Lisp_Object old_value)
+{
+  Lisp_Object frame;
+  struct x_display_info *dpyinfo = FRAME_DISPLAY_INFO (f);
+
+  XSETFRAME (frame, f);
+
+  set_wm_state (frame, !NILP (new_value),
+                dpyinfo->Xatom_net_wm_state_shaded, None);
+}
+
 /**
  * x_set_skip_taskbar:
  *
@@ -14243,7 +14257,8 @@ static bool
 x_get_current_wm_state (struct frame *f,
                         Window window,
                         int *size_state,
-                        bool *sticky)
+                        bool *sticky,
+                       bool *shaded)
 {
   unsigned long actual_size;
   int i;
@@ -14267,6 +14282,7 @@ x_get_current_wm_state (struct frame *f,
 
   *sticky = false;
   *size_state = FULLSCREEN_NONE;
+  *shaded = false;
 
   block_input ();
 
@@ -14328,6 +14344,8 @@ x_get_current_wm_state (struct frame *f,
         *size_state = FULLSCREEN_BOTH;
       else if (a == dpyinfo->Xatom_net_wm_state_sticky)
         *sticky = true;
+      else if (a == dpyinfo->Xatom_net_wm_state_shaded)
+       *shaded = true;
     }
 
 #ifdef USE_XCB
@@ -14350,7 +14368,7 @@ do_ewmh_fullscreen (struct frame *f)
   int cur;
   bool dummy;
 
-  x_get_current_wm_state (f, FRAME_OUTER_WINDOW (f), &cur, &dummy);
+  x_get_current_wm_state (f, FRAME_OUTER_WINDOW (f), &cur, &dummy, &dummy);
 
   /* Some window managers don't say they support _NET_WM_STATE, but they do say
      they support _NET_WM_STATE_FULLSCREEN.  Try that also.  */
@@ -14490,8 +14508,10 @@ x_handle_net_wm_state (struct frame *f, const 
XPropertyEvent *event)
 {
   int value = FULLSCREEN_NONE;
   Lisp_Object lval;
-  bool sticky = false;
-  bool not_hidden = x_get_current_wm_state (f, event->window, &value, &sticky);
+  bool sticky = false, shaded = false;
+  bool not_hidden = x_get_current_wm_state (f, event->window,
+                                           &value, &sticky,
+                                           &shaded);
 
   lval = Qnil;
   switch (value)
@@ -14512,6 +14532,7 @@ x_handle_net_wm_state (struct frame *f, const 
XPropertyEvent *event)
 
   store_frame_param (f, Qfullscreen, lval);
   store_frame_param (f, Qsticky, sticky ? Qt : Qnil);
+  store_frame_param (f, Qshaded, shaded ? Qt : Qnil);
 
   return not_hidden;
 }
@@ -16804,6 +16825,7 @@ x_term_init (Lisp_Object display_name, char 
*xrm_option, char *resource_name)
       ATOM_REFS_INIT ("_NET_WM_STATE_MAXIMIZED_VERT",
                      Xatom_net_wm_state_maximized_vert)
       ATOM_REFS_INIT ("_NET_WM_STATE_STICKY", Xatom_net_wm_state_sticky)
+      ATOM_REFS_INIT ("_NET_WM_STATE_SHADED", Xatom_net_wm_state_shaded)
       ATOM_REFS_INIT ("_NET_WM_STATE_HIDDEN", Xatom_net_wm_state_hidden)
       ATOM_REFS_INIT ("_NET_WM_WINDOW_TYPE", Xatom_net_window_type)
       ATOM_REFS_INIT ("_NET_WM_WINDOW_TYPE_TOOLTIP",
diff --git a/src/xterm.h b/src/xterm.h
index 84378b9ab2..ae9300f783 100644
--- a/src/xterm.h
+++ b/src/xterm.h
@@ -536,10 +536,11 @@ struct x_display_info
     Xatom_net_wm_state_maximized_horz, Xatom_net_wm_state_maximized_vert,
     Xatom_net_wm_state_sticky, Xatom_net_wm_state_above, 
Xatom_net_wm_state_below,
     Xatom_net_wm_state_hidden, Xatom_net_wm_state_skip_taskbar,
-    Xatom_net_frame_extents, Xatom_net_current_desktop, Xatom_net_workarea,
-    Xatom_net_wm_opaque_region, Xatom_net_wm_ping, Xatom_net_wm_sync_request,
-    Xatom_net_wm_sync_request_counter, Xatom_net_wm_frame_drawn,
-    Xatom_net_wm_user_time, Xatom_net_wm_user_time_window;
+    Xatom_net_wm_state_shaded, Xatom_net_frame_extents, 
Xatom_net_current_desktop,
+    Xatom_net_workarea, Xatom_net_wm_opaque_region, Xatom_net_wm_ping,
+    Xatom_net_wm_sync_request, Xatom_net_wm_sync_request_counter,
+    Xatom_net_wm_frame_drawn, Xatom_net_wm_user_time,
+    Xatom_net_wm_user_time_window;
 
   /* XSettings atoms and windows.  */
   Atom Xatom_xsettings_sel, Xatom_xsettings_prop, Xatom_xsettings_mgr;
@@ -1372,6 +1373,7 @@ x_mutable_colormap (Visual *visual)
 }
 
 extern void x_set_sticky (struct frame *, Lisp_Object, Lisp_Object);
+extern void x_set_shaded (struct frame *, Lisp_Object, Lisp_Object);
 extern void x_set_skip_taskbar (struct frame *, Lisp_Object, Lisp_Object);
 extern void x_set_z_group (struct frame *, Lisp_Object, Lisp_Object);
 extern bool x_wm_supports (struct frame *, Atom);



reply via email to

[Prev in Thread] Current Thread [Next in Thread]