summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/lispref/frames.texi5
-rw-r--r--etc/NEWS5
-rw-r--r--src/frame.c4
-rw-r--r--src/xfns.c1
-rw-r--r--src/xterm.c42
-rw-r--r--src/xterm.h10
6 files changed, 53 insertions, 14 deletions
diff --git a/doc/lispref/frames.texi b/doc/lispref/frames.texi
index f8188708e5d..bae8eb3c703 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 b08bdc6451e..76a9ecdbc07 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 8750fe4889c..b7ff7fd1fc4 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 b2e3615fcf9..977096c13c6 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 aee36b11017..66b5dce73cf 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 84378b9ab25..ae9300f7834 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);