summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJan Djärv <jan.h.d@swipnet.se>2011-08-04 13:06:22 +0200
committerJan Djärv <jan.h.d@swipnet.se>2011-08-04 13:06:22 +0200
commit99aaf75f7c50513f7a6ad6bac21bd8f68290633e (patch)
tree5291c6481fba535b17bfcf312686d4af13c4eb9b /src
parenteeec79cbfa7d7a45b1436942878ef5ad627a5a31 (diff)
downloademacs-99aaf75f7c50513f7a6ad6bac21bd8f68290633e.tar.gz
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
Diffstat (limited to 'src')
-rw-r--r--src/ChangeLog7
-rw-r--r--src/xterm.c38
2 files changed, 44 insertions, 1 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index 1ad53741533..f66d301e060 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -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
diff --git a/src/xterm.c b/src/xterm.c
index 20516ee9d6f..74e905cd246 100644
--- a/src/xterm.c
+++ b/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;