~ubuntu-branches/ubuntu/utopic/cairo-dock/utopic

« back to all changes in this revision

Viewing changes to src/gldit/cairo-dock-desklet-manager.c

Tags: upstream-2.3.0~1
ImportĀ upstreamĀ versionĀ 2.3.0~1

Show diffs side-by-side

added added

removed removed

Lines of Context:
28
28
#include <stdlib.h>
29
29
#include <string.h>
30
30
#include <math.h>
 
31
#include <time.h>
31
32
 
32
33
#include <gtk/gtkgl.h>
33
34
#include <GL/gl.h> 
36
37
#include <gdk/x11/gdkglx.h>
37
38
#include <gdk/gdkx.h>
38
39
 
39
 
#include "../config.h"
40
 
#include "cairo-dock-draw.h"
41
 
#include "cairo-dock-modules.h"
42
 
#include "cairo-dock-dialog-manager.h"
43
 
#include "cairo-dock-icons.h"
 
40
#include "gldi-config.h"
 
41
#include "cairo-dock-module-factory.h"  // cairo_dock_pre_read_module_instance_config
44
42
#include "cairo-dock-config.h"
45
43
#include "cairo-dock-X-manager.h"
46
44
#include "cairo-dock-notifications.h"
47
45
#include "cairo-dock-log.h"
48
46
#include "cairo-dock-container.h"
49
 
#include "cairo-dock-X-utilities.h"
50
 
#include "cairo-dock-surface-factory.h"
 
47
#include "cairo-dock-X-utilities.h"  // cairo_dock_set_xwindow_type_hint
51
48
#include "cairo-dock-backends-manager.h"
52
49
#include "cairo-dock-draw-opengl.h"
53
 
#include "cairo-dock-load.h"
54
 
#include "cairo-dock-animations.h"
55
 
#include "cairo-dock-internal-desklets.h"
 
50
#include "cairo-dock-image-buffer.h"
56
51
#include "cairo-dock-gui-manager.h"
57
 
#include "cairo-dock-launcher-manager.h"
58
52
#include "cairo-dock-desklet-factory.h"
 
53
#define _MANAGER_DEF_
59
54
#include "cairo-dock-desklet-manager.h"
60
55
 
 
56
// public (manager, config, data)
 
57
CairoDeskletsParam myDeskletsParam;
 
58
CairoDeskletManager myDeskletsMgr;
 
59
 
 
60
// dependancies
61
61
extern gboolean g_bUseOpenGL;
62
 
extern CairoDock *g_pMainDock;
 
62
extern CairoDock *g_pMainDock;  // pour savoir s'il faut afficher les boutons rattach.
63
63
 
 
64
// private
64
65
static CairoDockImageBuffer s_pRotateButtonBuffer;
65
66
static CairoDockImageBuffer s_pRetachButtonBuffer;
66
67
static CairoDockImageBuffer s_pDepthRotateButtonBuffer;
67
68
static CairoDockImageBuffer s_pNoInputButtonBuffer;
68
69
static GList *s_pDeskletList = NULL;
 
70
static time_t s_iStartupTime = 0;
69
71
 
70
72
static gboolean _cairo_dock_update_desklet_notification (gpointer data, CairoDesklet *pDesklet, gboolean *bContinueAnimation);
71
73
static gboolean _cairo_dock_enter_leave_desklet_notification (gpointer data, CairoDesklet *pDesklet, gboolean *bStartAnimation);
75
77
#define _no_input_button_alpha(pDesklet) (pDesklet->bNoInput ? .4+.6*pDesklet->fButtonsAlpha : pDesklet->fButtonsAlpha)
76
78
 
77
79
 
78
 
void cairo_dock_init_desklet_manager (void)
79
 
