~ubuntu-branches/ubuntu/wily/gnome-do/wily

« back to all changes in this revision

Viewing changes to Do.Interface.Linux.Docky/src/Docky.Interface/CursorTracker.cs

  • Committer: Bazaar Package Importer
  • Author(s): Christopher James Halse Rogers
  • Date: 2009-06-27 10:40:45 UTC
  • mfrom: (1.1.8 upstream) (0.1.5 squeeze)
  • Revision ID: james.westby@ubuntu.com-20090627104045-7st10y1cqr6dpz37
Tags: 0.8.2+dfsg-1
* New upstream release
  + No longer uses a plugin repository.  Fixes many plugin-
    related issues. (LP: #343096, LP: #330025, LP #345001)
  + No longer blocks on "About Do" (LP: #361679)
  + Reacts correctly when a Composite manager is enabled/
    disabled at runtime. (LP: #346347, LP: #390150)
  + Fixes for space reserved by Docky blocking drag and 
    drop operations. (LP: #354729, LP: #347052, LP: #382843)
  + Properly sets "Hidden" key on autostart files in response to 
    "Start on login" option.  (Closes: #526023) (LP: #369988)
* debian/patches/10_application_search_path:
  + Drop; included upstream
* debian/patches/10_sk_translation_update:
  + Import sk translation update from Debian BTS.
    (Closes: #531779)
* debian/patches/11_fix_autostart_when_directory_does_not_exist:
  + Patch from upstream.  Fixes the "Start on login" option when the 
    ~/.config/autostart directory does not exist. (LP: #393729)
* debian/control:
  + Update standards version to 3.8.2; no changes required.
  + Add libtool to Build-Depends; required for autoreconf.
  + Add Recommends: on new gnome-do-docklets package.
* debian/gnome-do.1
  + Fix spelling: GNOME-Do => GNOME Do.
  + Miscelaneous lintian fixes; NAME section, escaping minus signs with \-
* debian/copyright:
  + Update for new copyright holders.
  + Minor update to DEP-5 format

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
// CursorTracker.cs
 
2
// 
 
3
// Copyright (C) 2009 GNOME Do
 
4
//
 
5
// This program is free software: you can redistribute it and/or modify
 
6
// it under the terms of the GNU General Public License as published by
 
7
// the Free Software Foundation, either version 3 of the License, or
 
8
// (at your option) any later version.
 
9
//
 
10
// This program is distributed in the hope that it will be useful,
 
11
// but WITHOUT ANY WARRANTY; without even the implied warranty of
 
12
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
13
// GNU General Public License for more details.
 
14
//
 
15
// You should have received a copy of the GNU General Public License
 
16
// along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
17
//
 
18
 
 
19
using System;
 
20
using System.Collections.Generic;
 
21
using System.Linq;
 
22
 
 
23
using Gdk;
 
24
using Gtk;
 
25
 
 
26
namespace Docky.Interface
 
27
{
 
28
        public class CursorUpdatedArgs : EventArgs
 
29
        {
 
30
                public readonly Point OldCursor;
 
31
                public readonly Point NewCursor;
 
32
                
 
33
                public CursorUpdatedArgs (Point newCursor, Point oldCursor)
 
34
                {
 
35
                        NewCursor = newCursor;
 
36
                        OldCursor = oldCursor;
 
37
                }
 
38
        }
 
39
        
 
40
        public class CursorTracker : IDisposable
 
41
        {
 
42
                uint timer;
 
43
                uint timer_length;
 
44
                
 
45
                DateTime last_gtk_update;
 
46
                
 
47
                Gtk.Window parent;
 
48
                
 
49
                public event EventHandler<CursorUpdatedArgs> CursorUpdated;
 
50
                
 
51
                public bool Enabled { get; set; }
 
52
                
 
53
                public Gdk.Point Cursor { get; private set; }
 
54
                public Gdk.Point RootCursor { get; private set; }
 
55
                
 
56
                public ModifierType ModifierType { get; private set; }
 
57
                
 
58
                public Cairo.PointD CursorD { 
 
59
                        get { return new Cairo.PointD (Cursor.X, Cursor.Y); }
 
60
                }
 
61
                
 
62
                public Cairo.PointD RootCursorD {
 
63
                        get { return new Cairo.PointD (RootCursor.X, RootCursor.Y); }
 
64
                }
 
65
                
 
66
                public uint TimerLength {
 
67
                        get { return timer_length; }
 
68
                        set {
 
69
                                if (timer_length == value)
 
70
                                        return;
 
71
                                timer_length = value;
 
72
                                ResetTimer ();
 
73
                        }
 
74
                }
 
75
                
 
76
                public CursorTracker (Gtk.Window parent, uint timerLength)
 
77
                {
 
78
                        Enabled = true;
 
79
                        this.parent = parent;
 
80
                        
 
81
                        parent.MotionNotifyEvent += HandleMotionNotifyEvent; 
 
82
                        parent.AddEvents ((int) EventMask.PointerMotionMask);
 
83
                        
 
84
                        timer_length = timerLength;
 
85
                        timer = GLib.Timeout.Add (timer_length, HandleCursorTimeoutElapsed);
 
86
                }
 
87
                
 
88
                bool HandleCursorTimeoutElapsed ()
 
89
                {
 
90
                        if (!Enabled || (DateTime.UtcNow - last_gtk_update).TotalMilliseconds < timer_length >> 1) {
 
91
                                return true;
 
92
                        }
 
93
                        
 
94
                        int x, y, xroot, yroot;
 
95
                        ModifierType mod;
 
96
                        Gdk.Screen screen;
 
97
                        
 
98
                        parent.Display.GetPointer (out screen, out xroot, out yroot, out mod);
 
99
                        
 
100
                        if (screen == parent.Screen) {
 
101
                                Gdk.Rectangle geo;
 
102
                                if (parent is DockWindow)
 
103
                                        (parent as DockWindow).GetBufferedPosition (out geo.X, out geo.Y);
 
104
                                else
 
105
                                        parent.GetPosition (out geo.X, out geo.Y);
 
106
 
 
107
                                x = xroot - geo.X;
 
108
                                y = yroot - geo.Y;
 
109
                        } else {
 
110
                                xroot = -4000;
 
111
                                yroot = -4000;
 
112
                                x = -4000;
 
113
                                y = -4000;
 
114
                        }
 
115
                        
 
116
                        if (Cursor.X != x || Cursor.Y != y || ModifierType != mod) {
 
117
                                Point last = Cursor;
 
118
                                Cursor = new Point (x, y);
 
119
                                RootCursor = new Point (xroot, yroot);
 
120
                                ModifierType = mod;
 
121
                                
 
122
                                OnCursorUpdated (last);
 
123
                        }
 
124
                        
 
125
                        return true;
 
126
                }
 
127
                
 
128
                void HandleMotionNotifyEvent (object o, MotionNotifyEventArgs args)
 
129
                {
 
130
                        if (!Enabled)
 
131
                                return;
 
132
                        
 
133
                        Point last = Cursor;
 
134
                        last_gtk_update = DateTime.UtcNow;
 
135
                        Cursor = new Point ((int) args.Event.X, (int) args.Event.Y);
 
136
                        RootCursor = new Point ((int) args.Event.XRoot, (int) args.Event.YRoot);
 
137
                        ModifierType = args.Event.State;
 
138
                        
 
139
                        OnCursorUpdated (last);
 
140
                }
 
141
                
 
142
                void OnCursorUpdated (Point lastCursor)
 
143
                {
 
144
                        if (CursorUpdated != null)
 
145
                                CursorUpdated (this, new CursorUpdatedArgs (Cursor, lastCursor));
 
146
                }
 
147
                
 
148
                void ResetTimer ()
 
149
                {
 
150
                        GLib.Source.Remove (timer);
 
151
                        timer = GLib.Timeout.Add (timer_length, HandleCursorTimeoutElapsed);
 
152
                }
 
153
                
 
154
                public void Dispose ()
 
155
                {
 
156
                        GLib.Source.Remove (timer);
 
157
                        parent.MotionNotifyEvent -= HandleMotionNotifyEvent;
 
158
                }
 
159
        }
 
160
}