169
168
WORKAROUNDS_WINDOW (w);
171
if (w->type & CompWindowTypeDesktopMask)
174
/* get output region for window */
175
output = outputDeviceForWindow (w);
176
box = &w->screen->outputDev[output].region.extents;
178
/* does the size match the output rectangle? */
179
isFullSize = (w->serverX == box->x1) && (w->serverY == box->y1) &&
180
(w->serverWidth == (box->x2 - box->x1)) &&
181
(w->serverHeight == (box->y2 - box->y1));
183
/* if not, check if it matches the whole screen */
186
if ((w->serverX == 0) && (w->serverY == 0) &&
187
(w->serverWidth == w->screen->width) &&
188
(w->serverHeight == w->screen->height))
170
if (w->wmType & CompWindowTypeDesktopMask)
172
/* desktop windows are implicitly fullscreen */
177
/* get output region for window */
178
output = outputDeviceForWindow (w);
179
box = &w->screen->outputDev[output].region.extents;
181
/* does the size match the output rectangle? */
182
isFullSize = (w->serverX == box->x1) && (w->serverY == box->y1) &&
183
(w->serverWidth == (box->x2 - box->x1)) &&
184
(w->serverHeight == (box->y2 - box->y1));
186
/* if not, check if it matches the whole screen */
189
if ((w->serverX == 0) && (w->serverY == 0) &&
190
(w->serverWidth == w->screen->width) &&
191
(w->serverHeight == w->screen->height))
221
226
/* FIXME: Is this the best way to detect a notification type window? */
222
227
if (workaroundsGetNotificationDaemonFix (d))
224
if (w->wmType == CompWindowTypeNormalMask &&
229
if (newWmType == CompWindowTypeNormalMask &&
225
230
w->attrib.override_redirect && w->resName &&
226
231
strcmp (w->resName, "notification-daemon") == 0)
228
233
newWmType = CompWindowTypeNotificationMask;
232
if ((w->wmType == newWmType) && workaroundsGetFirefoxMenuFix (d))
238
if (workaroundsGetFirefoxMenuFix (d))
234
if (w->wmType == CompWindowTypeNormalMask &&
240
if (newWmType == CompWindowTypeNormalMask &&
235
241
w->attrib.override_redirect && w->resName)
237
243
if ((strcasecmp (w->resName, "gecko") == 0) ||
238
244
(strcasecmp (w->resName, "popup") == 0))
240
246
newWmType = CompWindowTypeDropdownMenuMask;
245
252
/* FIXME: Basic hack to get Java windows working correctly. */
246
if ((w->wmType == newWmType) && workaroundsGetJavaFix (d) && w->resName)
253
if (workaroundsGetJavaFix (d) && w->resName)
248
255
if ((strcmp (w->resName, "sun-awt-X11-XMenuWindow") == 0) ||
249
256
(strcmp (w->resName, "sun-awt-X11-XWindowPeer") == 0))
251
258
newWmType = CompWindowTypeDropdownMenuMask;
253
261
else if (strcmp (w->resName, "sun-awt-X11-XDialogPeer") == 0)
255
263
newWmType = CompWindowTypeDialogMask;
257
266
else if (strcmp (w->resName, "sun-awt-X11-XFramePeer") == 0)
259
268
newWmType = CompWindowTypeNormalMask;
263
if ((newWmType == w->wmType) && workaroundsGetQtFix (d))
273
if (workaroundsGetQtFix (d))
265
275
char *windowRole;
271
281
if ((strcmp (windowRole, "toolTipTip") == 0) ||
272
282
(strcmp (windowRole, "qtooltip_label") == 0))
274
285
newWmType = CompWindowTypeTooltipMask;
280
294
/* fix Qt transients - FIXME: is there a better way to detect them? */
281
if (w->wmType == newWmType)
283
if (!w->resName && w->attrib.override_redirect &&
284
(w->attrib.class == InputOutput) &&
285
(w->wmType == CompWindowTypeUnknownMask))
287
newWmType = CompWindowTypeDropdownMenuMask;
295
if (!w->resName && w->attrib.override_redirect &&
296
(w->attrib.class == InputOutput) &&
297
(w->wmType == CompWindowTypeUnknownMask))
299
newWmType = CompWindowTypeDropdownMenuMask;
292
305
if (newWmType != w->wmType)
294
307
WORKAROUNDS_WINDOW (w);
306
319
workaroundsFixupFullscreen (w);
310
workaroundsUpdateTimeout (void *closure)
312
CompWindow *w = (CompWindow *) closure;
314
WORKAROUNDS_WINDOW (w);
316
workaroundsUpdateSticky (w);
317
workaroundsDoFixes (w);
319
ww->updateHandle = 0;
325
323
workaroundsDisplayOptionChanged (CompDisplay *d,
343
341
WORKAROUNDS_DISPLAY (d);
343
switch (event->type) {
344
case ConfigureRequest:
345
w = findWindowAtDisplay (d, event->xconfigurerequest.window);
348
WORKAROUNDS_WINDOW (w);
350
if (ww->madeFullscreen)
351
w->state &= ~CompWindowStateFullscreenMask;
355
w = findWindowAtDisplay (d, event->xmaprequest.window);
358
workaroundsUpdateSticky (w);
359
workaroundsDoFixes (w);
363
w = findWindowAtDisplay (d, event->xmap.window);
364
if (w && w->attrib.override_redirect)
365
workaroundsDoFixes (w);
345
369
UNWRAP (wd, d, handleEvent);
346
370
(*d->handleEvent) (d, event);
347
371
WRAP (wd, d, handleEvent, workaroundsHandleEvent);
349
373
switch (event->type) {
374
case ConfigureRequest:
375
w = findWindowAtDisplay (d, event->xconfigurerequest.window);
378
WORKAROUNDS_WINDOW (w);
380
if (ww->madeFullscreen)
381
w->state |= CompWindowStateFullscreenMask;
350
384
case ClientMessage:
351
385
if (event->xclient.message_type == d->winDesktopAtom)
358
392
case PropertyNotify:
359
if (event->xproperty.atom == XA_WM_CLASS)
393
if ((event->xproperty.atom == XA_WM_CLASS) ||
394
(event->xproperty.atom == d->winTypeAtom))
361
396
w = findWindowAtDisplay (d, event->xproperty.window);
476
511
ww->madeSticky = FALSE;
477
512
ww->adjustedWinType = FALSE;
478
513
ww->isFullscreen = FALSE;
514
ww->madeFullscreen = FALSE;
480
516
w->privates[ws->windowPrivateIndex].ptr = ww;
482
ww->updateHandle = compAddTimeout (0, workaroundsUpdateTimeout, (void *) w);