void gldi_desklet_set_sticky (CairoDesklet *pDesklet, gboolean bSticky) { //g_print ("%s (%d)\n", __func__, bSticky); int iNumDesktop; if (bSticky) { gtk_window_stick (GTK_WINDOW (pDesklet->container.pWidget)); iNumDesktop = -1; } else { gtk_window_unstick (GTK_WINDOW (pDesklet->container.pWidget)); int iCurrentDesktop, iCurrentViewportX, iCurrentViewportY; gldi_desktop_get_current (&iCurrentDesktop, &iCurrentViewportX, &iCurrentViewportY); iNumDesktop = iCurrentDesktop * g_desktopGeometry.iNbViewportX * g_desktopGeometry.iNbViewportY + iCurrentViewportX * g_desktopGeometry.iNbViewportY + iCurrentViewportY; cd_debug (">>> on colle ce desklet sur le bureau %d", iNumDesktop); } //\_________________ On enregistre le nouvel etat. Icon *icon = pDesklet->pIcon; if (CAIRO_DOCK_IS_APPLET (icon)) cairo_dock_update_conf_file (icon->pModuleInstance->cConfFilePath, G_TYPE_BOOLEAN, "Desklet", "sticky", bSticky, G_TYPE_INT, "Desklet", "num desktop", iNumDesktop, G_TYPE_INVALID); }
static void init_object (GldiObject *obj, gpointer attr) { CairoDesklet *pDesklet = (CairoDesklet*)obj; CairoDeskletAttr *pAttributes = (CairoDeskletAttr*)attr; g_return_if_fail (pAttributes->pIcon != NULL); gldi_desklet_init_internals (pDesklet); // attach the main icon Icon *pIcon = pAttributes->pIcon; pDesklet->pIcon = pIcon; cairo_dock_set_icon_container (pIcon, pDesklet); if (CAIRO_DOCK_IS_APPLET (pIcon)) gtk_window_set_title (GTK_WINDOW (pDesklet->container.pWidget), pIcon->pModuleInstance->pModule->pVisitCard->cModuleName); // configure the desklet gldi_desklet_configure (pDesklet, pAttributes); // load buttons images if (s_pRotateButtonBuffer.pSurface == NULL) { _load_desklet_buttons (); } // register the new desklet s_pDeskletList = g_list_prepend (s_pDeskletList, pDesklet); // start the appearance animation if (! cairo_dock_is_loading ()) { pDesklet->container.fRatio = 0.1; pDesklet->bGrowingUp = TRUE; cairo_dock_launch_animation (CAIRO_CONTAINER (pDesklet)); } }
void cairo_dock_normalize_icons_order (GList *pIconList, CairoDockIconType iType) { cd_message ("%s (%d)", __func__, iType); int iOrder = 1; CairoDockIconType iGroupOrder = cairo_dock_get_group_order (iType); GString *sDesktopFilePath = g_string_new (""); GList* ic; Icon *icon; for (ic = pIconList; ic != NULL; ic = ic->next) { icon = ic->data; if (cairo_dock_get_icon_order (icon) != iGroupOrder) continue; icon->fOrder = iOrder ++; if (icon->acDesktopFileName != NULL) { g_string_printf (sDesktopFilePath, "%s/%s", g_cCurrentLaunchersPath, icon->acDesktopFileName); cairo_dock_update_conf_file (sDesktopFilePath->str, G_TYPE_DOUBLE, "Desktop Entry", "Order", icon->fOrder, G_TYPE_INVALID); } else if (CAIRO_DOCK_IS_APPLET (icon)) { cairo_dock_update_conf_file (icon->pModuleInstance->cConfFilePath, G_TYPE_DOUBLE, "Icon", "order", icon->fOrder, G_TYPE_INVALID); } } g_string_free (sDesktopFilePath, TRUE); }
static gboolean _on_desktop_geometry_changed (G_GNUC_UNUSED gpointer data) { // when the screen size changes, X will send a 'configure' event to each windows (because size and position might have changed), which will be interpreted by the desklet as a user displacement. // we must therefore replace the desklets at their correct position in the new desktop space. CairoDesklet *pDesklet; CairoDockMinimalAppletConfig *pMinimalConfig; GList *dl; for (dl = s_pDeskletList; dl != NULL; dl = dl->next) { pDesklet = dl->data; //g_print ("%s : %d;%d\n", pDesklet->pIcon->pModuleInstance->pModule->pVisitCard->cModuleName, pDesklet->container.iWindowPositionX, pDesklet->container.iWindowPositionY); if (CAIRO_DOCK_IS_APPLET (pDesklet->pIcon)) { // get the position (and other parameters) as defined by the user. pMinimalConfig = g_new0 (CairoDockMinimalAppletConfig, 1); GKeyFile *pKeyFile = gldi_module_instance_open_conf_file (pDesklet->pIcon->pModuleInstance, pMinimalConfig); //g_print (" %d;%d\n", pMinimalConfig->deskletAttribute.iDeskletPositionX, pMinimalConfig->deskletAttribute.iDeskletPositionY); // apply the settings to the desklet (actually we only need the position). gldi_desklet_configure (pDesklet, &pMinimalConfig->deskletAttribute); gldi_module_instance_free_generic_config (pMinimalConfig); g_key_file_free (pKeyFile); } } return GLDI_NOTIFICATION_LET_PASS; }
void cairo_dock_update_visibility_on_inhibators (gchar *cClass, Window Xid, gboolean bIsHidden) { CairoDockClassAppli *pClassAppli = cairo_dock_get_class (cClass); if (pClassAppli != NULL) { GList *pElement; Icon *pInhibatorIcon; for (pElement = pClassAppli->pIconsOfClass; pElement != NULL; pElement = pElement->next) { pInhibatorIcon = pElement->data; if (pInhibatorIcon->Xid == Xid) { cd_message (" %s aussi se %s", pInhibatorIcon->acName, (bIsHidden ? "cache" : "montre")); pInhibatorIcon->bIsHidden = bIsHidden; if (! CAIRO_DOCK_IS_APPLET (pInhibatorIcon) && g_fVisibleAppliAlpha != 0) { CairoDock *pInhibhatorDock = cairo_dock_search_dock_from_name (pInhibatorIcon->cParentDockName); pInhibatorIcon->fAlpha = 1; // on triche un peu. cairo_dock_redraw_my_icon (pInhibatorIcon, CAIRO_CONTAINER (pInhibhatorDock)); } } } } }
void cairo_dock_move_icon_after_icon (CairoDock *pDock, Icon *icon1, Icon *icon2) { //g_print ("%s (%s, %.2f, %x)\n", __func__, icon1->acName, icon1->fOrder, icon2); ///if ((icon2 != NULL) && (! ( (CAIRO_DOCK_IS_APPLI (icon1) && CAIRO_DOCK_IS_APPLI (icon2)) || (CAIRO_DOCK_IS_LAUNCHER (icon1) && CAIRO_DOCK_IS_LAUNCHER (icon2)) || (CAIRO_DOCK_IS_APPLET (icon1) && CAIRO_DOCK_IS_APPLET (icon2)) ) )) if ((icon2 != NULL) && fabs (cairo_dock_get_icon_order (icon1) - cairo_dock_get_icon_order (icon2)) > 1) return ; //\_________________ On change l'ordre de l'icone. gboolean bForceUpdate = FALSE; if (icon2 != NULL) { Icon *pNextIcon = cairo_dock_get_next_icon (pDock->icons, icon2); if (pNextIcon != NULL && fabs (pNextIcon->fOrder - icon2->fOrder) < 1e-3) { bForceUpdate = TRUE; } if (pNextIcon == NULL || cairo_dock_get_icon_order (pNextIcon) != cairo_dock_get_icon_order (icon2)) icon1->fOrder = icon2->fOrder + 1; else icon1->fOrder = (pNextIcon->fOrder - icon2->fOrder > 1 ? icon2->fOrder + 1 : (pNextIcon->fOrder + icon2->fOrder) / 2); } else { Icon *pFirstIcon = cairo_dock_get_first_icon_of_order (pDock->icons, icon1->iType); if (pFirstIcon != NULL) icon1->fOrder = pFirstIcon->fOrder - 1; else icon1->fOrder = 1; } //g_print ("icon1->fOrder:%.2f\n", icon1->fOrder); //\_________________ On change l'ordre dans le fichier du lanceur 1. if ((CAIRO_DOCK_IS_LAUNCHER (icon1) || CAIRO_DOCK_IS_SEPARATOR (icon1)) && icon1->acDesktopFileName != NULL) { gchar *cDesktopFilePath = g_strdup_printf ("%s/%s", g_cCurrentLaunchersPath, icon1->acDesktopFileName); cairo_dock_update_conf_file (cDesktopFilePath, G_TYPE_DOUBLE, "Desktop Entry", "Order", icon1->fOrder, G_TYPE_INVALID); g_free (cDesktopFilePath); } else if (CAIRO_DOCK_IS_APPLET (icon1)) cairo_dock_update_module_instance_order (icon1->pModuleInstance, icon1->fOrder); //\_________________ On change sa place dans la liste. pDock->pFirstDrawnElement = NULL; pDock->icons = g_list_remove (pDock->icons, icon1); pDock->icons = g_list_insert_sorted (pDock->icons, icon1, (GCompareFunc) cairo_dock_compare_icons_order); //\_________________ On recalcule la largeur max, qui peut avoir ete influencee par le changement d'ordre. cairo_dock_update_dock_size (pDock); if (bForceUpdate) cairo_dock_normalize_icons_order (pDock->icons, icon1->iType); }
CairoDockIconType cairo_dock_get_icon_type (Icon *icon) { if (CAIRO_DOCK_IS_APPLI (icon)) return CAIRO_DOCK_APPLI; else if (CAIRO_DOCK_IS_APPLET (icon)) return CAIRO_DOCK_APPLET; else if (CAIRO_DOCK_IS_SEPARATOR (icon)) return CAIRO_DOCK_SEPARATOR12; else return CAIRO_DOCK_LAUNCHER; }
void gldi_desklet_lock_position (CairoDesklet *pDesklet, gboolean bPositionLocked) { //g_print ("%s (%d)\n", __func__, bPositionLocked); pDesklet->bPositionLocked = bPositionLocked; //\_________________ On enregistre le nouvel etat. Icon *icon = pDesklet->pIcon; if (CAIRO_DOCK_IS_APPLET (icon)) cairo_dock_update_conf_file (icon->pModuleInstance->cConfFilePath, G_TYPE_BOOLEAN, "Desklet", "locked", pDesklet->bPositionLocked, G_TYPE_INVALID); }
cairo_surface_t *cairo_dock_create_surface_from_class (gchar *cClass, cairo_t *pSourceContext, double fMaxScale, double *fWidth, double *fHeight) { cd_debug ("%s (%s)", __func__, cClass); CairoDockClassAppli *pClassAppli = cairo_dock_get_class (cClass); if (pClassAppli != NULL) { cd_debug ("bUseXIcon:%d", pClassAppli->bUseXIcon); if (pClassAppli->bUseXIcon) return NULL; GList *pElement; Icon *pInhibatorIcon; for (pElement = pClassAppli->pIconsOfClass; pElement != NULL; pElement = pElement->next) { pInhibatorIcon = pElement->data; cd_debug (" %s", pInhibatorIcon->acName); if (! CAIRO_DOCK_IS_APPLET (pInhibatorIcon)) { cd_message ("%s va fournir genereusement sa surface", pInhibatorIcon->acName); return cairo_dock_duplicate_inhibator_surface_for_appli (pSourceContext, pInhibatorIcon, fMaxScale, fWidth, fHeight); } } } gchar *cIconFilePath = cairo_dock_search_icon_s_path (cClass); if (cIconFilePath != NULL) { cd_debug ("on remplace l'icone X par %s", cIconFilePath); cairo_surface_t *pSurface = cairo_dock_create_surface_from_image (cIconFilePath, pSourceContext, 1 + g_fAmplitude, g_tIconAuthorizedWidth[CAIRO_DOCK_APPLI], g_tIconAuthorizedHeight[CAIRO_DOCK_APPLI], CAIRO_DOCK_FILL_SPACE, fWidth, fHeight, NULL, NULL); g_free (cIconFilePath); return pSurface; } cd_debug ("classe %s prend l'icone X", cClass); return NULL; }
void cairo_dock_update_icon_s_container_name (Icon *icon, const gchar *cNewParentDockName) { g_free (icon->cParentDockName); icon->cParentDockName = g_strdup (cNewParentDockName); if (CAIRO_DOCK_IS_NORMAL_LAUNCHER (icon)) // icon->acDesktopFileName != NULL { gchar *cDesktopFilePath = g_strdup_printf ("%s/%s", g_cCurrentLaunchersPath, icon->acDesktopFileName); cairo_dock_update_conf_file (cDesktopFilePath, G_TYPE_STRING, "Desktop Entry", "Container", cNewParentDockName, G_TYPE_INVALID); g_free (cDesktopFilePath); } else if (CAIRO_DOCK_IS_APPLET (icon)) { cairo_dock_update_conf_file (icon->pModuleInstance->cConfFilePath, G_TYPE_STRING, "Icon", "dock name", cNewParentDockName, G_TYPE_INVALID); } }
void gldi_desklet_set_accessibility (CairoDesklet *pDesklet, CairoDeskletVisibility iVisibility, gboolean bSaveState) { cd_debug ("%s (%d)", __func__, iVisibility); //\_________________ On applique la nouvelle accessibilite. gtk_window_set_keep_below (GTK_WINDOW (pDesklet->container.pWidget), iVisibility == CAIRO_DESKLET_KEEP_BELOW); gtk_window_set_keep_above (GTK_WINDOW (pDesklet->container.pWidget), iVisibility == CAIRO_DESKLET_KEEP_ABOVE); if (iVisibility == CAIRO_DESKLET_ON_WIDGET_LAYER) { if (pDesklet->iVisibility != CAIRO_DESKLET_ON_WIDGET_LAYER) gldi_desktop_set_on_widget_layer (CAIRO_CONTAINER (pDesklet), TRUE); } else if (pDesklet->iVisibility == CAIRO_DESKLET_ON_WIDGET_LAYER) { gldi_desktop_set_on_widget_layer (CAIRO_CONTAINER (pDesklet), FALSE); } if (iVisibility == CAIRO_DESKLET_RESERVE_SPACE) { if (! pDesklet->bSpaceReserved) _reserve_space_for_desklet (pDesklet, TRUE); // sinon inutile de le refaire, s'il y'a un changement de taille ce sera fait lors du configure-event. } else if (pDesklet->bSpaceReserved) { _reserve_space_for_desklet (pDesklet, FALSE); } //\_________________ On enregistre le nouvel etat. pDesklet->iVisibility = iVisibility; Icon *icon = pDesklet->pIcon; if (bSaveState && CAIRO_DOCK_IS_APPLET (icon)) cairo_dock_update_conf_file (icon->pModuleInstance->cConfFilePath, G_TYPE_INT, "Desklet", "accessibility", iVisibility, G_TYPE_INVALID); }
void gldi_flying_container_terminate (CairoFlyingContainer *pFlyingContainer) { // detach the icon from the container Icon *pIcon = pFlyingContainer->pIcon; pFlyingContainer->pIcon = NULL; cairo_dock_set_icon_container (pIcon, NULL); // destroy it, or place it in a desklet. if (pIcon->cDesktopFileName != NULL) // a launcher/sub-dock/separator, that is part of the theme { gldi_object_delete (GLDI_OBJECT(pIcon)); } else if (CAIRO_DOCK_IS_APPLET(pIcon)) /// faire une fonction dans la factory ... { cd_debug ("le module %s devient un desklet", pIcon->pModuleInstance->cConfFilePath); gldi_module_instance_detach_at_position (pIcon->pModuleInstance, pFlyingContainer->container.iWindowPositionX + pFlyingContainer->container.iWidth/2, pFlyingContainer->container.iWindowPositionY + pFlyingContainer->container.iHeight/2); } // start the explosion animation cairo_dock_launch_animation (CAIRO_CONTAINER (pFlyingContainer)); }
static gboolean on_button_press_desklet(G_GNUC_UNUSED GtkWidget *pWidget, GdkEventButton *pButton, CairoDesklet *pDesklet) { if (pButton->button == 1) // clic gauche. { pDesklet->container.iMouseX = pButton->x; pDesklet->container.iMouseY = pButton->y; if (pButton->type == GDK_BUTTON_PRESS) { pDesklet->bClicked = TRUE; if (cairo_dock_desklet_is_free (pDesklet)) { ///pDesklet->container.iMouseX = pButton->x; // pour le deplacement manuel. ///pDesklet->container.iMouseY = pButton->y; if (pButton->x < myDeskletsParam.iDeskletButtonSize && pButton->y < myDeskletsParam.iDeskletButtonSize) pDesklet->rotating = TRUE; else if (pButton->x > pDesklet->container.iWidth - myDeskletsParam.iDeskletButtonSize && pButton->y < myDeskletsParam.iDeskletButtonSize) pDesklet->retaching = TRUE; else if (pButton->x > (pDesklet->container.iWidth - myDeskletsParam.iDeskletButtonSize)/2 && pButton->x < (pDesklet->container.iWidth + myDeskletsParam.iDeskletButtonSize)/2 && pButton->y < myDeskletsParam.iDeskletButtonSize) pDesklet->rotatingY = TRUE; else if (pButton->y > (pDesklet->container.iHeight - myDeskletsParam.iDeskletButtonSize)/2 && pButton->y < (pDesklet->container.iHeight + myDeskletsParam.iDeskletButtonSize)/2 && pButton->x < myDeskletsParam.iDeskletButtonSize) pDesklet->rotatingX = TRUE; else pDesklet->time = pButton->time; } if (pDesklet->bAllowNoClickable && pButton->x > pDesklet->container.iWidth - myDeskletsParam.iDeskletButtonSize && pButton->y > pDesklet->container.iHeight - myDeskletsParam.iDeskletButtonSize) pDesklet->making_transparent = TRUE; } else if (pButton->type == GDK_BUTTON_RELEASE) { if (!pDesklet->bClicked) // on n'accepte le release que si on avait clique sur le desklet avant (on peut recevoir le release si on avait clique sur un dialogue qui chevauchait notre desklet et qui a disparu au clic). { return FALSE; } pDesklet->bClicked = FALSE; //g_print ("GDK_BUTTON_RELEASE\n"); int x = pDesklet->container.iMouseX; int y = pDesklet->container.iMouseY; if (pDesklet->moving) { pDesklet->moving = FALSE; } else if (pDesklet->rotating) { pDesklet->rotating = FALSE; cairo_dock_update_conf_file (pDesklet->pIcon->pModuleInstance->cConfFilePath, G_TYPE_INT, "Desklet", "rotation", (int) (pDesklet->fRotation / G_PI * 180.), G_TYPE_INVALID); gtk_widget_queue_draw (pDesklet->container.pWidget); gldi_object_notify (pDesklet, NOTIFICATION_CONFIGURE_DESKLET, pDesklet); } else if (pDesklet->retaching) { pDesklet->retaching = FALSE; if (x > pDesklet->container.iWidth - myDeskletsParam.iDeskletButtonSize && y < myDeskletsParam.iDeskletButtonSize) // on verifie qu'on est encore dedans. { Icon *icon = pDesklet->pIcon; g_return_val_if_fail (CAIRO_DOCK_IS_APPLET (icon), FALSE); gldi_module_instance_detach (icon->pModuleInstance); return GLDI_NOTIFICATION_INTERCEPT; // interception du signal. } } else if (pDesklet->making_transparent) { cd_debug ("pDesklet->making_transparent\n"); pDesklet->making_transparent = FALSE; if (x > pDesklet->container.iWidth - myDeskletsParam.iDeskletButtonSize && y > pDesklet->container.iHeight - myDeskletsParam.iDeskletButtonSize) // on verifie qu'on est encore dedans. { Icon *icon = pDesklet->pIcon; g_return_val_if_fail (CAIRO_DOCK_IS_APPLET (icon), FALSE); pDesklet->bNoInput = ! pDesklet->bNoInput; cd_debug ("no input : %d (%s)", pDesklet->bNoInput, icon->pModuleInstance->cConfFilePath); cairo_dock_update_conf_file (icon->pModuleInstance->cConfFilePath, G_TYPE_BOOLEAN, "Desklet", "no input", pDesklet->bNoInput, G_TYPE_INVALID); _cairo_dock_set_desklet_input_shape (pDesklet); gtk_widget_queue_draw (pDesklet->container.pWidget); } } else if (pDesklet->rotatingY) { pDesklet->rotatingY = FALSE; cairo_dock_update_conf_file (pDesklet->pIcon->pModuleInstance->cConfFilePath, G_TYPE_INT, "Desklet", "depth rotation y", (int) (pDesklet->fDepthRotationY / G_PI * 180.), G_TYPE_INVALID); gtk_widget_queue_draw (pDesklet->container.pWidget); } else if (pDesklet->rotatingX) { pDesklet->rotatingX = FALSE; cairo_dock_update_conf_file (pDesklet->pIcon->pModuleInstance->cConfFilePath, G_TYPE_INT, "Desklet", "depth rotation x", (int) (pDesklet->fDepthRotationX / G_PI * 180.), G_TYPE_INVALID); gtk_widget_queue_draw (pDesklet->container.pWidget); } else { Icon *pClickedIcon = gldi_desklet_find_clicked_icon (pDesklet); gldi_object_notify (pDesklet, NOTIFICATION_CLICK_ICON, pClickedIcon, pDesklet, pButton->state); } // prudence. pDesklet->rotating = FALSE; pDesklet->retaching = FALSE; pDesklet->making_transparent = FALSE; pDesklet->rotatingX = FALSE; pDesklet->rotatingY = FALSE; } else if (pButton->type == GDK_2BUTTON_PRESS) { if (! (pButton->x < myDeskletsParam.iDeskletButtonSize && pButton->y < myDeskletsParam.iDeskletButtonSize) && ! (pButton->x > (pDesklet->container.iWidth - myDeskletsParam.iDeskletButtonSize)/2 && pButton->x < (pDesklet->container.iWidth + myDeskletsParam.iDeskletButtonSize)/2 && pButton->y < myDeskletsParam.iDeskletButtonSize)) { Icon *pClickedIcon = gldi_desklet_find_clicked_icon (pDesklet); // can be NULL gldi_object_notify (pDesklet, NOTIFICATION_DOUBLE_CLICK_ICON, pClickedIcon, pDesklet); } } } else if (pButton->button == 3 && pButton->type == GDK_BUTTON_PRESS) // clique droit. { Icon *pClickedIcon = gldi_desklet_find_clicked_icon (pDesklet); GtkWidget *menu = gldi_container_build_menu (CAIRO_CONTAINER (pDesklet), pClickedIcon); // genere un CAIRO_DOCK_BUILD_ICON_MENU. gldi_menu_popup (menu); } else if (pButton->button == 2 && pButton->type == GDK_BUTTON_PRESS) // clique milieu. { if (pButton->x < myDeskletsParam.iDeskletButtonSize && pButton->y < myDeskletsParam.iDeskletButtonSize) { pDesklet->fRotation = 0.; gtk_widget_queue_draw (pDesklet->container.pWidget); cairo_dock_update_conf_file (pDesklet->pIcon->pModuleInstance->cConfFilePath, G_TYPE_INT, "Desklet", "rotation", 0, G_TYPE_INVALID); gldi_object_notify (pDesklet, NOTIFICATION_CONFIGURE_DESKLET, pDesklet); } else if (pButton->x > (pDesklet->container.iWidth - myDeskletsParam.iDeskletButtonSize)/2 && pButton->x < (pDesklet->container.iWidth + myDeskletsParam.iDeskletButtonSize)/2 && pButton->y < myDeskletsParam.iDeskletButtonSize) { pDesklet->fDepthRotationY = 0.; gtk_widget_queue_draw (pDesklet->container.pWidget); cairo_dock_update_conf_file (pDesklet->pIcon->pModuleInstance->cConfFilePath, G_TYPE_INT, "Desklet", "depth rotation y", 0, G_TYPE_INVALID); } else if (pButton->y > (pDesklet->container.iHeight - myDeskletsParam.iDeskletButtonSize)/2 && pButton->y < (pDesklet->container.iHeight + myDeskletsParam.iDeskletButtonSize)/2 && pButton->x < myDeskletsParam.iDeskletButtonSize) { pDesklet->fDepthRotationX = 0.; gtk_widget_queue_draw (pDesklet->container.pWidget); cairo_dock_update_conf_file (pDesklet->pIcon->pModuleInstance->cConfFilePath, G_TYPE_INT, "Desklet", "depth rotation x", 0, G_TYPE_INVALID); } else { gldi_object_notify (pDesklet, NOTIFICATION_MIDDLE_CLICK_ICON, pDesklet->pIcon, pDesklet); } } return FALSE; }
void cairo_dock_swap_icons (CairoDock *pDock, Icon *icon1, Icon *icon2) { //g_print ("%s (%s, %s) : %.2f <-> %.2f\n", __func__, icon1->acName, icon2->acName, icon1->fOrder, icon2->fOrder); if (! ( (CAIRO_DOCK_IS_APPLI (icon1) && CAIRO_DOCK_IS_APPLI (icon2)) || (CAIRO_DOCK_IS_LAUNCHER (icon1) && CAIRO_DOCK_IS_LAUNCHER (icon2)) || (CAIRO_DOCK_IS_APPLET (icon1) && CAIRO_DOCK_IS_APPLET (icon2)) ) ) return ; //\_________________ On intervertit les ordres des 2 lanceurs. double fSwap = icon1->fOrder; icon1->fOrder = icon2->fOrder; icon2->fOrder = fSwap; //\_________________ On change l'ordre dans les fichiers des 2 lanceurs. if (CAIRO_DOCK_IS_LAUNCHER (icon1)) // ce sont des lanceurs. { gchar *cDesktopFilePath; GKeyFile* pKeyFile; if (icon1->acDesktopFileName != NULL) { cDesktopFilePath = g_strdup_printf ("%s/%s", g_cCurrentLaunchersPath, icon1->acDesktopFileName); pKeyFile = cairo_dock_open_key_file (cDesktopFilePath); if (pKeyFile == NULL) return ; g_key_file_set_double (pKeyFile, "Desktop Entry", "Order", icon1->fOrder); cairo_dock_write_keys_to_file (pKeyFile, cDesktopFilePath); g_key_file_free (pKeyFile); g_free (cDesktopFilePath); } if (icon2->acDesktopFileName != NULL) { cDesktopFilePath = g_strdup_printf ("%s/%s", g_cCurrentLaunchersPath, icon2->acDesktopFileName); pKeyFile = cairo_dock_open_key_file (cDesktopFilePath); if (pKeyFile == NULL) return ; g_key_file_set_double (pKeyFile, "Desktop Entry", "Order", icon2->fOrder); cairo_dock_write_keys_to_file (pKeyFile, cDesktopFilePath); g_key_file_free (pKeyFile); g_free (cDesktopFilePath); } } //\_________________ On les intervertit dans la liste. if (pDock->pFirstDrawnElement != NULL && (pDock->pFirstDrawnElement->data == icon1 || pDock->pFirstDrawnElement->data == icon2)) pDock->pFirstDrawnElement = NULL; pDock->icons = g_list_remove (pDock->icons, icon1); pDock->icons = g_list_remove (pDock->icons, icon2); pDock->icons = g_list_insert_sorted (pDock->icons, icon1, (GCompareFunc) cairo_dock_compare_icons_order); pDock->icons = g_list_insert_sorted (pDock->icons, icon2, (GCompareFunc) cairo_dock_compare_icons_order); //\_________________ On recalcule la largeur max, qui peut avoir ete influencee par le changement d'ordre. cairo_dock_update_dock_size (pDock); //\_________________ On met a jour l'ordre des applets dans le fichier de conf. if (CAIRO_DOCK_IS_APPLET (icon1)) cairo_dock_update_module_instance_order (icon1->pModuleInstance, icon1->fOrder); if (CAIRO_DOCK_IS_APPLET (icon2)) cairo_dock_update_module_instance_order (icon2->pModuleInstance, icon2->fOrder); if (fabs (icon2->fOrder - icon1->fOrder) < 1e-3) { cairo_dock_normalize_icons_order (pDock->icons, icon1->iType); } }