{
80
 
        memset (&s_pRotateButtonBuffer, 0, sizeof (CairoDockImageBuffer));
81
 
        memset (&s_pRetachButtonBuffer, 0, sizeof (CairoDockImageBuffer));
82
 
        memset (&s_pDepthRotateButtonBuffer, 0, sizeof (CairoDockImageBuffer));
83
 
        memset (&s_pNoInputButtonBuffer, 0, sizeof (CairoDockImageBuffer));
84
 
        
85
 
        cairo_dock_register_notification (CAIRO_DOCK_UPDATE_DESKLET,
86
 
                (CairoDockNotificationFunc) _cairo_dock_update_desklet_notification,
87
 
                CAIRO_DOCK_RUN_FIRST, NULL);
88
 
        cairo_dock_register_notification (CAIRO_DOCK_ENTER_DESKLET,
89
 
                (CairoDockNotificationFunc) _cairo_dock_enter_leave_desklet_notification,
90
 
                CAIRO_DOCK_RUN_FIRST, NULL);
91
 
        cairo_dock_register_notification (CAIRO_DOCK_LEAVE_DESKLET,
92
 
                (CairoDockNotificationFunc) _cairo_dock_enter_leave_desklet_notification,
93
 
                CAIRO_DOCK_RUN_FIRST, NULL);
94
 
        cairo_dock_register_notification (CAIRO_DOCK_RENDER_DESKLET,
95
 
                (CairoDockNotificationFunc) _cairo_dock_render_desklet_notification,
96
 
                CAIRO_DOCK_RUN_FIRST, NULL);
97
 
}
98
 
 
99
80
void cairo_dock_load_desklet_buttons (void)
100
81
{
101
82
        //g_print ("%s ()\n", __func__);
102
 
        if (myDesklets.cRotateButtonImage != NULL)
 
83
        if (myDeskletsParam.cRotateButtonImage != NULL)
103
84
        {
104
85
                cairo_dock_load_image_buffer (&s_pRotateButtonBuffer,
105
 
                        myDesklets.cRotateButtonImage,
106
 
                        myDesklets.iDeskletButtonSize,
107
 
                        myDesklets.iDeskletButtonSize,
 
86
                        myDeskletsParam.cRotateButtonImage,
 
87
                        myDeskletsParam.iDeskletButtonSize,
 
88
                        myDeskletsParam.iDeskletButtonSize,
108
89
                        CAIRO_DOCK_FILL_SPACE);
109
90
        }
110
91
        if (s_pRotateButtonBuffer.pSurface == NULL)
111
92
        {
112
93
                cairo_dock_load_image_buffer (&s_pRotateButtonBuffer,
113
 
                        CAIRO_DOCK_SHARE_DATA_DIR"/rotate-desklet.svg",
114
 
                        myDesklets.iDeskletButtonSize,
115
 
                        myDesklets.iDeskletButtonSize,
 
94
                        GLDI_SHARE_DATA_DIR"/rotate-desklet.svg",
 
95
                        myDeskletsParam.iDeskletButtonSize,
 
96
                        myDeskletsParam.iDeskletButtonSize,
116
97
                        CAIRO_DOCK_FILL_SPACE);
117
98
        }
118
99
        
119
 
        if (myDesklets.cRetachButtonImage != NULL)
 
100
        if (myDeskletsParam.cRetachButtonImage != NULL)
120
101
        {
121
102
                cairo_dock_load_image_buffer (&s_pRetachButtonBuffer,
122
 
                        myDesklets.cRetachButtonImage,
123
 
                        myDesklets.iDeskletButtonSize,
124
 
                        myDesklets.iDeskletButtonSize,
 
103
                        myDeskletsParam.cRetachButtonImage,
 
104
                        myDeskletsParam.iDeskletButtonSize,
 
105
                        myDeskletsParam.iDeskletButtonSize,
125
106
                        CAIRO_DOCK_FILL_SPACE);
126
107
        }
127
108
        if (s_pRetachButtonBuffer.pSurface == NULL)
128
109
        {
129
110
                cairo_dock_load_image_buffer (&s_pRetachButtonBuffer,
130
 
                        CAIRO_DOCK_SHARE_DATA_DIR"/retach-desklet.svg",
131
 
                        myDesklets.iDeskletButtonSize,
132
 
                        myDesklets.iDeskletButtonSize,
 
111
                        GLDI_SHARE_DATA_DIR"/retach-desklet.svg",
 
112
                        myDeskletsParam.iDeskletButtonSize,
 
113
                        myDeskletsParam.iDeskletButtonSize,
133
114
                        CAIRO_DOCK_FILL_SPACE);
134
115
        }
135
116
 
136
 
        if (myDesklets.cDepthRotateButtonImage != NULL)
 
117
        if (myDeskletsParam.cDepthRotateButtonImage != NULL)
137
118
        {
138
119
                cairo_dock_load_image_buffer (&s_pDepthRotateButtonBuffer,
139
 
                        myDesklets.cDepthRotateButtonImage,
140
 
                        myDesklets.iDeskletButtonSize,
141
 
                        myDesklets.iDeskletButtonSize,
 
120
                        myDeskletsParam.cDepthRotateButtonImage,
 
121
                        myDeskletsParam.iDeskletButtonSize,
 
122
                        myDeskletsParam.iDeskletButtonSize,
142
123
                        CAIRO_DOCK_FILL_SPACE);
143
124
        }
144
125
        if (s_pDepthRotateButtonBuffer.pSurface == NULL)
145
126
        {
146
127
                cairo_dock_load_image_buffer (&s_pDepthRotateButtonBuffer,
147
 
                        CAIRO_DOCK_SHARE_DATA_DIR"/depth-rotate-desklet.svg",
148
 
                        myDesklets.iDeskletButtonSize,
149
 
                        myDesklets.iDeskletButtonSize,
 
128
                        GLDI_SHARE_DATA_DIR"/depth-rotate-desklet.svg",
 
129
                        myDeskletsParam.iDeskletButtonSize,
 
130
                        myDeskletsParam.iDeskletButtonSize,
150
131
                        CAIRO_DOCK_FILL_SPACE);
151
132
        }
152
133
        
153
 
        if (myDesklets.cNoInputButtonImage != NULL)
 
134
        if (myDeskletsParam.cNoInputButtonImage != NULL)
154
135
        {
155
136
                cairo_dock_load_image_buffer (&s_pNoInputButtonBuffer,
156
 
                        myDesklets.cNoInputButtonImage,
157
 
                        myDesklets.iDeskletButtonSize,
158
 
                        myDesklets.iDeskletButtonSize,
 
137
                        myDeskletsParam.cNoInputButtonImage,
 
138
                        myDeskletsParam.iDeskletButtonSize,
 
139
                        myDeskletsParam.iDeskletButtonSize,
159
140
                        CAIRO_DOCK_FILL_SPACE);
160
141
        }
161
142
        if (s_pNoInputButtonBuffer.pSurface == NULL)
162
143
        {
163
144
                cairo_dock_load_image_buffer (&s_pNoInputButtonBuffer,
164
 
                        CAIRO_DOCK_SHARE_DATA_DIR"/no-input-desklet.png",
165
 
                        myDesklets.iDeskletButtonSize,
166
 
                        myDesklets.iDeskletButtonSize,
 
145
                        GLDI_SHARE_DATA_DIR"/no-input-desklet.png",
 
146
                        myDeskletsParam.iDeskletButtonSize,
 
147
                        myDeskletsParam.iDeskletButtonSize,
167
148
                        CAIRO_DOCK_FILL_SPACE);
168
149
        }
169
150
}
274
255
                }
