~cairo-dock-team/cairo-dock-core/popup_from_shortkey

« back to all changes in this revision

Viewing changes to src/gldit/cairo-dock-callbacks.c

  • Committer: Fabrice Rey
  • Date: 2013-06-04 22:58:28 UTC
  • Revision ID: fabounet03@gmail.com-20130604225828-x8lg3mv9135jr114
updated various parts of the core to the new API (new icons type, 'delete' method, simplified functions, etc)

Show diffs side-by-side

added added

removed removed

Lines of Context:
36
36
#include "cairo-dock-icon-factory.h"
37
37
#include "cairo-dock-icon-facility.h"
38
38
#include "cairo-dock-applications-manager.h"
 
39
#include "cairo-dock-stack-icon-manager.h"
 
40
#include "cairo-dock-separator-manager.h"
 
41
#include "cairo-dock-class-icon-manager.h"
39
42
#include "cairo-dock-application-facility.h"
40
 
#include "cairo-dock-desktop-file-factory.h"
41
43
#include "cairo-dock-launcher-manager.h"
42
44
#include "cairo-dock-config.h"
43
45
#include "cairo-dock-container.h"
54
56
#include "cairo-dock-desktop-manager.h"
55
57
#include "cairo-dock-windows-manager.h"  // gldi_windows_get_active
56
58
#include "cairo-dock-data-renderer.h"  // cairo_dock_refresh_data_renderer
 
59
#include "cairo-dock-indicator-manager.h"  // myIndicators.bUseClassIndic
57
60
#include "cairo-dock-callbacks.h"
58
61
 
59
62
// dependencies
190
193
                glDisable (GL_SCISSOR_TEST);
191
194
                
192
195
                gldi_glx_end_draw_container (CAIRO_CONTAINER (pDock));
193
 
                
194
 
                return FALSE ;
195
196
        }
196
197
        else if (! g_bUseOpenGL && pDock->pRenderer->render != NULL)
197
198
        {
215
216
                }
216
217
        
217
218
                cairo_destroy (pCairoContext);
218
 
                return FALSE ;
219
219
        }
220
 
        
 
220
        return FALSE;
221
221
        /// TODO: check that it works without the code below...
222
 
        
 
222
        /**
223
223
        //\________________ Cairo optimized rendering
224
224
        if (area.x + area.y != 0)  // x et/ou y sont > 0.
225
225
        {
283
283
        }
284
284
        
285
285
        cairo_destroy (pCairoContext);
286
 
        return FALSE;
 
286
        return FALSE;*/
287
287
}
288
288
 
289
289
 
313
313
static gboolean _cairo_dock_action_on_drag_hover (Icon *pIcon)
314
314
{
315
315
        gpointer data[2] = {pIcon, NULL};
316
 
        cairo_dock_foreach_icons_in_docks ((CairoDockForeachIconFunc)_search_icon, data);  // on verifie que l'icone ne s'est pas faite effacee entre-temps.
 
316
        gldi_icons_foreach_in_docks ((CairoDockForeachIconFunc)_search_icon, data);  // on verifie que l'icone ne s'est pas faite effacee entre-temps.
317
317
        pIcon = data[1];
318
318
        if (pIcon && pIcon->iface.action_on_drag_hover)
319
319
                pIcon->iface.action_on_drag_hover (pIcon);
402
402
}
403
403
 
404
404
 
405
 
gboolean cairo_dock_on_leave_dock_notification (G_GNUC_UNUSED gpointer data, CairoDock *pDock, G_GNUC_UNUSED gboolean *bStartAnimation)
406
 
