00001
00002
00003 #ifndef __CAIRO_DOCK_APPLET_FACILITY__
00004 #define __CAIRO_DOCK_APPLET_FACILITY__
00005
00006 #include "cairo-dock-struct.h"
00007
00021 gchar *cairo_dock_check_conf_file_exists (gchar *cUserDataDirName, gchar *cShareDataDir, gchar *cConfFileName);
00022
00023 void cairo_dock_free_minimal_config (CairoDockMinimalAppletConfig *pMinimalConfig);
00024
00034 void cairo_dock_set_icon_surface_full (cairo_t *pIconContext, cairo_surface_t *pSurface, double fScale, double fAlpha, Icon *pIcon, CairoDockContainer *pContainer);
00040 #define cairo_dock_set_icon_surface(pIconContext, pSurface) cairo_dock_set_icon_surface_full (pIconContext, pSurface, 1, 1, NULL, NULL)
00041
00048 void cairo_dock_draw_bar_on_icon (cairo_t *pIconContext, double fValue, Icon *pIcon, CairoDockContainer *pContainer);
00049
00056 void cairo_dock_add_reflection_to_icon (cairo_t *pIconContext, Icon *pIcon, CairoDockContainer *pContainer);
00064 void cairo_dock_set_icon_surface_with_reflect (cairo_t *pIconContext, cairo_surface_t *pSurface, Icon *pIcon, CairoDockContainer *pContainer);
00072 void cairo_dock_set_image_on_icon (cairo_t *pIconContext, gchar *cImagePath, Icon *pIcon, CairoDockContainer *pContainer);
00073
00081 void cairo_dock_set_icon_name (cairo_t *pSourceContext, const gchar *cIconName, Icon *pIcon, CairoDockContainer *pContainer);
00082
00090 void cairo_dock_set_quick_info (cairo_t *pSourceContext, const gchar *cQuickInfo, Icon *pIcon, double fMaxScale);
00099 void cairo_dock_set_quick_info_full (cairo_t *pSourceContext, Icon *pIcon, CairoDockContainer *pContainer, const gchar *cQuickInfoFormat, ...);
00104 #define cairo_dock_remove_quick_info(pIcon) cairo_dock_set_quick_info (NULL, NULL, pIcon, 1)
00105
00106 void cairo_dock_set_hours_minutes_as_quick_info (cairo_t *pSourceContext, Icon *pIcon, CairoDockContainer *pContainer, int iTimeInSeconds);
00107 void cairo_dock_set_minutes_secondes_as_quick_info (cairo_t *pSourceContext, Icon *pIcon, CairoDockContainer *pContainer, int iTimeInSeconds);
00108
00109
00110
00118 void cairo_dock_animate_icon (Icon *pIcon, CairoDock *pDock, CairoDockAnimationType iAnimationType, int iNbRounds);
00119
00132 gchar* cairo_dock_manage_themes_for_applet (gchar *cAppletShareDataDir, gchar *cThemeDirName, gchar *cAppletConfFilePath, GKeyFile *pKeyFile, gchar *cGroupName, gchar *cKeyName, gboolean *bFlushConfFileNeeded, gchar *cDefaultThemeName);
00133
00140 GtkWidget *cairo_dock_create_sub_menu (gchar *cLabel, GtkWidget *pMenu);
00141
00142
00143 typedef struct {
00144 gint iSidTimer;
00145 gint iSidTimerRedraw;
00146 gint iThreadIsRunning;
00147 GMutex *pMutexData;
00148 GVoidFunc acquisition;
00149 GVoidFunc read;
00150 GVoidFunc update;
00151 gint iCheckInterval;
00152 } CairoDockMeasure;
00153
00158 void cairo_dock_launch_measure (CairoDockMeasure *pMeasureTimer);
00167 CairoDockMeasure *cairo_dock_new_measure_timer (int iCheckInterval, GVoidFunc acquisition, GVoidFunc read, GVoidFunc update);
00172 void cairo_dock_stop_measure_timer (CairoDockMeasure *pMeasureTimer);
00177 void cairo_dock_free_measure_timer (CairoDockMeasure *pMeasureTimer);
00183 gboolean cairo_dock_measure_is_active (CairoDockMeasure *pMeasureTimer);
00189 void cairo_dock_change_measure_frequency (CairoDockMeasure *pMeasureTimer, int iNewCheckInterval);
00190
00191
00192
00196 #define CD_APPLET_H \
00197 CairoDockVisitCard *pre_init (void); \
00198 void init (GKeyFile *pKeyFile, Icon *pIcon, CairoDockContainer *pContainer, gchar *cConfFilePath, GError **erreur); \
00199 void stop (void); \
00200 gboolean reload (GKeyFile *pKeyFile, gchar *cConfFilePath, CairoDockContainer *pNewContainer);
00201
00202
00212 #define CD_APPLET_PRE_INIT_BEGIN(cName, iMajorVersion, iMinorVersion, iMicroVersion, iAppletCategory) \
00213 Icon *myIcon = NULL; \
00214 CairoDock *myDock = NULL; \
00215 CairoDockDesklet *myDesklet = NULL; \
00216 CairoDockContainer *myContainer = NULL; \
00217 cairo_t *myDrawContext = NULL; \
00218 AppletConfig myConfig; \
00219 AppletData myData; \
00220 CairoDockVisitCard *pre_init (void) \
00221 { \
00222 CairoDockVisitCard *pVisitCard = g_new0 (CairoDockVisitCard, 1); \
00223 pVisitCard->cModuleName = g_strdup (cName); \
00224 pVisitCard->cReadmeFilePath = g_strdup_printf ("%s/%s", MY_APPLET_SHARE_DATA_DIR, MY_APPLET_README_FILE); \
00225 pVisitCard->iMajorVersionNeeded = iMajorVersion; \
00226 pVisitCard->iMinorVersionNeeded = iMinorVersion; \
00227 pVisitCard->iMicroVersionNeeded = iMicroVersion; \
00228 pVisitCard->cPreviewFilePath = g_strdup_printf ("%s/%s", MY_APPLET_SHARE_DATA_DIR, MY_APPLET_PREVIEW_FILE); \
00229 pVisitCard->cGettextDomain = g_strdup (MY_APPLET_GETTEXT_DOMAIN); \
00230 pVisitCard->cDockVersionOnCompilation = g_strdup (MY_APPLET_DOCK_VERSION); \
00231 pVisitCard->cUserDataDir = g_strdup (MY_APPLET_USER_DATA_DIR); \
00232 pVisitCard->cShareDataDir = g_strdup (MY_APPLET_SHARE_DATA_DIR); \
00233 pVisitCard->cConfFileName = (MY_APPLET_CONF_FILE != NULL && strcmp (MY_APPLET_CONF_FILE, "none") != 0 ? g_strdup (MY_APPLET_CONF_FILE) : NULL); \
00234 pVisitCard->cModuleVersion = g_strdup (MY_APPLET_VERSION);\
00235 pVisitCard->iCategory =iAppletCategory ;\
00236 pVisitCard->cIconFilePath = g_strdup_printf ("%s/%s", MY_APPLET_SHARE_DATA_DIR, MY_APPLET_ICON_FILE);
00237
00240 #define CD_APPLET_PRE_INIT_END \
00241 return pVisitCard; \
00242 }
00243
00246 #define CD_APPLET_DEFINITION(cName, iMajorVersion, iMinorVersion, iMicroVersion, iAppletCategory) \
00247 CD_APPLET_PRE_INIT_BEGIN (cName, iMajorVersion, iMinorVersion, iMicroVersion, iAppletCategory) \
00248 CD_APPLET_PRE_INIT_END
00249
00250
00251
00252
00258 #define CD_APPLET_INIT_BEGIN(erreur) \
00259 void init (GKeyFile *pKeyFile, Icon *pIcon, CairoDockContainer *pContainer, gchar *cConfFilePath, GError **erreur) \
00260 { \
00261 g_return_if_fail (pContainer != NULL && pIcon != NULL); \
00262 myIcon = pIcon; \
00263 myContainer = pContainer; \
00264 myDock = (CAIRO_DOCK_IS_DOCK (pContainer) ? CAIRO_DOCK_DOCK (pContainer) : NULL); \
00265 myDesklet = (CAIRO_DOCK_IS_DESKLET (pContainer) ? CAIRO_DOCK_DESKLET (pContainer) : NULL); \
00266 read_conf_file (pKeyFile, cConfFilePath); \
00267 if (CAIRO_DOCK_IS_DOCK (myContainer)) \
00268 { \
00269 if (myIcon != NULL) \
00270 { \
00271 myDrawContext = cairo_create (myIcon->pIconBuffer); \
00272 g_return_if_fail (cairo_status (myDrawContext) == CAIRO_STATUS_SUCCESS); \
00273 } \
00274 } \
00275 else \
00276 myDrawContext = NULL;
00277
00281 #define CD_APPLET_INIT_END \
00282 return; \
00283 }
00284
00285
00289 #define CD_APPLET_STOP_BEGIN \
00290 void stop (void) \
00291 {
00292
00296 #define CD_APPLET_STOP_END \
00297 reset_data (); \
00298 reset_config (); \
00299 myDock = NULL; \
00300 myDesklet = NULL; \
00301 myContainer = NULL; \
00302 myIcon = NULL; \
00303 if (myDrawContext != NULL) \
00304 cairo_destroy (myDrawContext); \
00305 myDrawContext = NULL; \
00306 }
00307
00308
00312 #define CD_APPLET_RELOAD_BEGIN \
00313 gboolean reload (GKeyFile *pKeyFile, gchar *cConfFilePath, CairoDockContainer *pNewContainer) \
00314 { \
00315 cd_message ("%s (%s)\n", __func__, cConfFilePath); \
00316 g_return_val_if_fail (pNewContainer != NULL, FALSE); \
00317 CairoDockContainer *pOldContainer = myContainer; \
00318 gboolean bContainerTypeChanged = (myContainer == NULL || myContainer->iType != pNewContainer->iType); \
00319 myContainer = pNewContainer; \
00320 myDock = (CAIRO_DOCK_IS_DOCK (pNewContainer) ? CAIRO_DOCK_DOCK (pNewContainer) : NULL); \
00321 myDesklet = (CAIRO_DOCK_IS_DESKLET (pNewContainer) ? CAIRO_DOCK_DESKLET (pNewContainer) : NULL); \
00322 if (pKeyFile != NULL) \
00323 read_conf_file (pKeyFile, cConfFilePath); \
00324 if (myDrawContext != NULL) \
00325 cairo_destroy (myDrawContext); \
00326 if (CAIRO_DOCK_IS_DOCK (myContainer)) \
00327 { \
00328 myDrawContext = cairo_create (myIcon->pIconBuffer); \
00329 g_return_val_if_fail (cairo_status (myDrawContext) == CAIRO_STATUS_SUCCESS, FALSE); \
00330 } \
00331 else \
00332 myDrawContext = NULL;
00333
00337 #define CD_APPLET_RELOAD_END \
00338 return TRUE; \
00339 }
00340
00344 #define CD_APPLET_MY_CONFIG_CHANGED (pKeyFile != NULL)
00345
00349 #define CD_APPLET_MY_CONTAINER_TYPE_CHANGED bContainerTypeChanged
00350
00354 #define CD_APPLET_MY_OLD_CONTAINER pOldContainer;
00355
00356
00360 #define CD_APPLET_MY_CONF_FILE cConfFilePath
00361
00364 #define CD_APPLET_MY_KEY_FILE pKeyFile
00365
00366
00367
00368
00372 #define CD_APPLET_GET_CONFIG_BEGIN \
00373 void read_conf_file (GKeyFile *pKeyFile, gchar *cConfFilePath) \
00374 { \
00375 gboolean bFlushConfFileNeeded = FALSE, bNewKeysPresent = FALSE; \
00376 reset_config ();
00377
00381 #define CD_APPLET_GET_CONFIG_END \
00382 if (bNewKeysPresent) \
00383 cairo_dock_write_keys_to_file (pKeyFile, cConfFilePath); \
00384 if (! bFlushConfFileNeeded) \
00385 bFlushConfFileNeeded = cairo_dock_conf_file_needs_update (pKeyFile, MY_APPLET_VERSION); \
00386 if (bFlushConfFileNeeded) \
00387 cairo_dock_flush_conf_file (pKeyFile, cConfFilePath, MY_APPLET_SHARE_DATA_DIR);\
00388 }
00389
00390
00394 #define CD_APPLET_CONFIG_H \
00395 void read_conf_file (GKeyFile *pKeyFile, gchar *cConfFilePath); \
00396 void reset_config (void); \
00397 void reset_data (void);
00398
00399
00407 #define CD_CONFIG_GET_BOOLEAN_WITH_DEFAULT(cGroupName, cKeyName, bDefaultValue) cairo_dock_get_boolean_key_value (pKeyFile, cGroupName, cKeyName, &bFlushConfFileNeeded, bDefaultValue, NULL, NULL)
00408
00415 #define CD_CONFIG_GET_BOOLEAN(cGroupName, cKeyName) \
00416 CD_CONFIG_GET_BOOLEAN_WITH_DEFAULT (cGroupName, cKeyName, TRUE)
00417
00425 #define CD_CONFIG_GET_INTEGER_WITH_DEFAULT(cGroupName, cKeyName, iDefaultValue) cairo_dock_get_integer_key_value (pKeyFile, cGroupName, cKeyName, &bFlushConfFileNeeded, iDefaultValue, NULL, NULL)
00426
00432 #define CD_CONFIG_GET_INTEGER(cGroupName, cKeyName)CD_CONFIG_GET_INTEGER_WITH_DEFAULT (cGroupName, cKeyName, 0)
00433
00441 #define CD_CONFIG_GET_DOUBLE_WITH_DEFAULT(cGroupName, cKeyName, fDefaultValue) cairo_dock_get_double_key_value (pKeyFile, cGroupName, cKeyName, &bFlushConfFileNeeded, 0., NULL, NULL)
00442
00448 #define CD_CONFIG_GET_DOUBLE(cGroupName, cKeyName) CD_CONFIG_GET_DOUBLE_WITH_DEFAULT (cGroupName, cKeyName, 0.)
00449
00457 #define CD_CONFIG_GET_STRING_WITH_DEFAULT(cGroupName, cKeyName, cDefaultValue) cairo_dock_get_string_key_value (pKeyFile, cGroupName, cKeyName, &bFlushConfFileNeeded, cDefaultValue, NULL, NULL)
00458
00464 #define CD_CONFIG_GET_STRING(cGroupName, cKeyName) CD_CONFIG_GET_STRING_WITH_DEFAULT (cGroupName, cKeyName, NULL)
00465
00474 #define CD_CONFIG_GET_STRING_LIST_WITH_DEFAULT(cGroupName, cKeyName, length, cDefaultValues) cairo_dock_get_string_list_key_value (pKeyFile, cGroupName, cKeyName, &bFlushConfFileNeeded, length, cDefaultValues, NULL, NULL)
00475
00482 #define CD_CONFIG_GET_STRING_LIST(cGroupName, cKeyName, length) CD_CONFIG_GET_STRING_LIST_WITH_DEFAULT(cGroupName, cKeyName, length, NULL)
00483
00491 #define CD_CONFIG_GET_ANIMATION_WITH_DEFAULT(cGroupName, cKeyName, iDefaultAnimation) cairo_dock_get_animation_type_key_value (pKeyFile, cGroupName, cKeyName, &bFlushConfFileNeeded, iDefaultAnimation, NULL, NULL);
00492
00498 #define CD_CONFIG_GET_ANIMATION(cGroupName, cKeyName) CD_CONFIG_GET_ANIMATION_WITH_DEFAULT(cGroupName, cKeyName, CAIRO_DOCK_BOUNCE)
00499
00507 #define CD_CONFIG_GET_COLOR_WITH_DEFAULT(cGroupName, cKeyName, pColorBuffer, pDefaultColor) cairo_dock_get_double_list_key_value (pKeyFile, cGroupName, cKeyName, &bFlushConfFileNeeded, pColorBuffer, 4, pDefaultColor, NULL, NULL);
00508
00514 #define CD_CONFIG_GET_COLOR(cGroupName, cKeyName, pColorBuffer) CD_CONFIG_GET_COLOR_WITH_DEFAULT(cGroupName, cKeyName, pColorBuffer, NULL)
00515
00522 #define CD_CONFIG_GET_COLOR_RVB_WITH_DEFAULT(cGroupName, cKeyName, pColorBuffer, pDefaultColor) cairo_dock_get_double_list_key_value (pKeyFile, cGroupName, cKeyName, &bFlushConfFileNeeded, pColorBuffer, 3, pDefaultColor, NULL, NULL);
00523
00529 #define CD_CONFIG_GET_COLOR_RVB(cGroupName, cKeyName, pColorBuffer) CD_CONFIG_GET_COLOR_RVB_WITH_DEFAULT(cGroupName, cKeyName, pColorBuffer, NULL)
00530
00539 #define CD_CONFIG_GET_THEME_PATH(cGroupName, cKeyName, cThemesDirName, cDefaultThemeName) \
00540 cairo_dock_manage_themes_for_applet (MY_APPLET_SHARE_DATA_DIR, cThemesDirName, CD_APPLET_MY_CONF_FILE, pKeyFile, cGroupName, cKeyName, &bFlushConfFileNeeded, cDefaultThemeName)
00541
00545 #define CD_APPLET_RESET_CONFIG_BEGIN \
00546 void reset_config (void) \
00547 {
00548
00551 #define CD_APPLET_RESET_CONFIG_END \
00552 memset (&myConfig, 0, sizeof (AppletConfig)); \
00553 }
00554
00558 #define CD_APPLET_RESET_DATA_BEGIN \
00559 void reset_data(void) \
00560 {
00561
00564 #define CD_APPLET_RESET_DATA_END \
00565 memset (&myData, 0, sizeof (AppletData)); \
00566 }
00567
00568
00569
00574 #define CD_APPLET_ABOUT(cMessage) \
00575 void about (GtkMenuItem *menu_item, gpointer *data) \
00576 { \
00577 cairo_dock_show_temporary_dialog (cMessage, myIcon, myContainer, 0); \
00578 }
00579
00582 #define CD_APPLET_ABOUT_H \
00583 void about (GtkMenuItem *menu_item, gpointer *data);
00584
00585
00586 #define CD_APPLET_ON_CLICK action_on_click
00587
00590 #define CD_APPLET_REGISTER_FOR_CLICK_EVENT cairo_dock_register_notification (CAIRO_DOCK_CLICK_ICON, (CairoDockNotificationFunc) CD_APPLET_ON_CLICK, CAIRO_DOCK_RUN_FIRST);
00591
00594 #define CD_APPLET_UNREGISTER_FOR_CLICK_EVENT cairo_dock_remove_notification_func (CAIRO_DOCK_CLICK_ICON, (CairoDockNotificationFunc) CD_APPLET_ON_CLICK);
00595
00599 #define CD_APPLET_ON_CLICK_BEGIN \
00600 gboolean CD_APPLET_ON_CLICK (gpointer *data) \
00601 { \
00602 Icon *pClickedIcon = data[0]; \
00603 CairoDockContainer *pClickedContainer = data[1]; \
00604 guint iButtonState = GPOINTER_TO_INT (data[2]); \
00605 if (pClickedIcon == myIcon || (myIcon != NULL && pClickedContainer == CAIRO_DOCK_CONTAINER (myIcon->pSubDock)) || pClickedContainer == CAIRO_DOCK_CONTAINER (myDesklet)) \
00606 {
00607
00611 #define CD_APPLET_ON_CLICK_END \
00612 return CAIRO_DOCK_INTERCEPT_NOTIFICATION; \
00613 } \
00614 return CAIRO_DOCK_LET_PASS_NOTIFICATION; \
00615 }
00616
00619 #define CD_APPLET_ON_CLICK_H \
00620 gboolean CD_APPLET_ON_CLICK (gpointer *data);
00621
00622
00623 #define CD_APPLET_ON_BUILD_MENU applet_on_build_menu
00624
00627 #define CD_APPLET_REGISTER_FOR_BUILD_MENU_EVENT cairo_dock_register_notification (CAIRO_DOCK_BUILD_MENU, (CairoDockNotificationFunc) CD_APPLET_ON_BUILD_MENU, CAIRO_DOCK_RUN_FIRST);
00628
00631 #define CD_APPLET_UNREGISTER_FOR_BUILD_MENU_EVENT cairo_dock_remove_notification_func (CAIRO_DOCK_BUILD_MENU, (CairoDockNotificationFunc) CD_APPLET_ON_BUILD_MENU);
00632
00636 #define CD_APPLET_ON_BUILD_MENU_BEGIN \
00637 gboolean CD_APPLET_ON_BUILD_MENU (gpointer *data) \
00638 { \
00639 Icon *pClickedIcon = data[0]; \
00640 CairoDockContainer *pClickedContainer = data[1]; \
00641 if (pClickedIcon == myIcon || (myIcon != NULL && pClickedContainer == CAIRO_DOCK_CONTAINER (myIcon->pSubDock)) || pClickedContainer == CAIRO_DOCK_CONTAINER (myDesklet)) \
00642 { \
00643 GtkWidget *pAppletMenu = data[2]; \
00644 GtkWidget *pMenuItem, image; \
00645 pMenuItem = gtk_separator_menu_item_new (); \
00646 gtk_menu_shell_append(GTK_MENU_SHELL (pAppletMenu), pMenuItem);
00647
00651 #define CD_APPLET_ON_BUILD_MENU_END \
00652 } \
00653 return CAIRO_DOCK_LET_PASS_NOTIFICATION; \
00654 }
00655
00658 #define CD_APPLET_ON_BUILD_MENU_H \
00659 gboolean CD_APPLET_ON_BUILD_MENU (gpointer *data);
00660
00664 #define CD_APPLET_MY_MENU pAppletMenu
00665
00669 #define CD_APPLET_CLICKED_ICON pClickedIcon
00670
00673 #define CD_APPLET_CLICKED_CONTAINER pClickedContainer
00674
00678 #define CD_APPLET_SHIFT_CLICK (iButtonState & GDK_SHIFT_MASK)
00679
00682 #define CD_APPLET_CTRL_CLICK (iButtonState & GDK_CONTROL_MASK)
00683
00686 #define CD_APPLET_ALT_CLICK (iButtonState & GDK_MOD1_MASK)
00687
00688
00695 #define CD_APPLET_ADD_SUB_MENU(cLabel, pSubMenu, pMenu) \
00696 GtkWidget *pSubMenu = gtk_menu_new (); \
00697 pMenuItem = gtk_menu_item_new_with_label (cLabel); \
00698 gtk_menu_shell_append (GTK_MENU_SHELL (pMenu), pMenuItem); \
00699 gtk_menu_item_set_submenu (GTK_MENU_ITEM (pMenuItem), pSubMenu);
00700
00707 #define CD_APPLET_CREATE_AND_ADD_SUB_MENU(cLabel, pMenu) \
00708 cairo_dock_create_sub_menu (cLabel, pMenu);
00709
00717 #define CD_APPLET_ADD_IN_MENU_WITH_DATA(cLabel, pFunction, pMenu, pData) \
00718 pMenuItem = gtk_menu_item_new_with_label (cLabel); \
00719 gtk_menu_shell_append (GTK_MENU_SHELL (pMenu), pMenuItem); \
00720 g_signal_connect (G_OBJECT (pMenuItem), "activate", G_CALLBACK (pFunction), pData);
00721
00728 #define CD_APPLET_ADD_IN_MENU(cLabel, pFunction, pMenu) CD_APPLET_ADD_IN_MENU_WITH_DATA(cLabel, pFunction, pMenu, NULL)
00729
00738 #define CD_APPLET_ADD_IN_MENU_WITH_STOCK(cLabel, gtkStock, pFunction, pMenu, pData) \
00739 menu_item = gtk_image_menu_item_new_with_label (_(cLabel)); \
00740 image = gtk_image_new_from_stock (gtkStock, GTK_ICON_SIZE_MENU); \
00741 gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_item), image); \
00742 gtk_menu_shell_append (GTK_MENU_SHELL (pMenu), menu_item); \
00743 g_signal_connect (G_OBJECT (menu_item), "activate", G_CALLBACK(pFunction), pData);
00744
00745
00746
00750 #define CD_APPLET_ADD_SEPARATOR() \
00751 pMenuItem = gtk_separator_menu_item_new (); \
00752 gtk_menu_shell_append(GTK_MENU_SHELL (pSubMenu), pMenuItem);
00753
00758 #define CD_APPLET_ADD_ABOUT_IN_MENU(pMenu) CD_APPLET_ADD_IN_MENU (_("About"), about, pMenu)
00759
00764 #define CD_APPLET_LAST_ITEM_IN_MENU pMenuItem
00765
00766
00767 #define CD_APPLET_ON_MIDDLE_CLICK action_on_middle_click
00768
00771 #define CD_APPLET_REGISTER_FOR_MIDDLE_CLICK_EVENT cairo_dock_register_notification (CAIRO_DOCK_MIDDLE_CLICK_ICON, (CairoDockNotificationFunc) CD_APPLET_ON_MIDDLE_CLICK, CAIRO_DOCK_RUN_FIRST);
00772
00775 #define CD_APPLET_UNREGISTER_FOR_MIDDLE_CLICK_EVENT cairo_dock_remove_notification_func (CAIRO_DOCK_MIDDLE_CLICK_ICON, (CairoDockNotificationFunc) CD_APPLET_ON_MIDDLE_CLICK);
00776
00780 #define CD_APPLET_ON_MIDDLE_CLICK_BEGIN \
00781 gboolean CD_APPLET_ON_MIDDLE_CLICK (gpointer *data) \
00782 { \
00783 Icon *pClickedIcon = data[0]; \
00784 CairoDockContainer *pClickedContainer = data[1]; \
00785 if (pClickedIcon == myIcon || (myIcon != NULL && pClickedContainer == CAIRO_DOCK_CONTAINER (myIcon->pSubDock)) || pClickedContainer == CAIRO_DOCK_CONTAINER (myDesklet)) \
00786 {
00787
00790 #define CD_APPLET_ON_MIDDLE_CLICK_END \
00791 return CAIRO_DOCK_INTERCEPT_NOTIFICATION; \
00792 } \
00793 return CAIRO_DOCK_LET_PASS_NOTIFICATION; \
00794 }
00795
00798 #define CD_APPLET_ON_MIDDLE_CLICK_H \
00799 gboolean CD_APPLET_ON_MIDDLE_CLICK (gpointer *data);
00800
00801
00802 #define CD_APPLET_ON_DROP_DATA action_on_drop_data
00803
00806 #define CD_APPLET_REGISTER_FOR_DROP_DATA_EVENT cairo_dock_register_notification (CAIRO_DOCK_DROP_DATA, (CairoDockNotificationFunc) CD_APPLET_ON_DROP_DATA, CAIRO_DOCK_RUN_FIRST);
00807
00810 #define CD_APPLET_UNREGISTER_FOR_DROP_DATA_EVENT cairo_dock_remove_notification_func (CAIRO_DOCK_DROP_DATA, (CairoDockNotificationFunc) CD_APPLET_ON_DROP_DATA);
00811
00815 #define CD_APPLET_ON_DROP_DATA_BEGIN \
00816 gboolean CD_APPLET_ON_DROP_DATA (gpointer *data) \
00817 { \
00818 Icon *pClickedIcon = data[1]; \
00819 CairoDockContainer *pClickedContainer = data[3]; \
00820 if (pClickedIcon == myIcon || (myIcon != NULL && pClickedContainer == CAIRO_DOCK_CONTAINER (myIcon->pSubDock)) || pClickedContainer == CAIRO_DOCK_CONTAINER (myDesklet)) \
00821 { \
00822 const gchar *cReceivedData = data[0]; \
00823 g_return_val_if_fail (cReceivedData != NULL, CAIRO_DOCK_LET_PASS_NOTIFICATION);
00824
00828 #define CD_APPLET_RECEIVED_DATA cReceivedData
00829
00833 #define CD_APPLET_ON_DROP_DATA_END \
00834 return CAIRO_DOCK_INTERCEPT_NOTIFICATION; \
00835 } \
00836 return CAIRO_DOCK_LET_PASS_NOTIFICATION; \
00837 }
00838
00841 #define CD_APPLET_ON_DROP_DATA_H \
00842 gboolean CD_APPLET_ON_DROP_DATA (gpointer *data);
00843
00844
00845
00846
00850 #define CD_APPLET_REDRAW_MY_ICON \
00851 cairo_dock_redraw_my_icon (myIcon, myContainer);
00852
00857 #define CD_APPLET_SET_SURFACE_ON_MY_ICON(pSurface) \
00858 cairo_dock_set_icon_surface_with_reflect (myDrawContext, pSurface, myIcon, myContainer); \
00859 cairo_dock_redraw_my_icon (myIcon, myContainer);
00860
00865 #define CD_APPLET_SET_SURFACE_ON_MY_ICON_WITH_ZOOM(pSurface, fScale) \
00866 cairo_dock_set_icon_surface_full (myDrawContext, pSurface, fScale, 1., myIcon, myContainer); \
00867 cairo_dock_add_reflection_to_icon (myDrawContext, myIcon, myContainer); \
00868 cairo_dock_redraw_my_icon (myIcon, myContainer);
00869
00874 #define CD_APPLET_SET_SURFACE_ON_MY_ICON_WITH_ALPHA(pSurface, fAlpha) \
00875 cairo_dock_set_icon_surface_full (myDrawContext, pSurface, 1., fAlpha, myIcon, myContainer); \
00876 cairo_dock_add_reflection_to_icon (myDrawContext, myIcon, myContainer); \
00877 cairo_dock_redraw_my_icon (myIcon, myContainer);
00878
00883 #define CD_APPLET_SET_SURFACE_ON_MY_ICON_WITH_BAR(pSurface, fValue) \
00884 cairo_dock_set_icon_surface_full (myDrawContext, pSurface, 1., 1., myIcon, myContainer); \
00885 cairo_dock_draw_bar_on_icon (myDrawContext, fValue, myIcon, myContainer); \
00886 cairo_dock_add_reflection_to_icon (myDrawContext, myIcon, myContainer); \
00887 cairo_dock_redraw_my_icon (myIcon, myContainer);
00888
00893 #define CD_APPLET_SET_IMAGE_ON_MY_ICON(cImagePath) \
00894 if (cImagePath != myIcon->acFileName) \
00895 { \
00896 g_free (myIcon->acFileName); \
00897 myIcon->acFileName = g_strdup (cImagePath); \
00898 } \
00899 cairo_dock_set_image_on_icon (myDrawContext, cImagePath, myIcon, myContainer);
00900
00905 #define CD_APPLET_SET_LOCAL_IMAGE_ON_MY_ICON(cImageName) \
00906 { \
00907 gchar *cImageFilePath = g_strconcat (MY_APPLET_SHARE_DATA_DIR, "/", cImageName, NULL); \
00908 CD_APPLET_SET_IMAGE_ON_MY_ICON (cImageFilePath); \
00909 g_free (cImageFilePath); \
00910 }
00911
00917 #define CD_APPLET_SET_USER_IMAGE_ON_MY_ICON(cUserImageName, cDefaultLocalImageName) \
00918 { \
00919 gchar *cImagePath; \
00920 if (cUserImageName != NULL) \
00921 cImagePath = cairo_dock_generate_file_path (cUserImageName); \
00922 else \
00923 cImagePath = g_strdup_printf ("%s/%s", MY_APPLET_SHARE_DATA_DIR, cDefaultLocalImageName); \
00924 CD_APPLET_SET_IMAGE_ON_MY_ICON (cImagePath); \
00925 g_free (cImagePath); \
00926 }
00927
00933 #define CD_APPLET_SET_ZOOMED_SURFACE_ON_MY_ICON(pSurface, fScale) \
00934 cairo_dock_set_icon_surface_with_zoom (myDrawContext, pSurface, fScale, myIcon, myContainer); \
00935 cairo_dock_redraw_my_icon (myIcon, myContainer);
00936
00937
00942 #define CD_APPLET_SET_NAME_FOR_MY_ICON(cIconName) \
00943 cairo_dock_set_icon_name (myDrawContext, cIconName, myIcon, myContainer);
00944
00949 #define CD_APPLET_SET_QUICK_INFO_ON_MY_ICON(cQuickInfoFormat, ...) \
00950 cairo_dock_set_quick_info_full (myDrawContext, myIcon, myContainer, cQuickInfoFormat, ##__VA_ARGS__);
00951
00955 #define CD_APPLET_SET_QUICK_INFO_ON_MY_ICON_AND_REDRAW(cQuickInfoFormat, ...) \
00956 cairo_dock_set_quick_info_full (myDrawContext, myIcon, myContainer, cQuickInfoFormat, ##__VA_ARGS__); \
00957 cairo_dock_redraw_my_icon (myIcon, myContainer);
00958
00962 #define CD_APPLET_SET_HOURS_MINUTES_AS_QUICK_INFO(iTimeInSeconds) \
00963 cairo_dock_set_hours_minutes_as_quick_info (myDrawContext, myIcon, myContainer, iTimeInSeconds);
00964
00968 #define CD_APPLET_SET_MINUTES_SECONDES_AS_QUICK_INFO(iTimeInSeconds) \
00969 cairo_dock_set_minutes_secondes_as_quick_info (myDrawContext, myIcon, myContainer, iTimeInSeconds);
00970
00971
00972
00978 #define CD_APPLET_ANIMATE_MY_ICON(iAnimationType, iAnimationLength) \
00979 cairo_dock_animate_icon (myIcon, myContainer, iAnimationType, iAnimationLength);
00980
00986 #define CD_APPLET_LOAD_SURFACE_FOR_MY_APPLET(cImagePath) \
00987 cairo_dock_create_surface_for_icon (cImagePath, myDrawContext, myIcon->fWidth * (myDock ? (1 + g_fAmplitude) / myDock->fRatio : 1), myIcon->fHeight* (myDock ? (1 + g_fAmplitude) / myDock->fRatio : 1));
00988
00989
00995 #define CD_APPLET_SET_DESKLET_RENDERER_WITH_DATA(cRendererName, pConfig) \
00996 cairo_dock_set_desklet_renderer_by_name (myDesklet, cRendererName, NULL, CAIRO_DOCK_LOAD_ICONS_FOR_DESKLET, pConfig); \
00997 myDrawContext = cairo_create (myIcon->pIconBuffer);
00998
01002 #define CD_APPLET_SET_DESKLET_RENDERER(cRendererName) CD_APPLET_SET_DESKLET_RENDERER_WITH_DATA (cRendererName, NULL)
01003
01004
01008 #define CD_APPLET_INCLUDE_MY_VARS \
01009 extern Icon *myIcon; \
01010 extern cairo_t *myDrawContext; \
01011 extern CairoDock *myDock; \
01012 extern CairoDockDesklet *myDesklet; \
01013 extern CairoDockContainer *myContainer; \
01014 extern AppletConfig myConfig; \
01015 extern AppletData myData;
01016
01017
01018
01022 #define D_(message) dgettext (MY_APPLET_GETTEXT_DOMAIN, message)
01023 #define _D D_
01024
01025 #endif
01026
01027
01028
01029
01030 #define CD_APPLET_DEFINE_TIMER(_get_data, _read_data, _load_data) \
01031 static int s_iThreadIsRunning = 0, s_iSidTimerRedraw = 0; \
01032 static GStaticMutex mutexData = G_STATIC_MUTEX_INIT; \
01033 static gboolean _cairo_dock_timer (gpointer data) { \
01034 _cairo_dock_launch_measure (); \
01035 return TRUE; } \
01036 static gpointer _cairo_dock_threaded_calculation (gpointer data) { \
01037 _get_data (); \
01038 g_static_mutex_lock (&mutexData); \
01039 _read_data (); \
01040 g_static_mutex_unlock (&mutexData); \
01041 g_atomic_int_set (&s_iThreadIsRunning, 0); \
01042 return NULL; } \
01043 static gboolean _cairo_dock_check_for_redraw (gpointer data) { \
01044 int iThreadIsRunning = g_atomic_int_get (&s_iThreadIsRunning); \
01045 if (! iThreadIsRunning) { \
01046 s_iSidTimerRedraw = 0; \
01047 if (myIcon == NULL) { \
01048 cd_warning ("annulation du chargement de l'applet"); \
01049 return FALSE; } \
01050 g_static_mutex_lock (&mutexData); \
01051 _load_data (); \
01052 g_static_mutex_unlock (&mutexData); \
01053 if (myData.iSidTimer == 0) \
01054 myData.iSidTimer = g_timeout_add (myConfig.iCheckInterval, (GSourceFunc) _cairo_dock_timer, NULL); \
01055 return FALSE; } \
01056 return TRUE; } \
01057 void cairo_dock_launch_measure (void) { \
01058 if (g_atomic_int_compare_and_exchange (&s_iThreadIsRunning, 0, 1)) { \
01059 if (s_iSidTimerRedraw == 0) \
01060 s_iSidTimerRedraw = g_timeout_add (250, (GSourceFunc) _cairo_dock_check_for_redraw, (gpointer) NULL); \
01061 GError *erreur = NULL; \
01062 GThread* pThread = g_thread_create ((GThreadFunc) _cairo_dock_threaded_calculation, NULL, FALSE, &erreur); \
01063 if (erreur != NULL) { \
01064 cd_warning ("Attention : %s", erreur->message); \
01065 g_error_free (erreur); } } }
01066
01067 #define CD_APPLET_START_TIMER \
01068 cairo_dock_launch_measure ();
01069
01070 #define CD_APPLET_STOP_TIMER \
01071 if (myData.iSidTimer != 0) { \
01072 g_source_remove (myData.iSidTimer); \
01073 myData.iSidTimer = 0; }
01074
01075 #define CD_APPLET_TIMER_IS_RUNNING (myData.iSidTimer != 0)