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, &notify_xevent, property_notify_predicate, (XPointer)&window_id); 10187 XIfEvent(xdisplay, &notify_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, &notify_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,