1 /*******************************************************************************
2  * Copyright (c) 2000, 2018 IBM Corporation and others. All rights reserved.
3  * The contents of this file are made available under the terms
4  * of the GNU Lesser General Public License (LGPL) Version 2.1 that
5  * accompanies this distribution (lgpl-v21.txt).  The LGPL is also
6  * available at http://www.gnu.org/licenses/lgpl.html.  If the version
7  * of the LGPL at http://www.gnu.org is different to the version of
8  * the LGPL accompanying this distribution and there is any conflict
9  * between the two license versions, the terms of the LGPL accompanying
10  * this distribution shall govern.
11  *
12  * Contributors:
13  *     IBM Corporation - initial API and implementation
14  *******************************************************************************/
15 
16 #ifndef INC_os_H
17 #define INC_os_H
18 
19 #define NDEBUG
20 
21 #define G_DISABLE_DEPRECATED
22 #define GTK_DISABLE_SINGLE_INCLUDES
23 /*
24 #define GTK_DISABLE_DEPRECATED
25 #define GDK_DISABLE_DEPRECATED
26 #define GSEAL_ENABLE
27 */
28 
29 #include <stdlib.h>
30 #include <gtk/gtk.h>
31 #include <gdk/gdk.h>
32 #include <pango/pango.h>
33 #include <pango/pango-font.h>
34 #include <string.h>
35 #include <locale.h>
36 #include <unistd.h>
37 
38 #ifndef _WIN32
39 #include <dlfcn.h>
40 #include <gtk/gtkunixprint.h>
41 #else
42 #include <windows.h>
43 //#define NO_realpath // TODO [win32] use GetFullPathName instead;
44 
45 #define NO_gtk_1enumerate_1printers
46 #define NO_gtk_1printer_1get_1name
47 #define NO_gtk_1printer_1is_1default
48 #define NO_gtk_1print_1job_1get_1surface
49 #define NO_gtk_1print_1unix_1dialog_1get_1current_1page
50 #define NO_gtk_1print_1unix_1dialog_1get_1selected_1printer
51 #define NO_gtk_1print_1unix_1dialog_1get_1settings
52 #define NO_gtk_1print_1unix_1dialog_1set_1settings
53 #define NO_gtk_1print_1unix_1dialog_1get_1page_1setup
54 #define NO_gtk_1print_1unix_1dialog_1set_1page_1setup
55 #define NO_gtk_1printer_1get_1backend
56 #define NO_gtk_1print_1unix_1dialog_1new
57 #define NO_gtk_1print_1job_1new
58 #define NO_gtk_1print_1job_1send
59 #define NO_gtk_1print_1unix_1dialog_1set_1current_1page
60 #define NO_gtk_1print_1unix_1dialog_1set_1embed_1page_1setup
61 #define NO_gtk_1print_1unix_1dialog_1set_1manual_1capabilities
62 
63 // map realpath to a similar function in win32
64 #define realpath(N,R) _fullpath((R),(N),_MAX_PATH)
65 #endif
66 
67 
68 #define OS_LOAD_FUNCTION LOAD_FUNCTION
69 
70 // Hard-link code generated from GTK.java to LIB_GTK
71 #define GTK_LOAD_FUNCTION(var, name) LOAD_FUNCTION_LIB(var, LIB_GTK, name)
72 // Hard-link code generated from GDK.java to LIB_GDK
73 #define GDK_LOAD_FUNCTION(var, name) LOAD_FUNCTION_LIB(var, LIB_GDK, name)
74 
75 #ifdef _WIN32
76 #define LOAD_FUNCTION_LIB(var, libname, name) \
77 		static int initialized = 0; \
78 		static FARPROC var = NULL; \
79 		if (!initialized) { \
80 			HMODULE hm = LoadLibrary(libname); \
81 			if (hm) var = GetProcAddress(hm, #name); \
82 			initialized = 1; \
83 		}
84 #else
85 #define LOAD_FUNCTION_LIB(var, libname, name) \
86 		static int initialized = 0; \
87 		static void *var = NULL; \
88 		if (!initialized) { \
89 			void* handle = dlopen(libname, LOAD_FLAGS); \
90 			if (handle) var = dlsym(handle, #name); \
91 			initialized = 1; \
92 	                CHECK_DLERROR \
93 		}
94 #endif
95 
96 
97 #if defined(GDK_WINDOWING_X11)
98 #if !GTK_CHECK_VERSION(3,96,0)
99 #include <gtk/gtkx.h>
100 #define NO_gdk_1x11_1surface_1get_1xid
101 #define NO_gdk_1x11_1surface_1lookup_1for_1display
102 #else
103 #define NO_gdk_1x11_1get_1default_1xdisplay
104 #define NO_gdk_1x11_1window_1get_1xid
105 #define NO_gdk_1x11_1window_1lookup_1for_1display
106 #define NO_GTK_1IS_1PLUG
107 #define NO_gtk_1plug_1new
108 #define NO_gtk_1socket_1get_1id
109 #define NO_gtk_1socket_1new
110 #endif
111 #if !GTK_CHECK_VERSION(3,96,0)
112 #include <gdk/gdkx.h>
113 #else
114 #include <gdk/x11/gdkx.h>
115 #endif
116 #else
117 
118 #define NO_GDK_1IS_1X11_1DISPLAY
119 
120 /* X Structures */
121 #define NO_XExposeEvent
122 #define NO_XEvent
123 #define NO_XFocusChangeEvent
124 #define NO_X_1EVENT_1TYPE
125 #define NO_X_1EVENT_1WINDOW
126 
127 /* X functions */
128 #define NO_XCheckIfEvent
129 #define NO_XDefaultScreen
130 #define NO_XDefaultRootWindow
131 #define NO_XFree
132 #define NO_XGetWindowProperty
133 #define NO_XQueryPointer
134 #define NO_XKeysymToKeycode
135 #define NO_XSendEvent
136 #define NO_XSetInputFocus
137 #define NO_XSetErrorHandler
138 #define NO_XSetIOErrorHandler
139 #define NO_XSetTransientForHint
140 #define NO_XSynchronize
141 #define NO_XWarpPointer
142 #define NO_GDK_1PIXMAP_1XID
143 #define NO_gdk_1x11_1display_1error_1trap_1pop_1ignored
144 #define NO_gdk_1x11_1display_1error_1trap_1push
145 #define NO_gdk_1x11_1display_1get_1xdisplay
146 #define NO_gdk_1x11_1display_1utf8_1to_1compound_1text
147 #define NO_gdk_1x11_1drawable_1get_1xdisplay
148 #define NO_gdk_1x11_1drawable_1get_1xid
149 #define NO_gdk_1x11_1get_1default_1xdisplay
150 #define NO_gdk_1x11_1screen_1get_1window_1manager_1name
151 #define NO_gdk_1x11_1screen_1lookup_1visual
152 #define NO_gdk_1x11_1visual_1get_1xvisual
153 #define NO_gdk_1x11_1window_1get_1xid
154 #define NO_gdk_1x11_1window_1lookup_1for_1display
155 #define NO_gdk_window_lookup
156 #define NO_gdk_window_add_filter
157 #define NO_GTK_1IS_1PLUG
158 #define NO_gtk_1plug_1new
159 #define NO_gtk_1socket_1get_1id
160 #define NO_gtk_1socket_1new
161 #define NO_memmove__JLorg_eclipse_swt_internal_gtk_XExposeEvent_2J
162 #define NO_memmove__ILorg_eclipse_swt_internal_gtk_XExposeEvent_2I
163 #define NO_memmove__ILorg_eclipse_swt_internal_gtk_XFocusChangeEvent_2I
164 #define NO_memmove__Lorg_eclipse_swt_internal_gtk_XExposeEvent_2JJ
165 #define NO_memmove__Lorg_eclipse_swt_internal_gtk_XExposeEvent_2II
166 #define NO_memmove__Lorg_eclipse_swt_internal_gtk_XFocusChangeEvent_2JJ
167 #define NO_memmove__Lorg_eclipse_swt_internal_gtk_XFocusChangeEvent_2II
168 
169 #endif
170 
171 #if GTK_CHECK_VERSION(3,96,0)
172 #define GTK4 1
173 
174 // Structs which do not exist on GTK4
175 #define NO_GtkTargetEntry
176 #define NO_GdkEventWindowState
177 #define NO_GdkWindowAttr
178 #define NO_GdkEvent
179 #define NO_GdkEventButton
180 #define NO_GdkEventCrossing
181 #define NO_GdkEventFocus
182 #define NO_GdkEventKey
183 #define NO_GdkEventMotion
184 #define NO_GdkEventScroll
185 
186 // Memmoves for those structs which were removed in GTK4
187 #define NO_memmove__ILorg_eclipse_swt_internal_gtk_GtkTargetEntry_2I
188 #define NO_memmove__JLorg_eclipse_swt_internal_gtk_GtkTargetEntry_2J
189 #define NO_memmove__LLorg_eclipse_swt_internal_gtk_GtkTargetEntry_2II
190 #define NO_memmove__LLorg_eclipse_swt_internal_gtk_GtkTargetEntry_2JJ
191 #define NO_memmove__Iorg_eclipse_swt_internal_gtk_GdkEvent_2I
192 #define NO_memmove__Jorg_eclipse_swt_internal_gtk_GdkEvent_2J
193 #define NO_memmove__ILorg_eclipse_swt_internal_gtk_GdkEventButton_2I
194 #define NO_memmove__JLorg_eclipse_swt_internal_gtk_GdkEventButton_2J
195 #define NO_memmove__Lorg_eclipse_swt_internal_gtk_GdkEventButton_2II
196 #define NO_memmove__Lorg_eclipse_swt_internal_gtk_GdkEventButton_2JJ
197 #define NO_memmove__Iorg_eclipse_swt_internal_gtk_GdkEventCrossing_2I
198 #define NO_memmove__Jorg_eclipse_swt_internal_gtk_GdkEventCrossing_2J
199 #define NO_memmove__Lorg_eclipse_swt_internal_gtk_GdkEventCrossing_2II
200 #define NO_memmove__Lorg_eclipse_swt_internal_gtk_GdkEventCrossing_2JJ
201 #define NO_memmove__Iorg_eclipse_swt_internal_gtk_GdkEventFocus_2I
202 #define NO_memmove__Jorg_eclipse_swt_internal_gtk_GdkEventFocus_2J
203 #define NO_memmove__Lorg_eclipse_swt_internal_gtk_GdkEventFocus_2II
204 #define NO_memmove__Lorg_eclipse_swt_internal_gtk_GdkEventFocus_2JJ
205 #define NO_memmove__ILorg_eclipse_swt_internal_gtk_GdkEventKey_2I
206 #define NO_memmove__JLorg_eclipse_swt_internal_gtk_GdkEventKey_2J
207 #define NO_memmove__Lorg_eclipse_swt_internal_gtk_GdkEventKey_2II
208 #define NO_memmove__Lorg_eclipse_swt_internal_gtk_GdkEventKey_2JJ
209 #define NO_memmove__Lorg_eclipse_swt_internal_gtk_GdkEventMotion_2II
210 #define NO_memmove__Lorg_eclipse_swt_internal_gtk_GdkEventMotion_2JJ
211 #define NO_memmove__Iorg_eclipse_swt_internal_gtk_GdkEventWindowState_2I
212 #define NO_memmove__Jorg_eclipse_swt_internal_gtk_GdkEventWindowState_2J
213 #define NO_memmove__Lorg_eclipse_swt_internal_gtk_GdkEventWindowState_2II
214 #define NO_memmove__Lorg_eclipse_swt_internal_gtk_GdkEventWindowState_2JJ
215 
216 // No GtkClipboard on GTK4
217 #define NO_gtk_1clipboard_1clear
218 #define NO_gtk_1clipboard_1get
219 #define NO_gtk_1clipboard_1set_1can_1store
220 #define NO_gtk_1clipboard_1set_1with_1owner
221 #define NO_gtk_1clipboard_1store
222 #define NO_gtk_1clipboard_1wait_1for_1contents
223 
224 // No GtkStatusIcon on GTK4
225 #define NO_gtk_1status_1icon_1get_1geometry
226 #define NO_gtk_1status_1icon_1get_1visible
227 #define NO_gtk_1status_1icon_1new
228 #define NO_gtk_1status_1icon_1position_1menu_1func
229 #define NO_gtk_1status_1icon_1set_1from_1pixbuf
230 #define NO_gtk_1status_1icon_1set_1tooltip_1text
231 #define NO_gtk_1status_1icon_1set_1visible
232 
233 // No GtkTargetList on GTK4
234 #define NO_gtk_1target_1list_1new
235 #define NO_gtk_1target_1list_1unref
236 
237 // No GdkScreen on GTK4, including parameter casts
238 #define NO_gtk_1widget_1get_1screen
239 #define NO_gtk_1style_1context_1add_1provider_1for_1screen
240 #define NO_gdk_1device_1warp__IIII
241 #define NO_gdk_1device_1warp__JJII
242 #define NO_gdk_1screen_1get_1default
243 #define NO_gdk_1screen_1get_1monitor_1at_1point
244 #define NO_gdk_1screen_1get_1monitor_1at_1window
245 #define NO_gdk_1screen_1get_1monitor_1geometry
246 #define NO_gdk_1screen_1get_1monitor_1scale_1factor
247 #define NO_gdk_1screen_1get_1monitor_1workarea
248 #define NO_gdk_1screen_1get_1n_1monitors
249 #define NO_gdk_1screen_1get_1primary_1monitor
250 #define NO_gdk_1screen_1get_1resolution
251 #define NO_gdk_1screen_1get_1system_1visual
252 #define NO_gdk_1screen_1get_1window_1stack
253 #define NO_gdk_1screen_1is_1composited
254 
255 // Miscellaneous functions removed from GTK4
256 #define NO_gtk_1misc_1set_1alignment
257 #define NO_gdk_1test_1simulate_1button
258 #define NO_gdk_1test_1simulate_1key
259 #define NO_gdk_1atom_1name
260 #define NO_gdk_1cairo_1create
261 #define NO_gdk_1threads_1leave
262 #define NO_gdk_1selection_1owner_1set
263 #define NO_gdk_1selection_1owner_1get
264 #define NO_gdk_1visual_1get_1depth
265 #define NO_gtk_1widget_1style_1get__I_3B_3II
266 #define NO_gtk_1widget_1style_1get__J_3B_3IJ
267 #define NO_gtk_1widget_1style_1get__I_3B_3JI
268 #define NO_gtk_1widget_1style_1get__J_3B_3JJ
269 #define NO_gtk_1css_1provider_1load_1from_1data__I_3BI_3I
270 #define NO_gtk_1css_1provider_1load_1from_1data__J_3BJ_3J
271 #define NO_gdk_1pixbuf_1get_1from_1window
272 
273 // Some GtkContainer functions don't exist on GTK4
274 #define NO_gtk_1container_1propagate_1draw
275 #define NO_gtk_1container_1set_1border_1width
276 #define NO_gtk_1container_1get_1border_1width
277 
278 /**
279  * Some gtk_drag_* functions exist on both versions,
280  * but with different signatures. Define them in both GTK4
281  * and GTK3.
282  */
283 #define NO_gtk_1drag_1begin_1with_1coordinates__IIIIIII
284 #define NO_gtk_1drag_1begin_1with_1coordinates__JJIIJII
285 #define NO_gtk_1drag_1get_1data__IIII
286 #define NO_gtk_1drag_1get_1data__JJJI
287 
288 // Some gtk_drag_* functions were removed in GTK4
289 #define NO_gtk_1drag_1begin
290 #define NO_gtk_1drag_1dest_1set
291 #define NO_gtk_1drag_1dest_1find_1target
292 #define NO_gtk_1drag_1finish
293 #define NO_gtk_1drag_1set_1icon_1surface
294 
295 // Some sizing functions are not available on GTK4
296 #define NO_gtk_1window_1set_1geometry_1hints
297 
298 // No GdkWindow on GTK4, this includes parameter casting
299 #define NO_gtk_1widget_1set_1has_1window
300 #define NO_gtk_1widget_1get_1has_1window
301 #define NO_gtk_1im_1context_1set_1client_1window
302 #define NO_gtk_1widget_1set_1parent_1window
303 #define NO_gdk_1cairo_1set_1source_1window
304 #define NO_gdk_1device_1grab
305 #define NO_gdk_1display_1get_1monitor_1at_1window
306 #define NO_gdk_1get_1default_1root_1window
307 #define NO_gdk_1property_1get
308 #define NO_gdk_1window_1begin_1draw_1frame
309 #define NO_gdk_1window_1create_1similar_1surface
310 #define NO_gdk_1window_1destroy
311 #define NO_gdk_1window_1end_1draw_1frame
312 #define NO_gdk_1window_1focus
313 #define NO_gdk_1window_1get_1children
314 #define NO_gdk_1window_1get_1device_1position
315 #define NO_gdk_1window_1get_1display
316 #define NO_gdk_1window_1set_1events
317 #define NO_gdk_1window_1get_1events
318 #define NO_gdk_1window_1get_1frame_1extents
319 #define NO_gdk_1window_1get_1height
320 #define NO_gdk_1window_1get_1width
321 #define NO_gdk_1window_1get_1origin
322 #define NO_gdk_1window_1get_1parent
323 #define NO_gdk_1window_1get_1root_1origin
324 #define NO_gdk_1window_1get_1state
325 #define NO_gdk_1window_1get_1user_1data
326 #define NO_gdk_1window_1get_1visible_1region
327 #define NO_gdk_1window_1show
328 #define NO_gdk_1window_1hide
329 #define NO_gdk_1window_1invalidate_1rect
330 #define NO_gdk_1window_1invalidate_1region
331 #define NO_gdk_1window_1raise
332 #define NO_gdk_1window_1lower
333 #define NO_gdk_1window_1move
334 #define NO_gdk_1window_1move_1resize
335 #define NO_gdk_1window_1new
336 #define NO_gdk_1window_1process_1updates
337 #define NO_gdk_1window_1resize
338 #define NO_gdk_1window_1restack
339 #define NO_gdk_1window_1set_1cursor
340 #define NO_gdk_1window_1set_1decorations
341 #define NO_gdk_1window_1set_1functions
342 #define NO_gdk_1window_1set_1override_1redirect
343 #define NO_gdk_1window_1set_1user_1data
344 #define NO_gdk_1window_1show_1unraised
345 #define NO_gdk_1device_1get_1window_1at_1position
346 #define NO_gdk_1window_1set_1background_1pattern
347 #define NO_gdk_1event_1get_1window
348 
349 // GdkDragContext removals
350 #define NO_gdk_1drag_1context_1get_1dest_1window
351 #define NO_gdk_1drag_1context_1list_1targets
352 #define NO_gdk_1drag_1status
353 
354 // Some widgets have removed access to their GdkWindows in GTK4
355 #define NO_gtk_1text_1view_1get_1window
356 #define NO_gtk_1tree_1view_1get_1bin_1window
357 
358 // Event related functions removed in GTK4
359 #define NO_gdk_1event_1free
360 #define NO_gdk_1event_1get
361 #define NO_gdk_1event_1peek
362 #define NO_gdk_1event_1put
363 #define NO_GDK_1EVENT_1TYPE
364 #define NO_GDK_1EVENT_1WINDOW
365 
366 // GdkCursor removals
367 #define NO_gdk_1cursor_1new_1for_1display
368 #define NO_gdk_1cursor_1new_1from_1pixbuf
369 #define NO_gdk_1display_1supports_1cursor_1color
370 #define NO_gdk_1cursor_1new_1from_1name__JLjava_lang_String_2
371 
372 #else
373 
374 /**
375  * Some gtk_drag_* functions exist on both versions,
376  * but with different signatures. Define them in both GTK4
377  * and GTK3.
378  */
379 #define NO_gtk_1drag_1begin_1with_1coordinates__IIIIII
380 #define NO_gtk_1drag_1begin_1with_1coordinates__JJJIII
381 #define NO_gtk_1drag_1get_1data__III
382 #define NO_gtk_1drag_1get_1data__JJJ
383 
384 // No GdkSurface on GTK3
385 #define NO_gtk_1widget_1set_1has_1surface
386 #define NO_gtk_1widget_1get_1has_1surface
387 #define NO_gtk_1widget_1set_1parent_1surface
388 #define NO_gdk_1surface_1create_1similar_1surface
389 #define NO_gdk_1surface_1destroy
390 #define NO_gdk_1surface_1focus
391 #define NO_gdk_1device_1get_1surface_1at_1position
392 #define NO_gdk_1surface_1lower
393 #define NO_gdk_1surface_1raise
394 #define NO_gdk_1surface_1get_1children
395 #define NO_gdk_1surface_1get_1user_1data
396 #define NO_gdk_1surface_1get_1origin
397 #define NO_gdk_1surface_1invalidate_1rect
398 #define NO_gdk_1surface_1get_1display
399 #define NO_gdk_1surface_1set_1cursor
400 #define NO_gdk_1surface_1new_1child
401 #define NO_gdk_1surface_1set_1user_1data
402 #define NO_gdk_1surface_1restack
403 #define NO_gdk_1surface_1show_1unraised
404 #define NO_gdk_1surface_1show
405 #define NO_gdk_1surface_1get_1device_1position
406 #define NO_gdk_1display_1get_1monitor_1at_1surface
407 #define NO_gdk_1surface_1get_1frame_1extents
408 #define NO_gdk_1surface_1get_1width
409 #define NO_gdk_1surface_1get_1height
410 #define NO_gdk_1surface_1get_1state
411 #define NO_gdk_1surface_1resize
412 #define NO_gdk_1surface_1move
413 #define NO_gdk_1surface_1move_1resize
414 #define NO_gdk_1surface_1hide
415 #define NO_gdk_1surface_1set_1decorations
416 #define NO_gdk_1surface_1set_1functions
417 #define NO_gdk_1surface_1get_1root_1origin
418 #define NO_gdk_1surface_1invalidate_1region
419 #define NO_gdk_1event_1get_1surface
420 
421 // No GdkClipboard on GTK3
422 #define NO_gdk_1clipboard_1set_1content
423 #define NO_gdk_1display_1get_1clipboard
424 #define NO_gdk_1display_1get_1primary_1clipboard
425 
426 // No GtkSnapshot on GTK3
427 #define NO_gtk_1snapshot_1append_1cairo
428 #define NO_gtk_1widget_1snapshot_1child
429 
430 // No Graphene library on GTK3
431 #define NO_graphene_1rect_1alloc
432 #define NO_graphene_1rect_1free
433 #define NO_graphene_1rect_1init
434 
435 // Miscellaneous functions not present on GTK3
436 #define NO_gdk_1device_1warp__III
437 #define NO_gdk_1device_1warp__JII
438 #define NO_gdk_1display_1get_1keymap
439 #define NO_gtk_1widget_1measure
440 #define NO_gtk_1style_1context_1add_1provider_1for_1display
441 #define NO_gtk_1widget_1get_1first_1child
442 #define NO_gtk_1widget_1get_1next_1sibling
443 #define NO_gtk_1css_1provider_1load_1from_1data__I_3BI
444 #define NO_gtk_1css_1provider_1load_1from_1data__J_3BJ
445 #define NO_gdk_1display_1is_1composited
446 #define NO_gtk_1gesture_1multi_1press_1new
447 #define NO_gtk_1style_1context_1get_1margin
448 
449 // GdkCursor API changes from GTK3 -> GTK4
450 #define NO_gdk_1cursor_1new_1from_1name___3BI
451 #define NO_gdk_1cursor_1new_1from_1name___3BJ
452 #define NO_gdk_1cursor_1new_1from_1texture
453 #define NO_gtk_1widget_1set_1cursor
454 
455 // No GdkTexture on GTK3
456 #define NO_gdk_1texture_1new_1for_1pixbuf
457 
458 // GtkEventController related functions for GTK4
459 #define NO_gtk_1event_1controller_1key_1new
460 #define NO_gtk_1event_1controller_1motion_1new
461 #define NO_gtk_1event_1controller_1scroll_1new
462 #define NO_gtk_1widget_1add_1controller
463 
464 // GdkEvent functions which do not exist on GTK3
465 #define NO_gdk_1event_1get_1focus_1in
466 #define NO_gdk_1event_1get_1string
467 #define NO_gdk_1event_1get_1key_1group
468 #define NO_gdk_1event_1get_1crossing_1mode
469 
470 // GdkCursor API changes
471 #define NO_gdk_1cursor_1new_1from_1name__Ljava_lang_String_2J
472 
473 #endif
474 
475 #include "os_custom.h"
476 
477 #endif /* INC_os_H */
478