275
256
                if (s_pRetachButtonBuffer.pSurface != NULL && g_pMainDock)
276
257
                {
277
 
                        cairo_set_source_surface (pCairoContext, s_pRetachButtonBuffer.pSurface, pDesklet->container.iWidth - myDesklets.iDeskletButtonSize, 0.);
 
258
                        cairo_set_source_surface (pCairoContext, s_pRetachButtonBuffer.pSurface, pDesklet->container.iWidth - myDeskletsParam.iDeskletButtonSize, 0.);
278
259
                        cairo_paint_with_alpha (pCairoContext, pDesklet->fButtonsAlpha);
279
260
                }
280
261
        }
281
262
        if ((pDesklet->container.bInside || pDesklet->bNoInput || pDesklet->fButtonsAlpha) && s_pNoInputButtonBuffer.pSurface != NULL && pDesklet->bAllowNoClickable)
282
263
        {
283
 
                cairo_set_source_surface (pCairoContext, s_pNoInputButtonBuffer.pSurface, pDesklet->container.iWidth - myDesklets.iDeskletButtonSize, pDesklet->container.iHeight - myDesklets.iDeskletButtonSize);
 
264
                cairo_set_source_surface (pCairoContext, s_pNoInputButtonBuffer.pSurface, pDesklet->container.iWidth - myDeskletsParam.iDeskletButtonSize, pDesklet->container.iHeight - myDeskletsParam.iDeskletButtonSize);
284
265
                cairo_paint_with_alpha (pCairoContext, _no_input_button_alpha (pDesklet));
285
266
        }
