36
37
#include <gdk/x11/gdkglx.h>
37
38
#include <gdk/gdkx.h>
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"
59
54
#include "cairo-dock-desklet-manager.h"
56
// public (manager, config, data)
57
CairoDeskletsParam myDeskletsParam;
58
CairoDeskletManager myDeskletsMgr;
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.
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;
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)
78
void cairo_dock_init_desklet_manager (void)
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));
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);
99
80
void cairo_dock_load_desklet_buttons (void)
101
82
//g_print ("%s ()\n", __func__);
102
if (myDesklets.cRotateButtonImage != NULL)
83
if (myDeskletsParam.cRotateButtonImage != NULL)
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);
110
91
if (s_pRotateButtonBuffer.pSurface == NULL)
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);
119
if (myDesklets.cRetachButtonImage != NULL)
100
if (myDeskletsParam.cRetachButtonImage != NULL)
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);
127
108
if (s_pRetachButtonBuffer.pSurface == NULL)
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);
136
if (myDesklets.cDepthRotateButtonImage != NULL)
117
if (myDeskletsParam.cDepthRotateButtonImage != NULL)
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);
144
125
if (s_pDepthRotateButtonBuffer.pSurface == NULL)
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);
153
if (myDesklets.cNoInputButtonImage != NULL)
134
if (myDeskletsParam.cNoInputButtonImage != NULL)
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);
161
142
if (s_pNoInputButtonBuffer.pSurface == NULL)
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);
371
352
if (s_pRotateButtonBuffer.iTexture != 0)
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,
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);
380
361
if (s_pRetachButtonBuffer.iTexture != 0 && g_pMainDock)
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,
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);
389
370
if (s_pDepthRotateButtonBuffer.iTexture != 0)
392
373
glTranslatef (0.,
393
pDesklet->container.iHeight/2 - myDesklets.iDeskletButtonSize/2,
374
pDesklet->container.iHeight/2 - myDeskletsParam.iDeskletButtonSize/2,
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);
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,
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);
836
gboolean cairo_dock_desklet_manager_is_ready (void)
838
static gboolean bReady = FALSE;
839
if (!bReady) // once we are ready, no need to test it again.
841
bReady = (time (NULL) > s_iStartupTime + 5); // 5s delay on startup
850
static gboolean get_config (GKeyFile *pKeyFile, CairoDeskletsParam *pDesklets)
852
gboolean bFlushConfFileNeeded = FALSE;
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)
858
pUserDeskletDecorations = g_new0 (CairoDeskletDecoration, 1);
859
pUserDeskletDecorations->cDisplayedName = _("_custom decoration_");
860
cairo_dock_register_desklet_decoration ("personnal", pUserDeskletDecorations);
862
if (pDesklets->cDeskletDecorationsName == NULL || strcmp (pDesklets->cDeskletDecorationsName, "personnal") == 0)
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);
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;
889
static void reset_config (CairoDeskletsParam *pDesklets)
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);
903
static void reload (CairoDeskletsParam *pPrevDesklets, CairoDeskletsParam *pDesklets)
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))
910
cairo_dock_unload_desklet_buttons ();
911
cairo_dock_load_desklet_buttons ();
913
if (cairo_dock_strings_differ (pPrevDesklets->cDeskletDecorationsName, pDesklets->cDeskletDecorationsName))
915
cairo_dock_reload_desklets_decorations (TRUE); // TRUE <=> bDefaultThemeOnly
924
static void unload (void)
926
cairo_dock_unload_desklet_buttons ();
933
static void init (void)
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.
958
void gldi_register_desklets_manager (void)
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;
970
memset (&myDeskletsParam, 0, sizeof (CairoDeskletsParam));
971
myDeskletsMgr.mgr.pConfig = (GldiManagerConfigPtr*)&myDeskletsParam;
972
myDeskletsMgr.mgr.iSizeOfConfig = sizeof (CairoDeskletsParam);
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;
981
cairo_dock_install_notifications_on_object (&myDeskletsMgr, NB_NOTIFICATIONS_DESKLET);
983
gldi_register_manager (GLDI_MANAGER(&myDeskletsMgr));