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 "cairo-dock-modules.h"
22
#include "cairo-dock-config.h"
23
#include "cairo-dock-dock-manager.h"
24
#include "cairo-dock-dock-factory.h"
25
#include "cairo-dock-keybinder.h"
26
#include "cairo-dock-callbacks.h"
27
#include "cairo-dock-log.h"
28
#include "cairo-dock-dialog-manager.h"
29
#include "cairo-dock-backends-manager.h"
30
#include "cairo-dock-animations.h"
31
#include "cairo-dock-applications-manager.h"
32
#include "cairo-dock-application-facility.h"
33
#include "cairo-dock-load.h"
34
#define _INTERNAL_MODULE_
35
#include "cairo-dock-internal-accessibility.h"
36
#include "cairo-dock-dock-facility.h"
38
CairoConfigAccessibility myAccessibility;
39
extern CairoDock *g_pMainDock;
40
extern CairoDockHidingEffect *g_pHidingBackend;
42
static gboolean get_config (GKeyFile *pKeyFile, CairoConfigAccessibility *pAccessibility)
44
gboolean bFlushConfFileNeeded = FALSE;
46
//\____________________ Visibilite
47
int iVisibility = cairo_dock_get_integer_key_value (pKeyFile, "Accessibility", "visibility", &bFlushConfFileNeeded, -1, NULL, NULL); // -1 pour pouvoir intercepter le cas ou la cle n'existe pas.
48
gboolean bRaiseOnShortcut = FALSE;
50
gchar *cShortkey = cairo_dock_get_string_key_value (pKeyFile, "Accessibility", "raise shortcut", &bFlushConfFileNeeded, NULL, "Position", NULL);
52
pAccessibility->cHideEffect = cairo_dock_get_string_key_value (pKeyFile, "Accessibility", "hide effect", &bFlushConfFileNeeded, NULL, NULL, NULL);
54
if (iVisibility == -1) // option nouvelle 2.1.3
56
if (g_key_file_get_boolean (pKeyFile, "Accessibility", "reserve space", NULL))
57
iVisibility = CAIRO_DOCK_VISI_KEEP_ABOVE;
58
else if (g_key_file_get_boolean (pKeyFile, "Accessibility", "pop-up", NULL)) // on force au nouveau mode.
60
iVisibility = CAIRO_DOCK_VISI_AUTO_HIDE_ON_OVERLAP_ANY;
61
pAccessibility->cHideEffect = g_strdup_printf ("Fade out"); // on force a "fade out" pour garder le meme effet.
62
g_key_file_set_string (pKeyFile, "Accessibility", "hide effect", pAccessibility->cHideEffect);
64
else if (g_key_file_get_boolean (pKeyFile, "Accessibility", "auto-hide", NULL))
65
iVisibility = CAIRO_DOCK_VISI_AUTO_HIDE;
66
else if (g_key_file_get_boolean (pKeyFile, "Accessibility", "auto quick hide on max", NULL))
67
iVisibility = CAIRO_DOCK_VISI_AUTO_HIDE_ON_OVERLAP_ANY;
70
iVisibility = CAIRO_DOCK_VISI_SHORTKEY;
71
pAccessibility->cRaiseDockShortcut = cShortkey;
75
iVisibility = CAIRO_DOCK_VISI_KEEP_ABOVE;
77
g_key_file_set_integer (pKeyFile, "Accessibility", "visibility", iVisibility);
81
if (pAccessibility->cHideEffect == NULL) // nouvelle option 2.2.0, cela a change l'ordre du menu.
83
// avant c'etait : KEEP_ABOVE, RESERVE, KEEP_BELOW, AUTO_HIDE, HIDE_ON_MAXIMIZED, SHORTKEY
84
// mtn c'est : KEEP_ABOVE, RESERVE, KEEP_BELOW, HIDE_ON_OVERLAP, HIDE_ON_OVERLAP_ANY, AUTO_HIDE, VISI_SHORTKEY,
85
if (iVisibility == 2) // on force au nouveau mode.
87
iVisibility = CAIRO_DOCK_VISI_AUTO_HIDE_ON_OVERLAP_ANY;
88
pAccessibility->cHideEffect = g_strdup_printf ("Fade out"); // on force a "fade out" pour garder le meme effet.
89
g_key_file_set_integer (pKeyFile, "Accessibility", "visibility", iVisibility);
90
g_key_file_set_string (pKeyFile, "Accessibility", "hide effect", pAccessibility->cHideEffect);
92
else if (iVisibility == 3)
94
iVisibility = CAIRO_DOCK_VISI_AUTO_HIDE;
95
g_key_file_set_integer (pKeyFile, "Accessibility", "visibility", iVisibility);
97
else if (iVisibility == 4)
99
iVisibility = CAIRO_DOCK_VISI_AUTO_HIDE_ON_OVERLAP_ANY;
100
g_key_file_set_integer (pKeyFile, "Accessibility", "visibility", iVisibility);
102
else if (iVisibility == 5)
104
iVisibility = CAIRO_DOCK_VISI_SHORTKEY;
105
g_key_file_set_integer (pKeyFile, "Accessibility", "visibility", iVisibility);
108
if (iVisibility == CAIRO_DOCK_VISI_SHORTKEY)
110
pAccessibility->cRaiseDockShortcut = cShortkey;
114
pAccessibility->iVisibility = iVisibility;
116
if (pAccessibility->cHideEffect == NULL)
118
pAccessibility->cHideEffect = g_strdup_printf ("Move down");
119
g_key_file_set_string (pKeyFile, "Accessibility", "hide effect", pAccessibility->cHideEffect);
122
pAccessibility->iCallbackMethod = cairo_dock_get_integer_key_value (pKeyFile, "Accessibility", "callback", &bFlushConfFileNeeded, 0, NULL, NULL);
124
if (pAccessibility->iCallbackMethod == 3)
126
if (! g_key_file_has_key (pKeyFile, "Accessibility", "zone size", NULL))
128
pAccessibility->iZoneWidth = 100;
129
pAccessibility->iZoneHeight = 10;
130
int list[2] = {pAccessibility->iZoneWidth, pAccessibility->iZoneHeight};
131
g_key_file_set_integer_list (pKeyFile, "Accessibility", "zone size", list, 2);
133
cairo_dock_get_size_key_value_helper (pKeyFile, "Accessibility", "zone ", bFlushConfFileNeeded, pAccessibility->iZoneWidth, pAccessibility->iZoneHeight);
134
if (pAccessibility->iZoneWidth < 20)
135
pAccessibility->iZoneWidth = 20;
136
if (pAccessibility->iZoneHeight < 2)
137
pAccessibility->iZoneHeight = 2;
138
pAccessibility->cZoneImage = cairo_dock_get_string_key_value (pKeyFile, "Accessibility", "callback image", &bFlushConfFileNeeded, 0, "Background", NULL);
139
pAccessibility->fZoneAlpha = 1.; // on laisse l'utilisateur definir la transparence qu'il souhaite directement dans l'image.
142
//\____________________ Autres parametres.
143
pAccessibility->iMaxAuthorizedWidth = cairo_dock_get_integer_key_value (pKeyFile, "Accessibility", "max_authorized_width", &bFlushConfFileNeeded, 0, "Position", NULL); // obsolete, cache en conf.
144
pAccessibility->bExtendedMode = cairo_dock_get_boolean_key_value (pKeyFile, "Accessibility", "extended", &bFlushConfFileNeeded, FALSE, NULL, NULL);
146
pAccessibility->iUnhideDockDelay = cairo_dock_get_integer_key_value (pKeyFile, "Accessibility", "unhide delay", &bFlushConfFileNeeded, 0, NULL, NULL);
148
pAccessibility->bAutoHideOnFullScreen = cairo_dock_get_boolean_key_value (pKeyFile, "Accessibility", "auto quick hide", &bFlushConfFileNeeded, FALSE, "TaskBar", NULL);
149
pAccessibility->bAutoHideOnFullScreen = FALSE;
151
//\____________________ sous-docks.
152
pAccessibility->iLeaveSubDockDelay = cairo_dock_get_integer_key_value (pKeyFile, "Accessibility", "leaving delay", &bFlushConfFileNeeded, 330, "System", NULL);
153
pAccessibility->iShowSubDockDelay = cairo_dock_get_integer_key_value (pKeyFile, "Accessibility", "show delay", &bFlushConfFileNeeded, 300, "System", NULL);
154
if (!g_key_file_has_key (pKeyFile, "Accessibility", "show_on_click", NULL))
156
pAccessibility->bShowSubDockOnClick = cairo_dock_get_boolean_key_value (pKeyFile, "Accessibility", "show on click", &bFlushConfFileNeeded, FALSE, "System", NULL);
157
g_key_file_set_integer (pKeyFile, "Accessibility", "show_on_click", pAccessibility->bShowSubDockOnClick ? 1 : 0);
158
bFlushConfFileNeeded = TRUE;
161
pAccessibility->bShowSubDockOnClick = (cairo_dock_get_integer_key_value (pKeyFile, "Accessibility", "show_on_click", &bFlushConfFileNeeded, 0, NULL, NULL) == 1);
163
//\____________________ lock
164
pAccessibility->bLockAll = cairo_dock_get_boolean_key_value (pKeyFile, "Accessibility", "lock all", &bFlushConfFileNeeded, FALSE, NULL, NULL);
165
pAccessibility->bLockIcons = pAccessibility->bLockAll || cairo_dock_get_boolean_key_value (pKeyFile, "Accessibility", "lock icons", &bFlushConfFileNeeded, FALSE, NULL, NULL);
167
return bFlushConfFileNeeded;
171
static void reset_config (CairoConfigAccessibility *pAccessibility)
173
g_free (pAccessibility->cRaiseDockShortcut);
174
g_free (pAccessibility->cHideEffect);
175
g_free (pAccessibility->cZoneImage);
179
static void _show_all_docks (const gchar *cName, CairoDock *pDock, Icon *icon)
181
if (pDock->iRefCount > 0)
183
pDock->bTemporaryHidden = FALSE;
184
pDock->bAutoHide = FALSE;
185
cairo_dock_start_showing (pDock);
187
static void _hide_all_docks (const gchar *cName, CairoDock *pDock, Icon *icon)
189
if (pDock->iRefCount > 0)
191
pDock->bTemporaryHidden = FALSE;
192
pDock->bAutoHide = TRUE;
193
cairo_dock_start_hiding (pDock);
195
#define _bind_key(cShortcut) \
196
do { if (! cd_keybinder_bind (cShortcut, (CDBindkeyHandler) cairo_dock_raise_from_shortcut, NULL)) { \
197
g_free (cShortcut); \
198
cShortcut = NULL; } } while (0)
200
static void _init_hiding (CairoDock *pDock, gpointer data)
202
if (pDock->bIsShowing || pDock->bIsHiding)
204
g_pHidingBackend->init (pDock);
207
static void reload (CairoConfigAccessibility *pPrevAccessibility, CairoConfigAccessibility *pAccessibility)
209
CairoDock *pDock = g_pMainDock;
213
if (pPrevAccessibility->cRaiseDockShortcut != NULL)
214
cd_keybinder_unbind (pPrevAccessibility->cRaiseDockShortcut, (CDBindkeyHandler) cairo_dock_raise_from_shortcut);
218
//\_______________ Shortcut.
219
if (pAccessibility->cRaiseDockShortcut != NULL)
221
if (pPrevAccessibility->cRaiseDockShortcut == NULL || strcmp (pAccessibility->cRaiseDockShortcut, pPrevAccessibility->cRaiseDockShortcut) != 0) // le raccourci a change.
223
if (pPrevAccessibility->cRaiseDockShortcut != NULL)
224
cd_keybinder_unbind (pPrevAccessibility->cRaiseDockShortcut, (CDBindkeyHandler) cairo_dock_raise_from_shortcut);
225
if (! cd_keybinder_bind (pAccessibility->cRaiseDockShortcut, (CDBindkeyHandler) cairo_dock_raise_from_shortcut, NULL)) // le bind n'a pas pu se faire.
227
g_free (pAccessibility->cRaiseDockShortcut);
228
pAccessibility->cRaiseDockShortcut = NULL;
230
cairo_dock_reposition_root_docks (FALSE); // FALSE => tous.
234
else if (pPrevAccessibility->cRaiseDockShortcut != NULL) // plus de raccourci
236
cd_keybinder_unbind (pPrevAccessibility->cRaiseDockShortcut, (CDBindkeyHandler) cairo_dock_raise_from_shortcut);
238
cairo_dock_reposition_root_docks (FALSE); // FALSE => tous.
241
//\_______________ Max Size.
242
if (pAccessibility->iMaxAuthorizedWidth != pPrevAccessibility->iMaxAuthorizedWidth ||
243
pAccessibility->bExtendedMode != pPrevAccessibility->bExtendedMode)
245
cairo_dock_set_all_views_to_default (1); // 1 <=> tous les docks racines. met a jour la taille et reserve l'espace.
248
//\_______________ Hiding effect.
249
if (cairo_dock_strings_differ (pAccessibility->cHideEffect, pPrevAccessibility->cHideEffect))
251
g_pHidingBackend = cairo_dock_get_hiding_effect (pAccessibility->cHideEffect);
252
if (g_pHidingBackend && g_pHidingBackend->init)
254
cairo_dock_foreach_root_docks ((GFunc)_init_hiding, NULL); // si le dock est en cours d'animation, comme le backend est nouveau, il n'a donc pas ete initialise au debut de l'animation => on le fait ici.
258
//\_______________ Callback zone.
259
if (cairo_dock_strings_differ (pAccessibility->cZoneImage, pPrevAccessibility->cZoneImage) ||
260
pAccessibility->iZoneWidth != pPrevAccessibility->iZoneWidth ||
261
pAccessibility->iZoneHeight != pPrevAccessibility->iZoneHeight ||
262
pAccessibility->fZoneAlpha != pPrevAccessibility->fZoneAlpha)
264
cairo_dock_load_visible_zone (pAccessibility->cZoneImage, pAccessibility->iZoneWidth, pAccessibility->iZoneHeight, pAccessibility->fZoneAlpha);
266
cairo_dock_redraw_root_docks (FALSE); // FALSE <=> main dock inclus.
269
cairo_dock_set_dock_visibility (pDock, pAccessibility->iVisibility);
274
DEFINE_PRE_INIT (Accessibility)
276
pModule->cModuleName = "Accessibility";
277
pModule->cTitle = N_("Visibility");
278
pModule->cIcon = "icon-visibility.svg";
279
pModule->cDescription = N_("Do you like your dock to be always visible,\n or on the contrary unobtrusive?\nConfigure the way you access your docks and sub-docks!"); // How do you access to your docks ?
280
pModule->iCategory = CAIRO_DOCK_CATEGORY_BEHAVIOR;
281
pModule->iSizeOfConfig = sizeof (CairoConfigAccessibility);
282
pModule->iSizeOfData = 0;
284
pModule->reload = (CairoDockInternalModuleReloadFunc) reload;
285
pModule->get_config = (CairoDockInternalModuleGetConfigFunc) get_config;
286
pModule->reset_config = (CairoDockInternalModuleResetConfigFunc) reset_config;
287
pModule->reset_data = NULL;
289
pModule->pConfig = &myAccessibility;
290
pModule->pData = NULL;
294
IMHO, you can't assume in the spec that the dock/panel will be on the top of the screen.
295
Even if you set up things like this by default, the user is likely to move it, break your assumption, and then report a bug because it won't work as expected. I don't imagine you would reply him "it's your fault, you shouldn't have moved the gnome-panel". ^^
297
"our own indicators would not support that"
298
Well they'd better support it, to handle the case where the user places its gnome-panel at the bottom of the screen.
299
They just have to send the position of the gnome-panel, which is probably available as a property of the panel, or through a gconf call.
301
The parameter should also be used by each application, so that they can place their menu; I believe the Qt/GTK framework can mask this thing.