~cairo-dock-team/ubuntu/precise/cairo-dock/3.0.0.0beta1

« back to all changes in this revision

Viewing changes to src/cairo-dock-applications-manager.c

  • Committer: Bazaar Package Importer
  • Author(s): Julien Lavergne
  • Date: 2008-09-14 16:26:12 UTC
  • mfrom: (1.1.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20080914162612-t6aa8pr2o0qry48o
Tags: 1.6.2.3-0ubuntu1
* New upstream release.
* debian/control
 - Update to 3.8.0 (no change needed).
 - Add libxtst-dev as Build-Depends.
* debian/cairo-dock-data.install
 - Add usr/share/cairo-dock/emblems directory.
* debian/watch
 - Update location.
* debian/rules
 - Add a get-orig-source rule.

Show diffs side-by-side

added added

removed removed

Lines of Context:
10
10
#include <string.h>
11
11
#include <stdio.h>
12
12
#include <stdlib.h>
 
13
#define __USE_POSIX
 
14
#include <signal.h>
13
15
 
14
16
#include <cairo.h>
15
17
#include <X11/Xlib.h>
16
18
#include <X11/Xatom.h>
17
19
#include <X11/Xutil.h>
18
 
#include <signal.h>
 
20
#ifdef HAVE_XEXTEND
 
21
#include <X11/extensions/Xcomposite.h>
 
22
//#include <X11/extensions/Xdamage.h>
 
23
#endif
19
24
 
20
25
#include "cairo-dock-icons.h"
21
26
#include "cairo-dock-draw.h"
36
41
#define CAIRO_DOCK_TASKBAR_CHECK_INTERVAL 250
37
42
 
38
43
extern CairoDock *g_pMainDock;
39
 
extern gboolean g_bAutoHide;
40
44
extern double g_fAmplitude;
41
45
extern gboolean g_bUseSeparator;
42
46
 
45
49
extern gboolean g_bUniquePid;
46
50
extern gboolean g_bAnimateOnActiveWindow;
47
51
extern gboolean g_bAutoHideOnFullScreen;
 
52
extern gboolean g_bAutoHideOnMaximized;
48
53
extern gboolean g_bHideVisibleApplis;
49
54
extern double g_fVisibleAppliAlpha;
50
55
extern gboolean g_bAppliOnCurrentDesktopOnly;
52
57
extern int g_iNbDesktops;
53
58
extern int g_iNbViewportX,g_iNbViewportY ;
54
59
extern gboolean g_bMixLauncherAppli;
 
60
extern gboolean g_bShowThumbnail;
 
61
extern gboolean g_bUseFakeTransparency;
 
62
//extern int g_iDamageEvent;
55
63
 
56
64
static GHashTable *s_hXWindowTable = NULL;  // table des fenetres X affichees dans le dock.
57
65
static Display *s_XDisplay = NULL;
58
66
static int s_iSidUpdateAppliList = 0;
 
67
static Window s_iCurrentActiveWindow = 0;
59
68
static Atom s_aNetClientList;
60
69
static Atom s_aNetActiveWindow;
61
70
static Atom s_aNetCurrentDesktop;
67
76
static Atom s_aNetWmBelow;
68
77
static Atom s_aNetWmHidden;
69
78
static Atom s_aNetWmDesktop;
70
 
 
 
79
static Atom s_aNetWmMaximizedHoriz;
 
80
static Atom s_aNetWmMaximizedVert;
 
81
static Atom s_aRootMapID;
 
82
static Atom s_aNetNbDesktops;
71
83
 
72
84
void cairo_dock_initialize_application_manager (Display *pDisplay)
73
85
{
89
101
        s_aNetWmBelow = XInternAtom (s_XDisplay, "_NET_WM_STATE_BELOW", False);
90
102
        s_aNetWmHidden = XInternAtom (s_XDisplay, "_NET_WM_STATE_HIDDEN", False);
91
103
        s_aNetWmDesktop = XInternAtom (s_XDisplay, "_NET_WM_DESKTOP", False);
 
104
        s_aNetWmMaximizedHoriz = XInternAtom (s_XDisplay, "_NET_WM_STATE_MAXIMIZED_HORZ", False);
 
105
        s_aNetWmMaximizedVert = XInternAtom (s_XDisplay, "_NET_WM_STATE_MAXIMIZED_VERT", False);
 
106
        s_aRootMapID = XInternAtom (s_XDisplay, "_XROOTPMAP_ID", False);
 
107
        s_aNetNbDesktops = XInternAtom (s_XDisplay, "_NET_NUMBER_OF_DESKTOPS", False);
92
108
}
93
109
 
94
110
 
118
134
{
119
135
        if (CAIRO_DOCK_IS_APPLI (icon))
120
136
        {
121
 
                g_hash_table_remove (s_hXWindowTable, &icon->Xid);
 
137
                cd_message ("%s (%s)", __func__, icon->acName);
 
138
                if (icon->fLastCheckTime != -1)
 
139
                        g_hash_table_remove (s_hXWindowTable, &icon->Xid);
122
140
                
123
141
                cairo_dock_unregister_pid (icon);  // on n'efface pas sa classe ici car on peut en avoir besoin encore.
124
142
                
 
143
                if (icon->iBackingPixmap != 0)
 
144
                {
 
145
                        XFreePixmap (s_XDisplay, icon->iBackingPixmap);
 
146
                        icon->iBackingPixmap = 0;
 
147
                }
 
148
                
125
149
                cairo_dock_remove_appli_from_class (icon);
126
150
                cairo_dock_update_Xid_on_inhibators (icon->Xid, icon->cClass);
127
151
                
137
161
        CairoDock *pDock = cairo_dock_search_dock_from_name (pIcon->cParentDockName);
138
162
        if (pDock != NULL)
139
163
        {
 
164
                gchar *cParentDockName = pIcon->cParentDockName;
 
165
                pIcon->cParentDockName = NULL;  // astuce.
140
166
                cairo_dock_detach_icon_from_dock (pIcon, pDock, g_bUseSeparator);
141
167
                if (pDock->icons == NULL)
142
 
                        cairo_dock_destroy_dock (pDock, pIcon->cParentDockName, NULL, NULL);
 
168
                        cairo_dock_destroy_dock (pDock, cParentDockName, NULL, NULL);
143
169
                else if (! pDock->bIsMainDock)
144
170
                        cairo_dock_update_dock_size (pDock);
 
171
                g_free (cParentDockName);
145
172
        }
146
173
        
147
 
        cairo_dock_free_icon_buffers (pIcon);  // pour ne pas passer dans le 'unregister'.
 
174
        cairo_dock_free_icon_buffers (pIcon);  // on ne veut pas passer dans le 'unregister' ni la gestion de la classe.
 
175
        cairo_dock_unregister_pid (pIcon);
148
176
        g_free (pIcon);
149
177
        return TRUE;
150
178
}
259
287
        xClientMessage.xclient.send_event = True;
260
288
        xClientMessage.xclient.display = s_XDisplay;
261
289
        xClientMessage.xclient.window = Xid;
262
 
        xClientMessage.xclient.message_type = XInternAtom (s_XDisplay, "_NET_ACTIVE_WINDOW", False);
 
290
        xClientMessage.xclient.message_type = s_aNetActiveWindow;
263
291
        xClientMessage.xclient.format = 32;
264
292
        xClientMessage.xclient.data.l[0] = 2;  // source indication
265
293
        xClientMessage.xclient.data.l[1] = 0;  // timestamp
313
341
}
314
342
void cairo_dock_maximize_xwindow (Window Xid, gboolean bMaximize)
315
343
{
316
 
        _cairo_dock_change_window_state (Xid, bMaximize, XInternAtom (s_XDisplay, "_NET_WM_STATE_MAXIMIZED_VERT", False), XInternAtom (s_XDisplay, "_NET_WM_STATE_MAXIMIZED_HORZ", False));
 
344
        _cairo_dock_change_window_state (Xid, bMaximize, s_aNetWmMaximizedVert, s_aNetWmMaximizedHoriz);
317
345
}
318
346
 
319
347
void cairo_dock_set_xwindow_fullscreen (Window Xid, gboolean bFullScreen)
390
418
        if (iBufferNbElements > 0)
391
419
        {
392
420
                int i;
393
 
                Atom aNetWmMaximizedVertically = XInternAtom (s_XDisplay, "_NET_WM_STATE_MAXIMIZED_VERT", False);
394
 
                Atom aNetWmMaximizedHorizontally = XInternAtom (s_XDisplay, "_NET_WM_STATE_MAXIMIZED_HORZ", False);
395
421
                for (i = 0; i < iBufferNbElements && iIsMaximized < 2; i ++)
396
422
                {
397
 
                        if (pXStateBuffer[i] == aNetWmMaximizedVertically)
 
423
                        if (pXStateBuffer[i] == s_aNetWmMaximizedVert)
398
424
                                iIsMaximized ++;
399
 
                        if (pXStateBuffer[i] == aNetWmMaximizedHorizontally)
 
425
                        if (pXStateBuffer[i] == s_aNetWmMaximizedHoriz)
400
426
                                iIsMaximized ++;
401
427
                }
402
428
        }
470
496
        XFree (pXStateBuffer);
471
497
}
472
498
 
