Mercurial > dwindows
comparison gtk/dw.c @ 1479:1d414e81a099
FIXME: Workaround on GTK for Compiz not sending property notify
events for certain window styles causing a deadlock. Implement
a timeout and if the timeout expires push the event back.
author | bsmith@81767d24-ef19-dc11-ae90-00e081727c95 |
---|---|
date | Thu, 22 Dec 2011 12:09:43 +0000 |
parents | 1794caee0758 |
children | 559f434dcfbd |
comparison
equal
deleted
inserted
replaced
1478:7216f4301364 | 1479:1d414e81a099 |
---|---|
10124 _dw_box_pack(box, item, 0, width, height, hsize, vsize, pad, "dw_box_pack_end()"); | 10124 _dw_box_pack(box, item, 0, width, height, hsize, vsize, pad, "dw_box_pack_end()"); |
10125 } | 10125 } |
10126 | 10126 |
10127 union extents_union { guchar **gu_extents; unsigned long **extents; }; | 10127 union extents_union { guchar **gu_extents; unsigned long **extents; }; |
10128 static Atom extents_atom = 0; | 10128 static Atom extents_atom = 0; |
10129 static time_t extents_time = 0; | |
10129 | 10130 |
10130 static Bool property_notify_predicate(Display *xdisplay, XEvent *event, XPointer window_id) | 10131 static Bool property_notify_predicate(Display *xdisplay, XEvent *event, XPointer window_id) |
10131 { | 10132 { |
10132 unsigned long *window = (unsigned long *)window_id; | 10133 unsigned long *window = (unsigned long *)window_id; |
10133 | 10134 time_t currtime = time(NULL); |
10134 if(event->xany.type == PropertyNotify && event->xany.window == *window && event->xproperty.atom == extents_atom) | 10135 |
10136 /* If it is the event we are looking for... or if the timeout has expired */ | |
10137 if((event->xany.type == PropertyNotify && event->xany.window == *window && event->xproperty.atom == extents_atom) || | |
10138 (currtime - extents_time) > 1) | |
10135 return True; | 10139 return True; |
10136 return False; | 10140 return False; |
10137 } | 10141 } |
10138 | 10142 |
10139 /* Internal function to figure out the frame extents of an unmapped window */ | 10143 /* Internal function to figure out the frame extents of an unmapped window */ |
10169 xevent.xclient.message_type = extents_request_atom; | 10173 xevent.xclient.message_type = extents_request_atom; |
10170 xevent.xclient.display = xdisplay; | 10174 xevent.xclient.display = xdisplay; |
10171 xevent.xclient.window = window_id; | 10175 xevent.xclient.window = window_id; |
10172 xevent.xclient.format = 32; | 10176 xevent.xclient.format = 32; |
10173 | 10177 |
10178 /* Send the property request */ | |
10174 XSendEvent(xdisplay, xroot_window, False, | 10179 XSendEvent(xdisplay, xroot_window, False, |
10175 (SubstructureRedirectMask | SubstructureNotifyMask), | 10180 (SubstructureRedirectMask | SubstructureNotifyMask), |
10176 &xevent); | 10181 &xevent); |
10177 | 10182 |
10183 /* Record the request time */ | |
10184 time(&extents_time); | |
10185 | |
10186 /* Look for the property notify event */ | |
10178 XIfEvent(xdisplay, ¬ify_xevent, property_notify_predicate, (XPointer)&window_id); | 10187 XIfEvent(xdisplay, ¬ify_xevent, property_notify_predicate, (XPointer)&window_id); |
10188 | |
10189 /* If we didn't get the notification... put the event back onto the stack */ | |
10190 if(notify_xevent.xany.type != PropertyNotify || notify_xevent.xany.window != window_id | |
10191 || notify_xevent.xproperty.atom != extents_atom) | |
10192 XPutBackEvent(xdisplay, ¬ify_xevent); | |
10179 } | 10193 } |
10180 | 10194 |
10181 /* Attempt to retrieve window's frame extents. */ | 10195 /* Attempt to retrieve window's frame extents. */ |
10182 eu.extents = &extents; | 10196 eu.extents = &extents; |
10183 if(gdk_property_get(window->window, | 10197 if(gdk_property_get(window->window, |