| /******************************************************************************* |
| * Copyright (c) 2000, 2013 IBM Corporation and others. All rights reserved. |
| * The contents of this file are made available under the terms |
| * of the GNU Lesser General Public License (LGPL) Version 2.1 that |
| * accompanies this distribution (lgpl-v21.txt). The LGPL is also |
| * available at http://www.gnu.org/licenses/lgpl.html. If the version |
| * of the LGPL at http://www.gnu.org is different to the version of |
| * the LGPL accompanying this distribution and there is any conflict |
| * between the two license versions, the terms of the LGPL accompanying |
| * this distribution shall govern. |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| |
| #include "swt.h" |
| #include "os_structs.h" |
| #include "os_stats.h" |
| |
| #define OS_NATIVE(func) Java_org_eclipse_swt_internal_gtk_OS_##func |
| |
| #ifndef NO_GDK_1WINDOWING_1X11 |
| JNIEXPORT jboolean JNICALL OS_NATIVE(GDK_1WINDOWING_1X11) |
| (JNIEnv *env, jclass that) |
| { |
| jboolean rc; |
| OS_NATIVE_ENTER(env, that, GDK_1WINDOWING_1X11_FUNC) |
| #ifdef GDK_WINDOWING_X11 |
| rc = (jboolean)1; |
| #else |
| rc = (jboolean)0; |
| #endif |
| OS_NATIVE_EXIT(env, that, GDK_1WINDOWING_1X11_FUNC) |
| return rc; |
| } |
| #endif |
| |
| #ifndef NO_GDK_1WINDOWING_1WAYLAND |
| JNIEXPORT jboolean JNICALL OS_NATIVE(GDK_1WINDOWING_1WAYLAND) |
| (JNIEnv *env, jclass that) |
| { |
| jboolean rc; |
| OS_NATIVE_ENTER(env, that, GDK_1WINDOWING_1WAYLAND_FUNC) |
| #ifdef GDK_WINDOWING_WAYLAND |
| rc = (jboolean)1; |
| #else |
| rc = (jboolean)0; |
| #endif |
| OS_NATIVE_EXIT(env, that, GDK_1WINDOWING_1WAYLAND_FUNC) |
| return rc; |
| } |
| #endif |
| |
| #ifndef NO_imContextNewProc_1CALLBACK |
| static jlong superIMContextNewProc; |
| static GtkIMContext* lastIMContext; |
| static GtkIMContext* imContextNewProc (GType type, guint n_construct_properties, GObjectConstructParam * construct_properties) { |
| GtkIMContext* context = ((GtkIMContext * (*)(GType, guint, GObjectConstructParam *))superIMContextNewProc)(type, n_construct_properties, construct_properties); |
| lastIMContext = context; |
| return context; |
| } |
| #ifndef NO_imContextLast |
| JNIEXPORT jlong JNICALL OS_NATIVE(imContextLast) |
| (JNIEnv *env, jclass that) |
| { |
| jlong rc = 0; |
| OS_NATIVE_ENTER(env, that, imContextLast_FUNC); |
| rc = (jlong)lastIMContext; |
| OS_NATIVE_EXIT(env, that, imContextLast_FUNC); |
| return rc; |
| } |
| #endif |
| |
| JNIEXPORT jlong JNICALL OS_NATIVE(imContextNewProc_1CALLBACK) |
| (JNIEnv *env, jclass that, jlong arg0) |
| { |
| jlong rc = 0; |
| OS_NATIVE_ENTER(env, that, imContextNewProc_1CALLBACK_FUNC); |
| superIMContextNewProc = arg0; |
| rc = (jlong)imContextNewProc; |
| OS_NATIVE_EXIT(env, that, imContextNewProc_1CALLBACK_FUNC); |
| return rc; |
| } |
| #endif |
| |
| #ifndef NO_pangoLayoutNewProc_1CALLBACK |
| static jlong superPangoLayoutNewProc; |
| static PangoLayout * pangoLayoutNewProc (GType type, guint n_construct_properties, GObjectConstructParam * construct_properties) { |
| PangoLayout* layout = ((PangoLayout * (*)(GType, guint, GObjectConstructParam *))superPangoLayoutNewProc)(type, n_construct_properties, construct_properties); |
| pango_layout_set_auto_dir (layout, 0); |
| return layout; |
| } |
| JNIEXPORT jlong JNICALL OS_NATIVE(pangoLayoutNewProc_1CALLBACK) |
| (JNIEnv *env, jclass that, jlong arg0) |
| { |
| jlong rc = 0; |
| OS_NATIVE_ENTER(env, that, pangoLayoutNewProc_1CALLBACK_FUNC); |
| superPangoLayoutNewProc = arg0; |
| rc = (jlong)pangoLayoutNewProc; |
| OS_NATIVE_EXIT(env, that, pangoLayoutNewProc_1CALLBACK_FUNC); |
| return rc; |
| } |
| #endif |
| |
| #ifndef NO_pangoFontFamilyNewProc_1CALLBACK |
| static jlong superPangoFontFamilyNewProc; |
| static PangoFontFamily * pangoFontFamilyNewProc (GType type, guint n_construct_properties, GObjectConstructParam * construct_properties) { |
| PangoFontFamily* fontFamily = ((PangoFontFamily * (*)(GType, guint, GObjectConstructParam *))superPangoFontFamilyNewProc)(type, n_construct_properties, construct_properties); |
| return fontFamily; |
| } |
| JNIEXPORT jlong JNICALL OS_NATIVE(pangoFontFamilyNewProc_1CALLBACK) |
| (JNIEnv *env, jclass that, jlong arg0) |
| { |
| jlong rc = 0; |
| OS_NATIVE_ENTER(env, that, pangoFontFamilyNewProc_1CALLBACK_FUNC); |
| superPangoFontFamilyNewProc = arg0; |
| rc = (jlong)pangoFontFamilyNewProc; |
| OS_NATIVE_EXIT(env, that, pangoFontFamilyNewProc_1CALLBACK_FUNC); |
| return rc; |
| } |
| #endif |
| |
| #ifndef NO_pangoFontFaceNewProc_1CALLBACK |
| static jlong superPangoFontFaceNewProc; |
| static PangoFontFace * pangoFontFaceNewProc (GType type, guint n_construct_properties, GObjectConstructParam * construct_properties) { |
| PangoFontFace* fontFace = ((PangoFontFace * (*)(GType, guint, GObjectConstructParam *))superPangoFontFaceNewProc)(type, n_construct_properties, construct_properties); |
| return fontFace; |
| } |
| JNIEXPORT jlong JNICALL OS_NATIVE(pangoFontFaceNewProc_1CALLBACK) |
| (JNIEnv *env, jclass that, jlong arg0) |
| { |
| jlong rc = 0; |
| OS_NATIVE_ENTER(env, that, pangoFontFaceNewProc_1CALLBACK_FUNC); |
| superPangoFontFaceNewProc = arg0; |
| rc = (jlong)pangoFontFaceNewProc; |
| OS_NATIVE_EXIT(env, that, pangoFontFaceNewProc_1CALLBACK_FUNC); |
| return rc; |
| } |
| #endif |
| #ifndef NO_printerOptionWidgetNewProc_1CALLBACK |
| static jlong superPrinterOptionWidgetNewProc; |
| static GType * printerOptionWidgetNewProc (GType type, guint n_construct_properties, GObjectConstructParam * construct_properties) { |
| GType* printerOptionWidget = ((GType * (*)(GType, guint, GObjectConstructParam *))superPrinterOptionWidgetNewProc)(type, n_construct_properties, construct_properties); |
| return printerOptionWidget; |
| } |
| JNIEXPORT jlong JNICALL OS_NATIVE(printerOptionWidgetNewProc_1CALLBACK) |
| (JNIEnv *env, jclass that, jlong arg0) |
| { |
| jlong rc = 0; |
| OS_NATIVE_ENTER(env, that, printerOptionWidgetNewProc_1CALLBACK_FUNC); |
| superPrinterOptionWidgetNewProc = arg0; |
| rc = (jlong)printerOptionWidgetNewProc; |
| OS_NATIVE_EXIT(env, that, printerOptionWidgetNewProc_1CALLBACK_FUNC); |
| return rc; |
| } |
| #endif |
| |
| glong g_utf16_strlen(const gchar *str, glong max) { |
| const gchar *s = str; |
| guchar ch; |
| glong offset = 0; |
| if (!s || max == 0) return 0; |
| if (max < 0) { |
| while (*s) { |
| if (0xf0 <= *(guchar*)s && *(guchar*)s <= 0xfd) offset++; |
| s = g_utf8_next_char (s); |
| offset++; |
| } |
| |
| } else { |
| while (*s) { |
| ch = *(guchar*)s; |
| s = g_utf8_next_char (s); |
| if (s - str > max) break; |
| if (0xf0 <= ch && ch <= 0xfd) offset++; |
| offset++; |
| } |
| } |
| return offset; |
| } |
| |
| glong g_utf16_pointer_to_offset(const gchar *str, const gchar * pos) { |
| const gchar *s = str; |
| glong offset = 0; |
| if (!s || !pos) return 0; |
| while (s < pos && *s) { |
| if (0xf0 <= *(guchar*)s && *(guchar*)s <= 0xfd) offset++; |
| s = g_utf8_next_char (s); |
| offset++; |
| } |
| return offset; |
| } |
| |
| gchar* g_utf16_offset_to_pointer(const gchar* str, glong offset) { |
| const gchar *s = str; |
| if (!s) return 0; |
| while (offset-- > 0 && *s) { |
| if (0xf0 <= *(guchar*)s && *(guchar*)s <= 0xfd) offset--; |
| s = g_utf8_next_char (s); |
| } |
| return (gchar *)s; |
| } |
| |
| glong g_utf16_offset_to_utf8_offset(const gchar* str, glong offset) { |
| glong r = 0; |
| const gchar *s = str; |
| if (!s) return 0; |
| while (offset-- > 0 && *s) { |
| if (0xf0 <= *(guchar*)s && *(guchar*)s <= 0xfd) offset--; |
| s = g_utf8_next_char (s); |
| r++; |
| } |
| return r; |
| } |
| |
| glong g_utf8_offset_to_utf16_offset(const gchar* str, glong offset) { |
| glong r = 0; |
| const gchar *s = str; |
| if (!s) return 0; |
| while (offset-- > 0 && *s) { |
| if (0xf0 <= *(guchar*)s && *(guchar*)s <= 0xfd) r++; |
| s = g_utf8_next_char (s); |
| r++; |
| } |
| return r; |
| } |
| |
| #if !defined(GTK4) |
| |
| struct _SwtFixedPrivate { |
| GtkAdjustment *hadjustment; |
| GtkAdjustment *vadjustment; |
| guint hscroll_policy : 1; |
| guint vscroll_policy : 1; |
| GList *children; |
| }; |
| |
| struct _SwtFixedChild |
| { |
| GtkWidget *widget; |
| gint x; |
| gint y; |
| gint width; |
| gint height; |
| }; |
| typedef struct _SwtFixedChild SwtFixedChild; |
| |
| enum { |
| PROP_0, |
| PROP_HADJUSTMENT, |
| PROP_VADJUSTMENT, |
| PROP_HSCROLL_POLICY, |
| PROP_VSCROLL_POLICY, |
| }; |
| |
| static void swt_fixed_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); |
| static void swt_fixed_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); |
| static void swt_fixed_finalize (GObject *object); |
| static void swt_fixed_realize (GtkWidget *widget); |
| static void swt_fixed_map (GtkWidget *widget); |
| static AtkObject *swt_fixed_get_accessible (GtkWidget *widget); |
| static void swt_fixed_get_preferred_width (GtkWidget *widget, gint *minimum, gint *natural); |
| static void swt_fixed_get_preferred_height (GtkWidget *widget, gint *minimum, gint *natural); |
| static void swt_fixed_size_allocate (GtkWidget *widget, GtkAllocation *allocation); |
| static void swt_fixed_add (GtkContainer *container, GtkWidget *widget); |
| static void swt_fixed_remove (GtkContainer *container, GtkWidget *widget); |
| static void swt_fixed_forall (GtkContainer *container, gboolean include_internals, GtkCallback callback, gpointer callback_data); |
| |
| G_DEFINE_TYPE_WITH_CODE (SwtFixed, swt_fixed, GTK_TYPE_CONTAINER, |
| G_IMPLEMENT_INTERFACE (GTK_TYPE_SCROLLABLE, NULL) |
| G_ADD_PRIVATE (SwtFixed)) |
| |
| static void swt_fixed_class_init (SwtFixedClass *class) { |
| GObjectClass *gobject_class = (GObjectClass*) class; |
| GtkWidgetClass *widget_class = (GtkWidgetClass*) class; |
| GtkContainerClass *container_class = (GtkContainerClass*) class; |
| |
| /* GOject implementation */ |
| gobject_class->set_property = swt_fixed_set_property; |
| gobject_class->get_property = swt_fixed_get_property; |
| gobject_class->finalize = swt_fixed_finalize; |
| |
| /* Scrollable implemetation */ |
| g_object_class_override_property (gobject_class, PROP_HADJUSTMENT, "hadjustment"); |
| g_object_class_override_property (gobject_class, PROP_VADJUSTMENT, "vadjustment"); |
| g_object_class_override_property (gobject_class, PROP_HSCROLL_POLICY, "hscroll-policy"); |
| g_object_class_override_property (gobject_class, PROP_VSCROLL_POLICY, "vscroll-policy"); |
| |
| /* Widget implementation */ |
| widget_class->realize = swt_fixed_realize; |
| widget_class->map = swt_fixed_map; |
| widget_class->get_preferred_width = swt_fixed_get_preferred_width; |
| widget_class->get_preferred_height = swt_fixed_get_preferred_height; |
| widget_class->size_allocate = swt_fixed_size_allocate; |
| |
| /* Accessibility implementation */ |
| widget_class->get_accessible = swt_fixed_get_accessible; |
| |
| /* Container implementation */ |
| container_class->add = swt_fixed_add; |
| container_class->remove = swt_fixed_remove; |
| container_class->forall = swt_fixed_forall; |
| |
| } |
| |
| void swt_fixed_restack (SwtFixed *fixed, GtkWidget *widget, GtkWidget *sibling, gboolean above) { |
| SwtFixedPrivate *priv = fixed->priv; |
| GList *list; |
| SwtFixedChild *child, *sibling_child; |
| |
| list = priv->children; |
| while (list) { |
| child = list->data; |
| if (child->widget == widget) break; |
| list = list->next; |
| } |
| |
| if (!list) return; |
| priv->children = g_list_remove_link (priv->children, list); |
| g_list_free_1 (list); |
| |
| list = NULL; |
| if (sibling) { |
| list = priv->children; |
| while (list) { |
| sibling_child = list->data; |
| if (sibling_child->widget == sibling) { |
| break; |
| } |
| list = list->next; |
| } |
| if (list) { |
| if (!above) list = list->next; |
| } |
| } |
| if (!list) { |
| list = above ? priv->children : NULL; |
| } |
| priv->children = g_list_insert_before (priv->children, list, child); |
| |
| /* |
| { |
| GdkWindow *sibling_window = NULL; |
| if (list) { |
| child = list->data; |
| sibling_window = gtk_widget_get_window (child); |
| } |
| gdk_window_restack (gtk_widget_get_window (widget), sibling_window, above); |
| } |
| */ |
| } |
| |
| static void swt_fixed_init (SwtFixed *widget) { |
| SwtFixedPrivate *priv; |
| |
| priv = widget->priv = swt_fixed_get_instance_private (widget); |
| priv->children = NULL; |
| priv->hadjustment = NULL; |
| priv->vadjustment = NULL; |
| } |
| |
| static void swt_fixed_finalize (GObject *object) { |
| SwtFixed *widget = SWT_FIXED (object); |
| SwtFixedPrivate *priv = widget->priv; |
| |
| g_object_unref (priv->hadjustment); |
| g_object_unref (priv->vadjustment); |
| g_clear_object (&widget->accessible); |
| |
| G_OBJECT_CLASS (swt_fixed_parent_class)->finalize (object); |
| } |
| |
| static void swt_fixed_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { |
| SwtFixed *widget = SWT_FIXED (object); |
| SwtFixedPrivate *priv = widget->priv; |
| |
| switch (prop_id) { |
| case PROP_HADJUSTMENT: |
| g_value_set_object (value, priv->hadjustment); |
| break; |
| case PROP_VADJUSTMENT: |
| g_value_set_object (value, priv->vadjustment); |
| break; |
| case PROP_HSCROLL_POLICY: |
| g_value_set_enum (value, priv->hscroll_policy); |
| break; |
| case PROP_VSCROLL_POLICY: |
| g_value_set_enum (value, priv->vscroll_policy); |
| break; |
| default: |
| G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); |
| break; |
| } |
| } |
| |
| static void swt_fixed_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { |
| SwtFixed *widget = SWT_FIXED (object); |
| SwtFixedPrivate *priv = widget->priv; |
| GtkAdjustment *adjustment; |
| |
| switch (prop_id) { |
| case PROP_HADJUSTMENT: |
| adjustment = g_value_get_object (value); |
| if (adjustment && priv->hadjustment == adjustment) return; |
| if (priv->hadjustment != NULL) g_object_unref (priv->hadjustment); |
| if (adjustment == NULL) adjustment = gtk_adjustment_new (0.0, 0.0, 0.0, 0.0, 0.0, 0.0); |
| priv->hadjustment = g_object_ref_sink (adjustment); |
| g_object_notify (G_OBJECT (widget), "hadjustment"); |
| break; |
| case PROP_VADJUSTMENT: |
| adjustment = g_value_get_object (value); |
| if (adjustment && priv->vadjustment == adjustment) return; |
| if (priv->vadjustment != NULL) g_object_unref (priv->vadjustment); |
| if (adjustment == NULL) adjustment = gtk_adjustment_new (0.0, 0.0, 0.0, 0.0, 0.0, 0.0); |
| priv->vadjustment = g_object_ref_sink (adjustment); |
| g_object_notify (G_OBJECT (widget), "vadjustment"); |
| break; |
| case PROP_HSCROLL_POLICY: |
| priv->hscroll_policy = g_value_get_enum (value); |
| break; |
| case PROP_VSCROLL_POLICY: |
| priv->vscroll_policy = g_value_get_enum (value); |
| break; |
| default: |
| G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); |
| break; |
| } |
| } |
| |
| static void swt_fixed_realize (GtkWidget *widget) { |
| GtkAllocation allocation; |
| GdkWindow *window; |
| GdkWindowAttr attributes; |
| gint attributes_mask; |
| |
| if (!gtk_widget_get_has_window (widget)) { |
| GTK_WIDGET_CLASS (swt_fixed_parent_class)->realize (widget); |
| return; |
| } |
| |
| gtk_widget_set_realized (widget, TRUE); |
| |
| gtk_widget_get_allocation (widget, &allocation); |
| |
| attributes.window_type = GDK_WINDOW_CHILD; |
| attributes.x = allocation.x; |
| attributes.y = allocation.y; |
| attributes.width = allocation.width; |
| attributes.height = allocation.height; |
| attributes.wclass = GDK_INPUT_OUTPUT; |
| attributes.visual = gtk_widget_get_visual (widget); |
| attributes.event_mask = GDK_EXPOSURE_MASK | GDK_SCROLL_MASK | 1 << 23 /*GDK_SMOOTH_SCROLL_MASK*/ | gtk_widget_get_events (widget); |
| attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL; |
| window = gdk_window_new (gtk_widget_get_parent_window (widget), &attributes, attributes_mask); |
| gtk_widget_set_window (widget, window); |
| gdk_window_set_user_data (window, widget); |
| if (NULL != gtk_check_version (3, 18, 0)) { |
| G_GNUC_BEGIN_IGNORE_DEPRECATIONS |
| gtk_style_context_set_background (gtk_widget_get_style_context (widget), window); |
| G_GNUC_END_IGNORE_DEPRECATIONS |
| } |
| } |
| |
| static void swt_fixed_map (GtkWidget *widget) { |
| SwtFixed *fixed = SWT_FIXED (widget); |
| SwtFixedPrivate *priv = fixed->priv; |
| GList *list; |
| |
| gtk_widget_set_mapped (widget, TRUE); |
| list = priv->children; |
| while (list) { |
| SwtFixedChild *child_data = list->data; |
| GtkWidget *child = child_data->widget; |
| list = list->next; |
| if (gtk_widget_get_visible (child)) { |
| if (!gtk_widget_get_mapped (child)) gtk_widget_map (child); |
| } |
| } |
| if (gtk_widget_get_has_window (widget)) { |
| //NOTE: contrary to most of GTK, swt_fixed_* container does not raise windows upon showing them. |
| //This has the effect that widgets are drawn *beneath* the previous one. |
| //E.g if this line is changed to gdk_window_show (..) then widgets are drawn on top of the previous one. |
| //This affects mostly only the absolute layout with overlapping widgets, e.g minimizied panels that |
| //pop-out in Eclipse (aka fast-view). |
| //As such, be attentive to swt_fixed_forall(..); traversing children may need to be done in reverse in some |
| //cases. |
| gdk_window_show_unraised (gtk_widget_get_window (widget)); |
| } |
| } |
| |
| /* Accessibility */ |
| static AtkObject *swt_fixed_get_accessible (GtkWidget *widget) { |
| SwtFixed *fixed = SWT_FIXED (widget); |
| |
| if (!fixed->accessible) { |
| fixed->accessible = swt_fixed_accessible_new (widget); |
| } |
| return fixed->accessible; |
| } |
| |
| static void swt_fixed_get_preferred_width (GtkWidget *widget, gint *minimum, gint *natural) { |
| if (minimum) *minimum = 0; |
| if (natural) *natural = 0; |
| } |
| |
| static void swt_fixed_get_preferred_height (GtkWidget *widget, gint *minimum, gint *natural) { |
| if (minimum) *minimum = 0; |
| if (natural) *natural = 0; |
| } |
| |
| static void swt_fixed_size_allocate (GtkWidget *widget, GtkAllocation *allocation) { |
| SwtFixed *fixed = SWT_FIXED (widget); |
| SwtFixedPrivate *priv = fixed->priv; |
| GList *list; |
| GtkAllocation child_allocation; |
| GtkRequisition requisition; |
| gint w, h; |
| |
| gtk_widget_set_allocation (widget, allocation); |
| |
| if (gtk_widget_get_has_window (widget)) { |
| if (gtk_widget_get_realized (widget)) { |
| gdk_window_move_resize (gtk_widget_get_window (widget), allocation->x, allocation->y, allocation->width, allocation->height); |
| } |
| } |
| |
| list = priv->children; |
| |
| while (list) { |
| SwtFixedChild *child_data = list->data; |
| GtkWidget *child = child_data->widget; |
| list = list->next; |
| |
| child_allocation.x = child_data->x; |
| child_allocation.y = child_data->y; |
| if (!gtk_widget_get_has_window (widget)) { |
| child_allocation.x += allocation->x; |
| child_allocation.y += allocation->y; |
| } |
| |
| w = child_data->width; |
| h = child_data->height; |
| if (w == -1 || h == -1) { |
| gtk_widget_get_preferred_size (child, &requisition, NULL); |
| if (w == -1) w = requisition.width; |
| if (h == -1) h = requisition.height; |
| } |
| // Feature in GTK: gtk_widget_preferred_size() has to be called before |
| // gtk_widget_size_allocate otherwise a warning is thrown. See Bug 486068. |
| gtk_widget_get_preferred_size (child, &requisition, NULL); |
| |
| child_allocation.width = w; |
| child_allocation.height = h; |
| |
| gtk_widget_size_allocate (child, &child_allocation); |
| } |
| } |
| |
| void swt_fixed_move (SwtFixed *fixed, GtkWidget *widget, gint x, gint y) { |
| SwtFixedPrivate *priv = fixed->priv; |
| GList *list; |
| |
| list = priv->children; |
| while (list) { |
| SwtFixedChild *child_data = list->data; |
| GtkWidget *child = child_data->widget; |
| if (child == widget) { |
| child_data->x = x; |
| child_data->y = y; |
| break; |
| } |
| list = list->next; |
| } |
| } |
| |
| void swt_fixed_resize (SwtFixed *fixed, GtkWidget *widget, gint width, gint height) { |
| SwtFixedPrivate *priv = fixed->priv; |
| GList *list; |
| |
| list = priv->children; |
| while (list) { |
| SwtFixedChild *child_data = list->data; |
| GtkWidget *child = child_data->widget; |
| if (child == widget) { |
| child_data->width = width; |
| child_data->height = height; |
| |
| /* |
| * Feature in GTK: sometimes the sizing of child SwtFixed widgets |
| * does not happen quickly enough, causing miscalculations in SWT. |
| * Allocate the size of the child directly when swt_fixed_resize() |
| * is called. See bug 487160. |
| */ |
| GtkAllocation allocation, to_allocate; |
| GtkRequisition req; |
| gtk_widget_get_allocation(child, &allocation); |
| |
| // Keep x and y values the same to prevent misplaced containers |
| to_allocate.x = allocation.x; |
| to_allocate.y = allocation.y; |
| to_allocate.width = width; |
| to_allocate.height = height; |
| |
| // Call gtk_widget_get_preferred_size() and finish the allocation. |
| gtk_widget_get_preferred_size (child, &req, NULL); |
| gtk_widget_size_allocate(child, &to_allocate); |
| break; |
| } |
| list = list->next; |
| } |
| } |
| |
| static void swt_fixed_add (GtkContainer *container, GtkWidget *child) { |
| GtkWidget *widget = GTK_WIDGET (container); |
| SwtFixed *fixed = SWT_FIXED (container); |
| SwtFixedPrivate *priv = fixed->priv; |
| SwtFixedChild *child_data; |
| |
| child_data = g_new (SwtFixedChild, 1); |
| child_data->widget = child; |
| child_data->x = child_data->y = 0; |
| child_data->width = child_data->height = -1; |
| |
| priv->children = g_list_append (priv->children, child_data); |
| gtk_widget_set_parent (child, widget); |
| } |
| |
| static void swt_fixed_remove (GtkContainer *container, GtkWidget *widget) { |
| SwtFixed *fixed = SWT_FIXED (container); |
| SwtFixedPrivate *priv = fixed->priv; |
| GList *list; |
| |
| list = priv->children; |
| while (list) { |
| SwtFixedChild *child_data = list->data; |
| GtkWidget *child = child_data->widget; |
| if (child == widget) { |
| gtk_widget_unparent (widget); |
| priv->children = g_list_remove_link (priv->children, list); |
| g_list_free_1 (list); |
| g_free (child_data); |
| break; |
| } |
| list = list->next; |
| } |
| } |
| |
| static void swt_fixed_forall (GtkContainer *container, gboolean include_internals, GtkCallback callback, gpointer callback_data) { |
| SwtFixed *fixed = SWT_FIXED (container); |
| SwtFixedPrivate *priv = fixed->priv; |
| GList *list; |
| |
| list = priv->children; |
| |
| // NOTE: The direction of the list traversal is conditional. |
| // |
| // 1) When we do a *_foreach() traversal (i.e, include_internals==FALSE), we traverse the list as normal |
| // from front to back. |
| // This is used to layout higher level widgets inside containers (e.g row/grid etc..) in the expected way. |
| // If for a non-internal traversal we were to go in reverse, then widgets would get laid out in inverse order. |
| // 2) When we do a *_forall() traversal (i.e, include_internals==TRUE), we traverse the list in *reverse* order. |
| // This is an internal traversal of the internals of a widget. Reverse traversal is necessary for things like |
| // DnD Drop and DnD Motion events to find the correct widget in the case of overlapping widgets on an absolute layout. |
| // Reversal is required because in swt_fixed_map(..) we do not raise the widget when we show it, as a result |
| // the stack is in reverse. |
| if (include_internals) |
| list = g_list_last(list); |
| |
| while (list) { |
| SwtFixedChild *child_data = list->data; |
| GtkWidget *child = child_data->widget; |
| |
| if (include_internals) |
| list = list->prev; |
| else |
| list = list->next; |
| |
| (* callback) (child, callback_data); |
| } |
| } |
| |
| #else |
| struct _SwtFixedPrivate { |
| GtkAdjustment *hadjustment; |
| GtkAdjustment *vadjustment; |
| guint hscroll_policy : 1; |
| guint vscroll_policy : 1; |
| GList *children; |
| }; |
| |
| struct _SwtFixedChild |
| { |
| GtkWidget *widget; |
| gint x; |
| gint y; |
| gint width; |
| gint height; |
| }; |
| typedef struct _SwtFixedChild SwtFixedChild; |
| |
| enum { |
| PROP_0, |
| PROP_HADJUSTMENT, |
| PROP_VADJUSTMENT, |
| PROP_HSCROLL_POLICY, |
| PROP_VSCROLL_POLICY, |
| }; |
| |
| enum { |
| RESIZE, |
| LAST_SIGNAL |
| }; |
| |
| static guint signals[LAST_SIGNAL]; |
| |
| static void swt_fixed_dispose(GObject* object); |
| static void swt_fixed_finalize(GObject* object); |
| static void swt_fixed_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); |
| static void swt_fixed_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); |
| |
| static void swt_fixed_measure (GtkWidget *widget, GtkOrientation orientation, int for_size, int *minimum, |
| int *natural, int *minimum_baseline, int *natural_baseline); |
| static void swt_fixed_size_allocate (GtkWidget *widget, int width, int height, int baseline); |
| |
| G_DEFINE_TYPE_WITH_CODE (SwtFixed, swt_fixed, GTK_TYPE_WIDGET, |
| G_IMPLEMENT_INTERFACE (GTK_TYPE_SCROLLABLE, NULL) |
| G_ADD_PRIVATE (SwtFixed)) |
| |
| static void swt_fixed_class_init (SwtFixedClass *class) { |
| /* GObject implementation */ |
| GObjectClass *gobject_class = (GObjectClass*) class; |
| gobject_class->set_property = swt_fixed_set_property; |
| gobject_class->get_property = swt_fixed_get_property; |
| gobject_class->finalize = swt_fixed_finalize; |
| gobject_class->dispose = swt_fixed_dispose; |
| |
| /* Scrollable implementation */ |
| g_object_class_override_property (gobject_class, PROP_HADJUSTMENT, "hadjustment"); |
| g_object_class_override_property (gobject_class, PROP_VADJUSTMENT, "vadjustment"); |
| g_object_class_override_property (gobject_class, PROP_HSCROLL_POLICY, "hscroll-policy"); |
| g_object_class_override_property (gobject_class, PROP_VSCROLL_POLICY, "vscroll-policy"); |
| |
| /* Widget implementation */ |
| GtkWidgetClass* widget_class = (GtkWidgetClass*) class; |
| widget_class->measure = swt_fixed_measure; |
| widget_class->size_allocate = swt_fixed_size_allocate; |
| |
| signals[RESIZE] = g_signal_new( |
| "resize", |
| G_TYPE_FROM_CLASS (class), |
| G_SIGNAL_RUN_LAST, |
| 0, NULL, NULL, NULL, |
| G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_INT); |
| } |
| |
| void swt_fixed_restack (SwtFixed *fixed, GtkWidget *widget, GtkWidget *sibling, gboolean above) { |
| SwtFixedPrivate* priv = swt_fixed_get_instance_private(fixed); |
| GList *list; |
| SwtFixedChild *child, *sibling_child; |
| |
| list = priv->children; |
| while (list) { |
| child = list->data; |
| if (child->widget == widget) break; |
| list = list->next; |
| } |
| |
| if (!list) return; |
| priv->children = g_list_remove_link (priv->children, list); |
| g_list_free_1 (list); |
| |
| list = NULL; |
| if (sibling) { |
| list = priv->children; |
| while (list) { |
| sibling_child = list->data; |
| if (sibling_child->widget == sibling) { |
| break; |
| } |
| list = list->next; |
| } |
| if (list) { |
| if (!above) list = list->next; |
| } |
| } |
| if (!list) { |
| list = above ? priv->children : NULL; |
| } |
| priv->children = g_list_insert_before (priv->children, list, child); |
| } |
| |
| static void swt_fixed_init (SwtFixed* fixed) { |
| SwtFixedPrivate* priv = swt_fixed_get_instance_private(fixed); |
| |
| priv->children = NULL; |
| priv->hadjustment = NULL; |
| priv->vadjustment = NULL; |
| } |
| |
| static void swt_fixed_dispose(GObject* object) { |
| GtkWidget* child; |
| while ((child = gtk_widget_get_first_child(GTK_WIDGET(object)))) { |
| swt_fixed_remove(SWT_FIXED(object), child); |
| } |
| |
| G_OBJECT_CLASS(swt_fixed_parent_class)->dispose(object); |
| } |
| |
| static void swt_fixed_finalize (GObject *object) { |
| SwtFixedPrivate *priv = swt_fixed_get_instance_private(SWT_FIXED(object)); |
| |
| g_object_unref(priv->hadjustment); |
| g_object_unref(priv->vadjustment); |
| |
| G_OBJECT_CLASS(swt_fixed_parent_class)->finalize(object); |
| } |
| |
| static void swt_fixed_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { |
| SwtFixedPrivate *priv = swt_fixed_get_instance_private(SWT_FIXED(object)); |
| |
| switch (prop_id) { |
| case PROP_HADJUSTMENT: |
| g_value_set_object (value, priv->hadjustment); |
| break; |
| case PROP_VADJUSTMENT: |
| g_value_set_object (value, priv->vadjustment); |
| break; |
| case PROP_HSCROLL_POLICY: |
| g_value_set_enum (value, priv->hscroll_policy); |
| break; |
| case PROP_VSCROLL_POLICY: |
| g_value_set_enum (value, priv->vscroll_policy); |
| break; |
| default: |
| G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); |
| break; |
| } |
| } |
| |
| static void swt_fixed_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { |
| SwtFixedPrivate *priv = swt_fixed_get_instance_private(SWT_FIXED(object)); |
| GtkAdjustment *adjustment; |
| |
| switch (prop_id) { |
| case PROP_HADJUSTMENT: |
| adjustment = g_value_get_object (value); |
| if (adjustment && priv->hadjustment == adjustment) return; |
| if (priv->hadjustment != NULL) g_object_unref (priv->hadjustment); |
| if (adjustment == NULL) adjustment = gtk_adjustment_new (0.0, 0.0, 0.0, 0.0, 0.0, 0.0); |
| priv->hadjustment = g_object_ref_sink (adjustment); |
| g_object_notify (object, "hadjustment"); |
| break; |
| case PROP_VADJUSTMENT: |
| adjustment = g_value_get_object (value); |
| if (adjustment && priv->vadjustment == adjustment) return; |
| if (priv->vadjustment != NULL) g_object_unref (priv->vadjustment); |
| if (adjustment == NULL) adjustment = gtk_adjustment_new (0.0, 0.0, 0.0, 0.0, 0.0, 0.0); |
| priv->vadjustment = g_object_ref_sink (adjustment); |
| g_object_notify (object, "vadjustment"); |
| break; |
| case PROP_HSCROLL_POLICY: |
| priv->hscroll_policy = g_value_get_enum (value); |
| break; |
| case PROP_VSCROLL_POLICY: |
| priv->vscroll_policy = g_value_get_enum (value); |
| break; |
| default: |
| G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); |
| break; |
| } |
| } |
| |
| static void swt_fixed_measure (GtkWidget *widget, GtkOrientation orientation, int for_size, int *minimum, int *natural, int *minimum_baseline, int *natural_baseline) { |
| for (GtkWidget* child = gtk_widget_get_first_child(widget); child != NULL; child = gtk_widget_get_next_sibling(child)) { |
| int child_nat = 0; |
| |
| gtk_widget_measure(child, orientation, -1, NULL, &child_nat, NULL, NULL); |
| *natural = MAX(*natural, child_nat); |
| } |
| |
| if (minimum) *minimum = 0; |
| if (minimum_baseline) *minimum_baseline = -1; |
| if (natural_baseline) *natural_baseline = -1; |
| } |
| |
| static void swt_fixed_size_allocate (GtkWidget *widget, int width, int height, int baseline) { |
| g_signal_emit (widget, signals[RESIZE], 0, width, height); |
| |
| SwtFixedPrivate *priv = swt_fixed_get_instance_private(SWT_FIXED(widget)); |
| |
| GList* list = priv->children; |
| |
| while (list) { |
| SwtFixedChild *child_data = list->data; |
| GtkWidget *child = child_data->widget; |
| |
| GtkAllocation child_allocation; |
| child_allocation.x = child_data->x; |
| child_allocation.y = child_data->y; |
| |
| int w = child_data->width; |
| int h = child_data->height; |
| if (w == -1 || h == -1) { |
| GtkRequisition requisition; |
| gtk_widget_get_preferred_size (child, &requisition, NULL); |
| if (w == -1) w = requisition.width; |
| if (h == -1) h = requisition.height; |
| } |
| |
| child_allocation.width = w; |
| child_allocation.height = h; |
| |
| gtk_widget_size_allocate (child, &child_allocation, -1); |
| |
| list = list->next; |
| } |
| } |
| |
| void swt_fixed_move (SwtFixed *fixed, GtkWidget *widget, gint x, gint y) { |
| SwtFixedPrivate* priv = swt_fixed_get_instance_private(fixed); |
| GList* list = priv->children; |
| |
| while (list) { |
| SwtFixedChild* child_data = list->data; |
| GtkWidget* child = child_data->widget; |
| |
| if (child == widget) { |
| child_data->x = x; |
| child_data->y = y; |
| break; |
| } |
| |
| list = list->next; |
| } |
| } |
| |
| void swt_fixed_resize (SwtFixed *fixed, GtkWidget *widget, gint width, gint height) { |
| SwtFixedPrivate* priv = swt_fixed_get_instance_private(fixed); |
| GList* list = priv->children; |
| |
| while (list) { |
| SwtFixedChild* child_data = list->data; |
| GtkWidget* child = child_data->widget; |
| |
| if (child == widget) { |
| child_data->width = width; |
| child_data->height = height; |
| break; |
| } |
| |
| list = list->next; |
| } |
| } |
| |
| void swt_fixed_add (SwtFixed *fixed, GtkWidget *widget) { |
| g_return_if_fail(SWT_IS_FIXED(fixed)); |
| g_return_if_fail(GTK_IS_WIDGET(widget)); |
| g_return_if_fail(gtk_widget_get_parent(widget) == NULL); |
| |
| SwtFixedPrivate *priv = swt_fixed_get_instance_private(fixed); |
| |
| SwtFixedChild *child_data = g_new(SwtFixedChild, 1); |
| child_data->widget = widget; |
| child_data->x = child_data->y = 0; |
| child_data->width = child_data->height = -1; |
| |
| priv->children = g_list_append(priv->children, child_data); |
| |
| gtk_widget_set_parent(widget, GTK_WIDGET(fixed)); |
| } |
| |
| void swt_fixed_remove (SwtFixed *fixed, GtkWidget *widget) { |
| g_return_if_fail(SWT_IS_FIXED(fixed)); |
| g_return_if_fail(GTK_IS_WIDGET(widget)); |
| g_return_if_fail(gtk_widget_get_parent(widget) == GTK_WIDGET(fixed)); |
| |
| SwtFixedPrivate *priv = swt_fixed_get_instance_private(fixed); |
| GList *list = priv->children; |
| |
| while (list != NULL) { |
| SwtFixedChild *child_data = list->data; |
| GtkWidget *child = child_data->widget; |
| |
| if (child == widget) { |
| g_free(child_data); |
| priv->children = g_list_delete_link(priv->children, list); |
| |
| gtk_widget_unparent(widget); |
| break; |
| } |
| |
| list = list->next; |
| } |
| } |
| |
| #endif |
| |
| #if !defined(GTK4) |
| static void swt_fixed_accessible_class_init (SwtFixedAccessibleClass *klass); |
| static void swt_fixed_accessible_finalize (GObject *object); |
| static void swt_fixed_accessible_initialize (AtkObject *obj, gpointer data); |
| static AtkAttributeSet *swt_fixed_accessible_get_attributes (AtkObject *obj); |
| static const gchar *swt_fixed_accessible_get_description (AtkObject *obj); |
| static gint swt_fixed_accessible_get_index_in_parent (AtkObject *obj); |
| static gint swt_fixed_accessible_get_n_children (AtkObject *obj); |
| static const gchar *swt_fixed_accessible_get_name (AtkObject *obj); |
| static AtkObject *swt_fixed_accessible_get_parent (AtkObject *obj); |
| static AtkRole swt_fixed_accessible_get_role (AtkObject *obj); |
| static AtkObject *swt_fixed_accessible_ref_child (AtkObject *obj, gint i); |
| static AtkStateSet *swt_fixed_accesssible_ref_state_set (AtkObject *accessible); |
| static void swt_fixed_accessible_action_iface_init (AtkActionIface *iface); |
| static void swt_fixed_accessible_component_iface_init (AtkComponentIface *iface); |
| static void swt_fixed_accessible_editable_text_iface_init (AtkEditableTextIface *iface); |
| static void swt_fixed_accessible_hypertext_iface_init (AtkHypertextIface *iface); |
| static void swt_fixed_accessible_selection_iface_init (AtkSelectionIface *iface); |
| static void swt_fixed_accessible_table_iface_init (AtkTableIface *iface); |
| static void swt_fixed_accessible_text_iface_init (AtkTextIface *iface); |
| static void swt_fixed_accessible_value_iface_init (AtkValueIface *iface); |
| |
| struct _SwtFixedAccessiblePrivate { |
| // A boolean flag which is set to TRUE when an Accessible Java |
| // object has been created for this SwtFixedAccessible instance |
| gboolean has_accessible; |
| |
| // The GtkWidget this SwtFixedAccessible instance maps to. |
| GtkWidget *widget; |
| }; |
| |
| G_DEFINE_TYPE_WITH_CODE (SwtFixedAccessible, swt_fixed_accessible, GTK_TYPE_CONTAINER_ACCESSIBLE, |
| G_IMPLEMENT_INTERFACE (ATK_TYPE_ACTION, swt_fixed_accessible_action_iface_init) |
| G_IMPLEMENT_INTERFACE (ATK_TYPE_COMPONENT, swt_fixed_accessible_component_iface_init) |
| G_IMPLEMENT_INTERFACE (ATK_TYPE_EDITABLE_TEXT, swt_fixed_accessible_editable_text_iface_init) |
| G_IMPLEMENT_INTERFACE (ATK_TYPE_HYPERTEXT, swt_fixed_accessible_hypertext_iface_init) |
| G_IMPLEMENT_INTERFACE (ATK_TYPE_SELECTION, swt_fixed_accessible_selection_iface_init) |
| G_IMPLEMENT_INTERFACE (ATK_TYPE_TABLE, swt_fixed_accessible_table_iface_init) |
| G_IMPLEMENT_INTERFACE (ATK_TYPE_TEXT, swt_fixed_accessible_text_iface_init) |
| G_IMPLEMENT_INTERFACE (ATK_TYPE_VALUE, swt_fixed_accessible_value_iface_init) |
| G_ADD_PRIVATE (SwtFixedAccessible)) |
| |
| // Fully qualified Java class name for the Java implementation of ATK functions |
| const char *ACCESSIBILITY_CLASS_NAME = "org/eclipse/swt/accessibility/AccessibleObject"; |
| |
| static void swt_fixed_accessible_init (SwtFixedAccessible *accessible) { |
| // Initialize the SwtFixedAccessiblePrivate struct |
| accessible->priv = swt_fixed_accessible_get_instance_private (accessible); |
| } |
| |
| static void swt_fixed_accessible_class_init (SwtFixedAccessibleClass *klass) { |
| GObjectClass *object_class = G_OBJECT_CLASS (klass); |
| AtkObjectClass *atk_class = ATK_OBJECT_CLASS (klass); |
| |
| // Override GObject functions |
| object_class->finalize = swt_fixed_accessible_finalize; |
| |
| // Override AtkObject functions |
| atk_class->initialize = swt_fixed_accessible_initialize; |
| atk_class->get_attributes = swt_fixed_accessible_get_attributes; |
| atk_class->get_description = swt_fixed_accessible_get_description; |
| atk_class->get_index_in_parent = swt_fixed_accessible_get_index_in_parent; |
| atk_class->get_n_children = swt_fixed_accessible_get_n_children; |
| atk_class->get_name = swt_fixed_accessible_get_name; |
| atk_class->get_parent = swt_fixed_accessible_get_parent; |
| atk_class->get_role = swt_fixed_accessible_get_role; |
| atk_class->ref_child = swt_fixed_accessible_ref_child; |
| atk_class->ref_state_set = swt_fixed_accesssible_ref_state_set; |
| |
| } |
| |
| AtkObject *swt_fixed_accessible_new (GtkWidget *widget) { |
| AtkObject *accessible; |
| |
| g_return_val_if_fail (SWT_IS_FIXED (widget), NULL); |
| |
| // Create the SwtFixedAccessible instance and call the initializer |
| accessible = g_object_new (SWT_TYPE_FIXED_ACCESSIBLE, NULL); |
| atk_object_initialize (accessible, widget); |
| // Set the widget for this accessible, as not all SwtFixed instances |
| // have a matching Java Accessible. See bug 536974. |
| gtk_accessible_set_widget (GTK_ACCESSIBLE (accessible), widget); |
| |
| return accessible; |
| } |
| |
| static void swt_fixed_accessible_finalize (GObject *object) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (object); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| jlong returned_value = 0; |
| |
| // Call the Java implementation to ensure AccessibleObjects are removed |
| // from the HashMap on the Java side. |
| if (private->has_accessible) { |
| returned_value = call_accessible_object_function("gObjectClass_finalize", "(J)J", object); |
| if (returned_value != 0) g_critical ("Undefined behavior calling gObjectClass_finalize from C\n"); |
| } |
| |
| // Chain up to the parent class |
| G_OBJECT_CLASS (swt_fixed_accessible_parent_class)->finalize (object); |
| return; |
| } |
| |
| // This method is called from Java when an Accessible Java object that corresponds |
| // to this SwtFixedAccessible instance has been created. |
| void swt_fixed_accessible_register_accessible (AtkObject *obj, gboolean is_native, GtkWidget *to_map) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (obj); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| private->has_accessible = TRUE; |
| |
| if (!is_native) { |
| gtk_accessible_set_widget (GTK_ACCESSIBLE (obj), to_map); |
| private->widget = to_map; |
| } else { |
| // TODO_a11y: implement support for native GTK widgets on the Java side, |
| // some work might need to be done here. |
| } |
| return; |
| } |
| |
| static void swt_fixed_accessible_initialize (AtkObject *obj, gpointer data) { |
| // Call parent class initializer function |
| if (ATK_OBJECT_CLASS (swt_fixed_accessible_parent_class)->initialize != NULL) { |
| ATK_OBJECT_CLASS (swt_fixed_accessible_parent_class)->initialize (obj, data); |
| } |
| |
| SwtFixedAccessiblePrivate *private = SWT_FIXED_ACCESSIBLE (obj)->priv; |
| // If this SwtFixedAccessible instance has a corresponding Accessible |
| // Java object created for it, then we can map it to its widget. Otherwise, |
| // map it to NULL. This means that only widgets with an Accessible Java object |
| // created get ATK function/interface implementations. |
| if (private->has_accessible) { |
| gtk_accessible_set_widget (GTK_ACCESSIBLE (obj), GTK_WIDGET (data)); |
| } else { |
| gtk_accessible_set_widget (GTK_ACCESSIBLE (obj), NULL); |
| } |
| } |
| |
| static AtkAttributeSet *swt_fixed_accessible_get_attributes (AtkObject *obj) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (obj); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| jlong returned_value = 0; |
| |
| if (private->has_accessible) { |
| returned_value = call_accessible_object_function("atkObject_get_attributes", "(J)J", obj); |
| return (AtkAttributeSet *) returned_value; |
| } else { |
| return ATK_OBJECT_CLASS (swt_fixed_accessible_parent_class)->get_attributes (obj); |
| } |
| } |
| |
| static const gchar *swt_fixed_accessible_get_description (AtkObject *obj) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (obj); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| jlong returned_value = 0; |
| |
| if (private->has_accessible) { |
| returned_value = call_accessible_object_function("atkObject_get_description", "(J)J", obj); |
| return (const gchar *) returned_value; |
| } else { |
| return ATK_OBJECT_CLASS (swt_fixed_accessible_parent_class)->get_description (obj); |
| } |
| } |
| |
| static gint swt_fixed_accessible_get_index_in_parent (AtkObject *obj) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (obj); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| jlong returned_value = 0; |
| |
| if (private->has_accessible) { |
| returned_value = call_accessible_object_function("atkObject_get_index_in_parent", "(J)J", obj); |
| return (gint) returned_value; |
| } else { |
| return ATK_OBJECT_CLASS (swt_fixed_accessible_parent_class)->get_index_in_parent (obj); |
| } |
| } |
| |
| static gint swt_fixed_accessible_get_n_children (AtkObject *obj) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (obj); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| jlong returned_value = 0; |
| |
| if (private->has_accessible) { |
| returned_value = call_accessible_object_function("atkObject_get_n_children", "(J)J", obj); |
| return (gint) returned_value; |
| } else { |
| return ATK_OBJECT_CLASS (swt_fixed_accessible_parent_class)->get_n_children (obj); |
| } |
| } |
| |
| static const gchar *swt_fixed_accessible_get_name (AtkObject *obj) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (obj); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| jlong returned_value = 0; |
| |
| if (private->has_accessible) { |
| returned_value = call_accessible_object_function("atkObject_get_name", "(J)J", obj); |
| return (const gchar *) returned_value; |
| } else { |
| return ATK_OBJECT_CLASS (swt_fixed_accessible_parent_class)->get_name (obj); |
| } |
| } |
| |
| static AtkObject *swt_fixed_accessible_get_parent (AtkObject *obj) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (obj); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| jlong returned_value = 0; |
| |
| if (private->has_accessible) { |
| returned_value = call_accessible_object_function("atkObject_get_parent", "(J)J", obj); |
| return (AtkObject *) returned_value; |
| } else { |
| return ATK_OBJECT_CLASS (swt_fixed_accessible_parent_class)->get_parent (obj); |
| } |
| } |
| |
| static AtkRole swt_fixed_accessible_get_role (AtkObject *obj) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (obj); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| jlong returned_value = 0; |
| |
| if (private->has_accessible) { |
| returned_value = call_accessible_object_function("atkObject_get_role", "(J)J", obj); |
| return returned_value; |
| } else { |
| return ATK_OBJECT_CLASS (swt_fixed_accessible_parent_class)->get_role (obj); |
| } |
| } |
| |
| static AtkObject *swt_fixed_accessible_ref_child (AtkObject *obj, gint i) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (obj); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| jlong returned_value = 0; |
| |
| if (private->has_accessible) { |
| returned_value = call_accessible_object_function("atkObject_ref_child", "(JJ)J", obj, i); |
| return (AtkObject *) returned_value; |
| } else { |
| return ATK_OBJECT_CLASS (swt_fixed_accessible_parent_class)->ref_child (obj, i); |
| } |
| } |
| |
| static AtkStateSet *swt_fixed_accesssible_ref_state_set (AtkObject *obj) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (obj); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| jlong returned_value = 0; |
| |
| if (private->has_accessible) { |
| returned_value = call_accessible_object_function("atkObject_ref_state_set", "(J)J", obj); |
| return (AtkStateSet *) returned_value; |
| } else { |
| return ATK_OBJECT_CLASS (swt_fixed_accessible_parent_class)->ref_state_set (obj); |
| } |
| } |
| |
| static gboolean swt_fixed_accessible_action_do_action (AtkAction *action, gint i) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (action); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| jlong returned_value = 0; |
| |
| if (private->has_accessible) { |
| returned_value = call_accessible_object_function("atkAction_do_action", "(JJ)J", action, i); |
| } |
| return ((gint) returned_value == 1) ? TRUE : FALSE; |
| } |
| |
| static const gchar *swt_fixed_accessible_action_get_description (AtkAction *action, gint i) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (action); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| jlong returned_value = 0; |
| |
| if (private->has_accessible) { |
| returned_value = call_accessible_object_function("atkAction_get_description", "(JJ)J", action, i); |
| } |
| return (const gchar *) returned_value; |
| } |
| |
| static const gchar *swt_fixed_accessible_action_get_keybinding (AtkAction *action, gint i) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (action); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| jlong returned_value = 0; |
| |
| if (private->has_accessible) { |
| returned_value = call_accessible_object_function("atkAction_get_keybinding", "(JJ)J", action, i); |
| } |
| return (const gchar *) returned_value; |
| } |
| |
| static gint swt_fixed_accessible_action_get_n_actions (AtkAction *action) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (action); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| jlong returned_value = 0; |
| |
| if (private->has_accessible) { |
| returned_value = call_accessible_object_function("atkAction_get_n_actions", "(J)J", action); |
| } |
| return (gint) returned_value; |
| } |
| |
| static const gchar *swt_fixed_accessible_action_get_name (AtkAction *action, gint i) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (action); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| jlong returned_value = 0; |
| |
| if (private->has_accessible) { |
| returned_value = call_accessible_object_function("atkAction_get_name", "(JJ)J", action, i); |
| } |
| return (const gchar *) returned_value; |
| } |
| |
| static void swt_fixed_accessible_component_get_extents (AtkComponent *component, gint *x, gint *y, |
| gint *width, gint *height, AtkCoordType coord_type) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (component); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| if (private->has_accessible) { |
| call_accessible_object_function("atkComponent_get_extents", "(JJJJJJ)J", component, x, y, |
| width, height, coord_type); |
| } else { |
| GtkWidget *widget = gtk_accessible_get_widget(GTK_ACCESSIBLE(fixed)); |
| gint fixed_x, fixed_y; |
| GtkAllocation allocation; |
| gtk_widget_get_allocation(widget, &allocation); |
| #if defined(GTK4) |
| GdkSurface *surface = gtk_widget_get_surface(widget); |
| call_accessible_object_function("toDisplay", "(JJJ)J", surface, &fixed_x, &fixed_y); |
| if (coord_type == ATK_XY_SCREEN) { |
| *x = fixed_x; |
| *y = fixed_y; |
| } |
| if (coord_type == ATK_XY_WINDOW) { |
| GtkWidget *top = gtk_widget_get_toplevel(widget); |
| GdkSurface *top_surface = gtk_widget_get_surface(top); |
| gint top_x, top_y; |
| call_accessible_object_function("toDisplay", "(JJJ)J", top_surface, &top_x, &top_y); |
| *x = fixed_x - top_x; |
| *y = fixed_y - top_y; |
| } |
| #else |
| GdkWindow *window = gtk_widget_get_window(widget); |
| call_accessible_object_function("toDisplay", "(JJJ)J", window, &fixed_x, &fixed_y); |
| if (coord_type == ATK_XY_SCREEN) { |
| *x = fixed_x; |
| *y = fixed_y; |
| } |
| if (coord_type == ATK_XY_WINDOW) { |
| GtkWidget *top = gtk_widget_get_toplevel(widget); |
| GdkWindow *top_window = gtk_widget_get_window(top); |
| gint top_x, top_y; |
| call_accessible_object_function("toDisplay", "(JJJ)J", top_window, &top_x, &top_y); |
| *x = fixed_x - top_x; |
| *y = fixed_y - top_y; |
| } |
| #endif |
| *width = allocation.width; |
| *height = allocation.height; |
| } |
| return; |
| } |
| |
| static AtkObject *swt_fixed_accessible_component_ref_accessible_at_point (AtkComponent *component, gint x, |
| gint y, AtkCoordType coord_type) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (component); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| jlong returned_value = 0; |
| |
| if (private->has_accessible) { |
| returned_value = call_accessible_object_function("atkComponent_ref_accessible_at_point", "(JJJJ)J", |
| component, x, y, coord_type); |
| } |
| return (AtkObject *) returned_value; |
| } |
| |
| static void swt_fixed_accessible_editable_text_copy_text (AtkEditableText *text, gint start_pos, gint end_pos) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (text); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| |
| if (private->has_accessible) { |
| call_accessible_object_function("atkEditableText_copy_text", "(JJJ)J", text, start_pos, end_pos); |
| } |
| return; |
| } |
| |
| static void swt_fixed_accessible_editable_text_cut_text (AtkEditableText *text, gint start_pos, gint end_pos) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (text); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| |
| if (private->has_accessible) { |
| call_accessible_object_function("atkEditableText_cut_text", "(JJJ)J", text, start_pos, end_pos); |
| } |
| return; |
| } |
| |
| static void swt_fixed_accessible_editable_text_delete_text (AtkEditableText *text, gint start_pos, gint end_pos) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (text); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| |
| if (private->has_accessible) { |
| call_accessible_object_function("atkEditableText_delete_text", "(JJJ)J", text, start_pos, end_pos); |
| } |
| return; |
| } |
| |
| static void swt_fixed_accessible_editable_text_insert_text (AtkEditableText *text, const gchar *string, |
| gint length, gint *position) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (text); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| |
| if (private->has_accessible) { |
| call_accessible_object_function("atkEditableText_insert_text", "(JJJJ)J", text, string, length, position); |
| } |
| return; |
| } |
| |
| static void swt_fixed_accessible_editable_text_paste_text (AtkEditableText *text, gint position) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (text); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| |
| if (private->has_accessible) { |
| call_accessible_object_function("atkEditableText_paste_text", "(JJ)J", text, position); |
| } |
| return; |
| } |
| |
| static gboolean swt_fixed_accessible_editable_text_set_run_attributes (AtkEditableText *text, |
| AtkAttributeSet *attrib_set, gint start_offset, gint end_offset) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (text); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| jlong returned_value = 0; |
| |
| if (private->has_accessible) { |
| returned_value = call_accessible_object_function("atkEditableText_set_run_attributes", "(JJJJ)J", |
| attrib_set, start_offset, end_offset); |
| } |
| return ((gint) returned_value == 1) ? TRUE : FALSE; |
| } |
| |
| static void swt_fixed_accessible_editable_text_set_text_contents (AtkEditableText *text, const gchar *string) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (text); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| |
| if (private->has_accessible) { |
| call_accessible_object_function("atkEditableText_set_text_contents", "(JJ)J", text, string); |
| } |
| return; |
| } |
| |
| static AtkHyperlink *swt_fixed_accessible_hypertext_get_link (AtkHypertext *hypertext, gint link_index) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (hypertext); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| jlong returned_value = 0; |
| |
| if (private->has_accessible) { |
| returned_value = call_accessible_object_function("atkHypertext_get_link", "(JJ)J", hypertext, link_index); |
| } |
| return (AtkHyperlink *) returned_value; |
| } |
| |
| static gint swt_fixed_accessible_hypertext_get_link_index (AtkHypertext *hypertext, gint char_index) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (hypertext); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| jlong returned_value = 0; |
| |
| if (private->has_accessible) { |
| returned_value = call_accessible_object_function("atkHypertext_get_link_index", "(JJ)J", hypertext, char_index); |
| } |
| return (gint) returned_value; |
| } |
| |
| static gint swt_fixed_accessible_hypertext_get_n_links (AtkHypertext *hypertext) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (hypertext); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| jlong returned_value = 0; |
| |
| if (private->has_accessible) { |
| returned_value = call_accessible_object_function("atkHypertext_get_n_links", "(J)J", hypertext); |
| } |
| return (gint) returned_value; |
| } |
| |
| static gboolean swt_fixed_accessible_selection_is_child_selected (AtkSelection *selection, gint i) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (selection); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| jlong returned_value = 0; |
| |
| if (private->has_accessible) { |
| returned_value = call_accessible_object_function("atkSelection_is_child_selected", "(JJ)J", selection, i); |
| } |
| return ((gint) returned_value == 1) ? TRUE : FALSE; |
| } |
| |
| static AtkObject *swt_fixed_accessible_selection_ref_selection (AtkSelection *selection, gint i) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (selection); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| jlong returned_value = 0; |
| |
| if (private->has_accessible) { |
| returned_value = call_accessible_object_function("atkSelection_ref_selection", "(JJ)J", selection, i); |
| } |
| return (AtkObject *) returned_value; |
| } |
| |
| static AtkObject *swt_fixed_accessible_table_ref_at (AtkTable *table, gint row, gint column) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (table); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| jlong returned_value = 0; |
| |
| if (private->has_accessible) { |
| returned_value = call_accessible_object_function("atkTable_ref_at", "(JJJ)J", table, row, column); |
| } |
| return (AtkObject *) returned_value; |
| } |
| |
| static gint swt_fixed_accessible_table_get_index_at (AtkTable *table, gint row, gint column) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (table); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| jlong returned_value = 0; |
| |
| if (private->has_accessible) { |
| returned_value = call_accessible_object_function("atkTable_get_index_at", "(JJJ)J", table, row, column); |
| } |
| return (gint) returned_value; |
| } |
| |
| static gint swt_fixed_accessible_table_get_column_at_index (AtkTable *table, gint index) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (table); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| jlong returned_value = 0; |
| |
| if (private->has_accessible) { |
| returned_value = call_accessible_object_function("atkTable_get_column_at_index", "(JJ)J", table, index); |
| } |
| return (gint) returned_value; |
| } |
| |
| static gint swt_fixed_accessible_table_get_row_at_index (AtkTable *table, gint index) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (table); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| jlong returned_value = 0; |
| |
| if (private->has_accessible) { |
| returned_value = call_accessible_object_function("atkTable_get_row_at_index", "(JJ)J", table, index); |
| } |
| return (gint) returned_value; |
| } |
| |
| static gint swt_fixed_accessible_table_get_n_columns (AtkTable *table) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (table); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| jlong returned_value = 0; |
| |
| if (private->has_accessible) { |
| returned_value = call_accessible_object_function("atkTable_get_n_columns", "(J)J", table); |
| } |
| return (gint) returned_value; |
| } |
| |
| static gint swt_fixed_accessible_table_get_n_rows (AtkTable *table) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (table); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| jlong returned_value = 0; |
| |
| if (private->has_accessible) { |
| returned_value = call_accessible_object_function("atkTable_get_n_rows", "(J)J", table); |
| } |
| return (gint) returned_value; |
| } |
| |
| static gint swt_fixed_accessible_table_get_column_extent_at (AtkTable *table, gint row, gint column) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (table); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| jlong returned_value = 0; |
| |
| if (private->has_accessible) { |
| returned_value = call_accessible_object_function("atkTable_get_column_extent_at", "(JJJ)J", |
| table, row, column); |
| } |
| return (gint) returned_value; |
| } |
| |
| static gint swt_fixed_accessible_table_get_row_extent_at (AtkTable *table, gint row, gint column) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (table); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| jlong returned_value = 0; |
| |
| if (private->has_accessible) { |
| returned_value = call_accessible_object_function("atkTable_get_row_extent_at", "(JJJ)J", |
| table, row, column); |
| } |
| return (gint) returned_value; |
| } |
| |
| static AtkObject *swt_fixed_accessible_table_get_caption (AtkTable *table) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (table); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| jlong returned_value = 0; |
| |
| if (private->has_accessible) { |
| returned_value = call_accessible_object_function("atkTable_get_caption", "(J)J", table); |
| } |
| return (AtkObject *) returned_value; |
| } |
| |
| static AtkObject *swt_fixed_accessible_table_get_summary (AtkTable *table) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (table); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| jlong returned_value = 0; |
| |
| if (private->has_accessible) { |
| returned_value = call_accessible_object_function("atkTable_get_summary", "(J)J", table); |
| } |
| return (AtkObject *) returned_value; |
| } |
| |
| static const gchar *swt_fixed_accessible_table_get_column_description (AtkTable *table, gint column) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (table); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| jlong returned_value = 0; |
| |
| if (private->has_accessible) { |
| returned_value = call_accessible_object_function("atkTable_get_column_description", "(JJ)J", |
| table, column); |
| } |
| return (const gchar *) returned_value; |
| } |
| |
| static AtkObject *swt_fixed_accessible_table_get_column_header (AtkTable *table, gint column) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (table); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| jlong returned_value = 0; |
| |
| if (private->has_accessible) { |
| returned_value = call_accessible_object_function("atkTable_get_column_header", "(JJ)J", |
| table, column); |
| } |
| return (AtkObject *) returned_value; |
| } |
| |
| static const gchar *swt_fixed_accessible_table_get_row_description (AtkTable *table, gint row) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (table); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| jlong returned_value = 0; |
| |
| if (private->has_accessible) { |
| returned_value = call_accessible_object_function("atkTable_get_row_description", "(JJ)J", |
| table, row); |
| } |
| return (const gchar *) returned_value; |
| } |
| |
| static AtkObject *swt_fixed_accessible_table_get_row_header (AtkTable *table, gint row) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (table); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| jlong returned_value = 0; |
| |
| if (private->has_accessible) { |
| returned_value = call_accessible_object_function("atkTable_get_row_header", "(JJ)J", |
| table, row); |
| } |
| return (AtkObject *) returned_value; |
| } |
| |
| static gint swt_fixed_accessible_table_get_selected_rows (AtkTable *table, gint **selected) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (table); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| jlong returned_value = 0; |
| |
| if (private->has_accessible) { |
| returned_value = call_accessible_object_function("atkTable_get_selected_rows", "(JJ)J", |
| table, selected); |
| } |
| return (gint) returned_value; |
| } |
| |
| static gint swt_fixed_accessible_table_get_selected_columns (AtkTable *table, gint **selected) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (table); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| jlong returned_value = 0; |
| |
| if (private->has_accessible) { |
| returned_value = call_accessible_object_function("atkTable_get_selected_columns", "(JJ)J", |
| table, selected); |
| } |
| return (gint) returned_value; |
| } |
| |
| static gboolean swt_fixed_accessible_table_is_column_selected (AtkTable *table, gint column) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (table); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| jlong returned_value = 0; |
| |
| if (private->has_accessible) { |
| returned_value = call_accessible_object_function("atkTable_is_column_selected", "(JJ)J", |
| table, column); |
| } |
| return ((gint) returned_value == 1) ? TRUE : FALSE; |
| } |
| |
| static gboolean swt_fixed_accessible_table_is_row_selected (AtkTable *table, gint row) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (table); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| jlong returned_value = 0; |
| |
| if (private->has_accessible) { |
| returned_value = call_accessible_object_function("atkTable_is_row_selected", "(JJ)J", |
| table, row); |
| } |
| return ((gint) returned_value == 1) ? TRUE : FALSE; |
| } |
| |
| static gboolean swt_fixed_accessible_table_is_selected (AtkTable *table, gint row, gint column) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (table); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| jlong returned_value = 0; |
| |
| if (private->has_accessible) { |
| returned_value = call_accessible_object_function("atkTable_is_selected", "(JJJ)J", |
| table, row, column); |
| } |
| return ((gint) returned_value == 1) ? TRUE : FALSE; |
| } |
| |
| static gboolean swt_fixed_accessible_table_add_row_selection (AtkTable *table, gint row) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (table); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| jlong returned_value = 0; |
| |
| if (private->has_accessible) { |
| returned_value = call_accessible_object_function("atkTable_add_row_selection", "(JJ)J", |
| table, row); |
| } |
| return ((gint) returned_value == 1) ? TRUE : FALSE; |
| } |
| |
| static gboolean swt_fixed_accessible_table_remove_row_selection (AtkTable *table, gint row) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (table); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| jlong returned_value = 0; |
| |
| if (private->has_accessible) { |
| returned_value = call_accessible_object_function("atkTable_remove_row_selection", "(JJ)J", |
| table, row); |
| } |
| return ((gint) returned_value == 1) ? TRUE : FALSE; |
| } |
| |
| static gboolean swt_fixed_accessible_table_add_column_selection (AtkTable *table, gint column) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (table); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| jlong returned_value = 0; |
| |
| if (private->has_accessible) { |
| returned_value = call_accessible_object_function("atkTable_add_column_selection", "(JJ)J", |
| table, column); |
| } |
| return ((gint) returned_value == 1) ? TRUE : FALSE; |
| } |
| |
| static gboolean swt_fixed_accessible_table_remove_column_selection (AtkTable *table, gint column) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (table); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| jlong returned_value = 0; |
| |
| if (private->has_accessible) { |
| returned_value = call_accessible_object_function("atkTable_remove_row_selection", "(JJ)J", |
| table, column); |
| } |
| return ((gint) returned_value == 1) ? TRUE : FALSE; |
| } |
| |
| static gboolean swt_fixed_accessible_text_add_selection (AtkText *text, gint start_offset, gint end_offset) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (text); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| jlong returned_value = 0; |
| |
| if (private->has_accessible) { |
| returned_value = call_accessible_object_function("atkText_add_selection", "(JJJ)J", |
| text, start_offset, end_offset); |
| } |
| return ((gint) returned_value == 1) ? TRUE : FALSE; |
| } |
| |
| static AtkTextRange **swt_fixed_accessible_text_get_bounded_ranges (AtkText *text, AtkTextRectangle *rect, |
| AtkCoordType coord_type, AtkTextClipType x_clip_type, AtkTextClipType y_clip_type) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (text); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| jlong returned_value = 0; |
| |
| if (private->has_accessible) { |
| returned_value = call_accessible_object_function("atkText_get_bounded_ranges", "(JJJJJ)J", |
| text, rect, coord_type, x_clip_type, y_clip_type); |
| } |
| return (AtkTextRange **) returned_value; |
| } |
| |
| static gint swt_fixed_accessible_text_get_caret_offset (AtkText *text) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (text); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| jlong returned_value = 0; |
| |
| if (private->has_accessible) { |
| returned_value = call_accessible_object_function("atkText_get_caret_offset", "(J)J", text); |
| } |
| return (gint) returned_value; |
| } |
| |
| static gunichar swt_fixed_accessible_text_get_character_at_offset (AtkText *text, gint offset) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (text); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| jlong returned_value = 0; |
| |
| if (private->has_accessible) { |
| returned_value = call_accessible_object_function("atkText_get_character_at_offset", "(JJ)J", text, offset); |
| } |
| return (gunichar) returned_value; |
| } |
| |
| static gint swt_fixed_accessible_text_get_character_count (AtkText *text) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (text); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| jlong returned_value = 0; |
| |
| if (private->has_accessible) { |
| returned_value = call_accessible_object_function("atkText_get_character_count", "(J)J", text); |
| } |
| return (gint) returned_value; |
| } |
| |
| static gint swt_fixed_accessible_text_get_n_selections (AtkText *text) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (text); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| jlong returned_value = 0; |
| |
| if (private->has_accessible) { |
| returned_value = call_accessible_object_function("atkText_get_n_selections", "(J)J", text); |
| } |
| return (gint) returned_value; |
| } |
| |
| static gint swt_fixed_accessible_text_get_offset_at_point (AtkText *text, gint x, gint y, |
| AtkCoordType coords) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (text); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| jlong returned_value = 0; |
| |
| if (private->has_accessible) { |
| returned_value = call_accessible_object_function("atkText_get_offset_at_point", "(JJJJ)J", text, x, y, coords); |
| } |
| return (gint) returned_value; |
| } |
| |
| static void swt_fixed_accessible_text_get_range_extents (AtkText *text, gint start_offset, gint end_offset, |
| AtkCoordType coord_type, AtkTextRectangle *rect) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (text); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| |
| if (private->has_accessible) { |
| call_accessible_object_function("atkText_get_range_extents", "(JJJJJ)J", text, |
| start_offset, end_offset, coord_type, rect); |
| } |
| return; |
| } |
| |
| static AtkAttributeSet *swt_fixed_accessible_text_get_run_attributes (AtkText *text, gint offset, gint *start_offset, |
| gint *end_offset) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (text); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| jlong returned_value = 0; |
| |
| if (private->has_accessible) { |
| returned_value = call_accessible_object_function("atkText_get_run_attributes", "(JJJJ)J", text, |
| offset, start_offset, end_offset); |
| } |
| return (AtkAttributeSet *) returned_value; |
| } |
| |
| static gchar *swt_fixed_accessible_text_get_selection (AtkText *text, gint selection_num, gint *start_offset, |
| gint *end_offset) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (text); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| jlong returned_value = 0; |
| |
| if (private->has_accessible) { |
| returned_value = call_accessible_object_function("atkText_get_selection", "(JJJJ)J", text, |
| selection_num, start_offset, end_offset); |
| } |
| return (gchar *) returned_value; |
| } |
| |
| static gchar *swt_fixed_accessible_text_get_text (AtkText *text, gint start_offset, gint end_offset) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (text); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| jlong returned_value = 0; |
| |
| if (private->has_accessible) { |
| returned_value = call_accessible_object_function("atkText_get_text", "(JJJ)J", text, |
| start_offset, end_offset); |
| } |
| return (gchar *) returned_value; |
| } |
| |
| static gchar *swt_fixed_accessible_text_get_text_after_offset (AtkText *text, gint offset, |
| AtkTextBoundary boundary_type, gint *start_offset, gint *end_offset) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (text); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| jlong returned_value = 0; |
| |
| if (private->has_accessible) { |
| returned_value = call_accessible_object_function("atkText_get_text_after_offset", "(JJJJJ)J", text, |
| offset, boundary_type, start_offset, end_offset); |
| } |
| return (gchar *) returned_value; |
| } |
| |
| static gchar *swt_fixed_accessible_text_get_text_at_offset (AtkText *text, gint offset, |
| AtkTextBoundary boundary_type, gint *start_offset, gint *end_offset) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (text); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| jlong returned_value = 0; |
| |
| if (private->has_accessible) { |
| returned_value = call_accessible_object_function("atkText_get_text_at_offset", "(JJJJJ)J", text, |
| offset, boundary_type, start_offset, end_offset); |
| } |
| return (gchar *) returned_value; |
| } |
| |
| static gchar *swt_fixed_accessible_text_get_text_before_offset (AtkText *text, gint offset, |
| AtkTextBoundary boundary_type, gint *start_offset, gint *end_offset) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (text); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| jlong returned_value = 0; |
| |
| if (private->has_accessible) { |
| returned_value = call_accessible_object_function("atkText_get_text_before_offset", "(JJJJJ)J", text, |
| offset, boundary_type, start_offset, end_offset); |
| } |
| return (gchar *) returned_value; |
| } |
| |
| static gboolean swt_fixed_accessible_text_remove_selection (AtkText *text, gint selection_num) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (text); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| jlong returned_value = 0; |
| |
| if (private->has_accessible) { |
| returned_value = call_accessible_object_function("atkText_remove_selection", "(JJ)J", text, selection_num); |
| } |
| return ((gint) returned_value == 1) ? TRUE : FALSE; |
| } |
| |
| static gboolean swt_fixed_accessible_text_set_caret_offset (AtkText *text, gint offset) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (text); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| jlong returned_value = 0; |
| |
| if (private->has_accessible) { |
| returned_value = call_accessible_object_function("atkText_set_caret_offset", "(JJ)J", text, offset); |
| } |
| return ((gint) returned_value == 1) ? TRUE : FALSE; |
| } |
| |
| static gboolean swt_fixed_accessible_text_set_selection (AtkText *text, gint selection_num, |
| gint start_offset, gint end_offset) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (text); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| jlong returned_value = 0; |
| |
| if (private->has_accessible) { |
| returned_value = call_accessible_object_function("atkText_set_selection", "(JJJJ)J", text, |
| selection_num, start_offset, end_offset); |
| } |
| return ((gint) returned_value == 1) ? TRUE : FALSE; |
| } |
| |
| static void swt_fixed_accessible_value_get_current_value (AtkValue *obj, GValue *value) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (obj); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| |
| if (private->has_accessible) { |
| call_accessible_object_function("atkValue_get_current_value", "(JJ)J", obj, value); |
| } |
| return; |
| } |
| |
| static void swt_fixed_accessible_value_get_maximum_value (AtkValue *obj, GValue *value) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (obj); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| |
| if (private->has_accessible) { |
| call_accessible_object_function("atkValue_get_maximum_value", "(JJ)J", obj, value); |
| } |
| return; |
| } |
| |
| static void swt_fixed_accessible_value_get_minimum_value (AtkValue *obj, GValue *value) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (obj); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| |
| if (private->has_accessible) { |
| call_accessible_object_function("atkValue_get_minimum_value", "(JJ)J", obj, value); |
| } |
| return; |
| } |
| |
| static gboolean swt_fixed_accessible_value_set_current_value (AtkValue *obj, const GValue *value) { |
| SwtFixedAccessible *fixed = SWT_FIXED_ACCESSIBLE (obj); |
| SwtFixedAccessiblePrivate *private = fixed->priv; |
| jlong returned_value = 0; |
| |
| if (private->has_accessible) { |
| returned_value = call_accessible_object_function("atkValue_set_current_value", "(JJ)J", obj, value); |
| } |
| return ((gint) returned_value == 1) ? TRUE : FALSE; |
| } |
| |
| // Interfaces initializers and implementations |
| static void swt_fixed_accessible_action_iface_init (AtkActionIface *iface) { |
| iface->do_action = swt_fixed_accessible_action_do_action; |
| iface->get_description = swt_fixed_accessible_action_get_description; |
| iface->get_keybinding = swt_fixed_accessible_action_get_keybinding; |
| iface->get_n_actions = swt_fixed_accessible_action_get_n_actions; |
| iface->get_name = swt_fixed_accessible_action_get_name; |
| } |
| |
| static void swt_fixed_accessible_component_iface_init (AtkComponentIface *iface) { |
| iface->get_extents = swt_fixed_accessible_component_get_extents; |
| iface->ref_accessible_at_point = swt_fixed_accessible_component_ref_accessible_at_point; |
| } |
| |
| static void swt_fixed_accessible_editable_text_iface_init (AtkEditableTextIface *iface) { |
| iface->copy_text = swt_fixed_accessible_editable_text_copy_text; |
| iface->cut_text = swt_fixed_accessible_editable_text_cut_text; |
| iface->delete_text = swt_fixed_accessible_editable_text_delete_text; |
| iface->insert_text = swt_fixed_accessible_editable_text_insert_text; |
| iface->paste_text = swt_fixed_accessible_editable_text_paste_text; |
| iface->set_run_attributes = swt_fixed_accessible_editable_text_set_run_attributes; |
| iface->set_text_contents = swt_fixed_accessible_editable_text_set_text_contents; |
| } |
| |
| static void swt_fixed_accessible_hypertext_iface_init (AtkHypertextIface *iface) { |
| iface->get_link = swt_fixed_accessible_hypertext_get_link; |
| iface->get_link_index = swt_fixed_accessible_hypertext_get_link_index; |
| iface->get_n_links = swt_fixed_accessible_hypertext_get_n_links; |
| } |
| |
| static void swt_fixed_accessible_selection_iface_init (AtkSelectionIface *iface) { |
| iface->is_child_selected = swt_fixed_accessible_selection_is_child_selected; |
| iface->ref_selection = swt_fixed_accessible_selection_ref_selection; |
| } |
| |
| static void swt_fixed_accessible_table_iface_init (AtkTableIface *iface) { |
| iface->ref_at = swt_fixed_accessible_table_ref_at; |
| iface->get_index_at = swt_fixed_accessible_table_get_index_at; |
| iface->get_column_at_index = swt_fixed_accessible_table_get_column_at_index; |
| iface->get_row_at_index = swt_fixed_accessible_table_get_row_at_index; |
| iface->get_n_columns = swt_fixed_accessible_table_get_n_columns; |
| iface->get_n_rows = swt_fixed_accessible_table_get_n_rows; |
| iface->get_column_extent_at = swt_fixed_accessible_table_get_column_extent_at; |
| iface->get_row_extent_at = swt_fixed_accessible_table_get_row_extent_at; |
| iface->get_caption = swt_fixed_accessible_table_get_caption; |
| iface->get_summary = swt_fixed_accessible_table_get_summary; |
| iface->get_column_description = swt_fixed_accessible_table_get_column_description; |
| iface->get_column_header = swt_fixed_accessible_table_get_column_header; |
| iface->get_row_description = swt_fixed_accessible_table_get_row_description; |
| iface->get_row_header = swt_fixed_accessible_table_get_row_header; |
| iface->get_selected_columns = swt_fixed_accessible_table_get_selected_columns; |
| iface->get_selected_rows = swt_fixed_accessible_table_get_selected_rows; |
| iface->is_column_selected = swt_fixed_accessible_table_is_column_selected; |
| iface->is_row_selected = swt_fixed_accessible_table_is_row_selected; |
| iface->is_selected = swt_fixed_accessible_table_is_selected; |
| iface->add_row_selection = swt_fixed_accessible_table_add_row_selection; |
| iface->remove_row_selection = swt_fixed_accessible_table_remove_row_selection; |
| iface->add_column_selection = swt_fixed_accessible_table_add_column_selection; |
| iface->remove_column_selection = swt_fixed_accessible_table_remove_column_selection; |
| } |
| |
| static void swt_fixed_accessible_text_iface_init (AtkTextIface *iface) { |
| iface->add_selection = swt_fixed_accessible_text_add_selection; |
| iface->get_bounded_ranges = swt_fixed_accessible_text_get_bounded_ranges; |
| iface->get_caret_offset = swt_fixed_accessible_text_get_caret_offset; |
| iface->get_character_at_offset = swt_fixed_accessible_text_get_character_at_offset; |
| iface->get_character_count = swt_fixed_accessible_text_get_character_count; |
| iface->get_n_selections = swt_fixed_accessible_text_get_n_selections; |
| iface->get_offset_at_point = swt_fixed_accessible_text_get_offset_at_point; |
| iface->get_range_extents = swt_fixed_accessible_text_get_range_extents; |
| iface->get_run_attributes = swt_fixed_accessible_text_get_run_attributes; |
| iface->get_selection = swt_fixed_accessible_text_get_selection; |
| // TODO_a11y: add support for get_string_at_offset once Orca is updated |
| iface->get_text_before_offset = swt_fixed_accessible_text_get_text_before_offset; |
| iface->get_text_at_offset = swt_fixed_accessible_text_get_text_at_offset; |
| iface->get_text_after_offset = swt_fixed_accessible_text_get_text_after_offset; |
| iface->get_text = swt_fixed_accessible_text_get_text; |
| iface->remove_selection = swt_fixed_accessible_text_remove_selection; |
| iface->set_caret_offset = swt_fixed_accessible_text_set_caret_offset; |
| iface->set_selection = swt_fixed_accessible_text_set_selection; |
| } |
| |
| static void swt_fixed_accessible_value_iface_init (AtkValueIface *iface) { |
| /* |
| * TODO_a11y: add support for get_range, get_value_and_text, and set_value |
| * once Orca is updated. |
| */ |
| iface->get_current_value = swt_fixed_accessible_value_get_current_value; |
| iface->get_maximum_value = swt_fixed_accessible_value_get_maximum_value; |
| iface->get_minimum_value = swt_fixed_accessible_value_get_minimum_value; |
| iface->set_current_value = swt_fixed_accessible_value_set_current_value; |
| } |
| |
| jlong call_accessible_object_function (const char *method_name, const char *method_signature,...) { |
| jlong result = 0; |
| va_list arg_list; |
| jclass cls; |
| JNIEnv *env; |
| jmethodID mid; |
| |
| if (method_name == NULL || method_signature == NULL) { |
| g_critical("Error calling Java method with JNI, check method name and signature\n"); |
| return 0; |
| } |
| |
| // Get the JNIEnv pointer |
| if ((*JVM)->GetEnv(JVM, (void **)&env, JNI_VERSION_1_2)) { |
| g_critical("Error fetching the JNIEnv pointer\n"); |
| return 0; |
| } |
| |
| // Find the class pointer |
| cls = (*env)->FindClass(env, ACCESSIBILITY_CLASS_NAME); |
| if (cls == NULL) { |
| g_critical("JNI class pointer is NULL for class %s\n", ACCESSIBILITY_CLASS_NAME); |
| return 0; |
| } |
| |
| // Find the method ID |
| mid = (*env)->GetStaticMethodID(env, cls, method_name, method_signature); |
| |
| // If the method ID isn't NULL |
| if (mid == NULL) { |
| g_critical("JNI method ID pointer is NULL for method %s\n", method_name); |
| return 0; |
| } else { |
| va_start(arg_list, method_signature); |
| result = (*env)->CallStaticLongMethodV(env, cls, mid, arg_list); |
| va_end(arg_list); |
| |
| // JNI documentation says: |
| // The JNI functions that invoke a Java method return the result of |
| // the Java method. The programmer must call ExceptionOccurred() to |
| // check for possible exceptions that occurred during the execution |
| // of the Java method. |
| if ((*env)->ExceptionCheck(env)) { |
| g_critical("JNI method thrown exception: %s\n", method_name); |
| // Note that this also clears the exception. That's good because |
| // we don't want the unexpected exception to cause even more |
| // problems in later JNI calls. |
| (*env)->ExceptionDescribe(env); |
| // Exceptions are not expected, but still, let's do at least |
| // something to avoid possible confusion. |
| result = 0; |
| } |
| } |
| |
| return result; |
| } |
| |
| static GRecMutex swt_gdk_lock; |
| |
| static void swt_threads_enter(void) { |
| g_rec_mutex_lock(&swt_gdk_lock); |
| } |
| |
| static void swt_threads_leave(void) { |
| g_rec_mutex_unlock(&swt_gdk_lock); |
| } |
| |
| void swt_set_lock_functions() { |
| G_GNUC_BEGIN_IGNORE_DEPRECATIONS |
| gdk_threads_set_lock_functions(&swt_threads_enter, &swt_threads_leave); |
| G_GNUC_END_IGNORE_DEPRECATIONS |
| } |
| |
| //Add ability to debug gtk warnings for SWT snippets via SWT_FATAL_WARNINGS=1 |
| // env variable. Please see Eclipse bug 471477. |
| // PLEASE NOTE: this functionality is only available on GTK3. |
| void swt_debug_on_fatal_warnings() { |
| // NOTE: gtk_parse_args() must be called before gtk_init() to take effect. |
| int argcount = 2; |
| char *argument[] = {"", "--g-fatal-warnings"}; |
| char **arg2 = (char **) &argument; |
| gtk_parse_args(&argcount, &arg2); |
| } |
| #endif |