{
407
 
        //g_print ("%s (%d, %d)\n", __func__, pDock->iRefCount, pDock->bHasModalWindow);
408
 
        
409
 
        //\_______________ If a modal window is raised, we discard the 'leave-event' to stay in the up position.
410
 
        if (pDock->bHasModalWindow)
411
 
                return GLDI_NOTIFICATION_INTERCEPT;
412
 
        
413
 
        //\_______________ On gere le drag d'une icone hors du dock.
414
 
        if (s_pIconClicked != NULL
415
 
        && (CAIRO_DOCK_ICON_TYPE_IS_LAUNCHER (s_pIconClicked)
416
 
                || CAIRO_DOCK_ICON_TYPE_IS_CONTAINER (s_pIconClicked)
417
 
                || (CAIRO_DOCK_ICON_TYPE_IS_SEPARATOR (s_pIconClicked) && s_pIconClicked->cDesktopFileName && pDock->iMaxDockHeight > 30)  // if the dock is narrow (like a panel), prevent from dragging separators outside of the dock. TODO: maybe we need a parameter in the view...
418
 
                || CAIRO_DOCK_IS_DETACHABLE_APPLET (s_pIconClicked))
419
 
        && s_pFlyingContainer == NULL
420
 
        && ! myDocksParam.bLockIcons
421
 
        && ! myDocksParam.bLockAll
422
 
        && ! pDock->bPreventDraggingIcons)
423
 
        {
424
 
                cd_debug ("on a sorti %s du dock (%d;%d) / %dx%d", s_pIconClicked->cName, pDock->container.iMouseX, pDock->container.iMouseY, pDock->container.iWidth, pDock->container.iHeight);
425
 
                
426
 
                //if (! cairo_dock_hide_child_docks (pDock))  // on quitte si on entre dans un sous-dock, pour rester en position "haute".
427
 
                //      return ;
428
 
                
429
 
                CairoDock *pOriginDock = gldi_dock_get (s_pIconClicked->cParentDockName);
430
 
                g_return_val_if_fail (pOriginDock != NULL, TRUE);
431
 
                if (pOriginDock == pDock && _mouse_is_really_outside (pDock))  // ce test est la pour parer aux WM deficients mentaux comme KWin qui nous font sortir/rentrer lors d'un clic.
432
 
                {
433
 
                        cd_debug (" on detache l'icone");
434
 
                        pOriginDock->bIconIsFlyingAway = TRUE;
435
 
                        /**gchar *cParentDockName = s_pIconClicked->cParentDockName;
436
 
                        s_pIconClicked->cParentDockName = NULL;*/
437
 
                        cairo_dock_detach_icon_from_dock (s_pIconClicked, pOriginDock);
438
 
                        /**s_pIconClicked->cParentDockName = cParentDockName;  // we keep the parent dock name, to be able to re-insert it. we'll have to remove it when the icon is dropped.
439
 
                        cairo_dock_update_dock_size (pOriginDock);*/
440
 
                        cairo_dock_stop_icon_glide (pOriginDock);
441
 
                        
442
 
                        s_pFlyingContainer = gldi_flying_container_new (s_pIconClicked, pOriginDock);
443
 
                        //g_print ("- s_pIconClicked <- NULL\n");
444
 
                        s_pIconClicked = NULL;
445
 
                        if (pDock->iRefCount > 0 || pDock->bAutoHide)  // pour garder le dock visible.
446
 
                        {
447
 
                                return GLDI_NOTIFICATION_INTERCEPT;
448
 
                        }
449
 
                }
450
 
        }
451
 
        /**else if (s_pFlyingContainer != NULL && s_pFlyingContainer->pIcon != NULL && pDock->iRefCount > 0)  // on evite les bouclages.
452
 
        {
453
 
                CairoDock *pOriginDock = gldi_dock_get (s_pFlyingContainer->pIcon->cParentDockName);
454
 
                if (pOriginDock == pDock)
455
 
                        return GLDI_NOTIFICATION_INTERCEPT;
456
 
        }*/
457
 
        
458
 
        //\_______________ On lance l'animation du dock.
459
 
        if (pDock->iRefCount == 0)
460
 
        {
461
 
                //g_print ("%s (auto-hide:%d)\n", __func__, pDock->bAutoHide);
462
 
                if (pDock->bAutoHide)
463
 
                {
464
 
                        ///pDock->fFoldingFactor = (myBackendsParam.bAnimateOnAutoHide ? 0.001 : 0.);
465
 
                        cairo_dock_start_hiding (pDock);
466
 
                }
467
 
        }
468
 
        else if (pDock->icons != NULL)
469
 
        {
470
 
                pDock->fFoldingFactor = (myDocksParam.bAnimateSubDock ? 0.001 : 0.);
471
 
                Icon *pIcon = cairo_dock_search_icon_pointing_on_dock (pDock, NULL);
472
 
                //g_print ("'%s' se replie\n", pIcon?pIcon->cName:"none");
473
 
                gldi_object_notify (pIcon, NOTIFICATION_UNFOLD_SUBDOCK, pIcon);
474
 
        }
475
 
        //g_print ("start shrinking\n");
476
 
        cairo_dock_start_shrinking (pDock);  // on commence a faire diminuer la taille des icones.
477
 
        return GLDI_NOTIFICATION_LET_PASS;
478
 
}
479
 
 
480
405
static void cairo_dock_stop_icon_glide (CairoDock *pDock)
481
406
{
482
407
        Icon *icon;
657
582
        return FALSE;
658
583
}
659
584
 
