~timo-jyrinki/compiz-plugins-main/fix_755842

« back to all changes in this revision

Viewing changes to .pc/vpswitch_953834.patch/vpswitch/src/vpswitch.cpp

  • Committer: Package Import Robot
  • Author(s): Didier Roche, Łukasz 'sil2100' Zemczak, Didier Roche
  • Date: 2012-03-21 11:46:41 UTC
  • Revision ID: package-import@ubuntu.com-20120321114641-5ehdlu4zkt71vziw
Tags: 1:0.9.7.0~bzr19-0ubuntu7
[ Łukasz 'sil2100' Zemczak ]
* debian/patches/shift_954079.patch:
  - cherry picked the shift plugin patch for fixing an issue with compiz crashes
    on right-click. This removes an unused option in the plugin. (LP: #954079)
* debian/patches/fix_broken_build.patch:
  - fixes the build with the newer compiz
* debian/patches/vpswitch_953834.patch:
  - don't pass through keystrokes you are using to the active window (LP: #953834)

[ Didier Roche ]
* debian/control:
  - bump compiz-dev and libcompizconfig0-dev build-dep for ABI break
* debian/patches/fix_930192.patch:
  - Animations of large or full-screen windows skip frames (not smooth) (LP: #930192)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Compiz vpswitch plugin
 
3
 *
 
4
 * vpswitch.cpp
 
5
 *
 
6
 * Copyright (c) 2007 Dennis Kasprzyk <onestone@opencompositing.org>
 
7
 *
 
8
 * Go-to-numbered-viewport functionality by
 
9
 * 
 
10
 * Copyright (c) 2007 Robert Carr <racarr@opencompositing.org>
 
11
 *           (c) 2007 Danny Baumann <maniac@opencompositing.org>
 
12
 *
 
13
 * Go-to-specific-viewport functionality by
 
14
 *
 
15
 * Copyright (c) 2007 Michael Vogt <mvo@ubuntu.com>
 
16
 *
 
17
 * This program is free software; you can redistribute it and/or
 
18
 * modify it under the terms of the GNU General Public License
 
19
 * as published by the Free Software Foundation; either version 2
 
20
 * of the License, or (at your option) any later version.
 
21
 *
 
22
 * This program is distributed in the hope that it will be useful,
 
23
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
24
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
25
 * GNU General Public License for more details.
 
26
 *
 
27
 */
 
28
 
 
29
#include "vpswitch.h"
 
30
 
 
31
COMPIZ_PLUGIN_20090315 (vpswitch, VPSwitchPluginVTable);
 
32
 
 
33
bool
 
34
VPSwitchScreen::initPluginAction (CompAction         *action,
 
35
                                  CompAction::State  state,
 
36
                                  CompOption::Vector &options)
 
37
{
 
38
    GET_DATA;
 
39
 
 
40
    CompPlugin *plugin = CompPlugin::find (optionGetInitPlugin ().c_str ());
 
41
    bool       rv = false;
 
42
 
 
43
    if (!plugin)
 
44
        return false;
 
45
 
 
46
    foreach (CompOption &opt, plugin->vTable->getOptions ())
 
47
    {
 
48
        if (opt.type () == CompOption::TypeAction ||
 
49
            opt.type () == CompOption::TypeKey ||
 
50
            opt.type () == CompOption::TypeButton ||
 
51
            opt.type () == CompOption::TypeEdge ||
 
52
            opt.type () == CompOption::TypeBell)
 
53
            if (opt.name () == optionGetInitAction () &&
 
54
                opt.value ().action ().initiate ())
 
55
            {
 
56
                rv = opt.value ().action ().initiate ()
 
57
                     (action, state, options);
 
58
                break;
 
59
            }
 
60
    }
 
61
 
 
62
    if (rv)
 
63
        action->setState(action->state () | CompAction::StateTermButton);
 
64
 
 
65
    return rv;
 
66
}
 
67
 
 
68
bool
 
69
VPSwitchScreen::termPluginAction (CompAction         *action,
 
70
                                  CompAction::State  state,
 
71
                                  CompOption::Vector &options)
 
72
{
 
73
    CompPlugin *plugin = CompPlugin::find (optionGetInitPlugin ().c_str ());
 
74
    bool       rv = false;
 
75
 
 
76
    if (!plugin)
 
77
        return false;
 
78
 
 
79
    foreach (CompOption &opt, plugin->vTable->getOptions ())
 
80
    {
 
81
        if (opt.type () == CompOption::TypeAction ||
 
82
            opt.type () == CompOption::TypeKey ||
 
83
            opt.type () == CompOption::TypeButton ||
 
84
            opt.type () == CompOption::TypeEdge ||
 
85
            opt.type () == CompOption::TypeBell)
 
86
            if (opt.name () == optionGetInitAction () &&
 
87
                opt.value ().action ().terminate ())
 
88
            {
 
89
                rv = opt.value ().action ().terminate ()
 
90
                     (action, state, options);
 
91
                break;
 
92
            }
 
93
    }
 
94
 
 
95
    return rv;
 
96
}
 
97
 
 
98
void
 
99
VPSwitchScreen::gotovp (int x, int y)
 
100
{
 
101
    XEvent xev;
 
102
 
 
103
    xev.xclient.type    = ClientMessage;
 
104
    xev.xclient.display = screen->dpy ();
 
105
    xev.xclient.format  = 32;
 
106
 
 
107
    xev.xclient.message_type = Atoms::desktopViewport;
 
108
    xev.xclient.window       = screen->root ();
 
109
 
 
110
    xev.xclient.data.l[0] = x * screen->width ();
 
111
    xev.xclient.data.l[1] = y * screen->height ();
 
112
    xev.xclient.data.l[2] = 0;
 
113
    xev.xclient.data.l[3] = 0;
 
114
    xev.xclient.data.l[4] = 0;
 
115
 
 
116
    XSendEvent (screen->dpy (), screen->root (), false,
 
117
                SubstructureRedirectMask | SubstructureNotifyMask, &xev);
 
118
}
 
119
 
 
120
/* desktop mouse button initiated actions */
 
121
 
 
122
bool
 
123
VPSwitchScreen::next (CompAction         *action,
 
124
                      CompAction::State  state,
 
125
                      CompOption::Vector &options)
 
126
{
 
127
    int targetX, targetY;
 
128
    CompPoint vp (screen->vp ());
 
129
    CompSize vpsize (screen->vpSize ());
 
130
 
 
131
    GET_DATA;
 
132
 
 
133
    targetX = vp.x () + 1;
 
134
    targetY = vp.y ();
 
135
 
 
136
    if (targetX >= vpsize.width ())
 
137
    {
 
138
        targetX = 0;
 
139
        targetY++;
 
140
    }
 
141
    if (targetY >= vpsize.height ())
 
142
        targetY = 0;
 
143
 
 
144
    gotovp (targetX, targetY);
 
145
 
 
146
    return true;
 
147
}
 
148
 
 
149
bool
 
150
VPSwitchScreen::prev (CompAction         *action,
 
151
                      CompAction::State  state,
 
152
                      CompOption::Vector &options)
 
153
{
 
154
    int targetX, targetY;
 
155
    CompPoint vp (screen->vp ());
 
156
    CompSize vpsize (screen->vpSize ());
 
157
 
 
158
    GET_DATA;
 
159
 
 
160
    targetX = vp.x () - 1;
 
161
    targetY = vp.y ();
 
162
 
 
163
    if (targetX < 0)
 
164
    {
 
165
        targetX = vpsize.width () - 1;
 
166
        targetY--;
 
167
    }
 
168
    if (targetY < 0)
 
169
        targetY = vpsize.height () - 1;
 
170
 
 
171
    gotovp (targetX, targetY);
 
172
 
 
173
    return true;
 
174
}
 
175
 
 
176
bool
 
177
VPSwitchScreen::movevp (CompAction         *action,
 
178
                        CompAction::State  state,
 
179
                        CompOption::Vector &options,
 
180
                        unsigned int dx, unsigned int dy)
 
181
{
 
182
    CompPoint vp (screen->vp ());
 
183
    CompSize  vpsize (screen->vpSize ());
 
184
 
 
185
    GET_DATA;
 
186
 
 
187
    /* Check bounds */
 
188
 
 
189
    if (dx < 0 && vp.x () + dx < 0)
 
190
        return false;
 
191
 
 
192
    if (dx > 0 && vp.x () + dx > (unsigned int) vpsize.width ())
 
193
        return false;
 
194
 
 
195
    if (dy < 0 && vp.y () + dy < 0)
 
196
        return false;
 
197
 
 
198
    if (dy > 0 && vp.y () + dy > (unsigned int) vpsize.height ())
 
199
        return false;
 
200
 
 
201
    gotovp (vp.x () + dx, vp.y () + dy);
 
202
 
 
203
    return true;
 
204
}
 
205
 
 
206
/* Handle viewport number switch key events */
 
207
void
 
208
VPSwitchScreen::handleEvent (XEvent *event)
 
209
{
 
210
    switch (event->type)
 
211
    {
 
212
    case KeyPress:
 
213
        KeySym       pressedKeySym;
 
214
        unsigned int mods;
 
215
        int          i, row;
 
216
 
 
217
        if (!numberedActive)
 
218
            break;
 
219
 
 
220
        pressedKeySym = XLookupKeysym (&event->xkey, 0);
 
221
        mods = modHandler->keycodeToModifiers (event->xkey.keycode);
 
222
        if (mods & CompNumLockMask)
 
223
            row = 1; /* use first row of lookup table */
 
224
        else
 
225
            row = 2;
 
226
 
 
227
        for (i = 0; i < 10; i++)
 
228
        {
 
229
            /* first try to handle normal number keys */
 
230
            if (numberKeySyms[0][i] == pressedKeySym)
 
231
            {
 
232
                destination *= 10;
 
233
                destination += i;
 
234
                break;
 
235
            }
 
236
            else
 
237
            {
 
238
                if (numberKeySyms[row][i] == pressedKeySym)
 
239
                {
 
240
                    destination *= 10;
 
241
                    destination += i;
 
242
                    break;
 
243
                }
 
244
            }
 
245
        }
 
246
    }
 
247
 
 
248
    screen->handleEvent (event);
 
249
}
 
250
 
 
251
 
 
252
bool
 
253
VPSwitchScreen::initiateNumbered (CompAction         *action,
 
254
                                  CompAction::State  state,
 
255
                                  CompOption::Vector &options)
 
256
{
 
257
 
 
258
    numberedActive = true;
 
259
 
 
260
    if (state & CompAction::StateInitKey)
 
261
        action->setState (action->state () | CompAction::StateTermKey);
 
262
 
 
263
    return true;
 
264
}
 
265
 
 
266
bool
 
267
VPSwitchScreen::terminateNumbered (CompAction         *action,
 
268
                                   CompAction::State  state,
 
269
                                   CompOption::Vector &options)
 
270
{
 
271
    int        nx, ny;
 
272
    CompSize   vpsize (screen->vpSize ());
 
273
 
 
274
    if (!numberedActive)
 
275
        return false;
 
276
 
 
277
    numberedActive = false;
 
278
 
 
279
    if (destination < 1 ||
 
280
        destination > (int) (vpsize.width () * vpsize.height ()))
 
281
        return false;
 
282
 
 
283
    nx = (destination - 1 ) % vpsize.width ();
 
284
    ny = (destination - 1 ) / vpsize.width ();
 
285
 
 
286
    gotovp (nx, ny);
 
287
 
 
288
    return false;
 
289
}
 
290
 
 
291
/* switch-to-specific viewport stuff */
 
292
 
 
293
bool
 
294
VPSwitchScreen::switchto (CompAction         *action,
 
295
                          CompAction::State  state,
 
296
                          CompOption::Vector &options,
 
297
                          int num)
 
298
{
 
299
 
 
300
    destination = num;
 
301
 
 
302
    numberedActive = true;
 
303
    return terminateNumbered (action, state, options);
 
304
}
 
305
 
 
306
VPSwitchScreen::VPSwitchScreen (CompScreen *screen):
 
307
    PluginClassHandler <VPSwitchScreen, CompScreen> (screen),
 
308
    destination (0),
 
309
    numberedActive (false)
 
310
{
 
311
    ScreenInterface::setHandler (screen);
 
312
 
 
313
#define directionBind(name, dx, dy)                                            \
 
314
    optionSet##name##ButtonInitiate (boost::bind (&VPSwitchScreen::movevp,     \
 
315
                                                  this, _1, _2, _3, dx, dy))
 
316
 
 
317
    directionBind (Left, -1, 0);
 
318
    directionBind (Right, 1, 0);
 
319
    directionBind (Up, 0, -1);
 
320
    directionBind (Down, 0, 1);
 
321
 
 
322
#undef directionBind
 
323
 
 
324
#define numberedBind(num)                                                     \
 
325
    optionSetSwitchTo##num##KeyInitiate (boost::bind (&VPSwitchScreen::switchto, \
 
326
                                                      this, _1, _2, _3, num))
 