473
 
void cairo_dock_window_is_fullscreen_or_hidden (Window Xid, gboolean *bIsFullScreen, gboolean *bIsHidden)
 
499
void cairo_dock_window_is_fullscreen_or_hidden_or_maximized (Window Xid, gboolean *bIsFullScreen, gboolean *bIsHidden, gboolean *bIsMaximized)
474
500
{
475
501
        g_return_if_fail (Xid > 0);
476
502
        Atom aReturnedType = 0;
481
507
 
482
508
        *bIsFullScreen = FALSE;
483
509
        *bIsHidden = FALSE;
 
510
        *bIsMaximized = FALSE;
484
511
        if (iBufferNbElements > 0)
485
512
        {
486
 
                int i;
 
513
                int i, iNbMaximizedDimensions = 0;
487
514
                for (i = 0; i < iBufferNbElements; i ++)
488
515
                {
489
516
                        if (pXStateBuffer[i] == s_aNetWmFullScreen)
496
523
                        {
497
524
                                cd_message (  "s_aNetWmHidden");
498
525
                                *bIsHidden = TRUE;
499
 
                                break ;
 
526
                                //break ;
 
527
                        }
 
528
                        else if (pXStateBuffer[i] == s_aNetWmMaximizedVert)
 
529
                        {
 
530
                                iNbMaximizedDimensions ++;
 
531
                                if (iNbMaximizedDimensions == 2)
 
532
                                {
 
533
                                        *bIsMaximized = TRUE;
 
534
                                        //break;
 
535
                                }
 
536
                        }
 
537
                        else if (pXStateBuffer[i] == s_aNetWmMaximizedHoriz)
 
538
                        {
 
539
                                iNbMaximizedDimensions ++;
 
540
                                if (iNbMaximizedDimensions == 2)
 
541
                                {
 
542
                                        *bIsMaximized = TRUE;
 
543
                                        //break;
 
544
                                }
500
545
                        }
501
546
                }
502
547
        }
503
 
 
 
548
        
504
549
        XFree (pXStateBuffer);
505
550
}
506
551
 
507
 
Window cairo_dock_get_active_window (void)
 
