mirror of
https://git.savannah.gnu.org/git/emacs.git
synced 2025-02-02 20:16:25 +00:00
Set _NET_WM_WINDOW_OPACITY on outer window manager window also.
* xterm.c (x_find_topmost_parent): New function. (x_set_frame_alpha): Find topmost parent window with x_find_topmost_parent and set the property there also. (handle_one_xevent): Call x_set_frame_alpha on ReparentNotify. Fixes: debbugs:9181
This commit is contained in:
parent
eeec79cbfa
commit
99aaf75f7c
@ -1,3 +1,10 @@
|
||||
2011-08-04 Jan Djärv <jan.h.d@swipnet.se>
|
||||
|
||||
* xterm.c (x_find_topmost_parent): New function.
|
||||
(x_set_frame_alpha): Find topmost parent window with
|
||||
x_find_topmost_parent and set the property there also (bug#9181).
|
||||
(handle_one_xevent): Call x_set_frame_alpha on ReparentNotify.
|
||||
|
||||
2011-08-04 Paul Eggert <eggert@cs.ucla.edu>
|
||||
|
||||
* callproc.c (Fcall_process): Avoid vfork clobbering
|
||||
|
38
src/xterm.c
38
src/xterm.c
@ -442,6 +442,27 @@ x_display_info_for_display (Display *dpy)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static Window
|
||||
x_find_topmost_parent (struct frame *f)
|
||||
{
|
||||
struct x_output *x = f->output_data.x;
|
||||
Window win = None, wi = x->parent_desc;
|
||||
Display *dpy = FRAME_X_DISPLAY (f);
|
||||
|
||||
while (wi != FRAME_X_DISPLAY_INFO (f)->root_window)
|
||||
{
|
||||
Window root;
|
||||
Window *children;
|
||||
unsigned int nchildren;
|
||||
|
||||
win = wi;
|
||||
XQueryTree (dpy, win, &root, &wi, &children, &nchildren);
|
||||
XFree (children);
|
||||
}
|
||||
|
||||
return win;
|
||||
}
|
||||
|
||||
#define OPAQUE 0xffffffff
|
||||
|
||||
void
|
||||
@ -453,6 +474,7 @@ x_set_frame_alpha (struct frame *f)
|
||||
double alpha = 1.0;
|
||||
double alpha_min = 1.0;
|
||||
unsigned long opac;
|
||||
Window parent;
|
||||
|
||||
if (dpyinfo->x_highlight_frame == f)
|
||||
alpha = f->alpha[0];
|
||||
@ -473,6 +495,19 @@ x_set_frame_alpha (struct frame *f)
|
||||
|
||||
opac = alpha * OPAQUE;
|
||||
|
||||
x_catch_errors (dpy);
|
||||
|
||||
/* If there is a parent from the window manager, put the property there
|
||||
also, to work around broken window managers that fail to do that.
|
||||
Do this unconditionally as this function is called on reparent when
|
||||
alpha has not changed on the frame. */
|
||||
|
||||
parent = x_find_topmost_parent (f);
|
||||
if (parent != None)
|
||||
XChangeProperty (dpy, parent, dpyinfo->Xatom_net_wm_window_opacity,
|
||||
XA_CARDINAL, 32, PropModeReplace,
|
||||
(unsigned char *) &opac, 1L);
|
||||
|
||||
/* return unless necessary */
|
||||
{
|
||||
unsigned char *data;
|
||||
@ -480,7 +515,6 @@ x_set_frame_alpha (struct frame *f)
|
||||
int rc, format;
|
||||
unsigned long n, left;
|
||||
|
||||
x_catch_errors (dpy);
|
||||
rc = XGetWindowProperty (dpy, win, dpyinfo->Xatom_net_wm_window_opacity,
|
||||
0L, 1L, False, XA_CARDINAL,
|
||||
&actual, &format, &n, &left,
|
||||
@ -6088,6 +6122,8 @@ handle_one_xevent (struct x_display_info *dpyinfo, XEvent *eventptr,
|
||||
/* Perhaps reparented due to a WM restart. Reset this. */
|
||||
FRAME_X_DISPLAY_INFO (f)->wm_type = X_WMTYPE_UNKNOWN;
|
||||
FRAME_X_DISPLAY_INFO (f)->net_supported_window = 0;
|
||||
|
||||
x_set_frame_alpha (f);
|
||||
}
|
||||
goto OTHER;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user