286
267
        cairo_restore (pCairoContext);
371
352
                if (s_pRotateButtonBuffer.iTexture != 0)
372
353
                {
373
354
                        glPushMatrix ();
374
 
                        glTranslatef (-pDesklet->container.iWidth/2 + myDesklets.iDeskletButtonSize/2,
375
 
                                pDesklet->container.iHeight/2 - myDesklets.iDeskletButtonSize/2,
 
355
                        glTranslatef (-pDesklet->container.iWidth/2 + myDeskletsParam.iDeskletButtonSize/2,
 
356
                                pDesklet->container.iHeight/2 - myDeskletsParam.iDeskletButtonSize/2,
376
357
                                0.);
377
 
                        _cairo_dock_apply_texture_at_size (s_pRotateButtonBuffer.iTexture, myDesklets.iDeskletButtonSize, myDesklets.iDeskletButtonSize);
 
358
                        _cairo_dock_apply_texture_at_size (s_pRotateButtonBuffer.iTexture, myDeskletsParam.iDeskletButtonSize, myDeskletsParam.iDeskletButtonSize);
378
359
                        glPopMatrix ();
379
360
                }
380
361
                if (s_pRetachButtonBuffer.iTexture != 0 && g_pMainDock)
381
362
                {
382
363
                        glPushMatrix ();
383
 
                        glTranslatef (pDesklet->container.iWidth/2 - myDesklets.iDeskletButtonSize/2,
384
 
                                pDesklet->container.iHeight/2 - myDesklets.iDeskletButtonSize/2,
 
364
                        glTranslatef (pDesklet->container.iWidth/2 - myDeskletsParam.iDeskletButtonSize/2,
 
365
                                pDesklet->container.iHeight/2 - myDeskletsParam.iDeskletButtonSize/2,
385
366
                                0.);
386
 
                        _cairo_dock_apply_texture_at_size (s_pRetachButtonBuffer.iTexture, myDesklets.iDeskletButtonSize, myDesklets.iDeskletButtonSize);
 
367
                        _cairo_dock_apply_texture_at_size (s_pRetachButtonBuffer.iTexture, myDeskletsParam.iDeskletButtonSize, myDeskletsParam.iDeskletButtonSize);
387
368
                        glPopMatrix ();
388
369
                }
389
370
                if (s_pDepthRotateButtonBuffer.iTexture != 0)
390
371
                {
391
372
                        glPushMatrix ();
392
373
                        glTranslatef (0.,
393
 
                                pDesklet->container.iHeight/2 - myDesklets.iDeskletButtonSize/2,
 
374
                                pDesklet->container.iHeight/2 - myDeskletsParam.iDeskletButtonSize/2,
394
375
                                0.);
395
 
                        _cairo_dock_apply_texture_at_size (s_pDepthRotateButtonBuffer.iTexture, myDesklets.iDeskletButtonSize, myDesklets.iDeskletButtonSize);
 
376
                        _cairo_dock_apply_texture_at_size (s_pDepthRotateButtonBuffer.iTexture, myDeskletsParam.iDeskletButtonSize, myDeskletsParam.iDeskletButtonSize);
396
377
                        glPopMatrix ();
397
378
                        
398
379
                        glPushMatrix ();
399
380
                        glRotatef (90., 0., 0., 1.);
400
381
                        glTranslatef (0.,
401
 
                                pDesklet->container.iWidth/2 - myDesklets.iDeskletButtonSize/2,
 
382
                                pDesklet->container.iWidth/2 - myDeskletsParam.iDeskletButtonSize/2,
402
383
                                0.);
403
 
                        _cairo_dock_apply_texture_at_size (s_pDepthRotateButtonBuffer.iTexture, myDesklets.iDeskletButtonSize, myDesklets.iDeskletButtonSize);
 
384
                        _cairo_dock_apply_texture_at_size (s_pDepthRotateButtonBuffer.iTexture, myDeskletsParam.iDeskletButtonSize, myDeskletsParam.iDeskletButtonSize);
404
385
                        glPopMatrix ();
405
386
                }
406
387
        }
409
390
                _cairo_dock_set_blend_alpha ();
410
391
                _cairo_dock_set_alpha (_no_input_button_alpha(pDesklet));
411
392
                glPushMatrix ();
412
 
                glTranslatef (pDesklet->container.iWidth/2 - myDesklets.iDeskletButtonSize/2,
413
 
                        - pDesklet->container.iHeight/2 + myDesklets.iDeskletButtonSize/2,
 
393
                glTranslatef (pDesklet->container.iWidth/2 - myDeskletsParam.iDeskletButtonSize/2,
 
394
                        - pDesklet->container.iHeight/2 + myDeskletsParam.iDeskletButtonSize/2,
414
395
                        0.);
415
 
                _cairo_dock_apply_texture_at_size (s_pNoInputButtonBuffer.iTexture, myDesklets.iDeskletButtonSize, myDesklets.iDeskletButtonSize);
 
396
                _cairo_dock_apply_texture_at_size (s_pNoInputButtonBuffer.iTexture, myDeskletsParam.iDeskletButtonSize, myDeskletsParam.iDeskletButtonSize);
416
397
                glPopMatrix ();
417
398
        }
418
399
        
499
480
        }