552
Window cairo_dock_get_active_xwindow (void)
508
553
{
509
 
        Atom aNetActiveWindow = XInternAtom (s_XDisplay, "_NET_ACTIVE_WINDOW", False);
510
554
        Atom aReturnedType = 0;
511
555
        int aReturnedFormat = 0;
512
556
        unsigned long iLeftBytes, iBufferNbElements = 0;
513
557
        gulong *pXBuffer = NULL;
514
558
        Window root = DefaultRootWindow (s_XDisplay);
515
 
        XGetWindowProperty (s_XDisplay, root, aNetActiveWindow, 0, G_MAXULONG, False, XA_WINDOW, &aReturnedType, &aReturnedFormat, &iBufferNbElements, &iLeftBytes, (guchar **)&pXBuffer);
 
559
        XGetWindowProperty (s_XDisplay, root, s_aNetActiveWindow, 0, G_MAXULONG, False, XA_WINDOW, &aReturnedType, &aReturnedFormat, &iBufferNbElements, &iLeftBytes, (guchar **)&pXBuffer);
516
560
 
517
561
        Window xActiveWindow = (iBufferNbElements > 0 && pXBuffer != NULL ? pXBuffer[0] : 0);
518
562
        XFree (pXBuffer);
606
650
        {
607
651
                if (cairo_dock_animation_will_be_visible (pParentDock) && ! pParentDock->bInside && g_bAnimateOnActiveWindow)
608
652
                {
609
 
                        cairo_dock_arm_animation (icon, CAIRO_DOCK_WOBBLY, 1);  // un clignotement. il faut choisir une animation qui ne necessite pas que la fenetre du dock soit de taille maximale.
 
653
                        cairo_dock_arm_animation (icon, CAIRO_DOCK_WOBBLY, 1);  // une deformation. il faut choisir une animation qui ne necessite pas que la fenetre du dock soit de taille maximale.
610
654
                        cairo_dock_start_animation (icon, pParentDock);
611
655
                }
612
656
        }
613
657
}
614
658
 
 
659
static gboolean _cairo_dock_window_is_on_our_way (Window *Xid, Icon *icon, int *data)
 
660
{
 
661
        if (icon != NULL && cairo_dock_window_is_on_this_desktop (*Xid, data[0]))
 
662
        {
 
663
                gboolean bIsFullScreen, bIsHidden, bIsMaximized;
 
664
                cairo_dock_window_is_fullscreen_or_hidden_or_maximized (*Xid, &bIsFullScreen, &bIsHidden, &bIsMaximized);
 
665
                if ((data[1] && bIsMaximized & ! bIsHidden) || (data[2] && bIsFullScreen))
 
666
                {
 
667
                        cd_message ("%s est genante (%d, %d) (%d;%d %dx%d)", icon->acName, bIsMaximized, bIsFullScreen, icon->windowGeometry.x, icon->windowGeometry.y, icon->windowGeometry.width, icon->windowGeometry.height);
 
668
                        if (cairo_dock_window_hovers_dock (&icon->windowGeometry, g_pMainDock))
 
669
                        {
 
670
                                cd_message (" et en plus elle empiete sur notre dock");
 
671
                                return TRUE;
 
672
                        }
 
673
                }
 
674
        }
 
675
        return FALSE;
 
676
}
 
677
Icon * cairo_dock_search_window_on_our_way (gboolean bMaximizedWindow, gboolean bFullScreenWindow)
 