327
 
 
328
    /* Note: get actions in multi-lists, this is ugly */
 
329
 
 
330
    numberedBind (1);
 
331
    numberedBind (2);
 
332
    numberedBind (3);
 
333
    numberedBind (4);
 
334
    numberedBind (5);
 
335
    numberedBind (6);
 
336
    numberedBind (7);
 
337
    numberedBind (8);
 
338
    numberedBind (9);
 
339
    numberedBind (10);
 
340
 
 
341
#undef numberedBind
 
342
 
 
343
    optionSetBeginKeyInitiate (boost::bind(&VPSwitchScreen::initiateNumbered,
 
344
                                           this, _1, _2, _3));
 
345
    optionSetBeginKeyTerminate (boost::bind (&VPSwitchScreen::terminateNumbered,
 
346
                                              this, _1, _2, _3));
 
347
 
 
348
    optionSetNextButtonInitiate (boost::bind
 
349
                                        (&VPSwitchScreen::next,
 
350
                                         this, _1, _2, _3));
 
351
    optionSetPrevButtonInitiate (boost::bind 
 
352
                                        (&VPSwitchScreen::prev,
 
353
                                         this, _1, _2, _3));
 
354
    optionSetInitiateButtonInitiate (boost::bind 
 
355
                                        (&VPSwitchScreen::initPluginAction,
 
356
                                         this, _1, _2, _3));
 
357
    optionSetInitiateButtonTerminate (boost::bind
 
358
                                        (&VPSwitchScreen::termPluginAction,
 
359
                                         this, _1, _2, _3));
 
360
}
 
361
 
 
362
bool
 
363
VPSwitchPluginVTable::init ()
 
364
{
 
365
    if (!CompPlugin::checkPluginABI ("core", CORE_ABIVERSION))
 
366
        return false;
 
367
 
 
368
    return true;
 
369
}