~smspillaz/compiz-plugins-main/compiz-plugins-main.work_923683

« back to all changes in this revision

Viewing changes to ring/src/ring.h

  • Committer: Sam Spilsbury
  • Date: 2011-08-12 06:41:38 UTC
  • Revision ID: sam.spilsbury@canonical.com-20110812064138-sg45sswip9zgk0og
Sync in changes from upstream

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 *
 
3
 * Compiz ring switcher plugin
 
4
 *
 
5
 * ring.h
 
6
 *
 
7
 * Copyright : (C) 2007 by Danny Baumann
 
8
 * E-mail    : maniac@opencompositing.org
 
9
 *
 
10
 * Based on scale.c and switcher.c:
 
11
 * Copyright : (C) 2007 David Reveman
 
12
 * E-mail    : davidr@novell.com
 
13
 *
 
14
 * Ported to Compiz 0.9 by:
 
15
 * Copyright : (C) 2009 Sam Spilsbury
 
16
 * E-mail    : smspillaz@gmail.com
 
17
 *
 
18
 * This program is free software; you can redistribute it and/or
 
19
 * modify it under the terms of the GNU General Public License
 
20
 * as published by the Free Software Foundation; either version 2
 
21
 * of the License, or (at your option) any later version.
 
22
 *
 
23
 * This program is distributed in the hope that it will be useful,
 
24
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
25
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
26
 * GNU General Public License for more details.
 
27
 *
 
28
 */
 
29
 
 
30
#include <cmath>
 
31
 
 
32
#include <core/atoms.h>
 
33
#include <core/core.h>
 
34
#include <composite/composite.h>
 
35
#include <opengl/opengl.h>
 
36
#include <text/text.h>
 
37
 
 
38
#include <X11/Xatom.h>
 
39
 
 
40
#include "ring_options.h"
 
41
 
 
42
extern bool textAvailable;
 
43
 
 
44
class RingScreen :
 
45
    public PluginClassHandler <RingScreen, CompScreen>,
 
46
    public RingOptions,
 
47
    public ScreenInterface,
 
48
    public CompositeScreenInterface,
 
49
    public GLScreenInterface
 
50
{
 
51
    public:
 
52
 
 
53
        RingScreen (CompScreen *screen);
 
54
        ~RingScreen ();
 
55
 
 
56
    public:
 
57
 
 
58
        typedef enum {
 
59
            RingStateNone = 0,
 
60
            RingStateOut = 1,
 
61
            RingStateSwitching = 2,
 
62
            RingStateIn = 3
 
63
        } RingState;
 
64
 
 
65
        typedef enum {
 
66
            RingTypeNormal = 0,
 
67
            RingTypeGroup = 1,
 
68
            RingTypeAll = 2
 
69
        } RingType;
 
70
 
 
71
        class RingSlot {
 
72
            public:
 
73
                int   x, y;            /* thumb center coordinates */
 
74
                float scale;           /* size scale (fit to max thumb size) */
 
75
                float depthScale;      /* scale for depth impression */
 
76
                float depthBrightness; /* brightness for depth impression */
 
77
        };
 
78
 
 
79
        class RingDrawSlot {
 
80
            public:
 
81
                CompWindow *w;
 
82
                RingSlot   **slot;
 
83
        };
 
84
 
 
85
    public:
 
86
 
 
87
        CompositeScreen *cScreen;
 
88
        GLScreen        *gScreen;
 
89
 
 
90
        CompText        mText;
 
91
 
 
92
        CompScreen::GrabHandle mGrabIndex;
 
93
 
 
94
        RingState mState;
 
95
        RingType  mType;
 
96
        bool      mMoreAdjust;
 
97
        bool      mRotateAdjust;
 
98
 
 
99
        int     mRotTarget;
 
100
        int     mRotAdjust;
 
101
        GLfloat mRVelocity;
 
102
 
 
103
        /* only used for sorting */
 
104
        std::vector <CompWindow *>   mWindows;
 
105
        std::vector <RingDrawSlot>   mDrawSlots;
 
106
        int                          mWindowsSize;
 
107
        int                          mNWindows;
 
108
 
 
109
        Window mClientLeader;
 
110
 
 
111
        CompWindow *mSelectedWindow;
 
112
 
 
113
        CompMatch mMatch;
 
114
        CompMatch mCurrentMatch;
 
115
 
 
116
    public:
 
117
 
 
118
        /* Functions that we hook */
 
119
 
 
120
        void
 
121
        handleEvent (XEvent *);
 
122
 
 
123
        void
 
124
        preparePaint (int);
 
125
 
 
126
        bool
 
127
        glPaintOutput (const GLScreenPaintAttrib &,
 
128
                       const GLMatrix            &,
 
129
                       const CompRegion          &,
 
130
                       CompOutput                *,
 
131
                       unsigned int                );
 
132
 
 
133
        void
 
134
        donePaint ();
 
135
 
 
136
    public:
 
137
 
 
138
        /* Internal Functions */
 
139
 
 
140
        void
 
141
        freeWindowTitle ();
 
142
 
 
143
        void
 
144
        renderWindowTitle ();
 
145
 
 
146
        void
 
147
        drawWindowTitle ();
 
148
 
 
149
        bool
 
150
        layoutThumbs ();
 
151
 
 
152
        void
 
153
        addWindowToList (CompWindow *w);
 
154
 
 
155
        bool
 
156
        updateWindowList ();
 
157
 
 
158
        bool
 
159
        createWindowList ();
 
160
 
 
161
        void
 
162
        switchToWindow (bool       toNext);
 
163
 
 
164
        int
 
165
        countWindows ();
 
166
 
 
167
        int
 
168
        adjustRingRotation (float      chunk);
 
169
 
 
170
        bool
 
171
        terminate (CompAction         *action,
 
172
                   CompAction::State  state,
 
173
                   CompOption::Vector options);
 
174
 
 
175
        bool
 
176
        initiate (CompAction         *action,
 
177
                  CompAction::State  state,
 
178
                  CompOption::Vector options);
 
179
 
 
180
        bool
 
181
        doSwitch (CompAction         *action,
 
182
                  CompAction::State  state,
 
183
                  CompOption::Vector options,
 
184
                  bool           nextWindow,
 
185
                  RingType               f_type);
 
186
 
 
187
        void
 
188
        windowSelectAt (int  x,
 
189
                        int  y,
 
190
                        bool f_terminate);
 
191
 
 
192
        void
 
193
        windowRemove (CompWindow *w);
 
194
 
 
195
        void
 
196
        switchActivateEvent (bool);
 
197
 
 
198
};
 
