wxMessageBox off the main thread lost result code.
[wxWidgets.git] / include / wx / gtk / private / gtk2-compat.h
1 ///////////////////////////////////////////////////////////////////////////////
2 // Name: wx/gtk/private/compat.h
3 // Purpose: Compatibility code for older GTK+ versions
4 // Author: Vaclav Slavik
5 // Created: 2011-03-25
6 // Copyright: (c) 2011 Vaclav Slavik <vslavik@fastmail.fm>
7 // Licence: wxWindows licence
8 ///////////////////////////////////////////////////////////////////////////////
9
10 #ifndef _WX_GTK_PRIVATE_COMPAT_H_
11 #define _WX_GTK_PRIVATE_COMPAT_H_
12
13 // ----------------------------------------------------------------------------
14 // Implementations of new accessors for older GTK+ versions
15 // ----------------------------------------------------------------------------
16
17 // GTK+ deprecated direct access to struct members and some other stuff,
18 // replacing them with simple accessor functions. These aren't available in
19 // older versions, though, so we have to provide them for compatibility.
20 //
21 // Note: wx_ prefix is used to avoid symbol conflicts at runtime
22 //
23 // Note 2: We support building against newer GTK+ version and using an older
24 // one at runtime, so we must provide our implementations of these
25 // functions even if GTK_CHECK_VERSION would indicate the function is
26 // already available in GTK+.
27
28 #ifndef __WXGTK3__
29
30 // ----------------------------------------------------------------------------
31 // the following were introduced in GTK+ 2.8
32
33 static inline GtkWidget* wx_gtk_scrolled_window_get_hscrollbar(GtkScrolledWindow* scrolled_window)
34 {
35 return scrolled_window->hscrollbar;
36 }
37 #define gtk_scrolled_window_get_hscrollbar wx_gtk_scrolled_window_get_hscrollbar
38
39 static inline GtkWidget* wx_gtk_scrolled_window_get_vscrollbar(GtkScrolledWindow* scrolled_window)
40 {
41 return scrolled_window->vscrollbar;
42 }
43 #define gtk_scrolled_window_get_vscrollbar wx_gtk_scrolled_window_get_vscrollbar
44
45 // ----------------------------------------------------------------------------
46 // the following were introduced in GLib 2.10
47
48 static inline gpointer wx_g_object_ref_sink(gpointer object)
49 {
50 g_object_ref(object);
51 gtk_object_sink(GTK_OBJECT(object));
52 return object;
53 }
54 #define g_object_ref_sink wx_g_object_ref_sink
55
56 // ----------------------------------------------------------------------------
57 // the following were introduced in GTK+ 2.12
58
59 static inline void wx_gtk_about_dialog_set_program_name(GtkAboutDialog* about, const gchar* name)
60 {
61 gtk_about_dialog_set_name(about, name);
62 }
63 #define gtk_about_dialog_set_program_name wx_gtk_about_dialog_set_program_name
64
65 // ----------------------------------------------------------------------------
66 // the following were introduced in GTK+ 2.14
67
68 static inline gdouble wx_gtk_adjustment_get_lower(GtkAdjustment* adjustment)
69 {
70 return adjustment->lower;
71 }
72 #define gtk_adjustment_get_lower wx_gtk_adjustment_get_lower
73
74 static inline gdouble wx_gtk_adjustment_get_page_increment(GtkAdjustment* adjustment)
75 {
76 return adjustment->page_increment;
77 }
78 #define gtk_adjustment_get_page_increment wx_gtk_adjustment_get_page_increment
79
80 static inline gdouble wx_gtk_adjustment_get_page_size(GtkAdjustment* adjustment)
81 {
82 return adjustment->page_size;
83 }
84 #define gtk_adjustment_get_page_size wx_gtk_adjustment_get_page_size
85
86 static inline gdouble wx_gtk_adjustment_get_step_increment(GtkAdjustment* adjustment)
87 {
88 return adjustment->step_increment;
89 }
90 #define gtk_adjustment_get_step_increment wx_gtk_adjustment_get_step_increment
91
92 static inline gdouble wx_gtk_adjustment_get_upper(GtkAdjustment* adjustment)
93 {
94 return adjustment->upper;
95 }
96 #define gtk_adjustment_get_upper wx_gtk_adjustment_get_upper
97
98 static inline void wx_gtk_adjustment_set_page_size(GtkAdjustment* adjustment, gdouble page_size)
99 {
100 adjustment->page_size = page_size;
101 }
102 #define gtk_adjustment_set_page_size wx_gtk_adjustment_set_page_size
103
104 static inline GtkWidget* wx_gtk_color_selection_dialog_get_color_selection(GtkColorSelectionDialog* csd)
105 {
106 return csd->colorsel;
107 }
108 #define gtk_color_selection_dialog_get_color_selection wx_gtk_color_selection_dialog_get_color_selection
109
110 static inline GtkWidget* wx_gtk_dialog_get_content_area(GtkDialog* dialog)
111 {
112 return dialog->vbox;
113 }
114 #define gtk_dialog_get_content_area wx_gtk_dialog_get_content_area
115
116 static inline GtkWidget* wx_gtk_dialog_get_action_area(GtkDialog* dialog)
117 {
118 return dialog->action_area;
119 }
120 #define gtk_dialog_get_action_area wx_gtk_dialog_get_action_area
121
122 static inline guint16 wx_gtk_entry_get_text_length(GtkEntry* entry)
123 {
124 return entry->text_length;
125 }
126 #define gtk_entry_get_text_length wx_gtk_entry_get_text_length
127
128 static inline const guchar* wx_gtk_selection_data_get_data(GtkSelectionData* selection_data)
129 {
130 return selection_data->data;
131 }
132 #define gtk_selection_data_get_data wx_gtk_selection_data_get_data
133
134 static inline GdkAtom wx_gtk_selection_data_get_data_type(GtkSelectionData* selection_data)
135 {
136 return selection_data->type;
137 }
138 #define gtk_selection_data_get_data_type wx_gtk_selection_data_get_data_type
139
140 static inline gint wx_gtk_selection_data_get_format(GtkSelectionData* selection_data)
141 {
142 return selection_data->format;
143 }
144 #define gtk_selection_data_get_format wx_gtk_selection_data_get_format
145
146 static inline gint wx_gtk_selection_data_get_length(GtkSelectionData* selection_data)
147 {
148 return selection_data->length;
149 }
150 #define gtk_selection_data_get_length wx_gtk_selection_data_get_length
151
152 static inline GdkAtom wx_gtk_selection_data_get_target(GtkSelectionData* selection_data)
153 {
154 return selection_data->target;
155 }
156 #define gtk_selection_data_get_target wx_gtk_selection_data_get_target
157
158 static inline GdkWindow* wx_gtk_widget_get_window(GtkWidget* widget)
159 {
160 return widget->window;
161 }
162 #define gtk_widget_get_window wx_gtk_widget_get_window
163
164 static inline GtkWidget* wx_gtk_window_get_default_widget(GtkWindow* window)
165 {
166 return window->default_widget;
167 }
168 #define gtk_window_get_default_widget wx_gtk_window_get_default_widget
169
170 // ----------------------------------------------------------------------------
171 // the following were introduced in GTK+ 2.16
172
173 static inline GdkAtom wx_gtk_selection_data_get_selection(GtkSelectionData* selection_data)
174 {
175 return selection_data->selection;
176 }
177 #define gtk_selection_data_get_selection wx_gtk_selection_data_get_selection
178
179 // ----------------------------------------------------------------------------
180 // the following were introduced in GTK+ 2.18
181
182 static inline void wx_gtk_cell_renderer_get_alignment(GtkCellRenderer* cell, gfloat* xalign, gfloat* yalign)
183 {
184 *xalign = cell->xalign;
185 *yalign = cell->yalign;
186 }
187 #define gtk_cell_renderer_get_alignment wx_gtk_cell_renderer_get_alignment
188
189 static inline void wx_gtk_cell_renderer_get_padding(GtkCellRenderer* cell, gint* xpad, gint* ypad)
190 {
191 *xpad = cell->xpad;
192 *ypad = cell->ypad;
193 }
194 #define gtk_cell_renderer_get_padding wx_gtk_cell_renderer_get_padding
195
196 static inline void wx_gtk_widget_get_allocation(GtkWidget* widget, GtkAllocation* allocation)
197 {
198 *allocation = widget->allocation;
199 }
200 #define gtk_widget_get_allocation wx_gtk_widget_get_allocation
201
202 inline gboolean wx_gtk_widget_get_has_window(GtkWidget *widget)
203 {
204 return !GTK_WIDGET_NO_WINDOW(widget);
205 }
206 #define gtk_widget_get_has_window wx_gtk_widget_get_has_window
207
208
209 inline gboolean wx_gtk_widget_get_has_grab(GtkWidget *widget)
210 {
211 return GTK_WIDGET_HAS_GRAB(widget);
212 }
213 #define gtk_widget_get_has_grab wx_gtk_widget_get_has_grab
214
215
216 inline gboolean wx_gtk_widget_get_visible(GtkWidget *widget)
217 {
218 return GTK_WIDGET_VISIBLE(widget);
219 }
220 #define gtk_widget_get_visible wx_gtk_widget_get_visible
221
222
223 inline gboolean wx_gtk_widget_get_sensitive(GtkWidget *widget)
224 {
225 return GTK_WIDGET_SENSITIVE(widget);
226 }
227 #define gtk_widget_get_sensitive wx_gtk_widget_get_sensitive
228
229
230 inline gboolean wx_gtk_widget_is_drawable(GtkWidget *widget)
231 {
232 return GTK_WIDGET_DRAWABLE(widget);
233 }
234 #define gtk_widget_is_drawable wx_gtk_widget_is_drawable
235
236
237 inline gboolean wx_gtk_widget_get_can_focus(GtkWidget *widget)
238 {
239 return GTK_WIDGET_CAN_FOCUS(widget);
240 }
241 #define gtk_widget_get_can_focus wx_gtk_widget_get_can_focus
242
243 inline void wx_gtk_widget_set_can_focus(GtkWidget *widget, gboolean can)
244 {
245 if ( can )
246 GTK_WIDGET_SET_FLAGS(widget, GTK_CAN_FOCUS);
247 else
248 GTK_WIDGET_UNSET_FLAGS(widget, GTK_CAN_FOCUS);
249 }
250 #define gtk_widget_set_can_focus wx_gtk_widget_set_can_focus
251
252
253 inline gboolean wx_gtk_widget_get_can_default(GtkWidget *widget)
254 {
255 return GTK_WIDGET_CAN_DEFAULT(widget);
256 }
257 #define gtk_widget_get_can_default wx_gtk_widget_get_can_default
258
259 inline void wx_gtk_widget_set_can_default(GtkWidget *widget, gboolean can)
260 {
261 if ( can )
262 GTK_WIDGET_SET_FLAGS(widget, GTK_CAN_DEFAULT);
263 else
264 GTK_WIDGET_UNSET_FLAGS(widget, GTK_CAN_DEFAULT);
265 }
266 #define gtk_widget_set_can_default wx_gtk_widget_set_can_default
267
268
269 inline gboolean wx_gtk_widget_has_default(GtkWidget *widget)
270 {
271 return GTK_WIDGET_HAS_DEFAULT(widget);
272 }
273 #define gtk_widget_has_default wx_gtk_widget_has_default
274
275
276 inline GtkStateType wx_gtk_widget_get_state(GtkWidget *widget)
277 {
278 return (GtkStateType)GTK_WIDGET_STATE(widget);
279 }
280 #define gtk_widget_get_state wx_gtk_widget_get_state
281
282
283 inline gboolean wx_gtk_widget_get_double_buffered(GtkWidget *widget)
284 {
285 return GTK_WIDGET_DOUBLE_BUFFERED(widget);
286 }
287 #define gtk_widget_get_double_buffered wx_gtk_widget_get_double_buffered
288
289 static inline gboolean wx_gtk_widget_has_grab(GtkWidget* widget)
290 {
291 return GTK_WIDGET_HAS_GRAB(widget);
292 }
293 #define gtk_widget_has_grab wx_gtk_widget_has_grab
294
295 static inline void wx_gtk_widget_set_allocation(GtkWidget* widget, const GtkAllocation* allocation)
296 {
297 widget->allocation = *allocation;
298 }
299 #define gtk_widget_set_allocation wx_gtk_widget_set_allocation
300
301 // ----------------------------------------------------------------------------
302 // the following were introduced in GTK+ 2.20
303
304 inline gboolean wx_gtk_widget_get_realized(GtkWidget *widget)
305 {
306 return GTK_WIDGET_REALIZED(widget);
307 }
308 #define gtk_widget_get_realized wx_gtk_widget_get_realized
309
310
311 inline gboolean wx_gtk_widget_get_mapped(GtkWidget *widget)
312 {
313 return GTK_WIDGET_MAPPED(widget);
314 }
315 #define gtk_widget_get_mapped wx_gtk_widget_get_mapped
316
317 static inline void wx_gtk_widget_get_requisition(GtkWidget* widget, GtkRequisition* requisition)
318 {
319 *requisition = widget->requisition;
320 }
321 #define gtk_widget_get_requisition wx_gtk_widget_get_requisition
322
323 static inline GdkWindow* wx_gtk_entry_get_text_window(GtkEntry* entry)
324 {
325 return entry->text_area;
326 }
327 #define gtk_entry_get_text_window wx_gtk_entry_get_text_window
328
329 // ----------------------------------------------------------------------------
330 // the following were introduced in GTK+ 2.22
331
332 static inline GdkWindow* wx_gtk_button_get_event_window(GtkButton* button)
333 {
334 return button->event_window;
335 }
336 #define gtk_button_get_event_window wx_gtk_button_get_event_window
337
338 static inline GdkDragAction wx_gdk_drag_context_get_actions(GdkDragContext* context)
339 {
340 return context->actions;
341 }
342 #define gdk_drag_context_get_actions wx_gdk_drag_context_get_actions
343
344 static inline GdkDragAction wx_gdk_drag_context_get_selected_action(GdkDragContext* context)
345 {
346 return context->action;
347 }
348 #define gdk_drag_context_get_selected_action wx_gdk_drag_context_get_selected_action
349
350 static inline GdkDragAction wx_gdk_drag_context_get_suggested_action(GdkDragContext* context)
351 {
352 return context->suggested_action;
353 }
354 #define gdk_drag_context_get_suggested_action wx_gdk_drag_context_get_suggested_action
355
356 static inline GList* wx_gdk_drag_context_list_targets(GdkDragContext* context)
357 {
358 return context->targets;
359 }
360 #define gdk_drag_context_list_targets wx_gdk_drag_context_list_targets
361
362 static inline gint wx_gdk_visual_get_depth(GdkVisual* visual)
363 {
364 return visual->depth;
365 }
366 #define gdk_visual_get_depth wx_gdk_visual_get_depth
367
368 static inline gboolean wx_gtk_window_has_group(GtkWindow* window)
369 {
370 return window->group != NULL;
371 }
372 #define gtk_window_has_group wx_gtk_window_has_group
373
374 // ----------------------------------------------------------------------------
375 // the following were introduced in GTK+ 2.24
376
377 static inline GdkDisplay* wx_gdk_window_get_display(GdkWindow* window)
378 {
379 return gdk_drawable_get_display(window);
380 }
381 #define gdk_window_get_display wx_gdk_window_get_display
382
383 static inline GdkScreen* wx_gdk_window_get_screen(GdkWindow* window)
384 {
385 return gdk_drawable_get_screen(window);
386 }
387 #define gdk_window_get_screen wx_gdk_window_get_screen
388
389 static inline gint wx_gdk_window_get_height(GdkWindow* window)
390 {
391 int h;
392 gdk_drawable_get_size(window, NULL, &h);
393 return h;
394 }
395 #define gdk_window_get_height wx_gdk_window_get_height
396
397 static inline gint wx_gdk_window_get_width(GdkWindow* window)
398 {
399 int w;
400 gdk_drawable_get_size(window, &w, NULL);
401 return w;
402 }
403 #define gdk_window_get_width wx_gdk_window_get_width
404
405 #if GTK_CHECK_VERSION(2,10,0)
406 static inline void wx_gdk_cairo_set_source_window(cairo_t* cr, GdkWindow* window, gdouble x, gdouble y)
407 {
408 gdk_cairo_set_source_pixmap(cr, window, x, y);
409 }
410 #define gdk_cairo_set_source_window wx_gdk_cairo_set_source_window
411 #endif
412
413 // ----------------------------------------------------------------------------
414 // the following were introduced in GTK+ 3.0
415
416 static inline void wx_gdk_window_get_geometry(GdkWindow* window, gint* x, gint* y, gint* width, gint* height)
417 {
418 gdk_window_get_geometry(window, x, y, width, height, NULL);
419 }
420 #define gdk_window_get_geometry wx_gdk_window_get_geometry
421
422 static inline GtkWidget* wx_gtk_tree_view_column_get_button(GtkTreeViewColumn* tree_column)
423 {
424 return tree_column->button;
425 }
426 #define gtk_tree_view_column_get_button wx_gtk_tree_view_column_get_button
427
428 static inline GtkWidget* wx_gtk_box_new(GtkOrientation orientation, gint spacing)
429 {
430 GtkWidget* widget;
431 if (orientation == GTK_ORIENTATION_HORIZONTAL)
432 widget = gtk_hbox_new(false, spacing);
433 else
434 widget = gtk_vbox_new(false, spacing);
435 return widget;
436 }
437 #define gtk_box_new wx_gtk_box_new
438
439 static inline GtkWidget* wx_gtk_button_box_new(GtkOrientation orientation)
440 {
441 GtkWidget* widget;
442 if (orientation == GTK_ORIENTATION_HORIZONTAL)
443 widget = gtk_hbutton_box_new();
444 else
445 widget = gtk_vbutton_box_new();
446 return widget;
447 }
448 #define gtk_button_box_new wx_gtk_button_box_new
449
450 static inline GtkWidget* wx_gtk_scale_new(GtkOrientation orientation, GtkAdjustment* adjustment)
451 {
452 GtkWidget* widget;
453 if (orientation == GTK_ORIENTATION_HORIZONTAL)
454 widget = gtk_hscale_new(adjustment);
455 else
456 widget = gtk_vscale_new(adjustment);
457 return widget;
458 }
459 #define gtk_scale_new wx_gtk_scale_new
460
461 static inline GtkWidget* wx_gtk_scrollbar_new(GtkOrientation orientation, GtkAdjustment* adjustment)
462 {
463 GtkWidget* widget;
464 if (orientation == GTK_ORIENTATION_HORIZONTAL)
465 widget = gtk_hscrollbar_new(adjustment);
466 else
467 widget = gtk_vscrollbar_new(adjustment);
468 return widget;
469 }
470 #define gtk_scrollbar_new wx_gtk_scrollbar_new
471
472 static inline GtkWidget* wx_gtk_separator_new(GtkOrientation orientation)
473 {
474 GtkWidget* widget;
475 if (orientation == GTK_ORIENTATION_HORIZONTAL)
476 widget = gtk_hseparator_new();
477 else
478 widget = gtk_vseparator_new();
479 return widget;
480 }
481 #define gtk_separator_new wx_gtk_separator_new
482
483 static inline void wx_gtk_widget_get_preferred_height(GtkWidget* widget, gint* minimum, gint* natural)
484 {
485 GtkRequisition req;
486 gtk_widget_size_request(widget, &req);
487 if (minimum)
488 *minimum = req.height;
489 if (natural)
490 *natural = req.height;
491 }
492 #define gtk_widget_get_preferred_height wx_gtk_widget_get_preferred_height
493
494 static inline void wx_gtk_widget_get_preferred_width(GtkWidget* widget, gint* minimum, gint* natural)
495 {
496 GtkRequisition req;
497 gtk_widget_size_request(widget, &req);
498 if (minimum)
499 *minimum = req.width;
500 if (natural)
501 *natural = req.width;
502 }
503 #define gtk_widget_get_preferred_width wx_gtk_widget_get_preferred_width
504
505 static inline void wx_gtk_widget_get_preferred_size(GtkWidget* widget, GtkRequisition* minimum, GtkRequisition* natural)
506 {
507 GtkRequisition* req = minimum;
508 if (req == NULL)
509 req = natural;
510 gtk_widget_size_request(widget, req);
511 }
512 #define gtk_widget_get_preferred_size wx_gtk_widget_get_preferred_size
513
514 #endif // !__WXGTK3__
515 #endif // _WX_GTK_PRIVATE_COMPAT_H_