2
* This file is a part of the Cairo-Dock project
4
* Copyright : (C) see the 'copyright' file.
5
* E-mail : see the 'copyright' file.
7
* This program is free software; you can redistribute it and/or
8
* modify it under the terms of the GNU General Public License
9
* as published by the Free Software Foundation; either version 3
10
* of the License, or (at your option) any later version.
12
* This program is distributed in the hope that it will be useful,
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
* GNU General Public License for more details.
16
* You should have received a copy of the GNU General Public License
17
* along with this program. If not, see <http://www.gnu.org/licenses/>.
20
/************************************************************************************
22
This file is a part of the cairo-dock program,
23
released under the terms of the GNU General Public License.
25
Written by Cchumi & Fabrice Rey (for any bug report, please mail me to fabounet@users.berlios.de)
27
************************************************************************************/
29
#include <glib/gstdio.h>
32
#include "applet-struct.h"
33
#include "applet-load-icons.h"
34
#include "applet-draw.h"
36
gboolean my_bRotateIconsOnEllipse = TRUE;
39
static void _cd_switcher_draw_windows_on_viewport (Icon *pIcon, gint *data)
41
if (pIcon == NULL || pIcon->fPersonnalScale > 0)
43
if (pIcon->bIsHidden && ! myConfig.bDisplayHiddenWindows)
45
int iNumDesktop = data[0];
46
int iNumViewportX = data[1];
47
int iNumViewportY = data[2];
48
int iOneViewportWidth = data[3];
49
int iOneViewportHeight = data[4];
50
cairo_t *pCairoContext = GINT_TO_POINTER (data[5]);
52
// On calcule les coordonnees en repere absolu.
53
int x = pIcon->windowGeometry.x; // par rapport au viewport courant.
54
x += myData.switcher.iCurrentViewportX * g_iXScreenWidth[CAIRO_DOCK_HORIZONTAL]; // repere absolu
56
x += g_iNbViewportX * g_iXScreenWidth[CAIRO_DOCK_HORIZONTAL];
57
int y = pIcon->windowGeometry.y;
58
y += myData.switcher.iCurrentViewportY * g_iXScreenHeight[CAIRO_DOCK_HORIZONTAL];
60
y += g_iNbViewportY * g_iXScreenHeight[CAIRO_DOCK_HORIZONTAL];
61
int w = pIcon->windowGeometry.width, h = pIcon->windowGeometry.height;
63
// test d'intersection avec le viewport donne.
64
//g_print (" %s : (%d;%d) %dx%d\n", pIcon->acName, x, y, w, h);
65
if ((pIcon->iNumDesktop != -1 && pIcon->iNumDesktop != iNumDesktop) ||
66
x + w <= iNumViewportX * g_iXScreenWidth[CAIRO_DOCK_HORIZONTAL] ||
67
x >= (iNumViewportX + 1) * g_iXScreenWidth[CAIRO_DOCK_HORIZONTAL] ||
68
y + h <= iNumViewportY * g_iXScreenHeight[CAIRO_DOCK_HORIZONTAL] ||
69
y >= (iNumViewportY + 1) * g_iXScreenHeight[CAIRO_DOCK_HORIZONTAL])
71
//g_print (" > on la dessine (%x)\n", pIcon->pIconBuffer);
73
// on dessine ses traits.
74
cairo_save (pCairoContext);
76
cairo_set_source_rgba (pCairoContext, myConfig.RGBWLineColors[0], myConfig.RGBWLineColors[1], myConfig.RGBWLineColors[2], myConfig.RGBWLineColors[3]);
77
cairo_rectangle (pCairoContext,
78
(1.*x/g_iXScreenWidth[CAIRO_DOCK_HORIZONTAL] - iNumViewportX)*iOneViewportWidth,
79
(1.*y/g_iXScreenHeight[CAIRO_DOCK_HORIZONTAL] - iNumViewportY)*iOneViewportHeight,
80
1.*w/g_iXScreenWidth[CAIRO_DOCK_HORIZONTAL]*iOneViewportWidth,
81
1.*h/g_iXScreenHeight[CAIRO_DOCK_HORIZONTAL]*iOneViewportHeight);
82
if (pIcon->Xid == cairo_dock_get_current_active_window ())
84
//g_print (" %s est la fenetre active\n", pIcon->acName);
85
cairo_fill (pCairoContext);
89
cairo_stroke (pCairoContext);
92
if (pIcon->pIconBuffer != NULL)
94
CairoDock *pParentDock = NULL;
95
pParentDock = cairo_dock_search_dock_from_name (pIcon->cParentDockName);
96
if (pParentDock == NULL)
97
pParentDock = g_pMainDock;
99
cairo_dock_get_icon_extent (pIcon, pParentDock, &iWidth, &iHeight);
100
double fZoomX = (double) w/g_iXScreenWidth[CAIRO_DOCK_HORIZONTAL]*iOneViewportWidth / iWidth;
101
double fZoomY = (double) h/g_iXScreenHeight[CAIRO_DOCK_HORIZONTAL]*iOneViewportHeight / iHeight;
102
double fZoom = MIN (fZoomX, fZoomY); // on garde le ratio.
104
cairo_translate (pCairoContext,
105
(1.*x/g_iXScreenWidth[CAIRO_DOCK_HORIZONTAL] - iNumViewportX)*iOneViewportWidth + (fZoomX - fZoom) * iWidth/2,
106
(1.*y/g_iXScreenHeight[CAIRO_DOCK_HORIZONTAL] - iNumViewportY)*iOneViewportHeight + (fZoomY - fZoom) * iHeight/2);
107
cairo_scale (pCairoContext,
110
cairo_set_source_surface (pCairoContext,
114
cairo_paint (pCairoContext);
117
cairo_restore (pCairoContext);
121
static int _compare_icons_stack_order (Icon *icon1, Icon *icon2)
123
if (icon1 == NULL) // les icones nulles vont a la fin.
127
if (icon1->iStackOrder < icon2->iStackOrder) // ordre petit => dessus => dessinee en dernier.
132
void cd_switcher_draw_main_icon_compact_mode (void)
134
//cd_debug ("%s (%d;%d)", __func__, myData.switcher.iCurrentLine, myData.switcher.iCurrentColumn);
135
// On efface l'icone.
136
cairo_dock_erase_cairo_context (myDrawContext);
138
// definition des parametres de dessin.
139
//double fRatio = (myDock ? myDock->fRatio : 1.);
140
//double fMaxScale = cairo_dock_get_max_scale (myContainer); //coefficient Max icone Width
142
CD_APPLET_GET_MY_ICON_EXTENT (&iWidth, &iHeight);
143
myData.switcher.fOneViewportHeight = (iHeight - 2 * myConfig.iLineSize - (myData.switcher.iNbLines - 1) * myConfig.iInLineSize) / myData.switcher.iNbLines; //hauteur d'un bureau/viewport sans compter les lignes exterieures et interieures.
144
myData.switcher.fOneViewportWidth = (iWidth - 2 * myConfig.iLineSize - (myData.switcher.iNbColumns - 1) * myConfig.iInLineSize) / myData.switcher.iNbColumns; //largeur d'un bureau/viewport sans compter les lignes exterieures et interieures.
146
cairo_surface_t *pSurface = NULL;
147
double fZoomX, fZoomY;
148
if (myConfig.bMapWallpaper)
150
pSurface = cairo_dock_get_desktop_bg_surface ();
151
fZoomX = (double) myData.switcher.fOneViewportWidth / g_iXScreenWidth[CAIRO_DOCK_HORIZONTAL];
152
fZoomY= (double) myData.switcher.fOneViewportHeight / g_iXScreenHeight[CAIRO_DOCK_HORIZONTAL];
154
if (pSurface == NULL)
156
pSurface = myData.pDefaultMapSurface;
157
fZoomX = (double) myData.switcher.fOneViewportWidth / iWidth;
158
fZoomY = (double) myData.switcher.fOneViewportHeight / iHeight;
162
cairo_set_line_width (myDrawContext,myConfig.iLineSize);
163
cairo_set_source_rgba(myDrawContext,myConfig.RGBLineColors[0],myConfig.RGBLineColors[1],myConfig.RGBLineColors[2],myConfig.RGBLineColors[3]);
164
cairo_rectangle(myDrawContext,
165
.5*myConfig.iLineSize,
166
.5*myConfig.iLineSize,
167
iWidth - myConfig.iLineSize,
168
iHeight - myConfig.iLineSize);
170
cairo_stroke (myDrawContext);
172
// lignes interieures.
173
cairo_set_line_width (myDrawContext,myConfig.iInLineSize);
174
cairo_set_source_rgba(myDrawContext,myConfig.RGBInLineColors[0],myConfig.RGBInLineColors[1],myConfig.RGBInLineColors[2],myConfig.RGBInLineColors[3]);
177
for (i = 1; i <myData.switcher.iNbColumns; i ++) // lignes verticales.
179
xi = myConfig.iLineSize + i * (myData.switcher.fOneViewportWidth + myConfig.iInLineSize) - .5*myConfig.iInLineSize;
180
cairo_move_to (myDrawContext, xi, myConfig.iLineSize);
181
cairo_rel_line_to (myDrawContext, 0, iHeight - 2*myConfig.iLineSize);
182
cairo_stroke (myDrawContext);
184
for (j = 1; j < myData.switcher.iNbLines; j ++) // lignes horizontales.
186
yj = myConfig.iLineSize + j * (myData.switcher.fOneViewportHeight + myConfig.iInLineSize) - .5*myConfig.iInLineSize;
187
cairo_move_to (myDrawContext, myConfig.iLineSize, yj);
188
cairo_rel_line_to (myDrawContext, iWidth - 2*myConfig.iLineSize, 0);
189
cairo_stroke (myDrawContext);
192
GList *pWindowList = NULL;
193
if (myConfig.bDrawWindows)
195
pWindowList = cairo_dock_get_current_applis_list ();
196
pWindowList = g_list_sort (pWindowList, (GCompareFunc) _compare_icons_stack_order);
199
// chaque bureau/viewport.
200
int iNumDesktop=0, iNumViewportX=0, iNumViewportY=0;
201
for (j = 0; j < myData.switcher.iNbLines; j ++)
203
for (i = 0; i < myData.switcher.iNbColumns; i ++)
205
cairo_save (myDrawContext);
207
xi = myConfig.iLineSize + i * (myData.switcher.fOneViewportWidth + myConfig.iInLineSize);
208
yj = myConfig.iLineSize + j * (myData.switcher.fOneViewportHeight + myConfig.iInLineSize);
210
cairo_translate (myDrawContext,
214
cairo_scale (myDrawContext,
217
cairo_set_source_surface (myDrawContext,
221
cairo_paint(myDrawContext);
223
cairo_restore (myDrawContext);
225
if (myConfig.iDrawCurrentDesktopMode == SWICTHER_FILL_INVERTED && (i != myData.switcher.iCurrentColumn || j != myData.switcher.iCurrentLine))
227
cairo_save (myDrawContext);
229
cairo_set_source_rgba (myDrawContext, myConfig.RGBIndColors[0], myConfig.RGBIndColors[1], myConfig.RGBIndColors[2], myConfig.RGBIndColors[3]);
230
cairo_rectangle(myDrawContext,
231
xi - .5*myConfig.iLineSize,
232
yj - .5*myConfig.iLineSize,
233
myData.switcher.fOneViewportWidth + myConfig.iLineSize,
234
myData.switcher.fOneViewportHeight + myConfig.iLineSize);
235
cairo_fill (myDrawContext);
237
cairo_restore (myDrawContext);
240
if (myConfig.bDrawWindows)
242
cairo_save (myDrawContext);
244
cairo_translate (myDrawContext,
247
cairo_set_line_width (myDrawContext, 1.);
248
cairo_rectangle (myDrawContext,
251
myData.switcher.fOneViewportWidth,
252
myData.switcher.fOneViewportHeight);
253
cairo_clip (myDrawContext);
255
//g_print (" dessin des fenetres du bureau (%d;%d;%d) ...\n", iNumDesktop, iNumViewportX, iNumViewportY);
256
gint data[6] = {iNumDesktop, iNumViewportX, iNumViewportY, (int) myData.switcher.fOneViewportWidth, (int) myData.switcher.fOneViewportHeight, GPOINTER_TO_INT (myDrawContext)};
257
g_list_foreach (pWindowList, (GFunc) _cd_switcher_draw_windows_on_viewport, data);
259
cairo_restore (myDrawContext);
263
if (iNumViewportX == g_iNbViewportX)
266
if (iNumViewportY == g_iNbViewportY)
272
// dessin de l'indicateur sur le bureau courant (on le fait maintenant car dans le cas ou la ligne interieure est plus petite que la ligne de l'indicateur, les surfaces suivantes recouvreraient en partie la ligne.
273
if (myConfig.iDrawCurrentDesktopMode != SWICTHER_FILL_INVERTED)
275
i = myData.switcher.iCurrentColumn;
276
j = myData.switcher.iCurrentLine;
277
xi = myConfig.iLineSize + i * (myData.switcher.fOneViewportWidth + myConfig.iInLineSize);
278
yj = myConfig.iLineSize + j * (myData.switcher.fOneViewportHeight + myConfig.iInLineSize);
280
cairo_set_line_width (myDrawContext,myConfig.iLineSize);
281
cairo_set_source_rgba (myDrawContext,myConfig.RGBIndColors[0],myConfig.RGBIndColors[1],myConfig.RGBIndColors[2],myConfig.RGBIndColors[3]);
282
cairo_rectangle(myDrawContext,
283
xi - .5*myConfig.iLineSize,
284
yj - .5*myConfig.iLineSize,
285
myData.switcher.fOneViewportWidth + myConfig.iLineSize,
286
myData.switcher.fOneViewportHeight + myConfig.iLineSize);
288
if (myConfig.iDrawCurrentDesktopMode == SWICTHER_FILL)
289
cairo_fill (myDrawContext);
291
cairo_stroke(myDrawContext);
294
g_list_free (pWindowList); // le contenu appartient a la hash table, mais pas la liste.
296
if (CD_APPLET_MY_CONTAINER_IS_OPENGL)
297
cairo_dock_update_icon_texture (myIcon);
299
CD_APPLET_UPDATE_REFLECT_ON_MY_ICON;
303
void cd_switcher_draw_main_icon_expanded_mode (void)
305
// definition des parametres de dessin.
307
CD_APPLET_GET_MY_ICON_EXTENT (&iWidth, &iHeight);
308
//double fRatio = (myDock ? myDock->fRatio : 1.);
309
//double fMaxScale = cairo_dock_get_max_scale (myContainer); //coefficient Max icone Width
310
myData.switcher.fOneViewportHeight = (iHeight - 2 * myConfig.iLineSize - (myData.switcher.iNbLines - 1) * myConfig.iInLineSize) / myData.switcher.iNbLines; //hauteur d'un bureau/viewport sans compter les lignes exterieures et interieures.
311
myData.switcher.fOneViewportWidth = (iWidth - 2 * myConfig.iLineSize - (myData.switcher.iNbColumns - 1) * myConfig.iInLineSize) / myData.switcher.iNbColumns; //largeur d'un bureau/viewport sans compter les lignes exterieures et interieures.
313
cairo_surface_t *pSurface = NULL;
314
double fZoomX, fZoomY;
315
if (myConfig.bMapWallpaper)
317
cairo_dock_erase_cairo_context (myDrawContext);
319
pSurface = cairo_dock_get_desktop_bg_surface ();
320
fZoomX = 1. * iWidth / g_iXScreenWidth[CAIRO_DOCK_HORIZONTAL];
321
fZoomY= 1. * iHeight / g_iXScreenHeight[CAIRO_DOCK_HORIZONTAL];
322
cairo_translate (myDrawContext,
326
cairo_save (myDrawContext);
327
cairo_scale (myDrawContext,
330
cairo_set_source_surface (myDrawContext,
334
cairo_paint(myDrawContext);
335
cairo_restore (myDrawContext);
337
if (CD_APPLET_MY_CONTAINER_IS_OPENGL)
338
cairo_dock_update_icon_texture (myIcon);
340
CD_APPLET_UPDATE_REFLECT_ON_MY_ICON;
344
CD_APPLET_SET_LOCAL_IMAGE_ON_MY_ICON (MY_APPLET_ICON_FILE);
347
if (myConfig.bDrawWindows)
349
GList *pWindowList = cairo_dock_get_current_applis_list ();
350
pWindowList = g_list_sort (pWindowList, (GCompareFunc) _compare_icons_stack_order);
352
//fMaxScale = (myIcon->pSubDock != NULL ? cairo_dock_get_max_scale (myIcon->pSubDock) : 1);
353
//fRatio = (myIcon->pSubDock != NULL ? myIcon->pSubDock->fRatio : 1);
355
int iNumDesktop=0, iNumViewportX=0, iNumViewportY=0;
356
cairo_t *pCairoContext;
358
CairoContainer *pContainer = CD_APPLET_MY_ICONS_LIST_CONTAINER;
359
GList *pIconsList = CD_APPLET_MY_ICONS_LIST;
361
for (ic = pIconsList; ic != NULL; ic = ic->next)
364
cairo_dock_get_icon_extent (pIcon, pContainer, &iWidth, &iHeight);
366
data[0] = iNumDesktop;
367
data[1] = iNumViewportX;
368
data[2] = iNumViewportY;
371
pCairoContext = cairo_create (pIcon->pIconBuffer);
372
data[5] = GPOINTER_TO_INT (pCairoContext);
373
cairo_set_line_width (pCairoContext, 1.);
374
cairo_set_source_rgba (pCairoContext, myConfig.RGBWLineColors[0], myConfig.RGBWLineColors[1], myConfig.RGBWLineColors[2], myConfig.RGBWLineColors[3]);
376
g_list_foreach (pWindowList, (GFunc) _cd_switcher_draw_windows_on_viewport, data);
379
if (iNumViewportX == g_iNbViewportX)
382
if (iNumViewportY == g_iNbViewportY)
385
cairo_destroy (pCairoContext);
387
g_list_free (pWindowList); // le contenu appartient a la hash table, mais pas la liste.
391
/*Fonction de base pour toutes les autres*/
392
void cd_switcher_draw_main_icon (void)
394
cd_message ("%s (%d)", __func__, myConfig.bCompactView);
395
if (myConfig.bCompactView)
397
cd_switcher_draw_main_icon_compact_mode ();
401
cd_switcher_draw_main_icon_expanded_mode ();
404
CD_APPLET_REDRAW_MY_ICON;
2
* This file is a part of the Cairo-Dock project
4
* Copyright : (C) see the 'copyright' file.
5
* E-mail : see the 'copyright' file.
7
* This program is free software; you can redistribute it and/or
8
* modify it under the terms of the GNU General Public License
9
* as published by the Free Software Foundation; either version 3
10
* of the License, or (at your option) any later version.
12
* This program is distributed in the hope that it will be useful,
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
* GNU General Public License for more details.
16
* You should have received a copy of the GNU General Public License
17
* along with this program. If not, see <http://www.gnu.org/licenses/>.
21
#include <glib/gstdio.h>
24
#include "applet-struct.h"
25
#include "applet-load-icons.h"
26
#include "applet-draw.h"
28
gboolean my_bRotateIconsOnEllipse = TRUE;
31
static void _cd_switcher_draw_windows_on_viewport (Icon *pIcon, gint *data)
33
if (pIcon == NULL || pIcon->fPersonnalScale > 0)
35
if (pIcon->bIsHidden && ! myConfig.bDisplayHiddenWindows)
37
int iNumDesktop = data[0];
38
int iNumViewportX = data[1];
39
int iNumViewportY = data[2];
40
int iOneViewportWidth = data[3];
41
int iOneViewportHeight = data[4];
42
cairo_t *pCairoContext = GINT_TO_POINTER (data[5]);
44
// On calcule les coordonnees en repere absolu.
45
int x = pIcon->windowGeometry.x; // par rapport au viewport courant.
46
x += myData.switcher.iCurrentViewportX * g_iXScreenWidth[CAIRO_DOCK_HORIZONTAL]; // repere absolu
48
x += g_iNbViewportX * g_iXScreenWidth[CAIRO_DOCK_HORIZONTAL];
49
int y = pIcon->windowGeometry.y;
50
y += myData.switcher.iCurrentViewportY * g_iXScreenHeight[CAIRO_DOCK_HORIZONTAL];
52
y += g_iNbViewportY * g_iXScreenHeight[CAIRO_DOCK_HORIZONTAL];
53
int w = pIcon->windowGeometry.width, h = pIcon->windowGeometry.height;
55
// test d'intersection avec le viewport donne.
56
//g_print (" %s : (%d;%d) %dx%d\n", pIcon->cName, x, y, w, h);
57
if ((pIcon->iNumDesktop != -1 && pIcon->iNumDesktop != iNumDesktop) ||
58
x + w <= iNumViewportX * g_iXScreenWidth[CAIRO_DOCK_HORIZONTAL] ||
59
x >= (iNumViewportX + 1) * g_iXScreenWidth[CAIRO_DOCK_HORIZONTAL] ||
60
y + h <= iNumViewportY * g_iXScreenHeight[CAIRO_DOCK_HORIZONTAL] ||
61
y >= (iNumViewportY + 1) * g_iXScreenHeight[CAIRO_DOCK_HORIZONTAL])
63
//g_print (" > on la dessine (%x)\n", pIcon->pIconBuffer);
65
// on dessine ses traits.
66
cairo_save (pCairoContext);
68
cairo_set_source_rgba (pCairoContext, myConfig.RGBWLineColors[0], myConfig.RGBWLineColors[1], myConfig.RGBWLineColors[2], myConfig.RGBWLineColors[3]);
69
cairo_rectangle (pCairoContext,
70
(1.*x/g_iXScreenWidth[CAIRO_DOCK_HORIZONTAL] - iNumViewportX)*iOneViewportWidth,
71
(1.*y/g_iXScreenHeight[CAIRO_DOCK_HORIZONTAL] - iNumViewportY)*iOneViewportHeight,
72
1.*w/g_iXScreenWidth[CAIRO_DOCK_HORIZONTAL]*iOneViewportWidth,
73
1.*h/g_iXScreenHeight[CAIRO_DOCK_HORIZONTAL]*iOneViewportHeight);
74
if (pIcon->Xid == cairo_dock_get_current_active_window ())
76
//g_print (" %s est la fenetre active\n", pIcon->cName);
77
cairo_fill (pCairoContext);
81
cairo_stroke (pCairoContext);
84
if (pIcon->pIconBuffer != NULL)
86
CairoDock *pParentDock = NULL;
87
pParentDock = cairo_dock_search_dock_from_name (pIcon->cParentDockName);
88
if (pParentDock == NULL)
89
pParentDock = g_pMainDock;
91
cairo_dock_get_icon_extent (pIcon, CAIRO_CONTAINER (pParentDock), &iWidth, &iHeight);
92
double fZoomX = (double) w/g_iXScreenWidth[CAIRO_DOCK_HORIZONTAL]*iOneViewportWidth / iWidth;
93
double fZoomY = (double) h/g_iXScreenHeight[CAIRO_DOCK_HORIZONTAL]*iOneViewportHeight / iHeight;
94
double fZoom = MIN (fZoomX, fZoomY); // on garde le ratio.
96
cairo_translate (pCairoContext,
97
(1.*x/g_iXScreenWidth[CAIRO_DOCK_HORIZONTAL] - iNumViewportX)*iOneViewportWidth + (fZoomX - fZoom) * iWidth/2,
98
(1.*y/g_iXScreenHeight[CAIRO_DOCK_HORIZONTAL] - iNumViewportY)*iOneViewportHeight + (fZoomY - fZoom) * iHeight/2);
99
cairo_scale (pCairoContext,
102
cairo_set_source_surface (pCairoContext,
106
cairo_paint (pCairoContext);
109
cairo_restore (pCairoContext);
113
static int _compare_icons_stack_order (Icon *icon1, Icon *icon2)
115
if (icon1 == NULL) // les icones nulles vont a la fin.
119
if (icon1->iStackOrder < icon2->iStackOrder) // ordre petit => dessus => dessinee en dernier.
124
void cd_switcher_draw_main_icon_compact_mode (void)
126
//cd_debug ("%s (%d;%d)", __func__, myData.switcher.iCurrentLine, myData.switcher.iCurrentColumn);
127
// On efface l'icone.
128
cairo_dock_erase_cairo_context (myDrawContext);
130
// definition des parametres de dessin.
131
//double fRatio = (myDock ? myDock->container.fRatio : 1.);
132
//double fMaxScale = cairo_dock_get_max_scale (myContainer); //coefficient Max icone Width
134
CD_APPLET_GET_MY_ICON_EXTENT (&iWidth, &iHeight);
136
myData.switcher.fOneViewportHeight = (iHeight - 2 * myConfig.iLineSize - (myData.switcher.iNbLines - 1) * myConfig.iInLineSize) / myData.switcher.iNbLines; //hauteur d'un bureau/viewport sans compter les lignes exterieures et interieures.
137
myData.switcher.fOneViewportWidth = (iWidth - 2 * myConfig.iLineSize - (myData.switcher.iNbColumns - 1) * myConfig.iInLineSize) / myData.switcher.iNbColumns; //largeur d'un bureau/viewport sans compter les lignes exterieures et interieures.
139
double w = iWidth, h = iHeight;
140
if (myConfig.bPreserveScreenRatio)
142
double r = (double) g_iXScreenWidth[CAIRO_DOCK_HORIZONTAL] / g_iXScreenHeight[CAIRO_DOCK_HORIZONTAL];
143
double r_ = myData.switcher.fOneViewportWidth / myData.switcher.fOneViewportHeight;
144
if (r_ > r) // on etire trop en largeur.
146
myData.switcher.fOneViewportWidth /= r_ / r;
147
dx = iWidth/2 * (1 - r / r_);
152
myData.switcher.fOneViewportHeight /= r / r_;
153
dy = iHeight/2 * (1 - r_ / r);
157
myData.switcher.fOffsetX = dx;
158
myData.switcher.fOffsetY = dy;
160
cairo_save (myDrawContext);
161
cairo_translate (myDrawContext, dx, dy);
163
cairo_surface_t *pSurface = NULL;
164
double fZoomX, fZoomY;
165
if (myConfig.bMapWallpaper)
167
pSurface = cairo_dock_get_desktop_bg_surface ();
168
fZoomX = (double) myData.switcher.fOneViewportWidth / g_iXScreenWidth[CAIRO_DOCK_HORIZONTAL];
169
fZoomY= (double) myData.switcher.fOneViewportHeight / g_iXScreenHeight[CAIRO_DOCK_HORIZONTAL];
171
if (pSurface == NULL)
173
pSurface = myData.pDefaultMapSurface;
174
fZoomX = (double) myData.switcher.fOneViewportWidth / iWidth;
175
fZoomY = (double) myData.switcher.fOneViewportHeight / iHeight;
179
cairo_set_line_width (myDrawContext,myConfig.iLineSize);
180
cairo_set_source_rgba(myDrawContext,myConfig.RGBLineColors[0],myConfig.RGBLineColors[1],myConfig.RGBLineColors[2],myConfig.RGBLineColors[3]);
181
cairo_rectangle(myDrawContext,
182
.5*myConfig.iLineSize,
183
.5*myConfig.iLineSize,
184
w - myConfig.iLineSize,
185
h - myConfig.iLineSize);
187
cairo_stroke (myDrawContext);
189
// lignes interieures.
190
cairo_set_line_width (myDrawContext,myConfig.iInLineSize);
191
cairo_set_source_rgba(myDrawContext,myConfig.RGBInLineColors[0],myConfig.RGBInLineColors[1],myConfig.RGBInLineColors[2],myConfig.RGBInLineColors[3]);
194
for (i = 1; i < myData.switcher.iNbColumns; i ++) // lignes verticales.
196
xi = myConfig.iLineSize + i * (myData.switcher.fOneViewportWidth + myConfig.iInLineSize) - .5*myConfig.iInLineSize;
197
cairo_move_to (myDrawContext, xi, myConfig.iLineSize);
198
cairo_rel_line_to (myDrawContext, 0, h - 2*myConfig.iLineSize);
199
cairo_stroke (myDrawContext);
201
for (j = 1; j < myData.switcher.iNbLines; j ++) // lignes horizontales.
203
yj = myConfig.iLineSize + j * (myData.switcher.fOneViewportHeight + myConfig.iInLineSize) - .5*myConfig.iInLineSize;
204
cairo_move_to (myDrawContext, myConfig.iLineSize, yj);
205
cairo_rel_line_to (myDrawContext, w - 2*myConfig.iLineSize, 0);
206
cairo_stroke (myDrawContext);
209
GList *pWindowList = NULL;
210
if (myConfig.bDrawWindows)
212
pWindowList = cairo_dock_get_current_applis_list ();
213
pWindowList = g_list_sort (pWindowList, (GCompareFunc) _compare_icons_stack_order);
216
// chaque bureau/viewport.
217
int iNumDesktop=0, iNumViewportX=0, iNumViewportY=0;
218
int k = 0, N = g_iNbDesktops * g_iNbViewportX * g_iNbViewportY;
219
for (j = 0; j < myData.switcher.iNbLines; j ++)
221
for (i = 0; i < myData.switcher.iNbColumns; i ++)
223
cairo_save (myDrawContext);
225
xi = myConfig.iLineSize + i * (myData.switcher.fOneViewportWidth + myConfig.iInLineSize);
226
yj = myConfig.iLineSize + j * (myData.switcher.fOneViewportHeight + myConfig.iInLineSize);
228
cairo_translate (myDrawContext,
232
cairo_scale (myDrawContext,
235
cairo_set_source_surface (myDrawContext,
239
cairo_paint(myDrawContext);
241
cairo_restore (myDrawContext);
243
if (myConfig.iDrawCurrentDesktopMode == SWICTHER_FILL_INVERTED && (i != myData.switcher.iCurrentColumn || j != myData.switcher.iCurrentLine))
245
cairo_save (myDrawContext);
247
cairo_set_source_rgba (myDrawContext, myConfig.RGBIndColors[0], myConfig.RGBIndColors[1], myConfig.RGBIndColors[2], myConfig.RGBIndColors[3]);
248
cairo_rectangle(myDrawContext,
249
xi - .5*myConfig.iLineSize,
250
yj - .5*myConfig.iLineSize,
251
myData.switcher.fOneViewportWidth + myConfig.iLineSize,
252
myData.switcher.fOneViewportHeight + myConfig.iLineSize);
253
cairo_fill (myDrawContext);
255
cairo_restore (myDrawContext);
258
if (myConfig.bDrawWindows)
260
cairo_save (myDrawContext);
262
cairo_translate (myDrawContext,
265
cairo_set_line_width (myDrawContext, 1.);
266
cairo_rectangle (myDrawContext,
269
myData.switcher.fOneViewportWidth,
270
myData.switcher.fOneViewportHeight);
271
cairo_clip (myDrawContext);
273
//g_print (" dessin des fenetres du bureau (%d;%d;%d) ...\n", iNumDesktop, iNumViewportX, iNumViewportY);
274
gint data[6] = {iNumDesktop, iNumViewportX, iNumViewportY, (int) myData.switcher.fOneViewportWidth, (int) myData.switcher.fOneViewportHeight, GPOINTER_TO_INT (myDrawContext)};
275
g_list_foreach (pWindowList, (GFunc) _cd_switcher_draw_windows_on_viewport, data);
277
cairo_restore (myDrawContext);
281
if (iNumViewportX == g_iNbViewportX)
284
if (iNumViewportY == g_iNbViewportY)
293
// dessin de l'indicateur sur le bureau courant (on le fait maintenant car dans le cas ou la ligne interieure est plus petite que la ligne de l'indicateur, les surfaces suivantes recouvreraient en partie la ligne.
294
if (myConfig.iDrawCurrentDesktopMode != SWICTHER_FILL_INVERTED)
296
i = myData.switcher.iCurrentColumn;
297
j = myData.switcher.iCurrentLine;
298
xi = myConfig.iLineSize + i * (myData.switcher.fOneViewportWidth + myConfig.iInLineSize);
299
yj = myConfig.iLineSize + j * (myData.switcher.fOneViewportHeight + myConfig.iInLineSize);
301
cairo_set_line_width (myDrawContext,myConfig.iLineSize);
302
cairo_set_source_rgba (myDrawContext,myConfig.RGBIndColors[0],myConfig.RGBIndColors[1],myConfig.RGBIndColors[2],myConfig.RGBIndColors[3]);
303
cairo_rectangle(myDrawContext,
304
xi - .5*myConfig.iLineSize,
305
yj - .5*myConfig.iLineSize,
306
myData.switcher.fOneViewportWidth + myConfig.iLineSize,
307
myData.switcher.fOneViewportHeight + myConfig.iLineSize);
309
if (myConfig.iDrawCurrentDesktopMode == SWICTHER_FILL)
310
cairo_fill (myDrawContext);
312
cairo_stroke(myDrawContext);
315
cairo_restore (myDrawContext);
316
g_list_free (pWindowList); // le contenu appartient a la hash table, mais pas la liste.
318
if (CD_APPLET_MY_CONTAINER_IS_OPENGL)
319
cairo_dock_update_icon_texture (myIcon);
321
CD_APPLET_UPDATE_REFLECT_ON_MY_ICON;
325
void cd_switcher_draw_main_icon_expanded_mode (void)
327
// definition des parametres de dessin.
329
CD_APPLET_GET_MY_ICON_EXTENT (&iWidth, &iHeight);
330
//double fRatio = (myDock ? myDock->container.fRatio : 1.);
331
//double fMaxScale = cairo_dock_get_max_scale (myContainer); //coefficient Max icone Width
332
myData.switcher.fOneViewportHeight = (iHeight - 2 * myConfig.iLineSize - (myData.switcher.iNbLines - 1) * myConfig.iInLineSize) / myData.switcher.iNbLines; //hauteur d'un bureau/viewport sans compter les lignes exterieures et interieures.
333
myData.switcher.fOneViewportWidth = (iWidth - 2 * myConfig.iLineSize - (myData.switcher.iNbColumns - 1) * myConfig.iInLineSize) / myData.switcher.iNbColumns; //largeur d'un bureau/viewport sans compter les lignes exterieures et interieures.
335
cairo_surface_t *pSurface = NULL;
336
double fZoomX, fZoomY;
337
if (myConfig.bMapWallpaper)
339
cairo_dock_erase_cairo_context (myDrawContext);
341
pSurface = cairo_dock_get_desktop_bg_surface ();
342
fZoomX = 1. * iWidth / g_iXScreenWidth[CAIRO_DOCK_HORIZONTAL];
343
fZoomY= 1. * iHeight / g_iXScreenHeight[CAIRO_DOCK_HORIZONTAL];
344
cairo_translate (myDrawContext,
348
cairo_save (myDrawContext);
349
cairo_scale (myDrawContext,
352
cairo_set_source_surface (myDrawContext,
356
cairo_paint(myDrawContext);
357
cairo_restore (myDrawContext);
359
if (CD_APPLET_MY_CONTAINER_IS_OPENGL)
360
cairo_dock_update_icon_texture (myIcon);
362
CD_APPLET_UPDATE_REFLECT_ON_MY_ICON;
366
CD_APPLET_SET_LOCAL_IMAGE_ON_MY_ICON (MY_APPLET_ICON_FILE);
369
if (myConfig.bDrawWindows)
371
GList *pWindowList = cairo_dock_get_current_applis_list ();
372
pWindowList = g_list_sort (pWindowList, (GCompareFunc) _compare_icons_stack_order);
374
//fMaxScale = (myIcon->pSubDock != NULL ? cairo_dock_get_max_scale (myIcon->pSubDock) : 1);
375
//fRatio = (myIcon->pSubDock != NULL ? myIcon->pSubDock->container.fRatio : 1);
377
int iNumDesktop=0, iNumViewportX=0, iNumViewportY=0;
378
cairo_t *pCairoContext;
380
CairoContainer *pContainer = CD_APPLET_MY_ICONS_LIST_CONTAINER;
381
GList *pIconsList = CD_APPLET_MY_ICONS_LIST;
383
for (ic = pIconsList; ic != NULL; ic = ic->next)
386
cairo_dock_get_icon_extent (pIcon, pContainer, &iWidth, &iHeight);
388
data[0] = iNumDesktop;
389
data[1] = iNumViewportX;
390
data[2] = iNumViewportY;
393
pCairoContext = cairo_create (pIcon->pIconBuffer);
394
data[5] = GPOINTER_TO_INT (pCairoContext);
395
cairo_set_line_width (pCairoContext, 1.);
396
cairo_set_source_rgba (pCairoContext, myConfig.RGBWLineColors[0], myConfig.RGBWLineColors[1], myConfig.RGBWLineColors[2], myConfig.RGBWLineColors[3]);
398
g_list_foreach (pWindowList, (GFunc) _cd_switcher_draw_windows_on_viewport, data);
401
if (iNumViewportX == g_iNbViewportX)
404
if (iNumViewportY == g_iNbViewportY)
407
cairo_destroy (pCairoContext);
409
g_list_free (pWindowList); // le contenu appartient a la hash table, mais pas la liste.
413
/*Fonction de base pour toutes les autres*/
414
void cd_switcher_draw_main_icon (void)
416
cd_message ("%s (%d)", __func__, myConfig.bCompactView);
417
if (myConfig.bCompactView)
419
cd_switcher_draw_main_icon_compact_mode ();
423
cd_switcher_draw_main_icon_expanded_mode ();
426
CD_APPLET_REDRAW_MY_ICON;
430
void cd_switcher_draw_desktops_bounding_box (CairoDesklet *pDesklet)
432
//g_print ("%s ()\n", __func__);
434
glTranslatef (-pDesklet->container.iWidth/2, -pDesklet->container.iHeight/2, 0.);
436
w = myData.switcher.fOneViewportWidth/2;
437
h = myData.switcher.fOneViewportHeight/2;
439
int k = 0, N = g_iNbDesktops * g_iNbViewportX * g_iNbViewportY;
441
for (j = 0; j < myData.switcher.iNbLines; j ++) // lignes horizontales.
443
y = myConfig.iLineSize + j * (myData.switcher.fOneViewportHeight + myConfig.iInLineSize) - .5*myConfig.iInLineSize;
444
y = pDesklet->container.iHeight - (y + h + myData.switcher.fOffsetY);
446
for (i = 0; i < myData.switcher.iNbColumns; i ++) // lignes verticales.
448
x = myConfig.iLineSize + i * (myData.switcher.fOneViewportWidth + myConfig.iInLineSize) - .5*myConfig.iInLineSize;
449
x += w + myData.switcher.fOffsetX;
451
glLoadName(i * myData.switcher.iNbLines + j + 1); // +1 pour ne pas avoir 0.
454
glVertex3f(x-w, y+h, 0.);
455
glVertex3f(x+w, y+h, 0.);
456
glVertex3f(x+w, y-h, 0.);
457
glVertex3f(x-w, y-h, 0.);
467
void cd_switcher_extract_viewport_coords_from_picked_object (CairoDesklet *pDesklet, int *iCoordX, int *iCoordY)
469
//g_print ("%s (%d)\n", __func__, pDesklet->iPickedObject);
470
if (pDesklet->iPickedObject != 0)
472
pDesklet->iPickedObject --; // cf le +1
474
i = pDesklet->iPickedObject / myData.switcher.iNbLines;
475
j = pDesklet->iPickedObject % myData.switcher.iNbLines;
476
//g_print ("bureau (%d;%d)\n", i, j);
479
w = myData.switcher.fOneViewportWidth/2;
480
h = myData.switcher.fOneViewportHeight/2;
481
x = myConfig.iLineSize + i * (myData.switcher.fOneViewportWidth + myConfig.iInLineSize) - .5*myConfig.iInLineSize;
482
x += w + myData.switcher.fOffsetX;
483
y = myConfig.iLineSize + j * (myData.switcher.fOneViewportHeight + myConfig.iInLineSize) - .5*myConfig.iInLineSize;
484
y += h + myData.switcher.fOffsetY;
491
static void _show_window (GtkMenuItem *menu_item, Icon *pIcon)
493
cairo_dock_show_xwindow (pIcon->Xid);
495
static void _cd_switcher_list_windows_on_viewport (Icon *pIcon, gint *pData)
497
if (pIcon == NULL || pIcon->fPersonnalScale > 0)
499
int iNumDesktop = pData[0];
500
int iNumViewportX = pData[1];
501
int iNumViewportY = pData[2];
502
int iOneViewportWidth = pData[3];
503
int iOneViewportHeight = pData[4];
504
GtkWidget *pMenu = GINT_TO_POINTER (pData[5]);
506
// On calcule les coordonnees en repere absolu.
507
int x = pIcon->windowGeometry.x; // par rapport au viewport courant.
508
x += myData.switcher.iCurrentViewportX * g_iXScreenWidth[CAIRO_DOCK_HORIZONTAL]; // repere absolu
510
x += g_iNbViewportX * g_iXScreenWidth[CAIRO_DOCK_HORIZONTAL];
511
int y = pIcon->windowGeometry.y;
512
y += myData.switcher.iCurrentViewportY * g_iXScreenHeight[CAIRO_DOCK_HORIZONTAL];
514
y += g_iNbViewportY * g_iXScreenHeight[CAIRO_DOCK_HORIZONTAL];
515
int w = pIcon->windowGeometry.width, h = pIcon->windowGeometry.height;
517
// test d'intersection avec le viewport donne.
518
if ((pIcon->iNumDesktop != -1 && pIcon->iNumDesktop != iNumDesktop) ||
519
x + w <= iNumViewportX * g_iXScreenWidth[CAIRO_DOCK_HORIZONTAL] ||
520
x >= (iNumViewportX + 1) * g_iXScreenWidth[CAIRO_DOCK_HORIZONTAL] ||
521
y + h <= iNumViewportY * g_iXScreenHeight[CAIRO_DOCK_HORIZONTAL] ||
522
y >= (iNumViewportY + 1) * g_iXScreenHeight[CAIRO_DOCK_HORIZONTAL])
524
if (!pIcon->pIconBuffer)
527
g_print ("%s\n", pIcon->cName);
528
CairoDock *pParentDock = NULL;
529
pParentDock = cairo_dock_search_dock_from_name (pIcon->cParentDockName);
530
if (pParentDock == NULL)
531
pParentDock = g_pMainDock;
533
cairo_dock_get_icon_extent (pIcon, CAIRO_CONTAINER (pParentDock), &iWidth, &iHeight);
536
cairo_surface_t *surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24,
539
cairo_t *pCairoContext = cairo_create (surface);
540
cairo_scale (pCairoContext, (double)w/iWidth, (double)h/iHeight);
541
cairo_set_source_surface (pCairoContext, pIcon->pIconBuffer, 0., 0.);
542
cairo_paint (pCairoContext);
543
cairo_destroy (pCairoContext);
544
guchar *d, *data = cairo_image_surface_get_data (surface);
545
int r = cairo_image_surface_get_stride (surface);
547
GdkPixbuf *pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB,
552
guchar *p, *pixels = gdk_pixbuf_get_pixels (pixbuf);
553
int iNbChannels = gdk_pixbuf_get_n_channels (pixbuf);
554
int iRowstride = gdk_pixbuf_get_rowstride (pixbuf);
556
int red, green, blue;
558
for (y = 0; y < h; y ++)
560
for (x = 0; x < w; x ++)
562
p = pixels + y * iRowstride + x * iNbChannels;
563
d = data + y * r + x * 4;
565
fAlphaFactor = (float) d[3] / 255;
566
if (fAlphaFactor != 0)
568
red = d[0] / fAlphaFactor;
569
green = d[1] / fAlphaFactor;
570
blue = d[2] / fAlphaFactor;
574
red = blue = green = 0;
583
cairo_surface_destroy (surface);
585
GtkWidget *pMenuItem = gtk_image_menu_item_new_with_label (pIcon->cName);
586
GtkWidget *image = gtk_image_new_from_pixbuf (pixbuf);
587
gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (pMenuItem), image);
588
gtk_menu_shell_append (GTK_MENU_SHELL (pMenu), pMenuItem);
589
g_signal_connect (G_OBJECT (pMenuItem), "activate", G_CALLBACK (_show_window), pIcon);
591
g_object_unref (pixbuf);
593
void cd_switcher_build_windows_list (GtkWidget *pMenu)
595
GList *pWindowList = NULL;
596
pWindowList = cairo_dock_get_current_applis_list ();
597
pWindowList = g_list_sort (pWindowList, (GCompareFunc) _compare_icons_stack_order);
599
// chaque bureau/viewport.
600
int iNumDesktop=0, iNumViewportX=0, iNumViewportY=0;
601
int k = 0, N = g_iNbDesktops * g_iNbViewportX * g_iNbViewportY;
603
for (j = 0; j < myData.switcher.iNbLines; j ++)
605
for (i = 0; i < myData.switcher.iNbColumns; i ++)
607
g_print (" listing des fenetres du bureau (%d;%d;%d) ...\n", iNumDesktop, iNumViewportX, iNumViewportY);
608
gint data[6] = {iNumDesktop, iNumViewportX, iNumViewportY, (int) myData.switcher.fOneViewportWidth, (int) myData.switcher.fOneViewportHeight, GPOINTER_TO_INT (pMenu)};
609
g_list_foreach (pWindowList, (GFunc) _cd_switcher_list_windows_on_viewport, data);
611
GtkWidget *pMenuItem = gtk_separator_menu_item_new ();
612
gtk_menu_shell_append(GTK_MENU_SHELL (pMenu), pMenuItem); /// recuperer les noms des bureaux...
613
g_print ("-----------------\n");
616
if (iNumViewportX == g_iNbViewportX)
619
/// _NET_DESKTOP_NAMES, UTF8_STRING
622
if (iNumViewportY == g_iNbViewportY)