2
* Dock factory for Cairo-Dock
2
* This file is a part of the Cairo-Dock project
4
* Copyright : (C) 2009 by Fabrice Rey
5
* E-mail : fabounet@users.berlios.de
4
* Copyright : (C) see the 'copyright' file.
5
* E-mail : see the 'copyright' file.
7
7
* This program is free software; you can redistribute it and/or
8
8
* modify it under the terms of the GNU General Public License
150
152
pDock->bAtBottom = TRUE;
151
153
pDock->iRefCount = 0; // c'est un dock racine par defaut.
154
pDock->container.fRatio = 1.;
153
155
pDock->iAvoidingMouseIconType = -1;
154
156
pDock->fFlatDockWidth = - myIcons.iIconGap;
155
pDock->iMouseX = -1; // utile ?
157
pDock->container.iMouseX = -1; // utile ?
158
pDock->container.iMouseY = -1;
157
159
pDock->fMagnitudeMax = 1.;
159
161
//\__________________ On cree la fenetre GTK.
160
162
GtkWidget *pWindow = cairo_dock_create_container_window ();
161
163
gtk_container_set_border_width(GTK_CONTAINER(pWindow), 0);
162
pDock->pWidget = pWindow;
164
pDock->container.pWidget = pWindow;
164
166
if (g_bKeepAbove)
165
167
gtk_window_set_keep_above (GTK_WINDOW (pWindow), g_bKeepAbove);
228
230
G_CALLBACK (cairo_dock_on_drag_data_received),
230
232
g_signal_connect (G_OBJECT (pWindow),
232
234
G_CALLBACK (cairo_dock_on_drag_motion),
234
236
g_signal_connect (G_OBJECT (pWindow),
236
238
G_CALLBACK (cairo_dock_on_drag_leave),
240
/*g_signal_connect (G_OBJECT (pWindow),
242
G_CALLBACK (cairo_dock_on_drag_drop),
239
gtk_window_get_size (GTK_WINDOW (pWindow), &pDock->iCurrentWidth, &pDock->iCurrentHeight); // ca n'est que la taille initiale allouee par GTK.
245
gtk_window_get_size (GTK_WINDOW (pWindow), &pDock->container.iWidth, &pDock->container.iHeight); // ca n'est que la taille initiale allouee par GTK.
240
246
gtk_widget_show_all (pWindow);
241
247
gdk_window_set_back_pixmap (pWindow->window, NULL, FALSE); // vraiment plus rapide ?
244
250
#ifdef HAVE_GLITZ
245
if (g_bUseGlitz && pDock->pDrawFormat != NULL)
251
if (g_bUseGlitz && pDock->container.pDrawFormat != NULL)
247
253
glitz_format_t templ;
248
254
GdkDisplay *gdkdisplay;
252
258
gdkdisplay = gdk_display_get_default ();
253
259
XDisplay = gdk_x11_display_get_xdisplay (gdkdisplay);
254
260
xid = gdk_x11_drawable_get_xid (GDK_DRAWABLE (pWindow->window));
255
pDock->pGlitzDrawable = glitz_glx_create_drawable_for_window (XDisplay,
261
pDock->container.pGlitzDrawable = glitz_glx_create_drawable_for_window (XDisplay,
263
pDock->container.pDrawFormat,
259
pDock->iCurrentWidth,
260
pDock->iCurrentHeight);
261
if (! pDock->pGlitzDrawable)
265
pDock->container.iWidth,
266
pDock->container.iHeight);
267
if (! pDock->container.pGlitzDrawable)
263
269
cd_warning ("failed to create glitz drawable");
267
templ.color = pDock->pDrawFormat->color;
273
templ.color = pDock->container.pDrawFormat->color;
268
274
templ.color.fourcc = GLITZ_FOURCC_RGB;
269
pDock->pGlitzFormat = glitz_find_format (pDock->pGlitzDrawable,
275
pDock->container.pGlitzFormat = glitz_find_format (pDock->container.pGlitzDrawable,
270
276
GLITZ_FORMAT_RED_SIZE_MASK |
271
277
GLITZ_FORMAT_GREEN_SIZE_MASK |
272
278
GLITZ_FORMAT_BLUE_SIZE_MASK |
312
318
g_source_remove (pDock->iSidPopUp);
313
319
if (pDock->iSidLeaveDemand != 0)
314
320
g_source_remove (pDock->iSidLeaveDemand);
315
if (pDock->iSidIconGlide != 0)
316
g_source_remove (pDock->iSidIconGlide);
317
321
if (pDock->bIsMainDock && cairo_dock_application_manager_is_running ())
319
323
cairo_dock_pause_application_manager (); // precaution au cas ou.
321
325
cairo_dock_notify (CAIRO_DOCK_STOP_DOCK, pDock);
322
if (pDock->iSidGLAnimation != 0)
323
g_source_remove (pDock->iSidGLAnimation);
326
if (pDock->container.iSidGLAnimation != 0)
327
g_source_remove (pDock->container.iSidGLAnimation);
325
329
g_list_foreach (pDock->icons, (GFunc) _cairo_dock_fm_remove_monitor_on_one_icon, NULL);
332
336
g_object_unref ((gpointer) pDock->pShapeBitmap);
333
337
pDock->pShapeBitmap = NULL;
335
gtk_widget_destroy (pDock->pWidget);
336
pDock->pWidget = NULL;
339
gtk_widget_destroy (pDock->container.pWidget);
340
pDock->container.pWidget = NULL;
338
342
g_free (pDock->cRendererName);
339
343
pDock->cRendererName = NULL;
342
void cairo_dock_destroy_dock (CairoDock *pDock, const gchar *cDockName, CairoDock *pReceivingDock, const gchar *cpReceivingDockName)
346
void cairo_dock_destroy_dock (CairoDock *pDock, const gchar *cDockName, CairoDock *pReceivingDock, const gchar *cReceivingDockName)
344
cd_debug ("%s (%s, %d)", __func__, cDockName, pDock->iRefCount);
345
g_return_if_fail (pDock != NULL); // && cDockName != NULL
348
g_return_if_fail (pDock != NULL);
349
g_print ("%s (%s, %d)\n", __func__, cDockName, pDock->iRefCount);
346
350
if (pDock->bIsMainDock) // utiliser cairo_dock_free_all_docks ().
348
352
pDock->iRefCount --;
349
353
if (pDock->iRefCount > 0)
355
if (cairo_dock_search_dock_from_name (cDockName) != pDock)
357
cDockName = cairo_dock_search_dock_name (pDock);
358
cd_warning ("dock's name mismatch !\nThe real name is %s", cDockName);
352
361
cairo_dock_deactivate_one_dock (pDock);
354
363
gboolean bModuleWasRemoved = FALSE;
364
373
if (icon->pSubDock != NULL && pReceivingDock == NULL)
366
cairo_dock_destroy_dock (icon->pSubDock, icon->acName, NULL, NULL);
375
cairo_dock_destroy_dock (icon->pSubDock, icon->cClass != NULL ? icon->cClass : icon->cName, NULL, NULL);
367
376
icon->pSubDock = NULL;
370
if (pReceivingDock == NULL || cpReceivingDockName == NULL) // alors on les jete.
379
if (pReceivingDock == NULL || cReceivingDockName == NULL) // alors on les jete.
372
if (CAIRO_DOCK_IS_NORMAL_LAUNCHER (icon)) // icon->acDesktopFileName != NULL
381
if (CAIRO_DOCK_IS_STORED_LAUNCHER (icon))
374
cDesktopFilePath = g_strdup_printf ("%s/%s", g_cCurrentLaunchersPath, icon->acDesktopFileName);
383
cDesktopFilePath = g_strdup_printf ("%s/%s", g_cCurrentLaunchersPath, icon->cDesktopFileName);
375
384
g_remove (cDesktopFilePath);
376
385
g_free (cDesktopFilePath);
380
389
cairo_dock_update_icon_s_container_name (icon, CAIRO_DOCK_MAIN_DOCK_NAME);
381
390
bModuleWasRemoved = TRUE;
383
cairo_dock_free_icon (icon);
392
cairo_dock_free_icon (icon); // de-instancie l'applet.
385
394
else // on les re-attribue au dock receveur.
387
cairo_dock_update_icon_s_container_name (icon, cpReceivingDockName);
396
cairo_dock_update_icon_s_container_name (icon, cReceivingDockName);
389
icon->fWidth /= pDock->fRatio;
390
icon->fHeight /= pDock->fRatio;
398
icon->fWidth /= pDock->container.fRatio;
399
icon->fHeight /= pDock->container.fRatio;
392
cd_debug (" on re-attribue %s au dock %s", icon->acName, icon->cParentDockName);
401
cd_debug (" on re-attribue %s au dock %s", icon->cName, icon->cParentDockName);
393
402
cairo_dock_insert_icon_in_dock (icon, pReceivingDock, ! CAIRO_DOCK_UPDATE_DOCK_SIZE, CAIRO_DOCK_ANIMATE_ICON);
395
404
if (CAIRO_DOCK_IS_APPLET (icon))
426
436
if (pParentDock == NULL)
427
437
pParentDock = g_pMainDock;
428
CairoDockPositionType iScreenBorder = ((! pDock->bHorizontalDock) << 1) | (! pDock->bDirectionUp);
429
cd_message ("position : %d/%d", pDock->bHorizontalDock, pDock->bDirectionUp);
430
pDock->bHorizontalDock = (myViews.bSameHorizontality ? pParentDock->bHorizontalDock : ! pParentDock->bHorizontalDock);
431
pDock->bDirectionUp = pParentDock->bDirectionUp;
432
if (iScreenBorder != (((! pDock->bHorizontalDock) << 1) | (! pDock->bDirectionUp)))
438
CairoDockPositionType iScreenBorder = ((! pDock->container.bIsHorizontal) << 1) | (! pDock->container.bDirectionUp);
439
cd_message ("position : %d/%d", pDock->container.bIsHorizontal, pDock->container.bDirectionUp);
440
pDock->container.bIsHorizontal = (myViews.bSameHorizontality ? pParentDock->container.bIsHorizontal : ! pParentDock->container.bIsHorizontal);
441
pDock->container.bDirectionUp = pParentDock->container.bDirectionUp;
442
if (iScreenBorder != (((! pDock->container.bIsHorizontal) << 1) | (! pDock->container.bDirectionUp)))
434
cd_message ("changement de position -> %d/%d", pDock->bHorizontalDock, pDock->bDirectionUp);
444
cd_message ("changement de position -> %d/%d", pDock->container.bIsHorizontal, pDock->container.bDirectionUp);
435
445
cairo_dock_reload_reflects_in_dock (pDock);
437
447
if (g_bKeepAbove)
438
gtk_window_set_keep_above (GTK_WINDOW (pDock->pWidget), FALSE);
448
gtk_window_set_keep_above (GTK_WINDOW (pDock->container.pWidget), FALSE);
439
449
if (myAccessibility.bPopUp)
440
gtk_window_set_keep_below (GTK_WINDOW (pDock->pWidget), FALSE);
450
gtk_window_set_keep_below (GTK_WINDOW (pDock->container.pWidget), FALSE);
451
gtk_window_set_title (GTK_WINDOW (pDock->container.pWidget), "cairo-dock-sub");
442
453
pDock->bAutoHide = FALSE;
443
double fPrevRatio = pDock->fRatio;
444
pDock->fRatio = MIN (pDock->fRatio, myViews.fSubDockSizeRatio);
454
double fPrevRatio = pDock->container.fRatio;
455
pDock->container.fRatio = MIN (pDock->container.fRatio, myViews.fSubDockSizeRatio);
449
460
for (ic = pDock->icons; ic != NULL; ic = ic->next)
452
icon->fWidth *= pDock->fRatio / fPrevRatio;
453
icon->fHeight *= pDock->fRatio / fPrevRatio;
463
icon->fWidth *= pDock->container.fRatio / fPrevRatio;
464
icon->fHeight *= pDock->container.fRatio / fPrevRatio;
454
465
pDock->fFlatDockWidth += icon->fWidth + myIcons.iIconGap;
456
pDock->iMaxIconHeight *= pDock->fRatio / fPrevRatio;
467
pDock->iMaxIconHeight *= pDock->container.fRatio / fPrevRatio;
458
469
cairo_dock_set_default_renderer (pDock);
460
gtk_widget_hide (pDock->pWidget);
471
gtk_widget_hide (pDock->container.pWidget);
461
472
cairo_dock_update_dock_size (pDock);
463
474
const gchar *cDockName = cairo_dock_search_dock_name (pDock);
593
604
if (pNextIcon != NULL && ((cairo_dock_get_icon_order (pNextIcon) - cairo_dock_get_icon_order (icon)) % 2 == 0) && (cairo_dock_get_icon_order (pNextIcon) != cairo_dock_get_icon_order (icon)))
595
606
int iSeparatorType = iOrder + 1;
596
//g_print (" insertion de %s avant %s -> iSeparatorType : %d\n", icon->acName, pNextIcon->acName, iSeparatorType);
607
//g_print (" insertion de %s avant %s -> iSeparatorType : %d\n", icon->cName, pNextIcon->cName, iSeparatorType);
598
609
cairo_t *pSourceContext = cairo_dock_create_context_from_window (CAIRO_CONTAINER (pDock));
599
610
Icon *pSeparatorIcon = cairo_dock_create_separator_icon (pSourceContext, iSeparatorType, pDock);
615
626
if (pPrevIcon != NULL && ((cairo_dock_get_icon_order (pPrevIcon) - cairo_dock_get_icon_order (icon)) % 2 == 0) && (cairo_dock_get_icon_order (pPrevIcon) != cairo_dock_get_icon_order (icon)))
617
628
int iSeparatorType = iOrder - 1;
618
//g_print (" insertion de %s (%d) apres %s -> iSeparatorType : %d\n", icon->acName, icon->pModuleInstance != NULL, pPrevIcon->acName, iSeparatorType);
629
//g_print (" insertion de %s (%d) apres %s -> iSeparatorType : %d\n", icon->cName, icon->pModuleInstance != NULL, pPrevIcon->cName, iSeparatorType);
620
631
cairo_t *pSourceContext = cairo_dock_create_context_from_window (CAIRO_CONTAINER (pDock));
621
632
Icon *pSeparatorIcon = cairo_dock_create_separator_icon (pSourceContext, iSeparatorType, pDock);
661
678
//\___________________ On desactive sa miniature.
662
679
if (icon->Xid != 0)
664
cd_debug ("on desactive la miniature de %s (Xid : %lx)", icon->acName, icon->Xid);
681
cd_debug ("on desactive la miniature de %s (Xid : %lx)", icon->cName, icon->Xid);
665
682
cairo_dock_set_xicon_geometry (icon->Xid, 0, 0, 0, 0);
667
684
//\___________________ On l'enleve de la liste.
706
723
Icon * pSeparatorIcon = NULL;
707
724
int iOrder = cairo_dock_get_icon_order (icon);
708
//g_print ("iOrder : %d\n", iOrder);
709
if (iOrder > 1) // attention : iType - 1 > 0 si iType = 0, car c'est un unsigned int (enum) !
725
g_print ("plus d'icone de cet ordre : %d\n", iOrder);
710
727
pSeparatorIcon = cairo_dock_get_first_icon_of_order (pDock->icons, iOrder - 1);
711
728
if (iOrder + 1 < CAIRO_DOCK_NB_TYPES && pSeparatorIcon == NULL)
712
729
pSeparatorIcon = cairo_dock_get_first_icon_of_order (pDock->icons, iOrder + 1);
714
731
if (pSeparatorIcon != NULL)
716
//g_print (" on enleve un separateur\n");
733
g_print (" -> on enleve un separateur\n");
717
734
cairo_dock_detach_icon_from_dock (pSeparatorIcon, pDock, FALSE);
718
735
cairo_dock_free_icon (pSeparatorIcon);
740
if (CAIRO_DOCK_IS_STORED_LAUNCHER (icon) || CAIRO_DOCK_IS_USER_SEPARATOR (icon) || CAIRO_DOCK_IS_APPLET (icon))
741
cairo_dock_refresh_launcher_gui ();
724
744
void cairo_dock_remove_icon_from_dock_full (CairoDock *pDock, Icon *icon, gboolean bCheckUnusedSeparator)
726
g_return_if_fail (icon != NULL && pDock != NULL);
746
g_return_if_fail (icon != NULL);
727
747
//\___________________ On effectue les taches de fermeture de l'icone suivant son type.
728
if (icon->acDesktopFileName != NULL)
748
if (icon->cDesktopFileName != NULL)
730
gchar *icon_path = g_strdup_printf ("%s/%s", g_cCurrentLaunchersPath, icon->acDesktopFileName);
731
g_remove (icon_path);
750
gchar *cDesktopFilePath = g_strdup_printf ("%s/%s", g_cCurrentLaunchersPath, icon->cDesktopFileName);
751
g_remove (cDesktopFilePath);
752
g_free (cDesktopFilePath);
753
cairo_dock_mark_theme_as_modified (TRUE);
734
755
if (CAIRO_DOCK_IS_URI_LAUNCHER (icon))
736
757
cairo_dock_fm_remove_monitor (icon);
760
if (icon->pSubDock != NULL && icon->cClass == NULL)
762
cairo_dock_destroy_dock (icon->pSubDock, icon->cName, NULL, NULL);
763
icon->pSubDock = NULL;
739
if (CAIRO_DOCK_IS_APPLET (icon))
766
else if (CAIRO_DOCK_IS_APPLET (icon))
741
768
cairo_dock_deinstanciate_module (icon->pModuleInstance); // desactive l'instance du module.
742
icon->pModuleInstance = NULL; // l'instance n'est plus valide apres ca.
769
cairo_dock_update_conf_file_with_active_modules ();
770
cairo_dock_mark_theme_as_modified (TRUE);
743
771
} // rien a faire pour les separateurs automatiques.
745
773
//\___________________ On detache l'icone du dock.
746
cairo_dock_detach_icon_from_dock (icon, pDock, bCheckUnusedSeparator);
775
cairo_dock_detach_icon_from_dock (icon, pDock, bCheckUnusedSeparator);
748
777
if (CAIRO_DOCK_IS_NORMAL_APPLI (icon))
750
779
cairo_dock_unregister_appli (icon);
753
if (pDock->iRefCount == 0 && myAccessibility.bReserveSpace) // bIsMainDock
754
cairo_dock_reserve_space_for_dock (pDock, TRUE); // l'espace est reserve sur la taille min, qui a deja ete mise a jour.
766
792
next_ic = ic->next; // si l'icone se fait enlever, on perdrait le fil.
767
793
if (CAIRO_DOCK_IS_AUTOMATIC_SEPARATOR (icon))
769
//g_print ("un separateur en moins (apres %s)\n", ((Icon*)ic->data)->acName);
795
//g_print ("un separateur en moins (apres %s)\n", ((Icon*)ic->data)->cName);
770
796
cairo_dock_remove_one_icon_from_dock (pDock, icon);
771
797
cairo_dock_free_icon (icon);
790
816
if (! CAIRO_DOCK_IS_AUTOMATIC_SEPARATOR (next_icon) && abs (cairo_dock_get_icon_order (icon) - cairo_dock_get_icon_order (next_icon)) > 1) // icon->iType != next_icon->iType
792
818
int iSeparatorType = myIcons.tIconTypeOrder[next_icon->iType] - 1;
793
//g_print ("un separateur entre %s et %s, dans le groupe %d (=%d)\n", icon->acName, next_icon->acName, iSeparatorType, myIcons.tIconTypeOrder[iSeparatorType]);
819
//g_print ("un separateur entre %s et %s, dans le groupe %d (=%d)\n", icon->cName, next_icon->cName, iSeparatorType, myIcons.tIconTypeOrder[iSeparatorType]);
794
820
cairo_t *pCairoContext = cairo_dock_create_context_from_window (CAIRO_CONTAINER (pDock));
795
821
Icon *pSeparator = cairo_dock_create_separator_icon (pCairoContext, iSeparatorType, pDock);
796
822
cairo_destroy (pCairoContext);
797
823
if (pSeparator != NULL)
799
pSeparator->fWidth /= pDock->fRatio;
800
pSeparator->fHeight /= pDock->fRatio;
825
pSeparator->fWidth /= pDock->container.fRatio;
826
pSeparator->fHeight /= pDock->container.fRatio;
801
827
cairo_dock_insert_icon_in_dock_full (pSeparator, pDock, !CAIRO_DOCK_UPDATE_DOCK_SIZE, ! CAIRO_DOCK_ANIMATE_ICON, ! CAIRO_DOCK_INSERT_SEPARATOR, NULL);
802
828
pSeparator->cParentDockName = g_strdup (next_icon->cParentDockName);