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.
This commit is contained in:
Po Lu 2022-02-24 09:38:37 +08:00
parent d132bfe6cd
commit 543ae215c1
6 changed files with 53 additions and 14 deletions

View file

@ -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

View file

@ -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,

View file

@ -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");

View file

@ -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

View file

@ -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",

View file

@ -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);