1 /* GDK - The GIMP Drawing Kit
2  * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library. If not, see <http://www.gnu.org/licenses/>.
16  */
17 
18 /*
19  * Modified by the GTK+ Team and others 1997-2000.  See the AUTHORS
20  * file for a list of people on the GTK+ Team.  See the ChangeLog
21  * files for a list of changes.  These files are distributed with
22  * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
23  */
24 
25 /*
26  * Private uninstalled header defining things local to X windowing code
27  */
28 
29 #ifndef __GDK_PRIVATE_X11_H__
30 #define __GDK_PRIVATE_X11_H__
31 
32 #include "gdkcursor.h"
33 #include "gdkinternals.h"
34 #include "gdkx.h"
35 #include "gdksurface-x11.h"
36 #include "gdkscreen-x11.h"
37 
38 #include <X11/Xlib.h>
39 #include <X11/Xutil.h>
40 #include <X11/extensions/XInput2.h>
41 
42 #include <cairo-xlib.h>
43 
44 typedef enum {
45   GDK_FILTER_CONTINUE,
46   GDK_FILTER_TRANSLATE,
47   GDK_FILTER_REMOVE
48 } GdkFilterReturn;
49 
50 typedef GdkFilterReturn (*GdkFilterFunc) (const XEvent *xevent,
51                                           GdkEvent     *event,
52                                           gpointer      data);
53 
54 
55 void _gdk_x11_error_handler_push (void);
56 void _gdk_x11_error_handler_pop  (void);
57 
58 int           gdk_x11_display_get_window_depth           (GdkX11Display  *display);
59 Visual *      gdk_x11_display_get_window_visual          (GdkX11Display  *display);
60 Colormap      gdk_x11_display_get_window_colormap        (GdkX11Display  *display);
61 
62 void _gdk_x11_display_add_window    (GdkDisplay *display,
63                                      XID        *xid,
64                                      GdkSurface  *window);
65 void _gdk_x11_display_remove_window (GdkDisplay *display,
66                                      XID         xid);
67 
68 int _gdk_x11_display_send_xevent (GdkDisplay *display,
69                                   Window      window,
70                                   gboolean    propagate,
71                                   glong       event_mask,
72                                   XEvent     *event_send);
73 
74 cairo_region_t* _gdk_x11_xwindow_get_shape  (Display *xdisplay,
75                                              Window   window,
76                                              int      scale,
77                                              int      shape_type);
78 
79 void     _gdk_x11_region_get_xrectangles   (const cairo_region_t  *region,
80                                             int                    x_offset,
81                                             int                    y_offset,
82                                             int                    scale,
83                                             XRectangle           **rects,
84                                             int                   *n_rects);
85 
86 gboolean _gdk_x11_moveresize_handle_event   (const XEvent *event);
87 gboolean _gdk_x11_moveresize_configure_done (GdkDisplay *display,
88                                              GdkSurface  *window);
89 
90 void     _gdk_x11_keymap_state_changed   (GdkDisplay      *display,
91                                           const XEvent    *event);
92 void     _gdk_x11_keymap_keys_changed    (GdkDisplay      *display);
93 void     _gdk_x11_keymap_add_virt_mods   (GdkKeymap       *keymap,
94                                           GdkModifierType *modifiers);
95 
96 void _gdk_x11_surfaceing_init    (void);
97 
98 void _gdk_x11_surface_grab_check_unmap   (GdkSurface *window,
99                                           gulong     serial);
100 void _gdk_x11_surface_grab_check_destroy (GdkSurface *window);
101 
102 #ifdef HAVE_XDAMAGE
103 void _gdk_x11_surface_set_frame_still_painting (GdkSurface *surface,
104                                                 gboolean    painting);
105 #endif
106 
107 gboolean _gdk_x11_display_is_root_window (GdkDisplay *display,
108                                           Window      xroot_window);
109 
110 void _gdk_x11_display_update_grab_info        (GdkDisplay *display,
111                                                GdkDevice  *device,
112                                                int         status);
113 void _gdk_x11_display_update_grab_info_ungrab (GdkDisplay *display,
114                                                GdkDevice  *device,
115                                                guint32     time,
116                                                gulong      serial);
117 void _gdk_x11_display_queue_events            (GdkDisplay *display);
118 
119 
120 GdkAppLaunchContext *_gdk_x11_display_get_app_launch_context (GdkDisplay *display);
121 
122 int         _gdk_x11_display_text_property_to_utf8_list (GdkDisplay     *display,
123                                                          const char     *encoding,
124                                                          int             format,
125                                                          const guchar   *text,
126                                                          int             length,
127                                                          char         ***list);
128 char *      gdk_x11_utf8_to_string_target               (const char     *utf8_str,
129                                                          gboolean        return_latin1);
130 
131 void _gdk_x11_device_check_extension_events   (GdkDevice  *device);
132 
133 GdkX11DeviceManagerXI2 *_gdk_x11_device_manager_new (GdkDisplay *display);
134 
135 guchar * _gdk_x11_device_xi2_translate_event_mask (GdkX11DeviceManagerXI2 *device_manager_xi2,
136                                                    GdkEventMask            event_mask,
137                                                    int                    *len);
138 guint    _gdk_x11_device_xi2_translate_state      (XIModifierState *mods_state,
139                                                    XIButtonState   *buttons_state,
140                                                    XIGroupState    *group_state);
141 int      _gdk_x11_device_xi2_get_id               (GdkX11DeviceXI2 *device);
142 void     _gdk_device_xi2_unset_scroll_valuators   (GdkX11DeviceXI2 *device);
143 
144 
145 GdkDevice * _gdk_x11_device_manager_xi2_lookup    (GdkX11DeviceManagerXI2 *device_manager_xi2,
146                                                    int                     device_id);
147 void     _gdk_x11_device_xi2_add_scroll_valuator  (GdkX11DeviceXI2    *device,
148                                                    guint               n_valuator,
149                                                    GdkScrollDirection  direction,
150                                                    double              increment);
151 gboolean  _gdk_x11_device_xi2_get_scroll_delta    (GdkX11DeviceXI2    *device,
152                                                    guint               n_valuator,
153                                                    double              valuator_value,
154                                                    GdkScrollDirection *direction_ret,
155                                                    double             *delta_ret);
156 void     _gdk_device_xi2_reset_scroll_valuators   (GdkX11DeviceXI2    *device);
157 
158 double   gdk_x11_device_xi2_get_last_axis_value (GdkX11DeviceXI2 *device,
159                                                  int              n_axis);
160 
161 void     gdk_x11_device_xi2_store_axes          (GdkX11DeviceXI2 *device,
162                                                  double          *axes,
163                                                  int              n_axes);
164 
165 gboolean   _gdk_x11_display_supports_cursor_alpha   (GdkDisplay    *display);
166 gboolean   _gdk_x11_display_supports_cursor_color   (GdkDisplay    *display);
167 void       _gdk_x11_display_get_default_cursor_size (GdkDisplay *display,
168                                                      guint      *width,
169                                                      guint      *height);
170 void       _gdk_x11_display_get_maximal_cursor_size (GdkDisplay *display,
171                                                      guint      *width,
172                                                      guint      *height);
173 
174 GdkSurface * _gdk_x11_display_create_surface (GdkDisplay     *display,
175                                               GdkSurfaceType  surface_type,
176                                               GdkSurface     *parent,
177                                               int             x,
178                                               int             y,
179                                               int             width,
180                                               int             height);
181 GList *    gdk_x11_display_get_toplevel_windows     (GdkDisplay *display);
182 
183 void _gdk_x11_precache_atoms (GdkDisplay          *display,
184                               const char * const *atom_names,
185                               int                  n_atoms);
186 
187 Atom _gdk_x11_get_xatom_for_display_printf         (GdkDisplay    *display,
188                                                     const char    *format,
189                                                     ...) G_GNUC_PRINTF (2, 3);
190 
191 GdkDrag        *gdk_x11_drag_find                       (GdkDisplay             *display,
192                                                          Window                  source_xid,
193                                                          Window                  dest_xid);
194 void            gdk_x11_drag_handle_status              (GdkDisplay             *display,
195                                                          const XEvent           *xevent);
196 void            gdk_x11_drag_handle_finished            (GdkDisplay             *display,
197                                                          const XEvent           *xevent);
198 void            gdk_x11_drop_read_actions               (GdkDrop                *drop);
199 gboolean        gdk_x11_drop_filter                     (GdkSurface             *surface,
200                                                          const XEvent           *xevent);
201 
202 typedef struct _GdkSurfaceCache GdkSurfaceCache;
203 
204 GdkSurfaceCache *
205 gdk_surface_cache_get (GdkDisplay *display);
206 
207 GdkFilterReturn
208 gdk_surface_cache_filter (const XEvent *xevent,
209                           gpointer      data);
210 GdkFilterReturn
211 gdk_surface_cache_shape_filter (const XEvent *xevent,
212                                 gpointer      data);
213 
214 void _gdk_x11_cursor_display_finalize (GdkDisplay *display);
215 
216 void _gdk_x11_surface_register_dnd (GdkSurface *window);
217 
218 void gdk_x11_surface_update_popups (GdkSurface *surface);
219 
220 void gdk_x11_surface_enter_leave_monitors (GdkSurface *surface);
221 
222 GdkDrag        * _gdk_x11_surface_drag_begin (GdkSurface          *window,
223                                               GdkDevice          *device,
224                                               GdkContentProvider *content,
225                                               GdkDragAction       actions,
226                                               double              dx,
227                                               double              dy);
228 
229 void gdk_x11_surface_get_root_coords (GdkSurface *surface,
230                                       int         x,
231                                       int         y,
232                                       int        *root_x,
233                                       int        *root_y);
234 
235 void gdk_x11_surface_show (GdkSurface *surface,
236                            gboolean    already_mapped);
237 void gdk_x11_surface_raise (GdkSurface *surface);
238 void gdk_x11_surface_set_opacity (GdkSurface *surface,
239                                   double      opacity);
240 gboolean gdk_x11_surface_supports_edge_constraints (GdkSurface *surface);
241 
242 GdkGrabStatus _gdk_x11_convert_grab_status (int status);
243 
244 cairo_surface_t * _gdk_x11_display_create_bitmap_surface (GdkDisplay *display,
245                                                           int         width,
246                                                           int         height);
247 
248 extern const int         _gdk_x11_event_mask_table[];
249 extern const int         _gdk_x11_event_mask_table_size;
250 
251 #define GDK_SCREEN_DISPLAY(screen)    (GDK_X11_SCREEN (screen)->display)
252 #define GDK_SCREEN_XROOTWIN(screen)   (GDK_X11_SCREEN (screen)->xroot_window)
253 #define GDK_DISPLAY_XROOTWIN(display) (GDK_SCREEN_XROOTWIN (GDK_X11_DISPLAY (display)->screen))
254 #define GDK_SURFACE_SCREEN(win)        (GDK_X11_DISPLAY (gdk_surface_get_display (win))->screen)
255 #define GDK_SURFACE_DISPLAY(win)       (gdk_surface_get_display (win))
256 #define GDK_SURFACE_XROOTWIN(win)      (GDK_X11_SCREEN (GDK_SURFACE_SCREEN (win))->xroot_window)
257 
258 /* override some macros from gdkx.h with direct-access variants */
259 #undef GDK_DISPLAY_XDISPLAY
260 #undef GDK_SURFACE_XDISPLAY
261 #undef GDK_SURFACE_XID
262 #undef GDK_SCREEN_XDISPLAY
263 
264 #define GDK_DISPLAY_XDISPLAY(display) (GDK_X11_DISPLAY(display)->xdisplay)
265 #define GDK_SURFACE_XDISPLAY(win)      (GDK_X11_SCREEN (GDK_SURFACE_SCREEN (win))->xdisplay)
266 #define GDK_SURFACE_XID(win)           (GDK_X11_SURFACE (win)->xid)
267 #define GDK_SCREEN_XDISPLAY(screen)   (GDK_X11_SCREEN (screen)->xdisplay)
268 
269 #endif /* __GDK_PRIVATE_X11_H__ */
270