+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
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
double alpha = 1.0;
double alpha_min = 1.0;
unsigned long opac;
+ Window parent;
if (dpyinfo->x_highlight_frame == f)
alpha = f->alpha[0];
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;
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,
/* 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;