660
 
/*static gboolean _on_leave_dock_notification2 (G_GNUC_UNUSED gpointer data, CairoDock *pDock, G_GNUC_UNUSED gboolean *bStartAnimation)
661
 
{
662
 
        //\_______________ On gere le drag d'une icone hors du dock.
663
 
        if (s_pIconClicked != NULL
664
 
        && (CAIRO_DOCK_ICON_TYPE_IS_LAUNCHER (s_pIconClicked)
665
 
                || CAIRO_DOCK_ICON_TYPE_IS_CONTAINER (s_pIconClicked)
666
 
                || (CAIRO_DOCK_ICON_TYPE_IS_SEPARATOR (s_pIconClicked) && s_pIconClicked->cDesktopFileName)
667
 
                || CAIRO_DOCK_IS_DETACHABLE_APPLET (s_pIconClicked))
668
 
        && s_pFlyingContainer == NULL
669
 
        && ! myDocksParam.bLockIcons
670
 
        && ! myDocksParam.bLockAll
671
 
        && ! pDock->bPreventDraggingIcons)
672
 
        {
673
 
                cd_debug ("on a sorti %s du dock (%d;%d) / %dx%d", s_pIconClicked->cName, pDock->container.iMouseX, pDock->container.iMouseY, pDock->container.iWidth, pDock->container.iHeight);
674
 
                
675
 
                //if (! cairo_dock_hide_child_docks (pDock))  // on quitte si on entre dans un sous-dock, pour rester en position "haute".
676
 
                //      return ;
677
 
                
678
 
                CairoDock *pOriginDock = gldi_dock_get (s_pIconClicked->cParentDockName);
679
 
                g_return_val_if_fail (pOriginDock != NULL, TRUE);
680
 
                if (pOriginDock == pDock && _mouse_is_really_outside (pDock))  // ce test est la pour parer aux WM deficients mentaux comme KWin qui nous font sortir/rentrer lors d'un clic.
681
 
                {
682
 
                        cd_debug (" on detache l'icone");
683
 
                        pOriginDock->bIconIsFlyingAway = TRUE;
684
 
                        cairo_dock_detach_icon_from_dock (s_pIconClicked, pOriginDock);
685
 
                        ///cairo_dock_update_dock_size (pOriginDock);
686
 
                        cairo_dock_stop_icon_glide (pOriginDock);
687
 
                        
688
 
                        s_pFlyingContainer = gldi_flying_container_new (s_pIconClicked, pOriginDock);
689
 
                        //g_print ("- s_pIconClicked <- NULL\n");
690
 
                        s_pIconClicked = NULL;
691
 
                        if (pDock->iRefCount > 0 || pDock->bAutoHide)  // pour garder le dock visible.
692
 
                        {
693
 
                                return GLDI_NOTIFICATION_INTERCEPT;
694
 
                        }
695
 
                }
696
 
        }
697
 
        else if (s_pFlyingContainer != NULL && s_pFlyingContainer->pIcon != NULL && pDock->iRefCount > 0)  // on evite les bouclages.
698
 
        {
699
 
                CairoDock *pOriginDock = gldi_dock_get (s_pFlyingContainer->pIcon->cParentDockName);
700
 
                if (pOriginDock == pDock)
701
 
                        return GLDI_NOTIFICATION_INTERCEPT;
702
 
        }
703
 
        return GLDI_NOTIFICATION_LET_PASS;
704
 
}*/
705
 
 
706
585
static gboolean _on_leave_notify (G_GNUC_UNUSED GtkWidget* pWidget, GdkEventCrossing* pEvent, CairoDock *pDock)
707
586
{
708
587
        //g_print ("%s (bInside:%d; iState:%d; iRefCount:%d)\n", __func__, pDock->container.bInside, pDock->iInputState, pDock->iRefCount);
791
670
                pDock->iSidTestMouseOutside = 0;
792
671
        }
