static gboolean _on_active_window_changed (G_GNUC_UNUSED gpointer data, GldiWindowActor *actor) { // on gere son animation et son indicateur. Icon *icon = _get_appli_icon (actor); CairoDock *pParentDock = NULL; if (CAIRO_DOCK_IS_APPLI (icon)) { if (icon->bIsDemandingAttention) // force the stop demanding attention, as it can happen (for some reason) that the attention state doesn't change when the appli takes the focus. gldi_appli_icon_stop_demanding_attention (icon); pParentDock = CAIRO_DOCK(cairo_dock_get_icon_container (icon)); if (pParentDock == NULL) // inhibited or not shown { ///cairo_dock_update_activity_on_inhibitors (icon->cClass, actor); gldi_window_inhibitors_set_active_state (actor, TRUE); } else { gldi_appli_icon_animate_on_active (icon, pParentDock); } } // on enleve l'indicateur sur la precedente appli active. Icon *pLastActiveIcon = _get_appli_icon (s_pCurrentActiveWindow); if (CAIRO_DOCK_IS_APPLI (pLastActiveIcon)) { CairoDock *pLastActiveParentDock = CAIRO_DOCK(cairo_dock_get_icon_container (pLastActiveIcon)); if (pLastActiveParentDock == NULL) // inhibited or not shown { ///cairo_dock_update_inactivity_on_inhibitors (pLastActiveIcon->cClass, s_pCurrentActiveWindow); gldi_window_inhibitors_set_active_state (s_pCurrentActiveWindow, FALSE); } else { cairo_dock_redraw_icon (pLastActiveIcon); if (pLastActiveParentDock->iRefCount != 0) // l'icone est dans un sous-dock, comme l'indicateur est aussi dessine sur l'icone pointant sur ce sous-dock, il faut la redessiner sans l'indicateur. { CairoDock *pMainDock = NULL; Icon *pPointingIcon = cairo_dock_search_icon_pointing_on_dock (pLastActiveParentDock, &pMainDock); if (pPointingIcon && pMainDock) { cairo_dock_redraw_icon (pPointingIcon); } } } } s_pCurrentActiveWindow = actor; return GLDI_NOTIFICATION_LET_PASS; }
static void _for_one_appli_icon (G_GNUC_UNUSED GldiWindowActor *actor, Icon *icon, gpointer *data) { if (! CAIRO_DOCK_IS_APPLI (icon) || cairo_dock_icon_is_being_removed (icon)) return ; GldiIconFunc pFunction = data[0]; gpointer pUserData = data[1]; pFunction (icon, pUserData); }
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; }
static void cairo_dock_register_appli (Icon *icon) { if (CAIRO_DOCK_IS_APPLI (icon)) { cd_debug ("%s (%p ; %s)", __func__, icon->pAppli, icon->cName); // add to table g_hash_table_insert (s_hAppliIconsTable, icon->pAppli, icon); // add to class cairo_dock_add_appli_icon_to_class (icon); } }
static void cairo_dock_unregister_appli (Icon *icon) { if (CAIRO_DOCK_IS_APPLI (icon)) { cd_debug ("%s (%p ; %s)", __func__, icon->pAppli, icon->cName); // remove from table g_hash_table_remove (s_hAppliIconsTable, icon->pAppli); // remove from class cairo_dock_remove_appli_from_class (icon); // n'efface pas sa classe (on peut en avoir besoin encore). gldi_window_detach_from_inhibitors (icon->pAppli); // unset the appli gldi_icon_unset_appli (icon); } }
void cairo_dock_load_icon_text (Icon *icon) { cairo_dock_unload_image_buffer (&icon->label); if (icon->cName == NULL || (myIconsParam.iconTextDescription.iSize == 0)) return ; gchar *cTruncatedName = NULL; if (CAIRO_DOCK_IS_APPLI (icon) && myTaskbarParam.iAppliMaxNameLength > 0) { cTruncatedName = cairo_dock_cut_string (icon->cName, myTaskbarParam.iAppliMaxNameLength); } int iWidth, iHeight; cairo_surface_t *pSurface = cairo_dock_create_surface_from_text ((cTruncatedName != NULL ? cTruncatedName : icon->cName), &myIconsParam.iconTextDescription, &iWidth, &iHeight); cairo_dock_load_image_buffer_from_surface (&icon->label, pSurface, iWidth, iHeight); g_free (cTruncatedName); }
void cairo_dock_set_icons_geometry_for_window_manager (CairoDock *pDock) { if (! s_bAppliManagerIsRunning) return ; //g_print ("%s (main:%d, ref:%d)\n", __func__, pDock->bIsMainDock, pDock->iRefCount); /*long *data = g_new0 (long, 1+6*g_list_length (pDock->icons)); int i = 0;*/ Icon *icon; GList *ic; for (ic = pDock->icons; ic != NULL; ic = ic->next) { icon = ic->data; if (CAIRO_DOCK_IS_APPLI (icon)) { gldi_appli_icon_set_geometry_for_window_manager (icon, pDock); /*data[1+6*i+0] = 5; data[1+6*i+1] = icon->Xid; data[1+6*i+2] = pDock->container.iWindowPositionX + icon->fXAtRest; data[1+6*i+3] = 0; data[1+6*i+4] = icon->fWidth; data[1+6*i+5] = icon->fHeight; i ++;*/ } } /*data[0] = i; Atom atom = XInternAtom (gdk_x11_get_default_xdisplay(), "_KDE_WINDOW_PREVIEW", False); Window Xid = GDK_WINDOW_XID (pDock->container.pWidget->window); XChangeProperty(gdk_x11_get_default_xdisplay(), Xid, atom, atom, 32, PropModeReplace, data, 1+6*i);*/ if (pDock->bIsMainDock && myTaskbarParam.bHideVisibleApplis) // on complete avec les applis pas dans le dock, pour que l'effet de minimisation pointe (a peu pres) au bon endroit quand on la minimisera. { g_hash_table_foreach (s_hAppliIconsTable, (GHFunc) gldi_appli_reserve_geometry_for_window_manager, pDock); } }
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); } }