678
{
 
679
        cd_message ("%s (%d, %d)", __func__, bMaximizedWindow, bFullScreenWindow);
 
680
        if (! bMaximizedWindow && ! bFullScreenWindow)
 
681
                return NULL;
 
682
        int iDesktopNumber;
 
683
        iDesktopNumber = cairo_dock_get_current_desktop ();
 
684
        int data[3] = {iDesktopNumber, bMaximizedWindow, bFullScreenWindow};
 
685
        return g_hash_table_find (s_hXWindowTable, (GHRFunc) _cairo_dock_window_is_on_our_way, data);
 
686
}
615
687
static void _cairo_dock_hide_show_windows_on_other_desktops (Window *Xid, Icon *icon, int *pCurrentDesktop)
616
688
{
617
689
        g_return_if_fail (Xid != NULL && pCurrentDesktop != NULL);
630
702
                else
631
703
                {
632
704
                        cd_message (" => n'est pas sur le bureau actuel.");
633
 
                        CairoDock *pParentDock = cairo_dock_search_dock_from_name (icon->cParentDockName);
 
705
                        pParentDock = cairo_dock_search_dock_from_name (icon->cParentDockName);
634
706
                        if (pParentDock != NULL)
635
707
                        {
636
708
                                cairo_dock_detach_icon_from_dock (icon, pParentDock, TRUE);
641
713
                        gtk_widget_queue_draw (pParentDock->pWidget);
642
714
        }
643
715
}
 
716
static void _cairo_dock_fill_icon_buffer_with_thumbnail (Icon *icon, CairoDock *pParentDock)
 
717
{
 
718
        #ifdef HAVE_XEXTEND
 
719
        if (! icon->bIsHidden)  // elle vient d'apparaitre => nouveau backing pixmap.
 
720
        {
 
721
                if (icon->iBackingPixmap != 0)
 
722
                        XFreePixmap (s_XDisplay, icon->iBackingPixmap);
 
723
                if (g_bShowThumbnail)
 
724
                        icon->iBackingPixmap = XCompositeNameWindowPixmap (s_XDisplay, icon->Xid);
 
725
                g_print ("new backing pixmap (bis) : %d\n", icon->iBackingPixmap);
 
726
        }
 
727
        #endif
 
728
        cairo_t *pCairoContext = cairo_dock_create_context_from_window (CAIRO_CONTAINER (pParentDock));
 
729
        cairo_dock_fill_one_icon_buffer (icon, pCairoContext, 1 + g_fAmplitude, pParentDock->bHorizontalDock, TRUE, pParentDock->bDirectionUp);
 
730
        cairo_destroy (pCairoContext);
 
731
        icon->fWidth *= pParentDock->fRatio;
 
732
        icon->fHeight *= pParentDock->fRatio;
 
733
}
644
734
gboolean cairo_dock_unstack_Xevents (CairoDock *pDock)
645
735
{
646
736
        static XEvent event;
647
 
        static int iLastActiveWindow = 0;
648
737
        static gboolean bInProgress = FALSE;
649
738
        
650
739
        g_return_val_if_fail (pDock != NULL, FALSE);
660
749
        {
661
750
                icon = NULL;
662
751
                Xid = event.xany.window;
 
752
                //g_print ("  type : %d; atom : %s; window : %d\n", event.type, gdk_x11_get_xatom_name (event.xproperty.atom), Xid);
663
753
                //if (event.type == ClientMessage)
664
 
                //      cd_message ("\n\n\n >>>>>>>>>>>< event.type : %d\n\n", event.type);
 
754
                //cd_message ("\n\n\n >>>>>>>>>>>< event.type : %d\n\n", event.type);
665
755
                if (event.type == PropertyNotify)
666
756
                {
667
757
                        //g_print ("  type : %d; atom : %s; window : %d\n", event.xproperty.type, gdk_x11_get_xatom_name (event.xproperty.atom), Xid);
676
766
                                }
677
767
                                else if (event.xproperty.atom == s_aNetActiveWindow)
678
768
                                {
679
 
                                        Window XActiveWindow = cairo_dock_get_active_window ();
680
 
                                        if (iLastActiveWindow != XActiveWindow)
 
769
                                        Window XActiveWindow = cairo_dock_get_active_xwindow ();
 
770
                                        if (s_iCurrentActiveWindow != XActiveWindow)
681
771
                                        {
682
 
                                                iLastActiveWindow = XActiveWindow;
683
772
                                                icon = g_hash_table_lookup (s_hXWindowTable, &XActiveWindow);
 
773
                                                CairoDock *pParentDock = NULL;
684
774
                                                if (icon != NULL)
685
775
                                                {
686
776
                                                        cd_message ("%s devient active", icon->acName);
687
 
                                                        CairoDock *pParentDock = cairo_dock_search_dock_from_name (icon->cParentDockName);
 
777
                                                        pParentDock = cairo_dock_search_dock_from_name (icon->cParentDockName);
688
778
                                                        if (pParentDock == NULL)  // elle est inhibee.
689
779
                                                        {
690
780
                                                                cairo_dock_update_activity_on_inhibators (icon->cClass, icon->Xid);
691
781
                                                        }
692
782
                                                        else
693
783
                                                        {
694
 
                                                                cairo_dock_animate_icon_on_active (icon, pParentDock);
695
 
                                                        }
696
 
                                                        
697
 
                                                }
 
784
                                                                if (g_bAnimateOnActiveWindow)
 
785
                                                                        cairo_dock_animate_icon_on_active (icon, pParentDock);
 
786
                                                                else if (pParentDock->iSidShrinkDown == 0)
 
787
                                                                        cairo_dock_redraw_my_icon (icon, CAIRO_CONTAINER (pParentDock));
 
788
                                                        }
 
789
                                                        ///icon->bIsActive = TRUE;
 
790
                                                }
 
791
                                                
 
792
                                                Icon *pLastActiveIcon = g_hash_table_lookup (s_hXWindowTable, &s_iCurrentActiveWindow);
 
793
                                                if (pLastActiveIcon != NULL)
 
794
                                                {
 
795
                                                        ///pLastActiveIcon->bIsActive = FALSE;
 
796
                                                        CairoDock *pLastActiveParentDock = cairo_dock_search_dock_from_name (pLastActiveIcon->cParentDockName);
 
797
                                                        if (pLastActiveParentDock != NULL)
 
798
                                                        {
 
799
                                                                if (pLastActiveParentDock->iSidShrinkDown == 0)
 
800
                                                                        cairo_dock_redraw_my_icon (pLastActiveIcon, CAIRO_CONTAINER (pLastActiveParentDock));
 
801
                                                        }
 
802
                                                        else
 
803
                                                        {
 
804
                                                                cairo_dock_update_inactivity_on_inhibators (pLastActiveIcon->cClass, pLastActiveIcon->Xid);
 
805
                                                        }
 
806
                                                }
 
807
                                                
698
808
                                                cairo_dock_notify (CAIRO_DOCK_WINDOW_ACTIVATED, &XActiveWindow);
 
809
                                                
 
810
                                                s_iCurrentActiveWindow = XActiveWindow;
699
811
                                        }
700
812
                                }
701
813
                                else if (event.xproperty.atom == s_aNetCurrentDesktop || event.xproperty.atom == s_aNetDesktopViewport)
707
819
                                                int data[2] = {iDesktopNumber, GPOINTER_TO_INT (pDock)};
708
820
                                                g_hash_table_foreach (s_hXWindowTable, (GHFunc) _cairo_dock_hide_show_windows_on_other_desktops, data);
709
821
                                        }
 
822
                                        if (cairo_dock_quick_hide_is_activated () && (g_bAutoHideOnFullScreen || g_bAutoHideOnMaximized))
 
823
                                        {
 
824
                                                if (cairo_dock_search_window_on_our_way (g_bAutoHideOnMaximized, g_bAutoHideOnFullScreen) == NULL)
 
825
                                                {
 
826
                                                        cd_message (" => plus aucune fenetre genante");
 
827
                                                        cairo_dock_deactivate_temporary_auto_hide ();
 
828
                                                }
 
829
                                        }
 
830
                                        else if (! cairo_dock_quick_hide_is_activated () && (g_bAutoHideOnFullScreen || g_bAutoHideOnMaximized))
 
831
                                        {
 
832
                                                if (cairo_dock_search_window_on_our_way (g_bAutoHideOnMaximized, g_bAutoHideOnFullScreen) != NULL)
 
833
                                                {
 
834
                                                        cd_message (" => une fenetre est genante");
 
835
                                                        cairo_dock_activate_temporary_auto_hide ();
 
836
                                                }
 
837
                                        }
 
838
                                        cd_message ("bureau change");
710
839
                                        cairo_dock_notify (CAIRO_DOCK_DESKTOP_CHANGED, NULL);
711
840
                                }
 
841
                                else if (event.xproperty.atom == s_aNetNbDesktops)
 
842
                                {
 
843
                                        cd_message ("changementdu nombre de bureaux virtuels");
 
844
                                        g_iNbDesktops = cairo_dock_get_nb_desktops ();
 
845
                                        cairo_dock_notify (CAIRO_DOCK_SCREEN_GEOMETRY_ALTERED, NULL);
 
846
                                }
712
847
                                else if (event.xproperty.atom == s_aNetDesktopGeometry)