793
672
        
794
 
        
795
673
        //\_______________ Arrive ici, on est sorti du dock.
796
674
        pDock->container.bInside = FALSE;
797
675
        pDock->iAvoidingMouseIconType = -1;
809
687
                s_pSubDockShowing = NULL;
810
688
        }
811
689
        
 
690
        //\_______________ If a modal window is raised, we discard the 'leave-event' to stay in the up position.
 
691
        if (pDock->bHasModalWindow)
 
692
                return GLDI_NOTIFICATION_INTERCEPT;
 
693
        
 
694
        //\_______________ On gere le drag d'une icone hors du dock.
 
695
        if (s_pIconClicked != NULL
 
696
        && (CAIRO_DOCK_ICON_TYPE_IS_LAUNCHER (s_pIconClicked)
 
697
                || CAIRO_DOCK_ICON_TYPE_IS_CONTAINER (s_pIconClicked)
 
698
                || (CAIRO_DOCK_ICON_TYPE_IS_SEPARATOR (s_pIconClicked) && s_pIconClicked->cDesktopFileName && pDock->iMaxDockHeight > 30)  // if the dock is narrow (like a panel), prevent from dragging separators outside of the dock. TODO: maybe we need a parameter in the view...
 
699
                || CAIRO_DOCK_IS_DETACHABLE_APPLET (s_pIconClicked))
 
700
        && s_pFlyingContainer == NULL
 
701
        && ! myDocksParam.bLockIcons
 
702
        && ! myDocksParam.bLockAll
 
703
        && ! pDock->bPreventDraggingIcons)
 
704
        {
 
705
                cd_debug ("on a sorti %s du dock (%d;%d) / %dx%d", s_pIconClicked->cName, pDock->container.iMouseX, pDock->container.iMouseY, pDock->container.iWidth, pDock->container.iHeight);
 
706
                
 
707
                //if (! cairo_dock_hide_child_docks (pDock))  // on quitte si on entre dans un sous-dock, pour rester en position "haute".
 
708
                //      return ;
 
709
                
 
710
                CairoDock *pOriginDock = gldi_dock_get (s_pIconClicked->cParentDockName);
 
711
                g_return_val_if_fail (pOriginDock != NULL, TRUE);
 
712
                if (pOriginDock == pDock && _mouse_is_really_outside (pDock))  // ce test est la pour parer aux WM deficients mentaux comme KWin qui nous font sortir/rentrer lors d'un clic.
 
713
                {
 
714
                        cd_debug (" on detache l'icone");
 
715
                        pOriginDock->bIconIsFlyingAway = TRUE;
 
716
                        /**gchar *cParentDockName = s_pIconClicked->cParentDockName;
 
717
                        s_pIconClicked->cParentDockName = NULL;*/
 
718
                        cairo_dock_detach_icon_from_dock (s_pIconClicked, pOriginDock);
 
719
                        /**s_pIconClicked->cParentDockName = cParentDockName;  // we keep the parent dock name, to be able to re-insert it. we'll have to remove it when the icon is dropped.
 
720
                        cairo_dock_update_dock_size (pOriginDock);*/
 
721
                        cairo_dock_stop_icon_glide (pOriginDock);
 
722
                        
 
723
                        s_pFlyingContainer = gldi_flying_container_new (s_pIconClicked, pOriginDock);
 
724
                        //g_print ("- s_pIconClicked <- NULL\n");
 
725
                        s_pIconClicked = NULL;
 
726
                        if (pDock->iRefCount > 0 || pDock->bAutoHide)  // pour garder le dock visible.
 
727
                        {
 
728
                                return TRUE;
 
729
                        }
 
730
                }
 
731
        }
 
732
        /**else if (s_pFlyingContainer != NULL && s_pFlyingContainer->pIcon != NULL && pDock->iRefCount > 0)  // on evite les bouclages.
 
733
        {
 
734
                CairoDock *pOriginDock = gldi_dock_get (s_pFlyingContainer->pIcon->cParentDockName);
 
735
                if (pOriginDock == pDock)
 
736
                        return GLDI_NOTIFICATION_INTERCEPT;
 
737
        }*/
