library.os_custom.c Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of org.eclipse.swt.gtk.linux.aarch64 Show documentation
Show all versions of org.eclipse.swt.gtk.linux.aarch64 Show documentation
Standard Widget Toolkit for GTK on aarch64
The newest version!
/*******************************************************************************
* 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_10)) {
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