1/* 2 * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25#ifndef _GTK2_INTERFACE_H 26#define _GTK2_INTERFACE_H 27 28#include <stdlib.h> 29#include <jni.h> 30#include <X11/X.h> 31#include "gtk_interface.h" 32 33#define GTK_HAS_FOCUS (1 << 12) 34#define GTK_HAS_DEFAULT (1 << 14) 35 36typedef enum 37{ 38 GTK_WINDOW_TOPLEVEL, 39 GTK_WINDOW_POPUP 40} GtkWindowType; 41 42typedef enum 43{ 44 G_PARAM_READABLE = 1 << 0, 45 G_PARAM_WRITABLE = 1 << 1, 46 G_PARAM_CONSTRUCT = 1 << 2, 47 G_PARAM_CONSTRUCT_ONLY = 1 << 3, 48 G_PARAM_LAX_VALIDATION = 1 << 4, 49 G_PARAM_PRIVATE = 1 << 5 50} GParamFlags; 51 52/* We define all structure pointers to be void* */ 53typedef void GMainContext; 54typedef void GVfs; 55 56typedef void GdkColormap; 57typedef void GdkDrawable; 58typedef void GdkGC; 59typedef void GdkPixbuf; 60typedef void GdkPixmap; 61 62typedef void GtkFixed; 63typedef void GtkMenuItem; 64typedef void GtkMenuShell; 65typedef void GtkWidgetClass; 66typedef void PangoFontDescription; 67typedef void GtkSettings; 68 69/* Some real structures */ 70typedef struct 71{ 72 guint32 pixel; 73 guint16 red; 74 guint16 green; 75 guint16 blue; 76} GdkColor; 77 78typedef struct { 79 gint fd; 80 gushort events; 81 gushort revents; 82} GPollFD; 83 84typedef struct { 85 gint x; 86 gint y; 87 gint width; 88 gint height; 89} GdkRectangle; 90 91typedef struct { 92 gint x; 93 gint y; 94 gint width; 95 gint height; 96} GtkAllocation; 97 98typedef struct { 99 gint width; 100 gint height; 101} GtkRequisition; 102 103typedef struct { 104 GtkWidgetClass *g_class; 105} GTypeInstance; 106 107typedef struct { 108 gint left; 109 gint right; 110 gint top; 111 gint bottom; 112} GtkBorder; 113 114/****************************************************** 115 * FIXME: it is more safe to include gtk headers for 116 * the precise type definition of GType and other 117 * structures. This is a place where getting rid of gtk 118 * headers may be dangerous. 119 ******************************************************/ 120 121typedef struct 122{ 123 GType g_type; 124 125 union { 126 gint v_int; 127 guint v_uint; 128 glong v_long; 129 gulong v_ulong; 130 gint64 v_int64; 131 guint64 v_uint64; 132 gfloat v_float; 133 gdouble v_double; 134 gpointer v_pointer; 135 } data[2]; 136} GValue; 137 138typedef struct 139{ 140 GTypeInstance g_type_instance; 141 142 gchar *name; 143 GParamFlags flags; 144 GType value_type; 145 GType owner_type; 146} GParamSpec; 147 148typedef struct { 149 GTypeInstance g_type_instance; 150 guint ref_count; 151 void *qdata; 152} GObject; 153 154typedef struct { 155 GObject parent_instance; 156 guint32 flags; 157} GtkObject; 158 159typedef struct 160{ 161 GObject parent_instance; 162 163 GdkColor fg[5]; 164 GdkColor bg[5]; 165 GdkColor light[5]; 166 GdkColor dark[5]; 167 GdkColor mid[5]; 168 GdkColor text[5]; 169 GdkColor base[5]; 170 GdkColor text_aa[5]; /* Halfway between text/base */ 171 172 GdkColor black; 173 GdkColor white; 174 PangoFontDescription *font_desc; 175 176 gint xthickness; 177 gint ythickness; 178 179 GdkGC *fg_gc[5]; 180 GdkGC *bg_gc[5]; 181 GdkGC *light_gc[5]; 182 GdkGC *dark_gc[5]; 183 GdkGC *mid_gc[5]; 184 GdkGC *text_gc[5]; 185 GdkGC *base_gc[5]; 186 GdkGC *text_aa_gc[5]; 187 GdkGC *black_gc; 188 GdkGC *white_gc; 189 190 GdkPixmap *bg_pixmap[5]; 191} GtkStyle; 192 193typedef struct _GtkWidget GtkWidget; 194struct _GtkWidget 195{ 196 GtkObject object; 197 guint16 private_flags; 198 guint8 state; 199 guint8 saved_state; 200 gchar *name; 201 GtkStyle *style; 202 GtkRequisition requisition; 203 GtkAllocation allocation; 204 GdkWindow *window; 205 GtkWidget *parent; 206}; 207 208typedef struct 209{ 210 GtkWidget widget; 211 212 gfloat xalign; 213 gfloat yalign; 214 215 guint16 xpad; 216 guint16 ypad; 217} GtkMisc; 218 219typedef struct { 220 GtkWidget widget; 221 GtkWidget *focus_child; 222 guint border_width : 16; 223 guint need_resize : 1; 224 guint resize_mode : 2; 225 guint reallocate_redraws : 1; 226 guint has_focus_chain : 1; 227} GtkContainer; 228 229typedef struct { 230 GtkContainer container; 231 GtkWidget *child; 232} GtkBin; 233 234typedef struct { 235 GtkBin bin; 236 GdkWindow *event_window; 237 gchar *label_text; 238 guint activate_timeout; 239 guint constructed : 1; 240 guint in_button : 1; 241 guint button_down : 1; 242 guint relief : 2; 243 guint use_underline : 1; 244 guint use_stock : 1; 245 guint depressed : 1; 246 guint depress_on_activate : 1; 247 guint focus_on_click : 1; 248} GtkButton; 249 250typedef struct { 251 GtkButton button; 252 guint active : 1; 253 guint draw_indicator : 1; 254 guint inconsistent : 1; 255} GtkToggleButton; 256 257typedef struct _GtkAdjustment GtkAdjustment; 258struct _GtkAdjustment 259{ 260 GtkObject parent_instance; 261 262 gdouble lower; 263 gdouble upper; 264 gdouble value; 265 gdouble step_increment; 266 gdouble page_increment; 267 gdouble page_size; 268}; 269 270typedef enum 271{ 272 GTK_UPDATE_CONTINUOUS, 273 GTK_UPDATE_DISCONTINUOUS, 274 GTK_UPDATE_DELAYED 275} GtkUpdateType; 276 277typedef struct _GtkRange GtkRange; 278struct _GtkRange 279{ 280 GtkWidget widget; 281 GtkAdjustment *adjustment; 282 GtkUpdateType update_policy; 283 guint inverted : 1; 284 /*< protected >*/ 285 guint flippable : 1; 286 guint has_stepper_a : 1; 287 guint has_stepper_b : 1; 288 guint has_stepper_c : 1; 289 guint has_stepper_d : 1; 290 guint need_recalc : 1; 291 guint slider_size_fixed : 1; 292 gint min_slider_size; 293 GtkOrientation orientation; 294 GdkRectangle range_rect; 295 gint slider_start, slider_end; 296 gint round_digits; 297 /*< private >*/ 298 guint trough_click_forward : 1; 299 guint update_pending : 1; 300 /*GtkRangeLayout * */ void *layout; 301 /*GtkRangeStepTimer * */ void* timer; 302 gint slide_initial_slider_position; 303 gint slide_initial_coordinate; 304 guint update_timeout_id; 305 GdkWindow *event_window; 306}; 307 308typedef struct _GtkProgressBar GtkProgressBar; 309 310typedef enum 311{ 312 GTK_PROGRESS_CONTINUOUS, 313 GTK_PROGRESS_DISCRETE 314} GtkProgressBarStyle; 315 316typedef enum 317{ 318 GTK_PROGRESS_LEFT_TO_RIGHT, 319 GTK_PROGRESS_RIGHT_TO_LEFT, 320 GTK_PROGRESS_BOTTOM_TO_TOP, 321 GTK_PROGRESS_TOP_TO_BOTTOM 322} GtkProgressBarOrientation; 323 324typedef struct _GtkProgress GtkProgress; 325 326struct _GtkProgress 327{ 328 GtkWidget widget; 329 GtkAdjustment *adjustment; 330 GdkPixmap *offscreen_pixmap; 331 gchar *format; 332 gfloat x_align; 333 gfloat y_align; 334 guint show_text : 1; 335 guint activity_mode : 1; 336 guint use_text_format : 1; 337}; 338 339struct _GtkProgressBar 340{ 341 GtkProgress progress; 342 GtkProgressBarStyle bar_style; 343 GtkProgressBarOrientation orientation; 344 guint blocks; 345 gint in_block; 346 gint activity_pos; 347 guint activity_step; 348 guint activity_blocks; 349 gdouble pulse_fraction; 350 guint activity_dir : 1; 351 guint ellipsize : 3; 352}; 353 354/** 355 * Returns : 356 * NULL if the GLib library is compatible with the given version, or a string 357 * describing the version mismatch. 358 * Please note that the glib_check_version() is available since 2.6, 359 * so you should use GLIB_CHECK_VERSION macro instead. 360 */ 361static gchar* (*fp_glib_check_version)(guint required_major, guint required_minor, 362 guint required_micro); 363 364/** 365 * Returns : 366 * TRUE if the GLib library is compatible with the given version 367 */ 368#define GLIB_CHECK_VERSION(major, minor, micro) \ 369 (fp_glib_check_version && fp_glib_check_version(major, minor, micro) == NULL) 370 371/** 372 * Returns : 373 * NULL if the GTK+ library is compatible with the given version, or a string 374 * describing the version mismatch. 375 */ 376static gchar* (*fp_gtk_check_version)(guint required_major, guint required_minor, 377 guint required_micro); 378 379static void gtk2_init(GtkApi* gtk); 380 381static void (*fp_g_free)(gpointer mem); 382static void (*fp_g_object_unref)(gpointer object); 383static GdkWindow *(*fp_gdk_get_default_root_window) (void); 384 385static int (*fp_gdk_pixbuf_get_bits_per_sample)(const GdkPixbuf *pixbuf); 386static guchar *(*fp_gdk_pixbuf_get_pixels)(const GdkPixbuf *pixbuf); 387static gboolean (*fp_gdk_pixbuf_get_has_alpha)(const GdkPixbuf *pixbuf); 388static int (*fp_gdk_pixbuf_get_height)(const GdkPixbuf *pixbuf); 389static int (*fp_gdk_pixbuf_get_n_channels)(const GdkPixbuf *pixbuf); 390static int (*fp_gdk_pixbuf_get_rowstride)(const GdkPixbuf *pixbuf); 391static int (*fp_gdk_pixbuf_get_width)(const GdkPixbuf *pixbuf); 392static GdkPixbuf *(*fp_gdk_pixbuf_new_from_file)(const char *filename, GError **error); 393static GdkColorspace (*fp_gdk_pixbuf_get_colorspace)(const GdkPixbuf *pixbuf); 394 395static GdkPixbuf *(*fp_gdk_pixbuf_get_from_drawable)(GdkPixbuf *dest, 396 GdkDrawable *src, GdkColormap *cmap, int src_x, int src_y, 397 int dest_x, int dest_y, int width, int height); 398static GdkPixbuf *(*fp_gdk_pixbuf_scale_simple)(GdkPixbuf *src, 399 int dest_width, int dest_heigh, GdkInterpType interp_type); 400 401 402static void (*fp_gtk_widget_destroy)(void *widget); 403static void (*fp_gtk_window_present)(GtkWindow *window); 404static void (*fp_gtk_window_move)(GtkWindow *window, gint x, gint y); 405static void (*fp_gtk_window_resize)(GtkWindow *window, gint width, gint height); 406 407/** 408 * Function Pointers for GtkFileChooser 409 */ 410static gchar* (*fp_gtk_file_chooser_get_filename)(GtkFileChooser *chooser); 411static void (*fp_gtk_widget_hide)(void *widget); 412static void (*fp_gtk_main_quit)(void); 413static void* (*fp_gtk_file_chooser_dialog_new)(const gchar *title, 414 GtkWindow *parent, GtkFileChooserAction action, 415 const gchar *first_button_text, ...); 416static gboolean (*fp_gtk_file_chooser_set_current_folder)(GtkFileChooser *chooser, 417 const gchar *filename); 418static gboolean (*fp_gtk_file_chooser_set_filename)(GtkFileChooser *chooser, 419 const char *filename); 420static void (*fp_gtk_file_chooser_set_current_name)(GtkFileChooser *chooser, 421 const gchar *name); 422static void (*fp_gtk_file_filter_add_custom)(GtkFileFilter *filter, 423 GtkFileFilterFlags needed, GtkFileFilterFunc func, gpointer data, 424 GDestroyNotify notify); 425static void (*fp_gtk_file_chooser_set_filter)(GtkFileChooser *chooser, 426 GtkFileFilter *filter); 427static GType (*fp_gtk_file_chooser_get_type)(void); 428static GtkFileFilter* (*fp_gtk_file_filter_new)(void); 429static void (*fp_gtk_file_chooser_set_do_overwrite_confirmation)( 430 GtkFileChooser *chooser, gboolean do_overwrite_confirmation); 431static void (*fp_gtk_file_chooser_set_select_multiple)( 432 GtkFileChooser *chooser, gboolean select_multiple); 433static gchar* (*fp_gtk_file_chooser_get_current_folder)(GtkFileChooser *chooser); 434static GSList* (*fp_gtk_file_chooser_get_filenames)(GtkFileChooser *chooser); 435static guint (*fp_gtk_g_slist_length)(GSList *list); 436static gulong (*fp_g_signal_connect_data)(gpointer instance, 437 const gchar *detailed_signal, GCallback c_handler, gpointer data, 438 GClosureNotify destroy_data, GConnectFlags connect_flags); 439static void (*fp_gtk_widget_show)(void *widget); 440static void (*fp_gtk_main)(void); 441static guint (*fp_gtk_main_level)(void); 442static gchar* (*fp_g_path_get_dirname) (const gchar *file_name); 443static XID (*fp_gdk_x11_drawable_get_xid) (GdkWindow *drawable); 444 445static GList* (*fp_g_list_append) (GList *list, gpointer data); 446static void (*fp_g_list_free) (GList *list); 447static void (*fp_g_list_free_full) (GList *list, GDestroyNotify free_func); 448 449static gboolean (*fp_gtk_show_uri)(GdkScreen *screen, const gchar *uri, 450 guint32 timestamp, GError **error); 451 452#endif /* !_GTK2_INTERFACE_H */ 453