3
* Compiz KDE compatibility plugin
7
* Copyright : (C) 2007 by Danny Baumann
8
* E-mail : maniac@opencompositing.org
10
* Based on scale.c and switcher.c:
11
* Copyright : (C) 2007 David Reveman
12
* E-mail : davidr@novell.com
14
* This program is free software; you can redistribute it and/or
15
* modify it under the terms of the GNU General Public License
16
* as published by the Free Software Foundation; either version 2
17
* of the License, or (at your option) any later version.
19
* This program is distributed in the hope that it will be useful,
20
* but WITHOUT ANY WARRANTY; without even the implied warranty of
21
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22
* GNU General Public License for more details.
32
#include <X11/Xatom.h>
34
#include <compiz-core.h>
35
#include "kdecompat_options.h"
37
static int displayPrivateIndex;
39
typedef struct _KdeCompatDisplay {
40
int screenPrivateIndex;
42
HandleEventProc handleEvent;
43
HandleCompizEventProc handleCompizEvent;
45
CompPlugin *scaleHandle;
47
CompTimeoutHandle scaleTimeout;
51
Atom kdePresentGroupAtom;
54
typedef struct _KdeCompatScreen {
55
int windowPrivateIndex;
57
Bool hasSlidingPopups;
59
PreparePaintScreenProc preparePaintScreen;
60
PaintOutputProc paintOutput;
61
DonePaintScreenProc donePaintScreen;
62
PaintWindowProc paintWindow;
63
DamageWindowRectProc damageWindowRect;
65
CompWindow *presentWindow;
75
typedef struct _Thumb {
88
SlidePosition position;
95
typedef struct _KdeCompatWindow {
97
unsigned int nPreviews;
100
SlideData *slideData;
106
#define GET_KDECOMPAT_DISPLAY(d) \
107
((KdeCompatDisplay *) (d)->base.privates[displayPrivateIndex].ptr)
109
#define KDECOMPAT_DISPLAY(d) \
110
KdeCompatDisplay *kd = GET_KDECOMPAT_DISPLAY (d)
112
#define GET_KDECOMPAT_SCREEN(s, kd) \
113
((KdeCompatScreen *) (s)->base.privates[(kd)->screenPrivateIndex].ptr)
115
#define KDECOMPAT_SCREEN(s) \
116
KdeCompatScreen *ks = GET_KDECOMPAT_SCREEN (s, \
117
GET_KDECOMPAT_DISPLAY (s->display))
119
#define GET_KDECOMPAT_WINDOW(w, ks) \
120
((KdeCompatWindow *) (w)->base.privates[(ks)->windowPrivateIndex].ptr)
122
#define KDECOMPAT_WINDOW(w) \
123
KdeCompatWindow *kw = GET_KDECOMPAT_WINDOW (w, \
124
GET_KDECOMPAT_SCREEN (w->screen, \
125
GET_KDECOMPAT_DISPLAY (w->screen->display)))
128
kdecompatStopCloseAnimation (CompWindow *w)
130
KDECOMPAT_WINDOW (w);
138
while (kw->destroyCnt)
146
kdecompatSendSlideEvent (CompWindow *w,
150
CompDisplay *d = w->screen->display;
152
o[0].type = CompOptionTypeInt;
153
o[0].name = "window";
154
o[0].value.i = w->id;
156
o[1].type = CompOptionTypeBool;
157
o[1].name = "active";
158
o[1].value.b = start;
160
(*d->handleCompizEvent) (d, "kdecompat", "slide", o, 2);
164
kdecompatStartSlideAnimation (CompWindow *w,
167
KDECOMPAT_WINDOW (w);
171
SlideData *data = kw->slideData;
173
KDECOMPAT_SCREEN (w->screen);
176
data->duration = kdecompatGetSlideInDuration (w->screen);
178
data->duration = kdecompatGetSlideOutDuration (w->screen);
180
if (data->remaining > data->duration)
181
data->remaining = data->duration;
183
data->remaining = data->duration - data->remaining;
185
data->appearing = appearing;
186
ks->hasSlidingPopups = TRUE;
188
kdecompatSendSlideEvent (w, TRUE);
193
kdecompatEndSlideAnimation (CompWindow *w)
195
KDECOMPAT_WINDOW (w);
199
kw->slideData->remaining = 0;
200
kdecompatStopCloseAnimation (w);
201
kdecompatSendSlideEvent (w, FALSE);
206
kdecompatPreparePaintScreen (CompScreen *s,
207
int msSinceLastPaint)
209
KDECOMPAT_SCREEN (s);
211
if (ks->hasSlidingPopups)
215
for (w = s->windows; w; w = w->next)
217
KdeCompatWindow *kw = GET_KDECOMPAT_WINDOW (w, ks);
222
kw->slideData->remaining -= msSinceLastPaint;
223
if (kw->slideData->remaining <= 0)
224
kdecompatEndSlideAnimation (w);
228
UNWRAP (ks, s, preparePaintScreen);
229
(*s->preparePaintScreen) (s, msSinceLastPaint);
230
WRAP (ks, s, preparePaintScreen, kdecompatPreparePaintScreen);
234
kdecompatPaintOutput (CompScreen *s,
235
const ScreenPaintAttrib *attrib,
236
const CompTransform *transform,
243
KDECOMPAT_SCREEN (s);
245
if (ks->hasSlidingPopups)
246
mask |= PAINT_SCREEN_WITH_TRANSFORMED_WINDOWS_MASK;
248
UNWRAP (ks, s, paintOutput);
249
status = (*s->paintOutput) (s, attrib, transform, region, output, mask);
250
WRAP (ks, s, paintOutput, kdecompatPaintOutput);
256
kdecompatDonePaintScreen (CompScreen *s)
258
KDECOMPAT_SCREEN (s);
260
if (ks->hasSlidingPopups)
264
ks->hasSlidingPopups = FALSE;
266
for (w = s->windows; w; w = w->next)
268
KdeCompatWindow *kw = GET_KDECOMPAT_WINDOW (w, ks);
270
if (kw->slideData && kw->slideData->remaining)
273
ks->hasSlidingPopups = TRUE;
278
UNWRAP (ks, s, donePaintScreen);
279
(*s->donePaintScreen) (s);
280
WRAP (ks, s, donePaintScreen, kdecompatDonePaintScreen);
284
kdecompatPaintWindow (CompWindow *w,
285
const WindowPaintAttrib *attrib,
286
const CompTransform *transform,
290
CompScreen *s = w->screen;
294
KDECOMPAT_SCREEN (s);
295
KDECOMPAT_WINDOW (w);
297
if (kw->slideData && kw->slideData->remaining)
299
FragmentAttrib fragment;
300
CompTransform wTransform = *transform;
301
SlideData *data = kw->slideData;
302
float xTranslate = 0, yTranslate = 0, remainder;
305
if (mask & PAINT_WINDOW_OCCLUSION_DETECTION_MASK)
308
remainder = (float) data->remaining / data->duration;
309
if (!data->appearing)
310
remainder = 1.0 - remainder;
312
clipBox.x1 = w->attrib.x;
313
clipBox.y1 = w->attrib.y;
314
clipBox.x2 = clipBox.x1 + w->width;
315
clipBox.y2 = clipBox.y1 + w->height;
317
switch (data->position) {
319
xTranslate = (data->start - w->attrib.x) * remainder;
320
clipBox.x2 = data->start;
323
xTranslate = (data->start - w->width) * remainder;
324
clipBox.x1 = data->start;
327
yTranslate = (data->start - w->height) * remainder;
328
clipBox.y1 = data->start;
332
yTranslate = (data->start - w->attrib.y) * remainder;
333
clipBox.y2 = data->start;
337
UNWRAP (ks, s, paintWindow);
338
status = (*s->paintWindow) (w, attrib, transform, region,
339
mask | PAINT_WINDOW_NO_CORE_INSTANCE_MASK);
340
WRAP (ks, s, paintWindow, kdecompatPaintWindow);
342
initFragmentAttrib (&fragment, &w->lastPaint);
344
if (w->alpha || fragment.opacity != OPAQUE)
345
mask |= PAINT_WINDOW_TRANSLUCENT_MASK;
347
matrixTranslate (&wTransform, xTranslate, yTranslate, 0.0f);
350
glLoadMatrixf (wTransform.m);
352
glPushAttrib (GL_SCISSOR_BIT);
353
glEnable (GL_SCISSOR_TEST);
355
glScissor (clipBox.x1, s->height - clipBox.y2,
356
clipBox.x2 - clipBox.x1, clipBox.y2 - clipBox.y1);
358
(*s->drawWindow) (w, &wTransform, &fragment, region,
359
mask | PAINT_WINDOW_TRANSFORMED_MASK);
361
glDisable (GL_SCISSOR_TEST);
367
UNWRAP (ks, s, paintWindow);
368
status = (*s->paintWindow) (w, attrib, transform, region, mask);
369
WRAP (ks, s, paintWindow, kdecompatPaintWindow);
373
!kdecompatGetPlasmaThumbnails (s) ||
376
(mask & PAINT_WINDOW_OCCLUSION_DETECTION_MASK))
381
for (i = 0; i < kw->nPreviews; i++)
383
CompWindow *tw = findWindowAtScreen (s, kw->previews[i].id);
384
XRectangle *rect = &kw->previews[i].thumb;
385
unsigned int paintMask = mask | PAINT_WINDOW_TRANSFORMED_MASK;
386
float xScale = 1.0f, yScale = 1.0f, xTranslate, yTranslate;
387
CompIcon *icon = NULL;
392
xTranslate = rect->x + w->attrib.x - tw->attrib.x;
393
yTranslate = rect->y + w->attrib.y - tw->attrib.y;
395
if (tw->texture->pixmap)
397
unsigned int width, height;
399
width = tw->attrib.width + tw->input.left + tw->input.right;
400
height = tw->attrib.height + tw->input.top + tw->input.bottom;
402
xScale = (float) rect->width / width;
403
yScale = (float) rect->height / height;
405
xTranslate += tw->input.left * xScale;
406
yTranslate += tw->input.top * yScale;
410
icon = getWindowIcon (tw, 256, 256);
412
icon = s->defaultIcon;
415
if (!icon->texture.name && !iconToTexture (s, icon))
423
paintMask |= PAINT_WINDOW_BLEND_MASK;
425
if (icon->width >= rect->width || icon->height >= rect->height)
427
xScale = (float) rect->width / icon->width;
428
yScale = (float) rect->height / icon->height;
436
xTranslate += rect->width / 2 - (icon->width * xScale / 2);
437
yTranslate += rect->height / 2 - (icon->height * yScale / 2);
439
iconReg.rects = &iconReg.extents;
440
iconReg.numRects = 1;
442
iconReg.extents.x1 = tw->attrib.x;
443
iconReg.extents.y1 = tw->attrib.y;
444
iconReg.extents.x2 = tw->attrib.x + icon->width;
445
iconReg.extents.y2 = tw->attrib.y + icon->height;
447
matrix = icon->texture.matrix;
448
matrix.x0 -= (tw->attrib.x * icon->texture.matrix.xx);
449
matrix.y0 -= (tw->attrib.y * icon->texture.matrix.yy);
451
tw->vCount = tw->indexCount = 0;
452
(*s->addWindowGeometry) (tw, &matrix, 1,
453
&iconReg, &infiniteRegion);
460
if (tw->texture->pixmap || icon)
462
FragmentAttrib fragment;
463
CompTransform wTransform = *transform;
465
initFragmentAttrib (&fragment, attrib);
467
if (tw->alpha || fragment.opacity != OPAQUE)
468
paintMask |= PAINT_WINDOW_TRANSLUCENT_MASK;
470
matrixTranslate (&wTransform, tw->attrib.x, tw->attrib.y, 0.0f);
471
matrixScale (&wTransform, xScale, yScale, 1.0f);
472
matrixTranslate (&wTransform,
473
xTranslate / xScale - tw->attrib.x,
474
yTranslate / yScale - tw->attrib.y,
478
glLoadMatrixf (wTransform.m);
480
if (tw->texture->pixmap)
481
(*s->drawWindow) (tw, &wTransform, &fragment,
482
&infiniteRegion, paintMask);
484
(*s->drawWindowTexture) (tw, &icon->texture,
485
&fragment, paintMask);
495
kdecompatUpdatePreviews (CompWindow *w)
498
CompScreen *s = w->screen;
499
CompDisplay *d = s->display;
502
unsigned long n, left;
503
unsigned char *propData;
505
KDECOMPAT_DISPLAY (d);
506
KDECOMPAT_SCREEN (s);
507
KDECOMPAT_WINDOW (w);
511
result = XGetWindowProperty (d->display, w->id, kd->kdePreviewAtom, 0,
512
32768, FALSE, AnyPropertyType, &actual,
513
&format, &n, &left, &propData);
515
if (result == Success && propData)
517
if (format == 32 && actual == kd->kdePreviewAtom)
519
long *data = (long *) propData;
520
int nPreview = *data++;
522
if (n == (6 * nPreview + 1))
524
kw->previews = realloc (kw->previews,
525
nPreview * sizeof (Thumb));
528
while (kw->nPreviews < nPreview)
533
kw->previews[kw->nPreviews].id = *data++;
535
kw->previews[kw->nPreviews].thumb.x = *data++;
536
kw->previews[kw->nPreviews].thumb.y = *data++;
537
kw->previews[kw->nPreviews].thumb.width = *data++;
538
kw->previews[kw->nPreviews].thumb.height = *data++;
549
for (cw = s->windows; cw; cw = cw->next)
552
KdeCompatWindow *kcw = GET_KDECOMPAT_WINDOW (cw, ks);
554
kcw->isPreview = FALSE;
555
for (rw = s->windows; rw; rw = rw->next)
557
KdeCompatWindow *krw = GET_KDECOMPAT_WINDOW (rw, ks);
560
for (i = 0; i < krw->nPreviews; i++)
562
if (krw->previews[i].id == cw->id)
564
kcw->isPreview = TRUE;
576
kdecompatUpdateSlidePosition (CompWindow *w)
578
CompDisplay *d = w->screen->display;
581
unsigned long n, left;
582
unsigned char *propData;
584
KDECOMPAT_DISPLAY (d);
585
KDECOMPAT_WINDOW (w);
589
free (kw->slideData);
590
kw->slideData = NULL;
593
result = XGetWindowProperty (d->display, w->id, kd->kdeSlideAtom, 0,
594
32768, FALSE, AnyPropertyType, &actual,
595
&format, &n, &left, &propData);
597
if (result == Success && propData)
599
if (format == 32 && actual == kd->kdeSlideAtom && n == 2)
601
long *data = (long *) propData;
603
kw->slideData = malloc (sizeof (SlideData));
606
kw->slideData->remaining = 0;
607
kw->slideData->start = data[0];
608
kw->slideData->position = data[1];
617
kdecompatHandleWindowClose (CompWindow *w,
620
KDECOMPAT_WINDOW (w);
622
if (kw->slideData && kdecompatGetSlidingPopups (w->screen))
635
if (kw->slideData->appearing || !kw->slideData->remaining)
636
kdecompatStartSlideAnimation (w, FALSE);
641
kdecompatGetScaleAction (CompDisplay *d,
649
KDECOMPAT_DISPLAY (d);
652
if (!p || !p->vTable->getObjectOptions)
655
object = compObjectFind (&core.base, COMP_OBJECT_TYPE_DISPLAY, NULL);
659
option = (*p->vTable->getObjectOptions) (p, object, &nOption);
662
if (option->type == CompOptionTypeAction ||
663
option->type == CompOptionTypeButton ||
664
option->type == CompOptionTypeKey)
666
if (strcmp (option->name, name) == 0)
668
return &option->value.action;
679
kdecompatScaleActivate (void *closure)
681
PresentWindowData *data = (PresentWindowData *) closure;
682
CompScreen *s = data->s;
683
CompDisplay *d = s->display;
686
KDECOMPAT_DISPLAY (d);
688
w = findWindowAtScreen (s, data->manager);
689
if (w && !kd->scaleActive)
694
CompMatch *windowMatch = &o[1].value.match;
697
KDECOMPAT_SCREEN (s);
700
o[0].type = CompOptionTypeInt;
701
o[0].value.i = s->root;
704
o[1].type = CompOptionTypeMatch;
706
ks->presentWindow = w;
708
matchInit (windowMatch);
710
for (i = 0; i < data->nWindows; i++)
712
snprintf (buffer, sizeof (buffer), "xid=%ld", data->windows[i]);
713
matchAddExp (windowMatch, 0, buffer);
716
matchUpdate (d, windowMatch);
718
action = kdecompatGetScaleAction (d, "initiate_all_key");
719
if (action && action->initiate)
720
(action->initiate) (d, action, 0, o, 2);
722
matchFini (windowMatch);
731
kdecompatFreeScaleTimeout (KdeCompatDisplay *kd)
733
PresentWindowData *data = NULL;
735
if (kd->scaleTimeout)
736
data = compRemoveTimeout (kd->scaleTimeout);
740
kd->scaleTimeout = 0;
744
kdecompatPresentWindowGroup (CompWindow *w)
746
CompScreen *s = w->screen;
747
CompDisplay *d = s->display;
750
unsigned long n, left;
751
unsigned char *propData;
754
KDECOMPAT_DISPLAY (d);
756
if (!kdecompatGetPresentWindows (s))
759
if (!kd->scaleHandle)
761
compLogMessage ("kdecompat", CompLogLevelWarn,
762
"Scale plugin not loaded, present windows "
763
"effect not available!");
767
result = XGetWindowProperty (d->display, w->id, kd->kdePresentGroupAtom, 0,
768
32768, FALSE, AnyPropertyType, &actual,
769
&format, &n, &left, &propData);
771
if (result == Success && propData)
773
if (format == 32 && actual == kd->kdePresentGroupAtom)
775
long *property = (long *) propData;
777
if (!n || !property[0])
785
o.type = CompOptionTypeInt;
788
action = kdecompatGetScaleAction (d, "initiate_all_key");
789
if (action && action->terminate)
790
(action->terminate) (d, action,
791
CompActionStateCancel, &o, 1);
796
PresentWindowData *data;
798
/* Activate scale using a timeout - Rationale:
799
* At the time we get the property notify event, Plasma
800
* most likely holds a pointer grab due to the action being
801
* initiated by a button click. As scale also wants to get
802
* a pointer grab, we need to delay the activation a bit so
803
* Plasma can release its grab.
806
kdecompatFreeScaleTimeout (kd);
808
data = malloc (sizeof (PresentWindowData) + n * sizeof (Window));
814
data->manager = w->id;
816
for (i = 0; i < n; i++)
817
data->windows[i] = property[i];
819
kd->scaleTimeout = compAddTimeout (100, 200,
820
kdecompatScaleActivate,
831
kdecompatHandleCompizEvent (CompDisplay *d,
832
const char *pluginName,
833
const char *eventName,
837
KDECOMPAT_DISPLAY (d);
839
UNWRAP (kd, d, handleCompizEvent);
840
(*d->handleCompizEvent) (d, pluginName, eventName, option, nOption);
841
WRAP (kd, d, handleCompizEvent, kdecompatHandleCompizEvent);
843
if (kd->scaleHandle &&
844
strcmp (pluginName, "scale") == 0 &&
845
strcmp (eventName, "activate") == 0)
847
Window xid = getIntOptionNamed (option, nOption, "root", 0);
848
CompScreen *s = findScreenAtDisplay (d, xid);
850
kd->scaleActive = getBoolOptionNamed (option, nOption, "active", FALSE);
852
if (!kd->scaleActive && s)
854
KDECOMPAT_SCREEN (s);
856
if (ks->presentWindow)
857
XDeleteProperty (d->display, ks->presentWindow->id,
858
kd->kdePresentGroupAtom);
864
kdecompatHandleEvent (CompDisplay *d,
869
KDECOMPAT_DISPLAY (d);
871
switch (event->type) {
873
w = findWindowAtDisplay (d, event->xdestroywindow.window);
875
kdecompatHandleWindowClose (w, TRUE);
878
w = findWindowAtDisplay (d, event->xunmap.window);
879
if (w && !w->pendingUnmaps)
880
kdecompatHandleWindowClose (w, FALSE);
883
w = findWindowAtDisplay (d, event->xmap.window);
885
kdecompatStopCloseAnimation (w);
889
UNWRAP (kd, d, handleEvent);
890
(*d->handleEvent) (d, event);
891
WRAP (kd, d, handleEvent, kdecompatHandleEvent);
893
switch (event->type) {
895
if (event->xproperty.atom == kd->kdePreviewAtom)
897
w = findWindowAtDisplay (d, event->xproperty.window);
899
kdecompatUpdatePreviews (w);
901
else if (event->xproperty.atom == kd->kdeSlideAtom)
903
w = findWindowAtDisplay (d, event->xproperty.window);
905
kdecompatUpdateSlidePosition (w);
907
else if (event->xproperty.atom == kd->kdePresentGroupAtom)
909
w = findWindowAtDisplay (d, event->xproperty.window);
911
kdecompatPresentWindowGroup (w);
918
kdecompatDamageWindowRect (CompWindow *w,
923
CompScreen *s = w->screen;
925
KDECOMPAT_SCREEN (s);
926
KDECOMPAT_WINDOW (w);
928
if (kw->isPreview && kdecompatGetPlasmaThumbnails (s))
933
reg.rects = ®.extents;
936
for (cw = s->windows; cw; cw = cw->next)
938
KdeCompatWindow *kcw = GET_KDECOMPAT_WINDOW (cw, ks);
941
for (i = 0; i < kcw->nPreviews; i++)
943
if (kcw->previews[i].id != w->id)
946
reg.extents.x1 = kcw->previews[i].thumb.x + cw->attrib.x;
947
reg.extents.x2 = reg.extents.x1 + kcw->previews[i].thumb.width;
948
reg.extents.y1 = kcw->previews[i].thumb.y + cw->attrib.y;
949
reg.extents.y2 = reg.extents.y1 + kcw->previews[i].thumb.height;
951
damageScreenRegion (s, ®);
956
if (initial && kdecompatGetSlidingPopups (s))
957
kdecompatStartSlideAnimation (w, TRUE);
959
UNWRAP (ks, s, damageWindowRect);
960
status = (*s->damageWindowRect) (w, initial, rect);
961
WRAP (ks, s, damageWindowRect, kdecompatDamageWindowRect);
967
kdecompatAdvertiseSupport (CompScreen *s,
973
unsigned char value = 0;
975
XChangeProperty (s->display->display, s->root, atom, atom,
976
8, PropModeReplace, &value, 1);
980
XDeleteProperty (s->display->display, s->root, atom);
985
kdecompatScreenOptionChanged (CompScreen *s,
987
KdecompatScreenOptions num)
989
KDECOMPAT_DISPLAY (s->display);
991
if (num == KdecompatScreenOptionPlasmaThumbnails)
992
kdecompatAdvertiseSupport (s, kd->kdePreviewAtom, opt->value.b);
993
else if (num == KdecompatScreenOptionSlidingPopups)
994
kdecompatAdvertiseSupport (s, kd->kdeSlideAtom, opt->value.b);
995
else if (num == KdecompatScreenOptionPresentWindows)
996
kdecompatAdvertiseSupport (s, kd->kdePresentGroupAtom,
997
opt->value.b && kd->scaleHandle);
1001
kdecompatInitDisplay (CompPlugin *p,
1004
KdeCompatDisplay *kd;
1006
if (!checkPluginABI ("core", CORE_ABIVERSION))
1009
kd = malloc (sizeof (KdeCompatDisplay));
1013
kd->screenPrivateIndex = allocateScreenPrivateIndex (d);
1014
if (kd->screenPrivateIndex < 0)
1020
kd->kdePreviewAtom = XInternAtom (d->display, "_KDE_WINDOW_PREVIEW", 0);
1021
kd->kdeSlideAtom = XInternAtom (d->display, "_KDE_SLIDE", 0);
1022
kd->kdePresentGroupAtom = XInternAtom (d->display,
1023
"_KDE_PRESENT_WINDOWS_GROUP", 0);
1025
kd->scaleHandle = findActivePlugin ("scale");
1026
kd->scaleActive = FALSE;
1027
kd->scaleTimeout = 0;
1029
WRAP (kd, d, handleEvent, kdecompatHandleEvent);
1030
WRAP (kd, d, handleCompizEvent, kdecompatHandleCompizEvent);
1032
d->base.privates[displayPrivateIndex].ptr = kd;
1038
kdecompatFiniDisplay (CompPlugin *p,
1041
KDECOMPAT_DISPLAY (d);
1043
kdecompatFreeScaleTimeout (kd);
1045
freeScreenPrivateIndex (d, kd->screenPrivateIndex);
1047
UNWRAP (kd, d, handleEvent);
1048
UNWRAP (kd, d, handleCompizEvent);
1054
kdecompatInitScreen (CompPlugin *p,
1057
KdeCompatScreen *ks;
1059
KDECOMPAT_DISPLAY (s->display);
1061
ks = malloc (sizeof (KdeCompatScreen));
1065
ks->windowPrivateIndex = allocateWindowPrivateIndex (s);
1066
if (ks->windowPrivateIndex < 0)
1072
ks->hasSlidingPopups = FALSE;
1073
ks->presentWindow = NULL;
1075
kdecompatAdvertiseSupport (s, kd->kdePreviewAtom,
1076
kdecompatGetPlasmaThumbnails (s));
1077
kdecompatAdvertiseSupport (s, kd->kdeSlideAtom,
1078
kdecompatGetSlidingPopups (s));
1079
kdecompatAdvertiseSupport (s, kd->kdePresentGroupAtom,
1080
kdecompatGetPresentWindows (s) &&
1083
kdecompatSetPlasmaThumbnailsNotify (s, kdecompatScreenOptionChanged);
1084
kdecompatSetSlidingPopupsNotify (s, kdecompatScreenOptionChanged);
1086
WRAP (ks, s, preparePaintScreen, kdecompatPreparePaintScreen);
1087
WRAP (ks, s, paintOutput, kdecompatPaintOutput);
1088
WRAP (ks, s, donePaintScreen, kdecompatDonePaintScreen);
1089
WRAP (ks, s, paintWindow, kdecompatPaintWindow);
1090
WRAP (ks, s, damageWindowRect, kdecompatDamageWindowRect);
1092
s->base.privates[kd->screenPrivateIndex].ptr = ks;
1098
kdecompatFiniScreen (CompPlugin *p,
1101
KDECOMPAT_SCREEN (s);
1102
KDECOMPAT_DISPLAY (s->display);
1104
freeWindowPrivateIndex (s, ks->windowPrivateIndex);
1106
kdecompatAdvertiseSupport (s, kd->kdePreviewAtom, FALSE);
1107
kdecompatAdvertiseSupport (s, kd->kdeSlideAtom, FALSE);
1108
kdecompatAdvertiseSupport (s, kd->kdePresentGroupAtom, FALSE);
1110
UNWRAP (ks, s, preparePaintScreen);
1111
UNWRAP (ks, s, paintOutput);
1112
UNWRAP (ks, s, donePaintScreen);
1113
UNWRAP (ks, s, paintWindow);
1114
UNWRAP (ks, s, damageWindowRect);
1120
kdecompatInitWindow (CompPlugin *p,
1123
KdeCompatWindow *kw;
1125
KDECOMPAT_SCREEN (w->screen);
1127
kw = malloc (sizeof (KdeCompatWindow));
1131
kw->previews = NULL;
1133
kw->isPreview = FALSE;
1135
kw->slideData = NULL;
1140
w->base.privates[ks->windowPrivateIndex].ptr = kw;
1146
kdecompatFiniWindow (CompPlugin *p,
1149
KDECOMPAT_WINDOW (w);
1150
KDECOMPAT_SCREEN (w->screen);
1152
if (ks->presentWindow == w)
1153
ks->presentWindow = NULL;
1155
kdecompatStopCloseAnimation (w);
1158
free (kw->previews);
1161
free (kw->slideData);
1167
kdecompatInitObject (CompPlugin *p,
1170
static InitPluginObjectProc dispTab[] = {
1171
(InitPluginObjectProc) 0, /* InitCore */
1172
(InitPluginObjectProc) kdecompatInitDisplay,
1173
(InitPluginObjectProc) kdecompatInitScreen,
1174
(InitPluginObjectProc) kdecompatInitWindow
1177
RETURN_DISPATCH (o, dispTab, ARRAY_SIZE (dispTab), TRUE, (p, o));
1181
kdecompatFiniObject (CompPlugin *p,
1184
static FiniPluginObjectProc dispTab[] = {
1185
(FiniPluginObjectProc) 0, /* FiniCore */
1186
(FiniPluginObjectProc) kdecompatFiniDisplay,
1187
(FiniPluginObjectProc) kdecompatFiniScreen,
1188
(FiniPluginObjectProc) kdecompatFiniWindow
1191
DISPATCH (o, dispTab, ARRAY_SIZE (dispTab), (p, o));
1195
kdecompatInit (CompPlugin *p)
1197
displayPrivateIndex = allocateDisplayPrivateIndex ();
1198
if (displayPrivateIndex < 0)
1205
kdecompatFini (CompPlugin *p)
1207
freeDisplayPrivateIndex (displayPrivateIndex);
1210
CompPluginVTable kdecompatVTable = {
1215
kdecompatInitObject,
1216
kdecompatFiniObject,
1222
getCompPluginInfo (void)
1224
return &kdecompatVTable;