~cairo-dock-team/ubuntu/oneiric/cairo-dock/2.3.0-3

« back to all changes in this revision

Viewing changes to src/gldit/cairo-dock-internal-accessibility.c

  • Committer: Bazaar Package Importer
  • Author(s): Matthieu Baerts (matttbe)
  • Date: 2010-08-09 23:26:12 UTC
  • mto: This revision was merged to the branch mainline in revision 13.
  • Revision ID: james.westby@ubuntu.com-20100809232612-pocdxliaxjdetm37
Tags: upstream-2.2.0~0beta4
ImportĀ upstreamĀ versionĀ 2.2.0~0beta4

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/**
 
2
* This file is a part of the Cairo-Dock project
 
3
*
 
4
* Copyright : (C) see the 'copyright' file.
 
5
* E-mail    : see the 'copyright' file.
 
6
*
 
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.
 
11
*
 
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/>.
 
18
*/
 
19
 
 
20
#include <string.h>
 
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"
 
37
 
 
38
CairoConfigAccessibility myAccessibility;
 
39
extern CairoDock *g_pMainDock;
 
40
extern CairoDockHidingEffect *g_pHidingBackend;
 
41
 
 
42
static gboolean get_config (GKeyFile *pKeyFile, CairoConfigAccessibility *pAccessibility)
 
43
{
 
44
        gboolean bFlushConfFileNeeded = FALSE;
 
45
        
 
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;
 
49
        
 
50
        gchar *cShortkey = cairo_dock_get_string_key_value (pKeyFile, "Accessibility", "raise shortcut", &bFlushConfFileNeeded, NULL, "Position", NULL);
 
51
        
 
52
        pAccessibility->cHideEffect = cairo_dock_get_string_key_value (pKeyFile, "Accessibility", "hide effect", &bFlushConfFileNeeded, NULL, NULL, NULL);
 
53
        
 
54
        if (iVisibility == -1)  // option nouvelle 2.1.3
 
55
        {
 
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.
 
59
                {
 
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);
 
63
                }
 
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;
 
68
                else if (cShortkey)
 
69
                {
 
70
                        iVisibility = CAIRO_DOCK_VISI_SHORTKEY;
 
71
                        pAccessibility->cRaiseDockShortcut = cShortkey;
 
72
                        cShortkey = NULL;
 
73
                }
 
74
                else
 
75
                        iVisibility = CAIRO_DOCK_VISI_KEEP_ABOVE;
 
76
                
 
77
                g_key_file_set_integer (pKeyFile, "Accessibility", "visibility", iVisibility);
 
78
        }
 
79
        else
 
80
        {
 
81
                if (pAccessibility->cHideEffect == NULL)  // nouvelle option 2.2.0, cela a change l'ordre du menu.
 
82
                {
 
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.
 
86
                        {
 
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);
 
91
                        }
 
92
                        else if (iVisibility == 3)
 
93
                        {
 
94
                                iVisibility = CAIRO_DOCK_VISI_AUTO_HIDE;
 
95
                                g_key_file_set_integer (pKeyFile, "Accessibility", "visibility", iVisibility);
 
96
                        }
 
97
                        else if (iVisibility == 4)
 
98
                        {
 
99
                                iVisibility = CAIRO_DOCK_VISI_AUTO_HIDE_ON_OVERLAP_ANY;
 
100
                                g_key_file_set_integer (pKeyFile, "Accessibility", "visibility", iVisibility);
 
101
                        }
 
102
                        else if (iVisibility == 5)
 
103
                        {
 
104
                                iVisibility = CAIRO_DOCK_VISI_SHORTKEY;
 
105
                                g_key_file_set_integer (pKeyFile, "Accessibility", "visibility", iVisibility);
 
106
                        }
 
107
                }
 
108
                if (iVisibility == CAIRO_DOCK_VISI_SHORTKEY)
 
109
                {
 
110
                        pAccessibility->cRaiseDockShortcut = cShortkey;
 
111
                        cShortkey = NULL;
 
112
                }
 
113
        }
 
114
        pAccessibility->iVisibility = iVisibility;
 
115
        g_free (cShortkey);
 
116
        if (pAccessibility->cHideEffect == NULL) 
 
117
        {
 
118
                pAccessibility->cHideEffect = g_strdup_printf ("Move down");
 
119
                g_key_file_set_string (pKeyFile, "Accessibility", "hide effect", pAccessibility->cHideEffect);
 
120
        }
 
121
        
 
122
        pAccessibility->iCallbackMethod = cairo_dock_get_integer_key_value (pKeyFile, "Accessibility", "callback", &bFlushConfFileNeeded, 0, NULL, NULL);
 
123
        
 
124
        if (pAccessibility->iCallbackMethod == 3)
 
125
        {
 
126
                if (! g_key_file_has_key (pKeyFile, "Accessibility", "zone size", NULL))
 
127
                {
 
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);
 
132
                }
 
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.
 
140
        }
 
141
        
 
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);
 
145
        
 
146
        pAccessibility->iUnhideDockDelay = cairo_dock_get_integer_key_value (pKeyFile, "Accessibility", "unhide delay", &bFlushConfFileNeeded, 0, NULL, NULL);
 
147
        
 
148
        pAccessibility->bAutoHideOnFullScreen = cairo_dock_get_boolean_key_value (pKeyFile, "Accessibility", "auto quick hide", &bFlushConfFileNeeded, FALSE, "TaskBar", NULL);
 
149
        pAccessibility->bAutoHideOnFullScreen = FALSE;
 
150
        
 
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))
 
155
        {
 
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;
 
159
        }
 
160
        else
 
