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 
  36 typedef enum
  37 {
  38   GTK_WINDOW_TOPLEVEL,
  39   GTK_WINDOW_POPUP
  40 } GtkWindowType;
  41 
  42 typedef 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* */
  53 typedef void GMainContext;
  54 typedef void GVfs;
  55 
  56 typedef void GdkColormap;
  57 typedef void GdkDrawable;
  58 typedef void GdkGC;
  59 typedef void GdkPixbuf;
  60 typedef void GdkPixmap;
  61 
  62 typedef void GtkFixed;
  63 typedef void GtkMenuItem;
  64 typedef void GtkMenuShell;
  65 typedef void GtkWidgetClass;
  66 typedef void PangoFontDescription;
  67 typedef void GtkSettings;
  68 
  69 /* Some real structures */
  70 typedef struct
  71 {
  72   guint32 pixel;
  73   guint16 red;
  74   guint16 green;
  75   guint16 blue;
  76 } GdkColor;
  77 
  78 typedef struct {
  79   gint      fd;
  80   gushort   events;
  81   gushort   revents;
  82 } GPollFD;
  83 
  84 typedef struct {
  85   gint x;
  86   gint y;
  87   gint width;
  88   gint height;
  89 } GdkRectangle;
  90 
  91 typedef struct {
  92   gint x;
  93   gint y;
  94   gint width;
  95   gint height;
  96 } GtkAllocation;
  97 
  98 typedef struct {
  99   gint width;
 100   gint height;
 101 } GtkRequisition;
 102 
 103 typedef struct {
 104   GtkWidgetClass *g_class;
 105 } GTypeInstance;
 106 
 107 typedef 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 
 121 typedef 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 
 138 typedef 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 
 148 typedef struct {
 149   GTypeInstance g_type_instance;
 150   guint         ref_count;
 151   void         *qdata;
 152 } GObject;
 153 
 154 typedef struct {
 155   GObject parent_instance;
 156   guint32 flags;
 157 } GtkObject;
 158 
 159 typedef 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 
 193 typedef struct _GtkWidget GtkWidget;
 194 struct _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 
 208 typedef struct
 209 {
 210   GtkWidget widget;
 211 
 212   gfloat xalign;
 213   gfloat yalign;
 214 
 215   guint16 xpad;
 216   guint16 ypad;
 217 } GtkMisc;
 218 
 219 typedef 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 
 229 typedef struct {
 230   GtkContainer container;
 231   GtkWidget *child;
 232 } GtkBin;
 233 
 234 typedef 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 
 250 typedef struct {
 251   GtkButton button;
 252   guint active : 1;
 253   guint draw_indicator : 1;
 254   guint inconsistent : 1;
 255 } GtkToggleButton;
 256 
 257 typedef struct _GtkAdjustment GtkAdjustment;
 258 struct _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 
 270 typedef enum
 271 {
 272   GTK_UPDATE_CONTINUOUS,
 273   GTK_UPDATE_DISCONTINUOUS,
 274   GTK_UPDATE_DELAYED
 275 } GtkUpdateType;
 276 
 277 typedef struct _GtkRange GtkRange;
 278 struct _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 
 308 typedef struct _GtkProgressBar       GtkProgressBar;
 309 
 310 typedef enum
 311 {
 312   GTK_PROGRESS_CONTINUOUS,
 313   GTK_PROGRESS_DISCRETE
 314 } GtkProgressBarStyle;
 315 
 316 typedef 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 
 324 typedef struct _GtkProgress       GtkProgress;
 325 
 326 struct _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 
 339 struct _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  */
 361 static 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  */
 376 static gchar* (*fp_gtk_check_version)(guint required_major, guint required_minor,
 377                        guint required_micro);
 378 
 379 static void gtk2_init(GtkApi* gtk);
 380 
 381 static void (*fp_g_free)(gpointer mem);
 382 static void (*fp_g_object_unref)(gpointer object);
 383 static GdkWindow *(*fp_gdk_get_default_root_window) (void);
 384 
 385 static int (*fp_gdk_pixbuf_get_bits_per_sample)(const GdkPixbuf *pixbuf);
 386 static guchar *(*fp_gdk_pixbuf_get_pixels)(const GdkPixbuf *pixbuf);
 387 static gboolean (*fp_gdk_pixbuf_get_has_alpha)(const GdkPixbuf *pixbuf);
 388 static int (*fp_gdk_pixbuf_get_height)(const GdkPixbuf *pixbuf);
 389 static int (*fp_gdk_pixbuf_get_n_channels)(const GdkPixbuf *pixbuf);
 390 static int (*fp_gdk_pixbuf_get_rowstride)(const GdkPixbuf *pixbuf);
 391 static int (*fp_gdk_pixbuf_get_width)(const GdkPixbuf *pixbuf);
 392 static GdkPixbuf *(*fp_gdk_pixbuf_new_from_file)(const char *filename, GError **error);
 393 static GdkColorspace (*fp_gdk_pixbuf_get_colorspace)(const GdkPixbuf *pixbuf);
 394 
 395 static 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);
 398 static GdkPixbuf *(*fp_gdk_pixbuf_scale_simple)(GdkPixbuf *src,
 399         int dest_width, int dest_heigh, GdkInterpType interp_type);
 400 
 401 
 402 static void (*fp_gtk_widget_destroy)(void *widget);
 403 static void (*fp_gtk_window_present)(GtkWindow *window);
 404 static void (*fp_gtk_window_move)(GtkWindow *window, gint x, gint y);
 405 static void (*fp_gtk_window_resize)(GtkWindow *window, gint width, gint height);
 406 
 407 /**
 408  * Function Pointers for GtkFileChooser
 409  */
 410 static gchar* (*fp_gtk_file_chooser_get_filename)(GtkFileChooser *chooser);
 411 static void (*fp_gtk_widget_hide)(void *widget);
 412 static void (*fp_gtk_main_quit)(void);
 413 static void* (*fp_gtk_file_chooser_dialog_new)(const gchar *title,
 414     GtkWindow *parent, GtkFileChooserAction action,
 415     const gchar *first_button_text, ...);
 416 static gboolean (*fp_gtk_file_chooser_set_current_folder)(GtkFileChooser *chooser,
 417     const gchar *filename);
 418 static gboolean (*fp_gtk_file_chooser_set_filename)(GtkFileChooser *chooser,
 419     const char *filename);
 420 static void (*fp_gtk_file_chooser_set_current_name)(GtkFileChooser *chooser,
 421     const gchar *name);
 422 static void (*fp_gtk_file_filter_add_custom)(GtkFileFilter *filter,
 423     GtkFileFilterFlags needed, GtkFileFilterFunc func, gpointer data,
 424     GDestroyNotify notify);
 425 static void (*fp_gtk_file_chooser_set_filter)(GtkFileChooser *chooser,
 426     GtkFileFilter *filter);
 427 static GType (*fp_gtk_file_chooser_get_type)(void);
 428 static GtkFileFilter* (*fp_gtk_file_filter_new)(void);
 429 static void (*fp_gtk_file_chooser_set_do_overwrite_confirmation)(
 430     GtkFileChooser *chooser, gboolean do_overwrite_confirmation);
 431 static void (*fp_gtk_file_chooser_set_select_multiple)(
 432     GtkFileChooser *chooser, gboolean select_multiple);
 433 static gchar* (*fp_gtk_file_chooser_get_current_folder)(GtkFileChooser *chooser);
 434 static GSList* (*fp_gtk_file_chooser_get_filenames)(GtkFileChooser *chooser);
 435 static guint (*fp_gtk_g_slist_length)(GSList *list);
 436 static 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);
 439 static void (*fp_gtk_widget_show)(void *widget);
 440 static void (*fp_gtk_main)(void);
 441 static guint (*fp_gtk_main_level)(void);
 442 static gchar* (*fp_g_path_get_dirname) (const gchar *file_name);
 443 static XID (*fp_gdk_x11_drawable_get_xid) (GdkWindow *drawable);
 444 
 445 static GList* (*fp_g_list_append) (GList *list, gpointer data);
 446 static void (*fp_g_list_free) (GList *list);
 447 static void (*fp_g_list_free_full) (GList *list, GDestroyNotify free_func);
 448 
 449 static gboolean (*fp_gtk_show_uri)(GdkScreen *screen, const gchar *uri,
 450     guint32 timestamp, GError **error);
 451 
 452 #endif /* !_GTK2_INTERFACE_H */