812
738
        
813
739
        gboolean bStartAnimation = FALSE;
814
740
        gldi_object_notify (pDock, NOTIFICATION_LEAVE_DOCK, pDock, &bStartAnimation);
818
744
        return TRUE;
819
745
}
820
746
 
821
 
/**static gboolean _on_enter_notification (G_GNUC_UNUSED gpointer pData, CairoDock *pDock, G_GNUC_UNUSED gboolean *bStartAnimation)
822
 
{
823
 
        // si on rentre avec une icone volante, on la met dedans.
824
 
        if (s_pFlyingContainer != NULL)
825
 
        {
826
 
                Icon *pFlyingIcon = s_pFlyingContainer->pIcon;
827
 
                if (pDock != pFlyingIcon->pSubDock)  // on evite les boucles.
828
 
                {
829
 
                        struct timeval tv;
830
 
                        int r = gettimeofday (&tv, NULL);
831
 
                        double t = 0.;
832
 
                        if (r == 0)
833
 
                                t = tv.tv_sec + tv.tv_usec * 1e-6;
834
 
                        if (t - s_pFlyingContainer->fCreationTime > 1)  // on empeche le cas ou enlever l'icone fait augmenter le ratio du dock, et donc sa hauteur, et nous fait rentrer dedans des qu'on sort l'icone.
835
 
                        {
836
 
                                cd_debug ("on remet l'icone volante dans un dock (dock d'origine : %s)", pFlyingIcon->cParentDockName);
837
 
                                gldi_object_unref (GLDI_OBJECT(s_pFlyingContainer));
838
 
                                gldi_icon_stop_animation (pFlyingIcon);
839
 
                                cairo_dock_insert_icon_in_dock (pFlyingIcon, pDock, CAIRO_DOCK_ANIMATE_ICON);
840
 
                                s_pFlyingContainer = NULL;
841
 
                                pDock->bIconIsFlyingAway = FALSE;
842
 
                        }
843
 
                }
844
 
        }
845
 
        
846
 
        return GLDI_NOTIFICATION_LET_PASS;
847
 
}*/
848
747
static gboolean _on_enter_notify (G_GNUC_UNUSED GtkWidget* pWidget, GdkEventCrossing* pEvent, CairoDock *pDock)
849
748
{
850
749
        //g_print ("%s (bIsMainDock : %d; bInside:%d; state:%d; iMagnitudeIndex:%d; input shape:%x; event:%p)\n", __func__, pDock->bIsMainDock, pDock->container.bInside, pDock->iInputState, pDock->iMagnitudeIndex, pDock->pShapeBitmap, pEvent);
1113
1012
                                                if (pOriginDock != NULL && pDock != pOriginDock)
1114
1013
                                                {
1115
1014
                                                        cairo_dock_detach_icon_from_dock (s_pIconClicked, pOriginDock);
1116
 
                                                        ///cairo_dock_update_dock_size (pOriginDock);
1117
1015
                                                        
1118
 
                                                        cairo_dock_update_icon_s_container_name (s_pIconClicked, icon->cParentDockName);
 
1016
                                                        gldi_theme_icon_write_container_name_in_conf_file (s_pIconClicked, gldi_dock_get_name (pDock));
1119
1017
                                                        
1120
1018
                                                        cairo_dock_insert_icon_in_dock (s_pIconClicked, pDock, CAIRO_DOCK_ANIMATE_ICON);
1121
1019
                                                }
1278
1176
        }
1279
1177
        
1280
1178
        gboolean bSizeUpdated = (iNewWidth != pDock->container.iWidth || iNewHeight != pDock->container.iHeight);
1281
 
        gboolean bIsNowSized = (pDock->container.iWidth == 1 && pDock->container.iHeight == 1 && bSizeUpdated);
 
1179
        ///gboolean bIsNowSized = (pDock->container.iWidth == 1 && pDock->container.iHeight == 1 && bSizeUpdated);
1282
1180
        gboolean bPositionUpdated = (pDock->container.iWindowPositionX != iNewX || pDock->container.iWindowPositionY != iNewY);
1283
1181
        pDock->container.iWidth = iNewWidth;
1284
1182
        pDock->container.iHeight = iNewHeight;
