17
17
* along with this program. If not, see <http://www.gnu.org/licenses/>.
26
#include <X11/Xatom.h>
27
#include <X11/Xutil.h>
30
#include "cairo-dock-icon-facility.h" // cairo_dock_set_icon_name
20
#include "cairo-dock-icon-facility.h" // gldi_icon_set_name
31
21
#include "cairo-dock-dialog-factory.h"
32
22
#include "cairo-dock-animations.h"
33
23
#include "cairo-dock-surface-factory.h"
34
24
#include "cairo-dock-applications-manager.h"
25
#include "cairo-dock-launcher-manager.h"
26
#include "cairo-dock-separator-manager.h"
27
#include "cairo-dock-applet-manager.h"
28
#include "cairo-dock-stack-icon-manager.h"
35
29
#include "cairo-dock-windows-manager.h"
36
30
#include "cairo-dock-log.h"
37
31
#include "cairo-dock-dock-manager.h"
39
33
#include "cairo-dock-dock-facility.h" // cairo_dock_update_dock_size
40
34
#include "cairo-dock-desktop-manager.h"
41
35
#include "cairo-dock-indicator-manager.h" // myIndicatorsParam.bUseClassIndic
36
#include "cairo-dock-class-icon-manager.h" // gldi_class_icon_new
42
37
#include "cairo-dock-application-facility.h"
44
39
extern CairoDock *g_pMainDock;
188
183
Icon *pPointingIcon = cairo_dock_search_icon_pointing_on_dock (pParentDock, &pMainDock);
189
184
if (pPointingIcon && pMainDock)
191
cairo_dock_redraw_icon (pPointingIcon, CAIRO_CONTAINER (pMainDock)); // on se contente de redessiner cette icone sans l'animer. Une facon comme une autre de differencier ces 2 cas.
198
static void _load_class_icon (Icon *icon)
200
int iWidth = icon->iAllocatedWidth;
201
int iHeight = icon->iAllocatedWidth;
202
cairo_surface_t *pSurface = NULL;
203
if (icon->pSubDock != NULL && !myIndicatorsParam.bUseClassIndic) // icone de sous-dock avec un rendu specifique, on le redessinera lorsque les icones du sous-dock auront ete chargees.
205
pSurface = cairo_dock_create_blank_surface (iWidth, iHeight);
209
cd_debug ("%s (%dx%d)", __func__, iWidth, iHeight);
210
pSurface = cairo_dock_create_surface_from_class (icon->cClass,
213
if (pSurface == NULL) // aucun inhibiteur ou aucune image correspondant a cette classe, on cherche a copier une des icones d'appli de cette classe.
215
const GList *pApplis = cairo_dock_list_existing_appli_with_class (icon->cClass);
218
Icon *pOneIcon = (Icon *) (g_list_last ((GList*)pApplis)->data); // on prend le dernier car les applis sont inserees a l'envers, et on veut avoir celle qui etait deja present dans le dock (pour 2 raison : continuite, et la nouvelle (en 1ere position) n'est pas forcement deja dans un dock, ce qui fausse le ratio).
219
cd_debug (" load from %s (%dx%d)", pOneIcon->cName, iWidth, iHeight);
220
pSurface = cairo_dock_duplicate_inhibitor_surface_for_appli (pOneIcon,
227
cairo_dock_load_image_buffer_from_surface (&icon->image, pSurface, iWidth, iHeight);
229
static Icon *cairo_dock_create_icon_for_class_subdock (Icon *pSameClassIcon, CairoDock *pClassDock)
231
Icon *pFakeClassIcon = cairo_dock_new_icon ();
232
pFakeClassIcon->iTrueType = CAIRO_DOCK_ICON_TYPE_CLASS_CONTAINER;
233
pFakeClassIcon->iface.load_image = _load_class_icon;
234
pFakeClassIcon->iGroup = pSameClassIcon->iGroup;
236
pFakeClassIcon->cName = g_strdup (pSameClassIcon->cClass);
237
pFakeClassIcon->cCommand = g_strdup (pSameClassIcon->cCommand);
238
pFakeClassIcon->pMimeTypes = g_strdupv (pSameClassIcon->pMimeTypes);
239
pFakeClassIcon->cClass = g_strdup (pSameClassIcon->cClass);
240
pFakeClassIcon->fOrder = pSameClassIcon->fOrder;
241
pFakeClassIcon->cParentDockName = g_strdup (pSameClassIcon->cParentDockName);
242
pFakeClassIcon->bHasIndicator = pSameClassIcon->bHasIndicator;
244
pFakeClassIcon->pSubDock = pClassDock;
246
return pFakeClassIcon;
186
cairo_dock_redraw_icon (pPointingIcon); // on se contente de redessiner cette icone sans l'animer. Une facon comme une autre de differencier ces 2 cas.
249
193
// this function is used when we have an appli that is not inhibited. we can place it either in its subdock or in the dock next to an inhibitor or in the main dock amongst the other applis
250
194
static CairoDock *_cairo_dock_set_parent_dock_name_for_appli (Icon *icon, CairoDock *pMainDock, const gchar *cMainDockName)
285
229
icon->cParentDockName = g_strdup (cairo_dock_get_class_subdock_name (icon->cClass));
287
231
//\____________ link this sub-dock to the inhibitor, or to a fake appli icon.
288
if (CAIRO_DOCK_ICON_TYPE_IS_LAUNCHER (pSameClassIcon) || CAIRO_DOCK_ICON_TYPE_IS_APPLET (pSameClassIcon)) // c'est un inhibiteur.
232
if (GLDI_OBJECT_IS_LAUNCHER_ICON (pSameClassIcon) || GLDI_OBJECT_IS_APPLET_ICON (pSameClassIcon)) // c'est un inhibiteur.
290
234
if (pSameClassIcon->pAppli != NULL) // actuellement l'inhibiteur inhibe 1 seule appli.
299
243
CairoDock *pSameClassDock = gldi_dock_get (pSameClassIcon->cParentDockName);
300
244
if (pSameClassDock != NULL)
302
cairo_dock_set_icon_name (pSameClassIcon->cInitialName, pSameClassIcon, CAIRO_CONTAINER (pSameClassDock)); // on lui remet son nom de lanceur.
246
gldi_icon_set_name (pSameClassIcon, pSameClassIcon->cInitialName); // on lui remet son nom de lanceur.
305
249
pSameClassIcon->pSubDock = pParentDock;
306
250
CairoDock *pRootDock = gldi_dock_get (pSameClassIcon->cParentDockName);
307
251
if (pRootDock != NULL)
308
cairo_dock_redraw_icon (pSameClassIcon, CAIRO_CONTAINER (pRootDock)); // on la redessine car elle prend l'indicateur de classe.
252
cairo_dock_redraw_icon (pSameClassIcon); // on la redessine car elle prend l'indicateur de classe.
310
254
else if (pSameClassIcon->pSubDock != pParentDock)
311
255
cd_warning ("this launcher (%s) already has a subdock, but it's not the class's subdock !", pSameClassIcon->cName);
325
269
//\______________ On cree une icone de paille.
326
270
cd_debug (" on cree un fake...");
327
271
CairoDock *pClassMateParentDock = gldi_dock_get (pSameClassIcon->cParentDockName); // c'est en fait le main dock.
328
Icon *pFakeClassIcon = cairo_dock_create_icon_for_class_subdock (pSameClassIcon, pParentDock);
272
Icon *pFakeClassIcon = gldi_class_icon_new (pSameClassIcon, pParentDock);
330
274
//\______________ On detache le classmate, on le place dans le sous-dock, et on lui substitue le faux.
331
275
cd_debug (" on detache %s pour la passer dans le sous-dock de sa classe", pSameClassIcon->cName);
338
282
cairo_dock_insert_icon_in_dock_full (pFakeClassIcon, pClassMateParentDock, ! CAIRO_DOCK_ANIMATE_ICON, ! CAIRO_DOCK_INSERT_SEPARATOR, NULL);
339
283
cairo_dock_redraw_container (CAIRO_CONTAINER (pClassMateParentDock));
341
if (pFakeClassIcon->iSubdockViewType != 0)
285
///if (pFakeClassIcon->iSubdockViewType != 0)
286
if (!myIndicatorsParam.bUseClassIndic)
342
287
cairo_dock_trigger_redraw_subdock_content_on_icon (pFakeClassIcon);
483
428
for (ic = pMainDock->icons; ic != NULL; ic = ic->next)
485
430
pIcon = ic->data;
486
if (CAIRO_DOCK_ICON_TYPE_IS_LAUNCHER (pIcon) // launcher, even without class
487
|| CAIRO_DOCK_ICON_TYPE_IS_CONTAINER (pIcon) // container icon (likely to contain some launchers)
488
|| (CAIRO_DOCK_ICON_TYPE_IS_APPLET (pIcon) && pIcon->cClass != NULL) // applet acting like a launcher
489
|| (CAIRO_DOCK_ICON_TYPE_IS_SEPARATOR (pIcon))) // separator (user or auto).
431
if (GLDI_OBJECT_IS_LAUNCHER_ICON (pIcon) // launcher, even without class
432
|| GLDI_OBJECT_IS_STACK_ICON (pIcon) // container icon (likely to contain some launchers)
433
|| (GLDI_OBJECT_IS_APPLET_ICON (pIcon) && pIcon->cClass != NULL) // applet acting like a launcher
434
|| (GLDI_OBJECT_IS_SEPARATOR_ICON (pIcon))) // separator (user or auto).
491
436
pLastLauncher = pIcon;