713
848
                                {
714
849
                                        cd_message ("geometrie du bureau alteree");
715
 
                                        if (cairo_dock_update_screen_geometry ())  // modification largeur et/ou hauteur.
 
850
                                        
 
851
                                        cairo_dock_get_nb_viewports (&g_iNbViewportX, &g_iNbViewportY);
 
852
                                        
 
853
                                        if (cairo_dock_update_screen_geometry ())  // modification de la resolution.
716
854
                                        {
717
855
                                                cairo_dock_set_window_position_at_balance (pDock, pDock->iCurrentWidth, pDock->iCurrentHeight);
718
856
                                                gtk_window_move (GTK_WINDOW (pDock->pWidget), pDock->iWindowPositionX, pDock->iWindowPositionY);
719
 
                                                cairo_dock_notify (CAIRO_DOCK_SCREEN_GEOMETRY_ALTERED, NULL);
720
857
                                        }
721
 
                                        g_iNbDesktops = cairo_dock_get_nb_desktops ();
722
 
                                        cairo_dock_get_nb_viewports (&g_iNbViewportX, &g_iNbViewportY);
 
858
                                        cairo_dock_notify (CAIRO_DOCK_SCREEN_GEOMETRY_ALTERED, NULL);
 
859
                                }
 
860
                                else if (event.xproperty.atom == s_aRootMapID)
 
861
                                {
 
862
                                        cd_message ("changement du fond d'ecran");
 
863
                                        if (g_bUseFakeTransparency)
 
864
                                                cairo_dock_load_desktop_background_surface ();
 
865
                                        else
 
866
                                                cairo_dock_invalidate_desktop_bg_surface ();
 
867
                                        cairo_dock_notify (CAIRO_DOCK_SCREEN_GEOMETRY_ALTERED, NULL);
723
868
                                }
724
869
                        }
725
870
                        else
