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