500
481
        
501
482
        s_pDeskletList = g_list_prepend (s_pDeskletList, pDesklet);
 
483
        
 
484
        cairo_dock_notify_on_object (&myDeskletsMgr, NOTIFICATION_NEW_DESKLET, pDesklet);
 
485
        cairo_dock_notify_on_object (pDesklet, NOTIFICATION_NEW_DESKLET, pDesklet);
 
486
        
502
487
        return pDesklet;
503
488
}
504
489
 
511
496
 
512
497
CairoDesklet *cairo_dock_foreach_desklet (CairoDockForeachDeskletFunc pCallback, gpointer user_data)
513
498
{
514
 
        gpointer data[3] = {pCallback, user_data, NULL};
515
499
        CairoDesklet *pDesklet;
516
500
        GList *dl;
517
501
        for (dl = s_pDeskletList; dl != NULL; dl = dl->next)
524
508
        return NULL;
525
509
}
526
510
 
 
511
static gboolean _cairo_dock_foreach_icons_in_desklet (CairoDesklet *pDesklet, gpointer *data)
 
512
{
 
513
        CairoDockForeachIconFunc pFunction = data[0];
 
514
        gpointer pUserData = data[1];
 
515
        if (pDesklet->pIcon != NULL)
 
516
                pFunction (pDesklet->pIcon, CAIRO_CONTAINER (pDesklet), pUserData);
 
517
        Icon *pIcon;
 
518
        GList *ic;
 
519
        for (ic = pDesklet->icons; ic != NULL; ic = ic->next)
 
520
        {
 
521
                pFunction ((Icon*)ic->data, CAIRO_CONTAINER (pDesklet), pUserData);
 
522
        }
 
523
        return FALSE;
 
524
}
 
525
void cairo_dock_foreach_icons_in_desklets (CairoDockForeachIconFunc pFunction, gpointer pUserData)
 