726
871
                        {
727
872
                                if (event.xproperty.atom == s_aNetWmState || event.xproperty.atom == XInternAtom (s_XDisplay, "_KDE_WM_WINDOW_OPACITY", False))
728
873
                                {
729
 
                                        gboolean bIsFullScreen, bIsHidden;
730
 
                                        cairo_dock_window_is_fullscreen_or_hidden (Xid, &bIsFullScreen, &bIsHidden);
731
 
                                        cd_message ("changement d'etat de %d => {%d ; %d}", Xid, bIsFullScreen, bIsHidden);
732
 
                                        if (g_bAutoHideOnFullScreen && bIsFullScreen && ! cairo_dock_quick_hide_is_activated ())
733
 
                                        {
734
 
                                                cd_message (" => devient plein ecran");
735
 
                                                cairo_dock_activate_temporary_auto_hide (g_pMainDock);
 
874
                                        gboolean bIsFullScreen, bIsHidden, bIsMaximized;
 
875
                                        cairo_dock_window_is_fullscreen_or_hidden_or_maximized (Xid, &bIsFullScreen, &bIsHidden, &bIsMaximized);
 
876
                                        cd_message ("changement d'etat de %d => {%d ; %d ; %d}", Xid, bIsFullScreen, bIsHidden, bIsMaximized);
 
877
                                        /*if (g_bAutoHideOnFullScreen)
 
878
                                        {
 
879
                                                if (bIsFullScreen && ! cairo_dock_quick_hide_is_activated ())
 
880
                                                {
 
881
                                                        cd_message (" => devient plein ecran");
 
882
                                                        cairo_dock_activate_temporary_auto_hide ();
 
883
                                                }
 
884
                                                else if (! bIsFullScreen && cairo_dock_quick_hide_is_activated ())
 
885
                                                {
 
886
                                                        if (cairo_dock_search_fullscreen_window_on_current_desktop () == NULL)
 
887
                                                                cairo_dock_deactivate_temporary_auto_hide ();
 
888
                                                }
 
889
                                        }*/
 
890
                                        gboolean bChangeIntercepted = FALSE;
 
891
                                        if (g_bAutoHideOnMaximized || g_bAutoHideOnFullScreen)
 
892
                                        {
 
893
                                                if ( ((bIsMaximized && ! bIsHidden && g_bAutoHideOnMaximized) || (bIsFullScreen && g_bAutoHideOnFullScreen)) && ! cairo_dock_quick_hide_is_activated ())
 
894
                                                {
 
895
                                                        icon = g_hash_table_lookup (s_hXWindowTable, &Xid);
 
896
                                                        cd_message (" => %s devient genante", icon != NULL ? icon->acName : "une fenetre");
 
897
                                                        if (icon != NULL && cairo_dock_window_hovers_dock (&icon->windowGeometry, g_pMainDock))
 
898
                                                                cairo_dock_activate_temporary_auto_hide ();
 
899
                                                        //bChangeIntercepted = TRUE;
 
900
                                                }
 
901
                                                else if ((! bIsMaximized || ! g_bAutoHideOnMaximized || bIsHidden) && (! bIsFullScreen || ! g_bAutoHideOnFullScreen) && cairo_dock_quick_hide_is_activated ())
 
902
                                                {
 
903
                                                        if (cairo_dock_search_window_on_our_way (g_bAutoHideOnMaximized, g_bAutoHideOnFullScreen) == NULL)
 
904
                                                        {
 
905
                                                                cd_message (" => plus aucune fenetre genante");
 
906
                                                                cairo_dock_deactivate_temporary_auto_hide ();
 
907
                                                                //bChangeIntercepted = TRUE;
 
908
                                                        }
 
909
                                                }
736
910
                                        }
737
 
                                        else
 
911
                                        if (! bChangeIntercepted)
738
912
                                        {
739
913
                                                icon = g_hash_table_lookup (s_hXWindowTable, &Xid);
740
914
                                                if (icon != NULL && icon->fPersonnalScale <= 0)  // pour une icône en cours de supression, on ne fait rien.
749
923
                                                                icon->bIsHidden = bIsHidden;
750
924
                                                                cairo_dock_update_visibility_on_inhibators (icon->cClass, icon->Xid, icon->bIsHidden);
751
925
                                                                
752
 
                                                                if (g_bHideVisibleApplis && pParentDock != NULL)
 
926
                                                                /*if (cairo_dock_quick_hide_is_activated ())
 
927
                                                                {
 
928
                                                                        if (cairo_dock_search_window_on_our_way (g_bAutoHideOnMaximized, g_bAutoHideOnFullScreen) == NULL)
 
929
                                                                                cairo_dock_deactivate_temporary_auto_hide ();
 
930
                                                                }*/
 
931
                                                                #ifdef HAVE_XEXTEND
 
932
                                                                if (g_bShowThumbnail && pParentDock != NULL)
 
933
                                                                {
 
934
                                                                        if (! icon->bIsHidden)
 
935
                                                                        {
 
936
                                                                                if (icon->iBackingPixmap != 0)
 
937
                                                                                        XFreePixmap (s_XDisplay, icon->iBackingPixmap);
 
938
                                                                                if (g_bShowThumbnail)
 
939
                                                                                        icon->iBackingPixmap = XCompositeNameWindowPixmap (s_XDisplay, Xid);
 
940
                                                                                cd_message ("new backing pixmap (bis) : %d", icon->iBackingPixmap);
 
941
                                                                        }
 
942
                                                                        cairo_t *pCairoContext = cairo_dock_create_context_from_window (CAIRO_CONTAINER (pParentDock));
 
943
                                                                        cairo_dock_fill_one_icon_buffer (icon, pCairoContext, 1 + g_fAmplitude, pDock->bHorizontalDock, TRUE, pDock->bDirectionUp);
 
944
                                                                        cairo_destroy (pCairoContext);
 
945
                                                                        icon->fWidth *= pParentDock->fRatio;
 
946
                                                                        icon->fHeight *= pParentDock->fRatio;
 
947
                                                                }
 
948
                                                                #endif
 
949
                                                                if (g_bHideVisibleApplis)
753
950
                                                                {
754
951
                                                                        if (bIsHidden)
755
952
                                                                        {
756
953
                                                                                cd_message (" => se cache");
757
954
                                                                                if (! g_bAppliOnCurrentDesktopOnly || cairo_dock_window_is_on_current_desktop (Xid))
 
955
                                                                                {
758
956
                                                                                        pParentDock = cairo_dock_insert_appli_in_dock (icon, pDock, CAIRO_DOCK_UPDATE_DOCK_SIZE, ! CAIRO_DOCK_ANIMATE_ICON);
 
957
                                                                                        if (pParentDock != NULL)
 
958
                                                                                                _cairo_dock_fill_icon_buffer_with_thumbnail (icon, pParentDock);
 
959
                                                                                }
759
960
                                                                        }
760
961
                                                                        else
761
962
                                                                        {
762
963
                                                                                cd_message (" => re-apparait");
763
 
                                                                                cairo_dock_detach_icon_from_dock (icon, pParentDock, TRUE);
764
 
                                                                                cairo_dock_update_dock_size (pParentDock);
 
964
                                                                                if (pParentDock != NULL)
 
965
                                                                                {
 
966
                                                                                        cairo_dock_detach_icon_from_dock (icon, pParentDock, TRUE);
 
967
                                                                                        cairo_dock_update_dock_size (pParentDock);
 
968
                                                                                }
765
969
                                                                        }
766
970
                                                                        if (pParentDock != NULL)
767
971
                                                                                gtk_widget_queue_draw (pParentDock->pWidget);
768
972
                                                                }
 
973
                                                                else if (g_bShowThumbnail && pParentDock != NULL)
 
974
                                                                {
 
975
                                                                        _cairo_dock_fill_icon_buffer_with_thumbnail (icon, pParentDock);
 
976
                                                                        if (pParentDock->iSidShrinkDown == 0)
 
977
                                                                                cairo_dock_redraw_my_icon (icon, CAIRO_CONTAINER (pParentDock));
 
978
                                                                }
769
979
                                                                else if (g_fVisibleAppliAlpha != 0)
770
980
                                                                {
771
981
                                                                        icon->fAlpha = 1;  // on triche un peu.
772
 
                                                                        if (pParentDock != NULL)
 
982
                                                                        if (pParentDock != NULL && pParentDock->iSidShrinkDown == 0)
773
983
                                                                                cairo_dock_redraw_my_icon (icon, CAIRO_CONTAINER (pParentDock));
774
984
                                                                }
775
985
                                                        }
807
1017
                        icon = g_hash_table_lookup (s_hXWindowTable, &Xid);
808
1018
                        if (icon != NULL)
809
1019
                        {
 
1020
                                #ifdef HAVE_XEXTEND
 
1021
                                if (event.xconfigure.width != icon->windowGeometry.width || event.xconfigure.height != icon->windowGeometry.height)
 
1022
                                {
 
1023
                                        if (icon->iBackingPixmap != 0)
 
1024
                                                XFreePixmap (s_XDisplay, icon->iBackingPixmap);
 
1025
                                        if (g_bShowThumbnail)
 
1026
                                                icon->iBackingPixmap = XCompositeNameWindowPixmap (s_XDisplay, Xid);
 
1027
                                        cd_message ("new backing pixmap : %d", icon->iBackingPixmap);
 
1028
                                }
 
1029
                                #endif
810
1030
                                memcpy (&icon->windowGeometry, &event.xconfigure.x, sizeof (GtkAllocation));
811
1031
                        }
812
1032
                        
814
1034
                        {
815
1035
                                if (icon != NULL && icon->fPersonnalScale <= 0)  // pour une icone en cours de supression, on ne fait rien.
816
1036
                                {
817
 
                                        if (event.xconfigure.x + event.xconfigure.width < 0 || event.xconfigure.x > g_iScreenWidth[CAIRO_DOCK_HORIZONTAL] || event.xconfigure.y + event.xconfigure.height < 0 || event.xconfigure.y > g_iScreenHeight[CAIRO_DOCK_HORIZONTAL])  // en fait il faudrait faire ca modulo le nombre de viewports * la largeur d'un bureau, car avec une fenetre a droite, elle peut revenir sur le bureau par la gauche si elle est tres large...
 
1037
                                        if (event.xconfigure.x + event.xconfigure.width <= 0 || event.xconfigure.x >= g_iScreenWidth[CAIRO_DOCK_HORIZONTAL] || event.xconfigure.y + event.xconfigure.height <= 0 || event.xconfigure.y >= g_iScreenHeight[CAIRO_DOCK_HORIZONTAL])  // en fait il faudrait faire ca modulo le nombre de viewports * la largeur d'un bureau, car avec une fenetre a droite, elle peut revenir sur le bureau par la gauche si elle est tres large...
818
1038
                                        {
819
1039
                                                CairoDock *pParentDock = cairo_dock_search_dock_from_name (icon->cParentDockName);
820
1040
                                                if (pParentDock == NULL)
821
 
                                                        pParentDock = pDock;
 
1041
                                                        pParentDock = pDock;  /// pertinent ?...
822
1042
                                                cairo_dock_detach_icon_from_dock (icon, pParentDock, TRUE);
823
1043
                                                cairo_dock_update_dock_size (pParentDock);
824
1044
                                                gtk_widget_queue_draw (pParentDock->pWidget);
825
1045
                                        }
826
1046
                                        else  // elle est sur le bureau.
827
1047
                                        {
 
1048
                                                cd_message ("cette fenetre s'est deplacee sur le bureau courant (%d;%d)", event.xconfigure.x, event.xconfigure.y);
828
1049
                                                gboolean bInsideDock;
829
1050
                                                if (g_list_find (pDock->icons, icon) == NULL)
830
1051
                                                {
845
1066
                        }
846
1067
                        cairo_dock_notify (CAIRO_DOCK_WINDOW_CONFIGURED, &event.xconfigure);
847
1068
                }
848
 
                //else
849
 
                //      cd_message ("  type : %d; window : %d\n", event.xany.type, Xid);
 
1069
                /*else if (event.type == g_iDamageEvent + XDamageNotify)
 
1070
                {
 
1071
                        XDamageNotifyEvent *e = (XDamageNotifyEvent *) &event;
 
1072
                        g_print ("window %s has been damaged (%d;%d %dx%d)\n", e->drawable, e->area.x, e->area.y, e->area.width, e->area.height);
 
1073
                        // e->drawable is the window ID of the damaged window
 
1074
                        // e->geometry is the geometry of the damaged window    
 
1075
                        // e->area     is the bounding rect for the damaged area        
 
1076
                        // e->damage   is the damage handle returned by XDamageCreate()
 
1077
        
 
1078
                        // Subtract all the damage, repairing the window.
 
1079
                        XDamageSubtract (s_XDisplay, e->damage, None, None);
 
1080
                }
 
1081
                else
 
1082
                        g_print ("  type : %d (%d); window : %d\n", event.type, XDamageNotify, Xid);*/
850
1083
        }
851
1084
        if (XEventsQueued (s_XDisplay, QueuedAlready) != 0)
852
1085
                XSync (s_XDisplay, True);  // True <=> discard.
880
1113
 
881
1114
CairoDock *cairo_dock_insert_appli_in_dock (Icon *icon, CairoDock *pMainDock, gboolean bUpdateSize, gboolean bAnimate)
882
1115
{
 
1116
        cd_message ("%s (%s, %d)", __func__, icon->acName, icon->Xid);
 
1117
        
 
1118
        //\_________________ On gere ses eventuels inhibiteurs.
 
1119
        if (g_bMixLauncherAppli && cairo_dock_prevent_inhibated_class (icon))
 
1120
        {
 
1121
                cd_message (" -> se fait inhiber");
 
1122
                return NULL;
 
1123
        }
 
1124
        
883
1125
        //\_________________ On determine dans quel dock l'inserer.
884
 
        if (g_bMixLauncherAppli && cairo_dock_prevent_inhibated_class (icon))
885
 
                return NULL;
886
 
        
887
1126
        CairoDock *pParentDock = cairo_dock_manage_appli_class (icon, pMainDock);  // renseigne cParentDockName.
888
1127
        g_return_val_if_fail (pParentDock != NULL, NULL);
889
1128
 
890
1129
        //\_________________ On l'insere dans son dock parent en animant ce dernier eventuellement.
891
1130
        cairo_dock_insert_icon_in_dock (icon, pParentDock, bUpdateSize, bAnimate, CAIRO_DOCK_APPLY_RATIO, g_bUseSeparator);
892
 
        cd_message (" insertion de %s complete (%.2f %.2fx%.2f)", icon->acName, icon->fPersonnalScale, icon->fWidth, icon->fHeight);
 
1131
        cd_message (" insertion de %s complete (%.2f %.2fx%.2f) dans %s", icon->acName, icon->fPersonnalScale, icon->fWidth, icon->fHeight, icon->cParentDockName);
893
1132
 
894
1133
        if (bAnimate && cairo_dock_animation_will_be_visible (pParentDock))
895
1134
        {
904
1143
        return pParentDock;
905
1144
}
906
1145
 
907
 
static void _cairo_dock_remove_old_applis (Window *Xid, Icon *icon, double *fTime)
 
1146
static gboolean _cairo_dock_remove_old_applis (Window *Xid, Icon *icon, double *fTime)
908
1147
{
 
1148
        gboolean bToBeRemoved = FALSE;
909
1149
        if (icon != NULL)
910
1150
        {
911
1151
                //g_print ("%s (%s, %f / %f)\n", __func__, icon->acName, icon->fLastCheckTime, *fTime);
912
1152
                if (icon->fLastCheckTime > 0 && icon->fLastCheckTime < *fTime && icon->fPersonnalScale <= 0)
913
1153
                {
914
1154
                        cd_message ("cette fenetre (%ld) est trop vieille", *Xid);
 
1155
                        
 
1156
                        if (cairo_dock_quick_hide_is_activated () && (g_bAutoHideOnFullScreen || g_bAutoHideOnMaximized))
 
1157
                        {
 
1158
                                if (cairo_dock_search_window_on_our_way (g_bAutoHideOnMaximized, g_bAutoHideOnFullScreen) == NULL)
 
1159
                                {
 
1160
                                        cd_message (" => plus aucune fenetre genante");
 
1161
                                        cairo_dock_deactivate_temporary_auto_hide ();
 
1162
                                }
 
1163
                        }
 
1164
                        
915
1165
                        CairoDock *pParentDock = cairo_dock_search_dock_from_name (icon->cParentDockName);
916
1166
                        if (pParentDock != NULL)
917
1167
                        {
918
 
                                if (! pParentDock->bInside && (g_bAutoHide || pParentDock->iRefCount != 0) && pParentDock->bAtBottom)
 
1168
                                if (! pParentDock->bInside && (pParentDock->bAutoHide || pParentDock->iRefCount != 0) && pParentDock->bAtBottom)
919
1169
                                        icon->fPersonnalScale = 0.05;
920
1170
                                else
921
1171
                                        icon->fPersonnalScale = 1.0;
922
1172
                                //g_print ("icon->fPersonnalScale <- %.2f\n", icon->fPersonnalScale);
923
 
 
 
1173
                                
924
1174
                                cairo_dock_start_animation (icon, pParentDock);
925
1175
                        }
926
1176
                        else
927
1177
                        {
928
1178
                                cd_message ("  pas dans un container, on la detruit donc immediatement");
 
1179
                                icon->fLastCheckTime = -1;  // pour ne pas la desenregistrer de la HashTable lors du 'free'.
929
1180
                                cairo_dock_free_icon (icon);
 
1181
                                bToBeRemoved = TRUE;
 
1182
                                /// redessiner les inhibiteurs...
930
1183
                        }
931
1184
                }
932
1185
        }
 
1186
        return bToBeRemoved;
933
1187
}
934
1188
void cairo_dock_update_applis_list (CairoDock *pDock, double fTime)
935
1189
{
970
1224
                                                        cairo_dock_update_dock_size (pParentDock);
971
1225
                                        }
972
1226
                                }
 
1227
                                if ((g_bAutoHideOnMaximized && icon->bIsMaximized) || (g_bAutoHideOnFullScreen && icon->bIsFullScreen))
 
1228
                                {
 
1229
                                        if (! cairo_dock_quick_hide_is_activated ())
 
1230
                                        {
 
1231
                                                int iDesktopNumber = cairo_dock_get_current_desktop ();
 
1232
                                                if (cairo_dock_window_is_on_this_desktop (Xid, iDesktopNumber) && cairo_dock_window_hovers_dock (&icon->windowGeometry, pDock))
 
1233
                                                {
 
1234
                                                        cd_message (" cette nouvelle fenetre empiete sur notre dock");
 
1235
                                                        cairo_dock_activate_temporary_auto_hide ();
 
1236
                                                }
 
1237
                                        }
 
1238
                                }
973
1239
                        }
974
1240
                        else
975
1241
                                cairo_dock_blacklist_appli (Xid);
980
1246
                }
981
1247
        }
982
1248
 
983
 
        g_hash_table_foreach (s_hXWindowTable, (GHFunc) _cairo_dock_remove_old_applis, &fTime);
 
1249
        g_hash_table_foreach_remove (s_hXWindowTable, (GHRFunc) _cairo_dock_remove_old_applis, &fTime);
984
1250
        
985
1251
        if (bUpdateMainDockSize)
986
1252
                cairo_dock_update_dock_size (pDock);
1003
1269
        cairo_t *pCairoContext = cairo_dock_create_context_from_window (CAIRO_CONTAINER (pDock));
1004
1270
        g_return_if_fail (cairo_status (pCairoContext) == CAIRO_STATUS_SUCCESS);
1005
1271
 
 
1272
        int iDesktopNumber = cairo_dock_get_current_desktop ();
 
1273
        
1006
1274
        //\__________________ On cree les icones de toutes ces applis.
1007
1275
        CairoDock *pParentDock;
1008
1276
        gboolean bUpdateMainDockSize = FALSE;
1027
1295
                                                cairo_dock_update_dock_size (pParentDock);
1028
1296
                                }
