gtk2-compat.h 16 KB

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