526
{
 
527
        gpointer data[2] = {pFunction, pUserData};
 
528
        cairo_dock_foreach_desklet ((CairoDockForeachDeskletFunc) _cairo_dock_foreach_icons_in_desklet, data);
 
529
}
 
530
 
 
531
 
527
532
static gboolean _cairo_dock_reload_one_desklet_decorations (CairoDesklet *pDesklet, gpointer data)
528
533
{
529
534
        gboolean bDefaultThemeOnly = GPOINTER_TO_INT (data);
562
567
{
563
568
        gboolean bOnWidgetLayerToo = GPOINTER_TO_INT (data);
564
569
        Window Xid = GDK_WINDOW_XID (pDesklet->container.pWidget->window);
565
 
        gboolean bIsOnWidgetLayer = cairo_dock_window_is_utility (Xid);
 
570
        //gboolean bIsOnWidgetLayer = cairo_dock_window_is_utility (Xid);
 
571
        gboolean bIsOnWidgetLayer = (pDesklet->iVisibility == CAIRO_DESKLET_ON_WIDGET_LAYER);
566
572
        if (bOnWidgetLayerToo || ! bIsOnWidgetLayer)
567
573
        {
568
574
                cd_debug ("%s (%d)", __func__, Xid);
826
832
        }
827
833
        return NULL;
828
834
}
 
835
 
 
836
gboolean cairo_dock_desklet_manager_is_ready (void)
 
837
{
 
838
        static gboolean bReady = FALSE;
 
839
        if (!bReady)  // once we are ready, no need to test it again.
 
840
        {
 
841
                bReady = (time (NULL) > s_iStartupTime + 5);  // 5s delay on startup
 
842
        }
 
843
        return bReady;
 
844
}
 
845
 
 
846
  //////////////////
 
847
 /// GET CONFIG ///
 
848
//////////////////
 
849
 
 
850
static gboolean get_config (GKeyFile *pKeyFile, CairoDeskletsParam *pDesklets)
 
851
{
 
852
        gboolean bFlushConfFileNeeded = FALSE;
 
853
        
 
854
        pDesklets->cDeskletDecorationsName = cairo_dock_get_string_key_value (pKeyFile, "Desklets", "decorations", &bFlushConfFileNeeded, "dark", NULL, NULL);
 
855
        CairoDeskletDecoration *pUserDeskletDecorations = cairo_dock_get_desklet_decoration ("personnal");
 
856
        if (pUserDeskletDecorations == NULL)
 
857
        {
 
858
                pUserDeskletDecorations = g_new0 (CairoDeskletDecoration, 1);
 
859
                pUserDeskletDecorations->cDisplayedName = _("_custom decoration_");
 
860
                cairo_dock_register_desklet_decoration ("personnal", pUserDeskletDecorations);
 
861
        }
 
862
        if (pDesklets->cDeskletDecorationsName == NULL || strcmp (pDesklets->cDeskletDecorationsName, "personnal") == 0)
 
863
        {
 
864
                g_free (pUserDeskletDecorations->cBackGroundImagePath);
 
865
                pUserDeskletDecorations->cBackGroundImagePath = cairo_dock_get_string_key_value (pKeyFile, "Desklets", "bg desklet", &bFlushConfFileNeeded, NULL, NULL, NULL);
 
866
                g_free (pUserDeskletDecorations->cForeGroundImagePath);
 
867
                pUserDeskletDecorations->cForeGroundImagePath = cairo_dock_get_string_key_value (pKeyFile, "Desklets", "fg desklet", &bFlushConfFileNeeded, NULL, NULL, NULL);
 
868
                pUserDeskletDecorations->iLoadingModifier = CAIRO_DOCK_FILL_SPACE;
 
869
                pUserDeskletDecorations->fBackGroundAlpha = cairo_dock_get_double_key_value (pKeyFile, "Desklets", "bg alpha", &bFlushConfFileNeeded, 1.0, NULL, NULL);
 
870
                pUserDeskletDecorations->fForeGroundAlpha = cairo_dock_get_double_key_value (pKeyFile, "Desklets", "fg alpha", &bFlushConfFileNeeded, 1.0, NULL, NULL);
 
871
                pUserDeskletDecorations->iLeftMargin = cairo_dock_get_integer_key_value (pKeyFile, "Desklets", "left offset", &bFlushConfFileNeeded, 0, NULL, NULL);
 
872
                pUserDeskletDecorations->iTopMargin = cairo_dock_get_integer_key_value (pKeyFile, "Desklets", "top offset", &bFlushConfFileNeeded, 0, NULL, NULL);
 
873
                pUserDeskletDecorations->iRightMargin = cairo_dock_get_integer_key_value (pKeyFile, "Desklets", "right offset", &bFlushConfFileNeeded, 0, NULL, NULL);
 
874
                pUserDeskletDecorations->iBottomMargin = cairo_dock_get_integer_key_value (pKeyFile, "Desklets", "bottom offset", &bFlushConfFileNeeded, 0, NULL, NULL);
 
875
        }
 
876
        pDesklets->iDeskletButtonSize = cairo_dock_get_integer_key_value (pKeyFile, "Desklets", "button size", &bFlushConfFileNeeded, 16, NULL, NULL);
 
877
        pDesklets->cRotateButtonImage = cairo_dock_get_string_key_value (pKeyFile, "Desklets", "rotate image", &bFlushConfFileNeeded, NULL, NULL, NULL);
 
878
        pDesklets->cRetachButtonImage = cairo_dock_get_string_key_value (pKeyFile, "Desklets", "retach image", &bFlushConfFileNeeded, NULL, NULL, NULL);
 
879
        pDesklets->cDepthRotateButtonImage = cairo_dock_get_string_key_value (pKeyFile, "Desklets", "depth rotate image", &bFlushConfFileNeeded, NULL, NULL, NULL);
 
880
        pDesklets->cNoInputButtonImage = cairo_dock_get_string_key_value (pKeyFile, "Desklets", "no input image", &bFlushConfFileNeeded, NULL, NULL, NULL);
 
881
        return bFlushConfFileNeeded;
 
882
}
 
883
 
 
884
 
 
885
  ////////////////////
 
886
 /// RESET CONFIG ///
 
887
////////////////////
 
888
 
 
889
static void reset_config (CairoDeskletsParam *pDesklets)
 
890
{
 
891
        g_free (pDesklets->cDeskletDecorationsName);
 
892
        g_free (pDesklets->cRotateButtonImage);
 
893
        g_free (pDesklets->cRetachButtonImage);
 
894
        g_free (pDesklets->cDepthRotateButtonImage);
 
895
        g_free (pDesklets->cNoInputButtonImage);
 
896
}
 
897
 
 
898
 
 
899
  //////////////
 
900
 /// RELOAD ///
 
901
//////////////
 
902
 
 
903
static void reload (CairoDeskletsParam *pPrevDesklets, CairoDeskletsParam *pDesklets)
 
904
{
 
905
        if (cairo_dock_strings_differ (pPrevDesklets->cRotateButtonImage, pDesklets->cRotateButtonImage) ||
 
906
                cairo_dock_strings_differ (pPrevDesklets->cRetachButtonImage, pDesklets->cRetachButtonImage) ||
 
907
                cairo_dock_strings_differ (pPrevDesklets->cDepthRotateButtonImage, pDesklets->cDepthRotateButtonImage) ||
 
908
                cairo_dock_strings_differ (pPrevDesklets->cNoInputButtonImage, pDesklets->cNoInputButtonImage))
 
909
        {
 
910
                cairo_dock_unload_desklet_buttons ();
 
911
                cairo_dock_load_desklet_buttons ();
 
912
        }
 
913
        if (cairo_dock_strings_differ (pPrevDesklets->cDeskletDecorationsName, pDesklets->cDeskletDecorationsName))
 
914
        {
 
915
                cairo_dock_reload_desklets_decorations (TRUE);  // TRUE <=> bDefaultThemeOnly
 
916
        }
 
917
}
 
918
 
 
919
 
 
920
  //////////////
 
921
 /// UNLOAD ///
 
922
//////////////
 
923
 
 
924
static void unload (void)
 
925
{
 
926
        cairo_dock_unload_desklet_buttons ();
 
927
}
 
928
 
 
929
  ////////////
 
930
 /// INIT ///
 
931
////////////
 
932
 
 
933
static void init (void)
 
934
{
 
935
        cairo_dock_register_notification_on_object (&myDeskletsMgr,
 
936
                NOTIFICATION_UPDATE_DESKLET,
 
937
                (CairoDockNotificationFunc) _cairo_dock_update_desklet_notification,
 
938
                CAIRO_DOCK_RUN_FIRST, NULL);
 
939
        cairo_dock_register_notification_on_object (&myDeskletsMgr,
 
940
                NOTIFICATION_ENTER_DESKLET,
 
941
                (CairoDockNotificationFunc) _cairo_dock_enter_leave_desklet_notification,
 
942
                CAIRO_DOCK_RUN_FIRST, NULL);
 
943
        cairo_dock_register_notification_on_object (&myDeskletsMgr,
 
944
                NOTIFICATION_LEAVE_DESKLET,
 
945
                (CairoDockNotificationFunc) _cairo_dock_enter_leave_desklet_notification,
 
946
                CAIRO_DOCK_RUN_FIRST, NULL);
 
947
        cairo_dock_register_notification_on_object (&myDeskletsMgr,
 
948
                NOTIFICATION_RENDER_DESKLET,
 
949
                (CairoDockNotificationFunc) _cairo_dock_render_desklet_notification,
 
950
                CAIRO_DOCK_RUN_FIRST, NULL);
 
951
        s_iStartupTime = time (NULL);  // on startup, the WM can take a long time before it has positionned all the desklets. To avoid irrelevant configure events, we set a delay.
 
952
}
 
953
 
 
954
  ///////////////
 
955
 /// MANAGER ///
 
956
///////////////
 
957
 
 
958
void gldi_register_desklets_manager (void)
 
959
{
 
960
        // Manager
 
961
        memset (&myDeskletsMgr, 0, sizeof (CairoDeskletManager));
 
962
        myDeskletsMgr.mgr.cModuleName   = "Desklets";
 
963
        myDeskletsMgr.mgr.init          = init;
 
964
        myDeskletsMgr.mgr.load          = NULL;  // data are loaded the first time a desklet is created, to avoid create them for nothing.
 
965
        myDeskletsMgr.mgr.unload                = unload;
 
966
        myDeskletsMgr.mgr.reload                = (GldiManagerReloadFunc)reload;
 
967
        myDeskletsMgr.mgr.get_config    = (GldiManagerGetConfigFunc)get_config;
 
968
        myDeskletsMgr.mgr.reset_config = (GldiManagerResetConfigFunc)reset_config;
 
969
        // Config
 
970
        memset (&myDeskletsParam, 0, sizeof (CairoDeskletsParam));
 
971
        myDeskletsMgr.mgr.pConfig = (GldiManagerConfigPtr*)&myDeskletsParam;
 
972
        myDeskletsMgr.mgr.iSizeOfConfig = sizeof (CairoDeskletsParam);
 
973
        // data
 
974
        memset (&s_pRotateButtonBuffer, 0, sizeof (CairoDockImageBuffer));
 
975
        memset (&s_pRetachButtonBuffer, 0, sizeof (CairoDockImageBuffer));
 
976
        memset (&s_pDepthRotateButtonBuffer, 0, sizeof (CairoDockImageBuffer));
 
977
        memset (&s_pNoInputButtonBuffer, 0, sizeof (CairoDockImageBuffer));
 
978
        myDeskletsMgr.mgr.iSizeOfData = 0;
 
979
        myDeskletsMgr.mgr.pData = (GldiManagerDataPtr*)NULL;
 
980
        // signals
 
981
        cairo_dock_install_notifications_on_object (&myDeskletsMgr, NB_NOTIFICATIONS_DESKLET);
 
982
        // register
 
983
        gldi_register_manager (GLDI_MANAGER(&myDeskletsMgr));
 
984
}