1335
1233
                }
1336
1234
                
1337
1235
                cairo_dock_calculate_dock_icons (pDock);
1338
 
                //g_print ("configure size\n");
 
1236
                //g_print ("configure size %s\n", pDock->cDockName);
1339
1237
                cairo_dock_trigger_set_WM_icons_geometry (pDock);  // changement de position ou de taille du dock => on replace les icones.
1340
1238
                
1341
1239
                gldi_dialogs_replace_all ();
1342
1240
                
1343
 
                if (bIsNowSized && g_bUseOpenGL)  // in OpenGL, the context is linked to the window; now that the window has a correct size, the context is ready -> draw things that couldn't be drawn until now.
 
1241
                if (/**bIsNowSized*/bSizeUpdated && g_bUseOpenGL)  // in OpenGL, the context is linked to the window; now that the window has a correct size, the context is ready -> draw things that couldn't be drawn until now.
1344
1242
                {
1345
1243
                        Icon *icon;
1346
1244
                        GList *ic;
1355
1253
                                }
1356
1254
                                if (bDamaged)
1357
1255
                                {
1358
 
                                        //g_print ("This icon %s is damaged\n", icon->cName);
 
1256
                                        //g_print ("This icon %s is damaged (%d)\n", icon->cName, icon->iSubdockViewType);
1359
1257
                                        icon->bDamaged = FALSE;
1360
1258
                                        if (cairo_dock_get_icon_data_renderer (icon) != NULL)
1361
1259
                                        {
1362
1260
                                                cairo_dock_refresh_data_renderer (icon, CAIRO_CONTAINER (pDock));
1363
1261
                                        }
1364
 
                                        else if (icon->iSubdockViewType != 0)
 
1262
                                        else if (icon->iSubdockViewType != 0
 
1263
                                        || (icon->cClass != NULL && ! myIndicatorsParam.bUseClassIndic && (CAIRO_DOCK_ICON_TYPE_IS_CLASS_CONTAINER (icon) || GLDI_OBJECT_IS_LAUNCHER_ICON (icon))))
1365
1264
                                        {
1366
1265
                                                cairo_dock_draw_subdock_content_on_icon (icon, pDock);
1367
1266
                                        }
1867
1766
                                pDock = cairo_dock_detach_appli (pIcon);
1868
1767
                                if (pDock == NULL)  // the dock has been destroyed (empty class sub-dock).
1869
1768
                                {
1870
 
                                        cairo_dock_free_icon (pIcon);
 
1769
                                        gldi_object_unref (GLDI_OBJECT (pIcon));
1871
1770
                                        return FALSE;
1872
1771
                                }
1873
1772
                        }
1874
1773
                        else
1875
1774
                        {
1876
1775
                                cd_message (" - %s va etre supprimee", pIcon->cName);
1877
 
                                cairo_dock_remove_icon_from_dock (pDock, pIcon);  // enleve le separateur automatique avec; supprime le .desktop et le sous-dock des lanceurs; stoppe les applets; marque le theme.
1878
 
                                
 
1776
                                /// TODO: do that in the 'reset_object'...
 
1777
                                cairo_dock_detach_icon_from_dock (pIcon, pDock);
1879
1778
                                if (pIcon->cClass != NULL && pDock == cairo_dock_get_class_subdock (pIcon->cClass))  // appli icon in its class sub-dock => destroy the class sub-dock if it becomes empty (we don't want an empty sub-dock).
1880
1779
                                {
1881
1780
                                        gboolean bEmptyClassSubDock = cairo_dock_check_class_subdock_is_empty (pDock, pIcon->cClass);
1882
1781
                                        if (bEmptyClassSubDock)
1883
1782
                                        {
1884
 
                                                cairo_dock_free_icon (pIcon);
 
1783
                                                gldi_object_unref (GLDI_OBJECT (pIcon));
1885
1784
                                                return FALSE;
1886
1785
                                        }
1887
1786
                                }
1888
1787
                                
1889
 
                                cairo_dock_free_icon (pIcon);
 
1788
                                gldi_object_delete (GLDI_OBJECT(pIcon));
1890
1789
                        }
1891
1790
                }
1892
1791
                else if (pIcon->fInsertRemoveFactor == (gdouble)-0.05)