1029
1297
                        }
 
1298
                        if ((g_bAutoHideOnMaximized && pIcon->bIsMaximized) || (g_bAutoHideOnFullScreen && pIcon->bIsFullScreen))
 
1299
                        {
 
1300
                                if (! cairo_dock_quick_hide_is_activated () && cairo_dock_window_is_on_this_desktop (pIcon->Xid, iDesktopNumber))
 
1301
                                {
 
1302
                                        if (cairo_dock_window_hovers_dock (&pIcon->windowGeometry, pDock))
 
1303
                                        {
 
1304
                                                cd_message (" elle empiete sur notre dock");
 
1305
                                                cairo_dock_activate_temporary_auto_hide ();
 
1306
                                        }
 
1307
                                }
 
1308
                        }
1030
1309
                }
1031
1310
                else
1032
1311
                        cairo_dock_blacklist_appli (Xid);
1039
1318
        
1040
1319
        //\__________________ On lance le gestionnaire d'evenements X.
1041
1320
        s_iSidUpdateAppliList = g_timeout_add (CAIRO_DOCK_TASKBAR_CHECK_INTERVAL, (GSourceFunc) cairo_dock_unstack_Xevents, (gpointer) pDock);  // un g_idle_add () consomme 90% de CPU ! :-/
 
