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:
parent
d132bfe6cd
commit
543ae215c1
6 changed files with 53 additions and 14 deletions
|
@ -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
|
||||
|
|
5
etc/NEWS
5
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,
|
||||
|
|
|
@ -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");
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
42
src/xterm.c
42
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",
|
||||
|
|
10
src/xterm.h
10
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);
|
||||
|
|
Loading…
Add table
Reference in a new issue