199
 
 
200
class RingWindow :
 
201
    public PluginClassHandler <RingWindow, CompWindow>,
 
202
    public GLWindowInterface,
 
203
    public CompositeWindowInterface
 
204
{
 
205
    public:
 
206
 
 
207
        RingWindow (CompWindow *);
 
208
        ~RingWindow ();
 
209
 
 
210
        CompWindow      *window;
 
211
        CompositeWindow *cWindow;
 
212
        GLWindow        *gWindow;
 
213
 
 
214
        RingScreen::RingSlot *mSlot;
 
215
 
 
216
        GLfloat mXVelocity;
 
217
        GLfloat mYVelocity;
 
218
        GLfloat mScaleVelocity;
 
219
 
 
220
        GLfloat mTx;
 
221
        GLfloat mTy;
 
222
        GLfloat mScale;
 
223
        bool    mAdjust;
 
224
 
 
225
        bool
 
226
        glPaint (const GLWindowPaintAttrib &,
 
227
                 const GLMatrix            &,
 
228
                 const CompRegion          &,
 
229
                 unsigned int                );
 
230
 
 
231
        bool
 
232
        damageRect (bool, const CompRect &);
 
233
 
 
234
        bool
 
235
        is (bool removing = false);
 
236
 
 
237
        static bool
 
238
        compareWindows (CompWindow *w1,
 
239
                        CompWindow *w2);
 
240
 
 
241
        static bool 
 
242
        compareRingWindowDepth (RingScreen::RingDrawSlot e1,
 
243
                                RingScreen::RingDrawSlot e2);
 
244
 
 
245
        int
 
246
        adjustVelocity ();
 
247
};
 
248
 
 
249
#define PI 3.1415926
 
250
#define DIST_ROT (3600 / mWindows.size ())
 
251
#define DIST_ROT_w (3600 / rs->mWindows.size ())
 
252
#define ICON_SIZE 64
 
253
 
 
254
#define RING_SCREEN(s)                                                         \
 
255
    RingScreen *rs = RingScreen::get (s)
 
256
 
 
257
#define RING_WINDOW(w)                                                         \
 
258
    RingWindow *rw = RingWindow::get (w)
 
259
 
 
260
class RingPluginVTable :
 
261
    public CompPlugin::VTableForScreenAndWindow <RingScreen, RingWindow>
 
262
{
 
263
    public:
 
264
 
 
265
        bool init ();
 
266
};