]> Pileus Git - ~andy/gtk/blob - gdk/gdkdisplay.h
Merge the xi2-for-master branch
[~andy/gtk] / gdk / gdkdisplay.h
1 /*
2  * gdkdisplay.h
3  * 
4  * Copyright 2001 Sun Microsystems Inc. 
5  *
6  * Erwann Chenede <erwann.chenede@sun.com>
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Library General Public
10  * License as published by the Free Software Foundation; either
11  * version 2 of the License, or (at your option) any later version.
12  *
13  * This library is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * Library General Public License for more details.
17  *
18  * You should have received a copy of the GNU Library General Public
19  * License along with this library; if not, write to the
20  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
21  * Boston, MA 02111-1307, USA.
22  */
23
24 #if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
25 #error "Only <gdk/gdk.h> can be included directly."
26 #endif
27
28 #ifndef __GDK_DISPLAY_H__
29 #define __GDK_DISPLAY_H__
30
31 #include <gdk/gdktypes.h>
32 #include <gdk/gdkevents.h>
33 #include <gdk/gdkdevicemanager.h>
34
35 G_BEGIN_DECLS
36
37 typedef struct _GdkDisplayClass GdkDisplayClass;
38 typedef struct _GdkDisplayPointerHooks GdkDisplayPointerHooks;
39 typedef struct _GdkDisplayDeviceHooks GdkDisplayDeviceHooks;
40
41 #define GDK_TYPE_DISPLAY              (gdk_display_get_type ())
42 #define GDK_DISPLAY_OBJECT(object)    (G_TYPE_CHECK_INSTANCE_CAST ((object), GDK_TYPE_DISPLAY, GdkDisplay))
43 #define GDK_DISPLAY_CLASS(klass)      (G_TYPE_CHECK_CLASS_CAST ((klass), GDK_TYPE_DISPLAY, GdkDisplayClass))
44 #define GDK_IS_DISPLAY(object)        (G_TYPE_CHECK_INSTANCE_TYPE ((object), GDK_TYPE_DISPLAY))
45 #define GDK_IS_DISPLAY_CLASS(klass)   (G_TYPE_CHECK_CLASS_TYPE ((klass), GDK_TYPE_DISPLAY))
46 #define GDK_DISPLAY_GET_CLASS(obj)    (G_TYPE_INSTANCE_GET_CLASS ((obj), GDK_TYPE_DISPLAY, GdkDisplayClass))
47
48 /* Tracks information about the keyboard grab on this display */
49 typedef struct
50 {
51   GdkWindow *window;
52   GdkWindow *native_window;
53   gulong serial;
54   gboolean owner_events;
55   guint32 time;
56 } GdkKeyboardGrabInfo;
57
58 /* Tracks information about which window and position the pointer last was in.
59  * This is useful when we need to synthesize events later.
60  * Note that we track toplevel_under_pointer using enter/leave events,
61  * so in the case of a grab, either with owner_events==FALSE or with the
62  * pointer in no clients window the x/y coordinates may actually be outside
63  * the window.
64  */
65 typedef struct
66 {
67   GdkWindow *toplevel_under_pointer; /* The toplevel window with mouse inside, tracked via native events */
68   GdkWindow *window_under_pointer; /* The window that last got sent a normal enter event */
69   gdouble toplevel_x, toplevel_y; 
70   guint32 state;
71   guint32 button;
72 } GdkPointerWindowInfo;
73
74 typedef struct
75 {
76   guint32 button_click_time[2]; /* The last 2 button click times. */
77   GdkWindow *button_window[2];  /* The last 2 windows to receive button presses. */
78   gint button_number[2];        /* The last 2 buttons to be pressed. */
79   gint button_x[2];             /* The last 2 button click positions. */
80   gint button_y[2];
81 } GdkMultipleClickInfo;
82
83 struct _GdkDisplay
84 {
85   GObject parent_instance;
86
87   /*< private >*/
88   GList *GSEAL (queued_events);
89   GList *GSEAL (queued_tail);
90
91   /* Information for determining if the latest button click
92    * is part of a double-click or triple-click
93    */
94   GHashTable *GSEAL (multiple_click_info);
95
96   guint GSEAL (double_click_time);      /* Maximum time between clicks in msecs */
97   GdkDevice *GSEAL (core_pointer);      /* Core pointer device */
98
99   const GdkDisplayDeviceHooks *GSEAL (device_hooks); /* Current hooks for querying pointer */
100   
101   guint GSEAL (closed) : 1;             /* Whether this display has been closed */
102   guint GSEAL (ignore_core_events) : 1; /* Don't send core motion and button event */
103
104   guint GSEAL (double_click_distance);  /* Maximum distance between clicks in pixels */
105
106   GHashTable *GSEAL (device_grabs);
107   GHashTable *GSEAL (motion_hint_info);
108
109   /* Hashtable containing a GdkPointerWindowInfo for each device */
110   GHashTable *GSEAL (pointers_info);
111
112   /* Last reported event time from server */
113   guint32 GSEAL (last_event_time);
114
115   /* Device manager associated to the display */
116   GdkDeviceManager *GSEAL (device_manager);
117 };
118
119 struct _GdkDisplayClass
120 {
121   GObjectClass parent_class;
122   
123   G_CONST_RETURN gchar *     (*get_display_name)   (GdkDisplay *display);
124   gint                       (*get_n_screens)      (GdkDisplay *display);
125   GdkScreen *                (*get_screen)         (GdkDisplay *display,
126                                                     gint        screen_num);
127   GdkScreen *                (*get_default_screen) (GdkDisplay *display);
128
129   
130   /* Signals */
131   void (*closed) (GdkDisplay *display,
132                   gboolean    is_error);
133 };
134
135 struct _GdkDisplayPointerHooks
136 {
137   void (*get_pointer)              (GdkDisplay      *display,
138                                     GdkScreen      **screen,
139                                     gint            *x,
140                                     gint            *y,
141                                     GdkModifierType *mask);
142   GdkWindow* (*window_get_pointer) (GdkDisplay      *display,
143                                     GdkWindow       *window,
144                                     gint            *x,
145                                     gint            *y,
146                                     GdkModifierType *mask);
147   GdkWindow* (*window_at_pointer)  (GdkDisplay      *display,
148                                     gint            *win_x,
149                                     gint            *win_y);
150 };
151
152 /**
153  * GdkDisplayDeviceHooks:
154  * @get_device_state: Obtains the current position and modifier state for
155  * @device. The position is given in coordinates relative to the window
156  * containing the pointer, which is returned in @window.
157  * @window_get_device_position: Obtains the window underneath the device
158  * position. Current device position and modifier state are returned in
159  * @x, @y and @mask. The position is given in coordinates relative to
160  * @window.
161  * @window_at_device_position: Obtains the window underneath the device
162  * position, returning the location of that window in @win_x, @win_y.
163  * Returns %NULL if the window under the mouse pointer is not known to
164  * GDK (for example, belongs to another application).
165  *
166  * A table of pointers to functions for getting quantities related to
167  * the current device position. Each #GdkDisplay has a table of this type,
168  * which can be set using gdk_display_set_device_hooks().
169  */
170 struct _GdkDisplayDeviceHooks
171 {
172   void (* get_device_state)                  (GdkDisplay       *display,
173                                               GdkDevice        *device,
174                                               GdkScreen       **screen,
175                                               gint             *x,
176                                               gint             *y,
177                                               GdkModifierType  *mask);
178   GdkWindow * (* window_get_device_position) (GdkDisplay      *display,
179                                               GdkDevice       *device,
180                                               GdkWindow       *window,
181                                               gint            *x,
182                                               gint            *y,
183                                               GdkModifierType *mask);
184   GdkWindow * (* window_at_device_position)  (GdkDisplay *display,
185                                               GdkDevice  *device,
186                                               gint       *win_x,
187                                               gint       *win_y);
188 };
189
190 GType       gdk_display_get_type (void) G_GNUC_CONST;
191 GdkDisplay *gdk_display_open                (const gchar *display_name);
192
193 G_CONST_RETURN gchar * gdk_display_get_name (GdkDisplay *display);
194
195 gint        gdk_display_get_n_screens      (GdkDisplay  *display);
196 GdkScreen * gdk_display_get_screen         (GdkDisplay  *display,
197                                             gint         screen_num);
198 GdkScreen * gdk_display_get_default_screen (GdkDisplay  *display);
199
200 #ifndef GDK_MULTIDEVICE_SAFE
201 void        gdk_display_pointer_ungrab     (GdkDisplay  *display,
202                                             guint32      time_);
203 void        gdk_display_keyboard_ungrab    (GdkDisplay  *display,
204                                             guint32      time_);
205 gboolean    gdk_display_pointer_is_grabbed (GdkDisplay  *display);
206 #endif /* GDK_MULTIDEVICE_SAFE */
207
208 gboolean    gdk_display_device_is_grabbed  (GdkDisplay  *display,
209                                             GdkDevice   *device);
210 void        gdk_display_beep               (GdkDisplay  *display);
211 void        gdk_display_sync               (GdkDisplay  *display);
212 void        gdk_display_flush              (GdkDisplay  *display);
213
214 void        gdk_display_close              (GdkDisplay  *display);
215
216 #ifndef GDK_DISABLE_DEPRECATED
217 GList *     gdk_display_list_devices       (GdkDisplay  *display);
218 #endif /* GDK_DISABLE_DEPRECATED */
219
220 GdkEvent* gdk_display_get_event  (GdkDisplay     *display);
221 GdkEvent* gdk_display_peek_event (GdkDisplay     *display);
222 void      gdk_display_put_event  (GdkDisplay     *display,
223                                   const GdkEvent *event);
224
225 void gdk_display_add_client_message_filter (GdkDisplay   *display,
226                                             GdkAtom       message_type,
227                                             GdkFilterFunc func,
228                                             gpointer      data);
229
230 void gdk_display_set_double_click_time     (GdkDisplay   *display,
231                                             guint         msec);
232 void gdk_display_set_double_click_distance (GdkDisplay   *display,
233                                             guint         distance);
234
235 GdkDisplay *gdk_display_get_default (void);
236
237 #ifndef GDK_MULTIDEVICE_SAFE
238
239 #ifndef GDK_DISABLE_DEPRECATED
240 GdkDevice  *gdk_display_get_core_pointer (GdkDisplay *display);
241 #endif /* GDK_DISABLE_DEPRECATED */
242
243 void             gdk_display_get_pointer           (GdkDisplay             *display,
244                                                     GdkScreen             **screen,
245                                                     gint                   *x,
246                                                     gint                   *y,
247                                                     GdkModifierType        *mask);
248 GdkWindow *      gdk_display_get_window_at_pointer (GdkDisplay             *display,
249                                                     gint                   *win_x,
250                                                     gint                   *win_y);
251 void             gdk_display_warp_pointer          (GdkDisplay             *display,
252                                                     GdkScreen              *screen,
253                                                     gint                   x,
254                                                     gint                   y);
255 #endif /* GDK_MULTIDEVICE_SAFE */
256
257 void             gdk_display_get_device_state              (GdkDisplay            *display,
258                                                             GdkDevice             *device,
259                                                             GdkScreen            **screen,
260                                                             gint                  *x,
261                                                             gint                  *y,
262                                                             GdkModifierType       *mask);
263 GdkWindow *      gdk_display_get_window_at_device_position (GdkDisplay            *display,
264                                                             GdkDevice             *device,
265                                                             gint                  *win_x,
266                                                             gint                  *win_y);
267 void             gdk_display_warp_device                   (GdkDisplay            *display,
268                                                             GdkDevice             *device,
269                                                             GdkScreen             *screen,
270                                                             gint                   x,
271                                                             gint                   y);
272
273 #ifndef GDK_MULTIDEVICE_SAFE
274 GdkDisplayPointerHooks *gdk_display_set_pointer_hooks (GdkDisplay                   *display,
275                                                        const GdkDisplayPointerHooks *new_hooks);
276 #endif /* GDK_MULTIDEVICE_SAFE */
277
278 GdkDisplayDeviceHooks *gdk_display_set_device_hooks (GdkDisplay                  *display,
279                                                      const GdkDisplayDeviceHooks *new_hooks);
280
281 GdkDisplay *gdk_display_open_default_libgtk_only (void);
282
283 gboolean gdk_display_supports_cursor_alpha     (GdkDisplay    *display);
284 gboolean gdk_display_supports_cursor_color     (GdkDisplay    *display);
285 guint    gdk_display_get_default_cursor_size   (GdkDisplay    *display);
286 void     gdk_display_get_maximal_cursor_size   (GdkDisplay    *display,
287                                                 guint         *width,
288                                                 guint         *height);
289
290 GdkWindow *gdk_display_get_default_group       (GdkDisplay *display); 
291
292 gboolean gdk_display_supports_selection_notification (GdkDisplay *display);
293 gboolean gdk_display_request_selection_notification  (GdkDisplay *display,
294                                                       GdkAtom     selection);
295
296 gboolean gdk_display_supports_clipboard_persistence (GdkDisplay    *display);
297 void     gdk_display_store_clipboard                (GdkDisplay    *display,
298                                                      GdkWindow     *clipboard_window,
299                                                      guint32        time_,
300                                                      const GdkAtom *targets,
301                                                      gint           n_targets);
302
303 gboolean gdk_display_supports_shapes           (GdkDisplay    *display);
304 gboolean gdk_display_supports_input_shapes     (GdkDisplay    *display);
305 gboolean gdk_display_supports_composite        (GdkDisplay    *display);
306
307 GdkDeviceManager * gdk_display_get_device_manager (GdkDisplay *display);
308
309
310 G_END_DECLS
311
312 #endif  /* __GDK_DISPLAY_H__ */