1321
        
 
1322
        if (s_iCurrentActiveWindow == 0)
 
1323
                s_iCurrentActiveWindow = cairo_dock_get_active_xwindow ();
1042
1324
}
1043
1325
 
1044
1326
void cairo_dock_pause_application_manager (void)
1061
1343
        
1062
1344
        cairo_dock_remove_all_applis_from_class_table ();  // enleve aussi les indicateurs.
1063
1345
        
1064
 
        cairo_dock_reset_appli_table ();
 
1346
        cairo_dock_reset_appli_table ();  // libere les icones des applis.
1065
1347
}
1066
1348
 
1067
1349
gboolean cairo_dock_application_manager_is_running (void)
1068
1350
{
1069
1351
        return (s_iSidUpdateAppliList != 0);
1070
1352
}
 
1353
 
 
1354
 
 
1355
GList *cairo_dock_get_current_applis_list (void)
 
1356
{
 
1357
        return g_hash_table_get_values (s_hXWindowTable);
 
1358
}
 
1359
 
 
1360
Window cairo_dock_get_current_active_window (void)
 
1361
{
 
1362
        return s_iCurrentActiveWindow;
 
1363
}
 
1364
 
 
1365
Icon *cairo_dock_get_current_active_icon (void)
 
1366
{
 
1367
        return g_hash_table_lookup (s_hXWindowTable, &s_iCurrentActiveWindow);
 
1368
}
 
1369
 
 
1370
Icon *cairo_dock_get_icon_with_Xid (Window Xid)
 
1371
{
 
1372
        return g_hash_table_lookup (s_hXWindowTable, &Xid);
 
1373
}