30
30
cairo_dock_get_current_desktop_and_viewport (&myData.switcher.iCurrentDesktop, &myData.switcher.iCurrentViewportX, &myData.switcher.iCurrentViewportY);
31
31
//g_print ("%s () -> %d;%d;%d\n", __func__, myData.switcher.iCurrentDesktop, myData.switcher.iCurrentViewportX, myData.switcher.iCurrentViewportY);
33
myData.switcher.iNbViewportTotal = g_iNbDesktops * g_iNbViewportX * g_iNbViewportY;
33
myData.switcher.iNbViewportTotal = g_desktopGeometry.iNbDesktops * g_desktopGeometry.iNbViewportX * g_desktopGeometry.iNbViewportY;
35
35
cd_switcher_compute_desktop_coordinates (myData.switcher.iCurrentDesktop, myData.switcher.iCurrentViewportX, myData.switcher.iCurrentViewportY, &myData.switcher.iCurrentLine, &myData.switcher.iCurrentColumn);
43
43
//g_print ("%s (%d)\n", __func__, iNbViewports);
44
44
double fZoomX, fZoomY;
45
45
int iNbLines, iNbDesktopByLine;
47
if (myConfig.bPreserveScreenRatio) // on va chercher a minimiser la deformation de l'image de fond d'ecran.
48
///if (myConfig.bPreserveScreenRatio) // on va chercher a minimiser la deformation de l'image de fond d'ecran.
51
cairo_dock_get_icon_extent (myIcon, myContainer, &w, &h);
49
52
double fRatio, fMinRatio=9999;
50
53
for (iNbLines = 1; iNbLines <= iNbViewports; iNbLines ++)
52
if (iNbViewports % iNbLines != 0)
55
///if (iNbViewports % iNbLines != 0)
54
57
iNbDesktopByLine = iNbViewports / iNbLines;
55
fZoomX = myIcon->fWidth / (iNbDesktopByLine * g_iXScreenWidth[CAIRO_DOCK_HORIZONTAL]);
56
fZoomY = myIcon->fHeight / (iNbLines * g_iXScreenHeight[CAIRO_DOCK_HORIZONTAL]);
58
fZoomX = (double)w / (iNbDesktopByLine * g_desktopGeometry.iXScreenWidth[CAIRO_DOCK_HORIZONTAL]);
59
fZoomY = (double)h / (iNbLines * g_desktopGeometry.iXScreenHeight[CAIRO_DOCK_HORIZONTAL]);
57
60
fRatio = (fZoomX > fZoomY ? fZoomX / fZoomY : fZoomY / fZoomX); // ratio ramene dans [1, inf].
58
61
//cd_debug ("%d lignes => fRatio: %.2f", iNbLines, fRatio);
59
62
if (fRatio < fMinRatio)
76
79
*iBestNbLines = (int) ceil (sqrt (iNbViewports));
77
80
*iBestNbColumns = (int) ceil ((double)iNbViewports / (*iBestNbLines));
81
85
void cd_switcher_compute_nb_lines_and_columns (void)
83
if (g_iNbDesktops > 1) // plusieurs bureaux simples (Metacity) ou etendus (Compiz avec 2 cubes).
87
if (g_desktopGeometry.iNbDesktops > 1) // plusieurs bureaux simples (Metacity) ou etendus (Compiz avec 2 cubes).
85
if (g_iNbViewportX * g_iNbViewportY > 1) // plusieurs bureaux etendus (Compiz avec N cubes).
89
if (g_desktopGeometry.iNbViewportX * g_desktopGeometry.iNbViewportY > 1) // plusieurs bureaux etendus (Compiz avec N cubes).
87
myData.switcher.iNbLines = g_iNbDesktops; // on respecte l'agencement de l'utilisateur (groupement par bureau).
88
myData.switcher.iNbColumns = g_iNbViewportX * g_iNbViewportY;
91
myData.switcher.iNbLines = g_desktopGeometry.iNbDesktops; // on respecte l'agencement de l'utilisateur (groupement par bureau).
92
myData.switcher.iNbColumns = g_desktopGeometry.iNbViewportX * g_desktopGeometry.iNbViewportY;
90
94
else // plusieurs bureaux simples (Metacity)
92
_cd_switcher_get_best_agencement (g_iNbDesktops, &myData.switcher.iNbLines, &myData.switcher.iNbColumns);
96
_cd_switcher_get_best_agencement (g_desktopGeometry.iNbDesktops, &myData.switcher.iNbLines, &myData.switcher.iNbColumns);
95
99
else // un seul bureau etendu.
97
if (g_iNbViewportY > 1) // desktop wall.
101
if (g_desktopGeometry.iNbViewportY > 1) // desktop wall.
99
myData.switcher.iNbLines = g_iNbViewportY; // on respecte l'agencement de l'utilisateur.
100
myData.switcher.iNbColumns = g_iNbViewportX;
103
myData.switcher.iNbLines = g_desktopGeometry.iNbViewportY; // on respecte l'agencement de l'utilisateur.
104
myData.switcher.iNbColumns = g_desktopGeometry.iNbViewportX;
104
_cd_switcher_get_best_agencement (g_iNbViewportX, &myData.switcher.iNbLines, &myData.switcher.iNbColumns);
108
_cd_switcher_get_best_agencement (g_desktopGeometry.iNbViewportX, &myData.switcher.iNbLines, &myData.switcher.iNbColumns);
107
111
myData.iPrevIndexHovered = -1; // cela invalide le dernier bureau survole.
113
117
g_return_if_fail (myData.switcher.iNbColumns != 0);
114
118
//cd_debug ("%s (%d;%d)", __func__, iNumViewportX, iNumViewportY);
115
if (g_iNbDesktops > 1) // plusieurs bureaux simples (Metacity) ou etendus (Compiz avec 2 cubes).
119
if (g_desktopGeometry.iNbDesktops > 1) // plusieurs bureaux simples (Metacity) ou etendus (Compiz avec 2 cubes).
117
if (g_iNbViewportX * g_iNbViewportY > 1) // plusieurs bureaux etendus (Compiz avec N cubes).
121
if (g_desktopGeometry.iNbViewportX * g_desktopGeometry.iNbViewportY > 1) // plusieurs bureaux etendus (Compiz avec N cubes).
119
123
*iNumLine = iNumDesktop;
120
*iNumColumn = iNumViewportY * g_iNbViewportX + iNumViewportX;
124
*iNumColumn = iNumViewportY * g_desktopGeometry.iNbViewportX + iNumViewportX;
122
126
else // plusieurs bureaux simples (Metacity)
128
132
else // un seul bureau etendu.
130
if (g_iNbViewportY > 1) // desktop wall.
134
if (g_desktopGeometry.iNbViewportY > 1) // desktop wall.
132
136
*iNumLine = iNumViewportY;
133
137
*iNumColumn = iNumViewportX;
144
148
void cd_switcher_compute_desktop_from_coordinates (int iNumLine, int iNumColumn, int *iNumDesktop, int *iNumViewportX, int *iNumViewportY)
146
if (g_iNbDesktops > 1) // plusieurs bureaux simples (Metacity) ou etendus (Compiz avec 2 cubes).
150
if (g_desktopGeometry.iNbDesktops > 1) // plusieurs bureaux simples (Metacity) ou etendus (Compiz avec 2 cubes).
148
if (g_iNbViewportX * g_iNbViewportY > 1) // plusieurs bureaux etendus (Compiz avec N cubes).
152
if (g_desktopGeometry.iNbViewportX * g_desktopGeometry.iNbViewportY > 1) // plusieurs bureaux etendus (Compiz avec N cubes).
150
154
*iNumDesktop = iNumLine;
151
*iNumViewportX = iNumColumn % g_iNbViewportX;
152
*iNumViewportY = iNumColumn / g_iNbViewportX;
155
*iNumViewportX = iNumColumn % g_desktopGeometry.iNbViewportX;
156
*iNumViewportY = iNumColumn / g_desktopGeometry.iNbViewportX;
154
158
else // plusieurs bureaux simples (Metacity)
161
165
else // un seul bureau etendu.
163
167
*iNumDesktop = 0;
164
if (g_iNbViewportY > 1) // desktop wall.
168
if (g_desktopGeometry.iNbViewportY > 1) // desktop wall.
166
170
*iNumViewportX = iNumColumn;
167
171
*iNumViewportY = iNumLine;
178
182
int cd_switcher_compute_index (int iNumDesktop, int iNumViewportX, int iNumViewportY)
180
return iNumDesktop * g_iNbViewportX * g_iNbViewportY + iNumViewportX * g_iNbViewportY + iNumViewportY;
184
return iNumDesktop * g_desktopGeometry.iNbViewportX * g_desktopGeometry.iNbViewportY + iNumViewportX * g_desktopGeometry.iNbViewportY + iNumViewportY;
183
187
void cd_switcher_compute_viewports_from_index (int iIndex, int *iNumDesktop, int *iNumViewportX, int *iNumViewportY)
185
if (g_iNbViewportX == 0 || g_iNbViewportY == 0) // des fois (chgt de resolution sous Compiz), le rafraichissement se passe mal, on le force donc ici pour eviter une division par 0.
189
if (g_desktopGeometry.iNbViewportX == 0 || g_desktopGeometry.iNbViewportY == 0) // des fois (chgt de resolution sous Compiz), le rafraichissement se passe mal, on le force donc ici pour eviter une division par 0.
187
191
cd_switcher_refresh_desktop_values (myApplet);
189
g_return_if_fail (g_iNbViewportX > 0 && g_iNbViewportY > 0);
193
g_return_if_fail (g_desktopGeometry.iNbViewportX > 0 && g_desktopGeometry.iNbViewportY > 0);
191
*iNumDesktop = iIndex / (g_iNbViewportX * g_iNbViewportY);
192
int index2 = iIndex % (g_iNbViewportX * g_iNbViewportY);
193
*iNumViewportX = index2 / g_iNbViewportY;
194
*iNumViewportY = index2 % g_iNbViewportY;
195
*iNumDesktop = iIndex / (g_desktopGeometry.iNbViewportX * g_desktopGeometry.iNbViewportY);
196
int index2 = iIndex % (g_desktopGeometry.iNbViewportX * g_desktopGeometry.iNbViewportY);
197
*iNumViewportX = index2 / g_desktopGeometry.iNbViewportY;
198
*iNumViewportY = index2 % g_desktopGeometry.iNbViewportY;
195
199
//g_print (" -> %d;%d;%d\n", *iNumDesktop, *iNumViewportX, *iNumViewportY);
199
203
static void cd_switcher_change_nb_desktops (int iDeltaNbDesktops)
201
if (g_iNbDesktops >= g_iNbViewportX * g_iNbViewportY)
205
if (g_desktopGeometry.iNbDesktops >= g_desktopGeometry.iNbViewportX * g_desktopGeometry.iNbViewportY)
203
cairo_dock_set_nb_desktops (g_iNbDesktops + iDeltaNbDesktops);
207
cairo_dock_set_nb_desktops (g_desktopGeometry.iNbDesktops + iDeltaNbDesktops);
207
if (g_iNbViewportX >= g_iNbViewportY)
208
cairo_dock_set_nb_viewports (g_iNbViewportX + iDeltaNbDesktops, g_iNbViewportY);
211
if (g_desktopGeometry.iNbViewportX >= g_desktopGeometry.iNbViewportY)
212
cairo_dock_set_nb_viewports (g_desktopGeometry.iNbViewportX + iDeltaNbDesktops, g_desktopGeometry.iNbViewportY);
210
cairo_dock_set_nb_viewports (g_iNbViewportX, g_iNbViewportY + iDeltaNbDesktops);
214
cairo_dock_set_nb_viewports (g_desktopGeometry.iNbViewportX, g_desktopGeometry.iNbViewportY + iDeltaNbDesktops);
240
244
gboolean cd_switcher_refresh_desktop_values (CairoDockModuleInstance *myApplet)
242
g_iNbDesktops = cairo_dock_get_nb_desktops ();
243
cairo_dock_get_nb_viewports (&g_iNbViewportX, &g_iNbViewportY);
246
g_desktopGeometry.iNbDesktops = cairo_dock_get_nb_desktops ();
247
cairo_dock_get_nb_viewports (&g_desktopGeometry.iNbViewportX, &g_desktopGeometry.iNbViewportY);
248
g_print ("refresh -> %d/%d/%d\n", g_desktopGeometry.iNbDesktops, g_desktopGeometry.iNbViewportX, g_desktopGeometry.iNbViewportY);
244
249
cd_switcher_update_from_screen_geometry ();
245
250
myData.iSidAutoRefresh = 0;