161
                pAccessibility->bShowSubDockOnClick = (cairo_dock_get_integer_key_value (pKeyFile, "Accessibility", "show_on_click", &bFlushConfFileNeeded, 0, NULL, NULL) == 1);
 
162
        
 
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);
 
166
        
 
167
        return bFlushConfFileNeeded;
 
168
}
 
169
 
 
170
 
 
171
static void reset_config (CairoConfigAccessibility *pAccessibility)
 
172
{
 
173
        g_free (pAccessibility->cRaiseDockShortcut);
 
174
        g_free (pAccessibility->cHideEffect);
 
175
        g_free (pAccessibility->cZoneImage);
 
176
}
 
177
 
 
178
 
 
179
static void _show_all_docks (const gchar *cName, CairoDock *pDock, Icon *icon)
 
180
{
 
181
        if (pDock->iRefCount > 0)
 
182
                return;
 
183
        pDock->bTemporaryHidden = FALSE;
 
184
        pDock->bAutoHide = FALSE;
 
185
        cairo_dock_start_showing (pDock);
 
186
}
 
187
static void _hide_all_docks (const gchar *cName, CairoDock *pDock, Icon *icon)
 
188
{
 
189
        if (pDock->iRefCount > 0)
 
190
                return;
 
191
        pDock->bTemporaryHidden = FALSE;
 
192
        pDock->bAutoHide = TRUE;
 
193
        cairo_dock_start_hiding (pDock);
 
194
}
 
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)
 
199
 
 
200
static void _init_hiding (CairoDock *pDock, gpointer data)
 
201
{
 
202
        if (pDock->bIsShowing || pDock->bIsHiding)
 
203
        {
 
204
                g_pHidingBackend->init (pDock);
 
205
        }
 
206
}
 
207
static void reload (CairoConfigAccessibility *pPrevAccessibility, CairoConfigAccessibility *pAccessibility)
 
208
{
 
209
        CairoDock *pDock = g_pMainDock;
 
210
        
 
211
        if (! pDock)
 
212
        {
 
213
                if (pPrevAccessibility->cRaiseDockShortcut != NULL)
 
214
                        cd_keybinder_unbind (pPrevAccessibility->cRaiseDockShortcut, (CDBindkeyHandler) cairo_dock_raise_from_shortcut);
 
215
                return ;
 
216
        }
 
217
        
 
218
        //\_______________ Shortcut.
 
219
        if (pAccessibility->cRaiseDockShortcut != NULL)
 
220
        {
 
221
                if (pPrevAccessibility->cRaiseDockShortcut == NULL || strcmp (pAccessibility->cRaiseDockShortcut, pPrevAccessibility->cRaiseDockShortcut) != 0)  // le raccourci a change.
 
222
                {
 
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.
 
226
                        {
 
227
                                g_free (pAccessibility->cRaiseDockShortcut);
 
228
                                pAccessibility->cRaiseDockShortcut = NULL;
 
229
                                
 
230
                                cairo_dock_reposition_root_docks (FALSE);  // FALSE => tous.
 
231
                        }
 
232
                }
 
233
        }
 
234
        else if (pPrevAccessibility->cRaiseDockShortcut != NULL) // plus de raccourci
 
235
{
 
236
                cd_keybinder_unbind (pPrevAccessibility->cRaiseDockShortcut, (CDBindkeyHandler) cairo_dock_raise_from_shortcut);
 
237
                
 
238
                cairo_dock_reposition_root_docks (FALSE);  // FALSE => tous.
 
239
        }
 
240
        
 
241
        //\_______________ Max Size.
 
242
        if (pAccessibility->iMaxAuthorizedWidth != pPrevAccessibility->iMaxAuthorizedWidth ||
 
243
                pAccessibility->bExtendedMode != pPrevAccessibility->bExtendedMode)
 
244
        {
 
245
                cairo_dock_set_all_views_to_default (1);  // 1 <=> tous les docks racines. met a jour la taille et reserve l'espace.
 
246
        }
 
247
        
 
248
        //\_______________ Hiding effect.
 
249
        if (cairo_dock_strings_differ (pAccessibility->cHideEffect, pPrevAccessibility->cHideEffect))
 
250
        {
 
251
                g_pHidingBackend = cairo_dock_get_hiding_effect (pAccessibility->cHideEffect);
 
252
                if (g_pHidingBackend && g_pHidingBackend->init)
 
253
                {
 
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.
 
255
                }
 
256
        }
 
257
        
 
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)
 
263
        {
 
264
                cairo_dock_load_visible_zone (pAccessibility->cZoneImage, pAccessibility->iZoneWidth, pAccessibility->iZoneHeight, pAccessibility->fZoneAlpha);
 
265
                
 
266
                cairo_dock_redraw_root_docks (FALSE);  // FALSE <=> main dock inclus.
 
267
        }
 
268
        
 
269
        cairo_dock_set_dock_visibility (pDock, pAccessibility->iVisibility);
 
270
}
 
271
 
 
272
 
 
273
 
 
274
DEFINE_PRE_INIT (Accessibility)
 
275
{
 
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;
 
283
        
 
284
        pModule->reload = (CairoDockInternalModuleReloadFunc) reload;
 
285
        pModule->get_config = (CairoDockInternalModuleGetConfigFunc) get_config;
 
286
        pModule->reset_config = (CairoDockInternalModuleResetConfigFunc) reset_config;
 
287
        pModule->reset_data = NULL;
 
288
        
 
289
        pModule->pConfig = &myAccessibility;
 
290
        pModule->pData = NULL;
 
291
}
 
292
 
 
293
/*
 
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". ^^
 
296
 
 
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.
 
300
 
 
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.
 
302
 
 
303
Fabounet.
 
304
*/