summaryrefslogtreecommitdiff
path: root/eel
diff options
context:
space:
mode:
Diffstat (limited to 'eel')
-rw-r--r--eel/eel-accessibility.c15
-rw-r--r--eel/eel-background.c43
-rw-r--r--eel/eel-canvas-rect-ellipse.c17
-rw-r--r--eel/eel-canvas.c41
-rw-r--r--eel/eel-editable-label.c46
-rw-r--r--eel/eel-editable-label.h1
-rw-r--r--eel/eel-gtk-extensions.c68
-rw-r--r--eel/eel-labeled-image.c215
8 files changed, 195 insertions, 251 deletions
diff --git a/eel/eel-accessibility.c b/eel/eel-accessibility.c
index 94c429a3..0d9707ad 100644
--- a/eel/eel-accessibility.c
+++ b/eel/eel-accessibility.c
@@ -218,11 +218,16 @@ eel_accessible_text_get_type (void)
{
const GTypeInfo tinfo =
{
- sizeof (AtkTextIface),
- (GBaseInitFunc) NULL,
- (GBaseFinalizeFunc) NULL,
- (GClassInitFunc) NULL,
- (GClassFinalizeFunc) NULL
+ sizeof (AtkTextIface), /* class_size */
+ NULL, /* base_init */
+ NULL, /* base_finalize */
+ NULL, /* class_init */
+ NULL, /* class_finalize */
+ NULL, /* class_data */
+ 0, /* instance_size */
+ 0, /* n_preallocs */
+ NULL, /* instance_init */
+ NULL /* value_table */
};
type = g_type_register_static (
diff --git a/eel/eel-background.c b/eel/eel-background.c
index ae585d6a..ceaa972f 100644
--- a/eel/eel-background.c
+++ b/eel/eel-background.c
@@ -105,7 +105,7 @@ free_background_surface (EelBackground *self)
it will live forever, so we need to kill it manually.
If set as root background it will be killed next time the
background is changed. */
- if (self->details->unset_root_surface)
+ if (GDK_IS_X11_DISPLAY (gdk_display_get_default()) && (self->details->unset_root_surface))
{
XKillClient (cairo_xlib_surface_get_display (surface),
cairo_xlib_surface_get_drawable (surface));
@@ -311,9 +311,20 @@ drawable_get_adjusted_size (EelBackground *self,
if (self->details->is_desktop)
{
GdkScreen *screen = gtk_widget_get_screen (self->details->widget);
- gint scale = gtk_widget_get_scale_factor (self->details->widget);
- *width = WidthOfScreen (gdk_x11_screen_get_xscreen (screen)) / scale;
- *height = HeightOfScreen (gdk_x11_screen_get_xscreen (screen)) / scale;
+ GdkDisplay *display = gdk_screen_get_display (screen);
+ if (GDK_IS_X11_DISPLAY (display))
+ {
+ gint scale = gtk_widget_get_scale_factor (self->details->widget);
+ *width = WidthOfScreen (gdk_x11_screen_get_xscreen (screen)) / scale;
+ *height = HeightOfScreen (gdk_x11_screen_get_xscreen (screen)) / scale;
+ }
+ else {
+ GdkRectangle workarea = {0};
+ gdk_monitor_get_workarea(gdk_display_get_monitor_at_window(gdk_display_get_default(),
+ gtk_widget_get_window (self->details->widget)), &workarea);
+ *width = workarea.width;
+ *height = workarea.height;
+ }
}
else
{
@@ -413,17 +424,18 @@ set_root_surface (EelBackground *self,
GdkScreen *screen)
{
eel_background_ensure_realized (self);
+ GdkDisplay *display = gdk_screen_get_display (screen);
if (self->details->use_common_surface) {
self->details->unset_root_surface = FALSE;
} else {
int width, height;
drawable_get_adjusted_size (self, &width, &height);
- self->details->bg_surface = mate_bg_create_surface (self->details->bg, window,
- width, height, TRUE);
+ if ((GDK_IS_X11_DISPLAY (display)) && (self->details->bg_surface == NULL))
+ self->details->bg_surface = mate_bg_create_surface (self->details->bg, window,
+ width, height, TRUE);
}
-
- if (self->details->bg_surface != NULL)
+ if ((GDK_IS_X11_DISPLAY (display)) && (self->details->bg_surface != NULL))
mate_bg_set_surface_as_root (screen, self->details->bg_surface);
}
@@ -638,7 +650,7 @@ widget_realized_setup (GtkWidget *widget,
}
GdkScreen *screen = gtk_widget_get_screen (widget);
- GdkWindow *window = gdk_screen_get_root_window (screen);
+ GdkDisplay *display = gdk_screen_get_display (screen);
if (self->details->screen_size_handler > 0)
{
@@ -654,9 +666,16 @@ widget_realized_setup (GtkWidget *widget,
self->details->screen_monitors_handler =
g_signal_connect (screen, "monitors-changed", G_CALLBACK (screen_size_changed), self);
- self->details->use_common_surface =
- (gdk_window_get_visual (window) == gtk_widget_get_visual (widget)) ? TRUE : FALSE;
-
+ if (GDK_IS_X11_DISPLAY (display))
+ {
+ GdkWindow *window = gdk_screen_get_root_window (screen);
+ self->details->use_common_surface =
+ (gdk_window_get_visual (window) == gtk_widget_get_visual (widget)) ? TRUE : FALSE;
+ }
+ else /*Wayland is always composited but never has a root window*/
+ {
+ self->details->use_common_surface = FALSE;
+ }
init_fade (self);
}
diff --git a/eel/eel-canvas-rect-ellipse.c b/eel/eel-canvas-rect-ellipse.c
index 9b2feba4..7ca56a46 100644
--- a/eel/eel-canvas-rect-ellipse.c
+++ b/eel/eel-canvas-rect-ellipse.c
@@ -101,7 +101,8 @@ eel_canvas_re_get_type (void)
NULL, /* class_data */
sizeof (EelCanvasRE),
0, /* n_preallocs */
- (GInstanceInitFunc) eel_canvas_re_init
+ (GInstanceInitFunc) eel_canvas_re_init,
+ NULL /* value_table */
};
re_type = g_type_register_static (eel_canvas_item_get_type (),
@@ -204,7 +205,7 @@ eel_canvas_re_set_fill (EelCanvasRE *re, gboolean fill_set)
{
if (re->fill_set != fill_set)
{
- re->fill_set = fill_set;
+ re->fill_set = (fill_set != FALSE);
eel_canvas_item_request_update (EEL_CANVAS_ITEM (re));
}
}
@@ -214,7 +215,7 @@ eel_canvas_re_set_outline (EelCanvasRE *re, gboolean outline_set)
{
if (re->outline_set != outline_set)
{
- re->outline_set = outline_set;
+ re->outline_set = (outline_set != FALSE);
eel_canvas_item_request_update (EEL_CANVAS_ITEM (re));
}
}
@@ -465,7 +466,8 @@ eel_canvas_rect_get_type (void)
NULL, /* class_data */
sizeof (EelCanvasRect),
0, /* n_preallocs */
- (GInstanceInitFunc) eel_canvas_rect_init
+ (GInstanceInitFunc) eel_canvas_rect_init,
+ NULL /* value_table */
};
rect_type = g_type_register_static (eel_canvas_re_get_type (),
@@ -735,7 +737,12 @@ eel_canvas_rect_update (EelCanvasItem *item, double i2w_dx, double i2w_dy, gint
if (re->width_pixels)
width_pixels = (int) re->width;
else
- width_pixels = (int) floor (re->width * re->item.canvas->pixels_per_unit + 0.5);
+ {
+ double pixels;
+
+ pixels = floor (re->width * re->item.canvas->pixels_per_unit + 0.5);
+ width_pixels = (int) pixels;
+ }
width_lt = width_pixels / 2;
width_rb = (width_pixels + 1) / 2;
diff --git a/eel/eel-canvas.c b/eel/eel-canvas.c
index faf1ab69..a9d98101 100644
--- a/eel/eel-canvas.c
+++ b/eel/eel-canvas.c
@@ -137,7 +137,8 @@ eel_canvas_item_get_type (void)
NULL, /* class_data */
sizeof (EelCanvasItem),
0, /* n_preallocs */
- (GInstanceInitFunc) eel_canvas_item_init
+ (GInstanceInitFunc) eel_canvas_item_init,
+ NULL /* value_table */
};
canvas_item_type = g_type_register_static (G_TYPE_INITIALLY_UNOWNED,
@@ -1255,8 +1256,8 @@ eel_canvas_group_get_type (void)
NULL, /* class_data */
sizeof (EelCanvasGroup),
0, /* n_preallocs */
- (GInstanceInitFunc) eel_canvas_group_init
-
+ (GInstanceInitFunc) eel_canvas_group_init,
+ NULL /* value_table */
};
group_type = g_type_register_static (eel_canvas_item_get_type (),
@@ -1851,7 +1852,8 @@ eel_canvas_get_type (void)
NULL, /* class_data */
sizeof (EelCanvas),
0, /* n_preallocs */
- (GInstanceInitFunc) eel_canvas_init
+ (GInstanceInitFunc) eel_canvas_init,
+ NULL /* value_table */
};
canvas_type = g_type_register_static (gtk_layout_get_type (),
@@ -2286,10 +2288,12 @@ scroll_to (EelCanvas *canvas, int cx, int cy)
int scroll_width, scroll_height;
int right_limit, bottom_limit;
int old_zoom_xofs, old_zoom_yofs;
- int changed_x = FALSE, changed_y = FALSE;
+ gboolean changed_x;
+ gboolean changed_y;
int canvas_width, canvas_height;
GtkAllocation allocation;
GtkAdjustment *vadjustment, *hadjustment;
+ gdouble adjustment_value;
guint width, height;
gtk_widget_get_allocation (GTK_WIDGET (canvas), &allocation);
@@ -2373,22 +2377,25 @@ scroll_to (EelCanvas *canvas, int cx, int cy)
hadjustment = gtk_scrollable_get_hadjustment (GTK_SCROLLABLE (canvas));
vadjustment = gtk_scrollable_get_vadjustment (GTK_SCROLLABLE (canvas));
- if (((int) gtk_adjustment_get_value (hadjustment)) != cx)
- {
- gtk_adjustment_set_value (hadjustment, cx);
- changed_x = TRUE;
- }
+ adjustment_value = gtk_adjustment_get_value (hadjustment);
+ changed_x = ((int) adjustment_value) != cx;
+ if (changed_x)
+ gtk_adjustment_set_value (hadjustment,
+ (gdouble) cx);
- if (((int) gtk_adjustment_get_value (vadjustment)) != cy)
- {
- gtk_adjustment_set_value (vadjustment, cy);
- changed_y = TRUE;
- }
+ adjustment_value = gtk_adjustment_get_value (vadjustment);
+ changed_y = ((int) adjustment_value) != cy;
+ if (changed_y)
+ gtk_adjustment_set_value (vadjustment,
+ (gdouble) cy);
gtk_layout_get_size (&canvas->layout, &width, &height);
- if ((scroll_width != (int) width )|| (scroll_height != (int) height))
+ if ((scroll_width != (int) width) ||
+ (scroll_height != (int) height))
{
- gtk_layout_set_size (GTK_LAYOUT (canvas), scroll_width, scroll_height);
+ gtk_layout_set_size (GTK_LAYOUT (canvas),
+ (guint) scroll_width,
+ (guint) scroll_height);
}
/* Signal GtkLayout that it should do a redraw. */
diff --git a/eel/eel-editable-label.c b/eel/eel-editable-label.c
index a3b6813b..7c4bcb38 100644
--- a/eel/eel-editable-label.c
+++ b/eel/eel-editable-label.c
@@ -135,7 +135,6 @@ static gboolean eel_editable_label_delete_surrounding_cb (GtkIMContext
gint offset,
gint n_chars,
EelEditableLabel *label);
-static void eel_editable_label_clear_layout (EelEditableLabel *label);
static void eel_editable_label_recompute (EelEditableLabel *label);
static void eel_editable_label_ensure_layout (EelEditableLabel *label,
gboolean include_preedit);
@@ -764,7 +763,7 @@ eel_editable_label_set_draw_outline (EelEditableLabel *label,
if (label->draw_outline != draw_outline)
{
- label->draw_outline = draw_outline;
+ label->draw_outline = (draw_outline != FALSE);
gtk_widget_queue_draw (GTK_WIDGET (label));
}
@@ -790,7 +789,7 @@ eel_editable_label_set_line_wrap (EelEditableLabel *label,
if (label->wrap != wrap)
{
- label->wrap = wrap;
+ label->wrap = (wrap != FALSE);
g_object_notify (G_OBJECT (label), "wrap");
gtk_widget_queue_resize (GTK_WIDGET (label));
@@ -828,15 +827,6 @@ eel_editable_label_get_line_wrap (EelEditableLabel *label)
return label->wrap;
}
-PangoFontDescription *
-eel_editable_label_get_font_description (EelEditableLabel *label)
-{
- if (label->font_desc)
- return pango_font_description_copy (label->font_desc);
-
- return NULL;
-}
-
void
eel_editable_label_set_font_description (EelEditableLabel *label,
const PangoFontDescription *desc)
@@ -849,7 +839,7 @@ eel_editable_label_set_font_description (EelEditableLabel *label,
else
label->font_desc = NULL;
- eel_editable_label_clear_layout (label);
+ g_clear_object (&label->layout);
}
static void
@@ -873,29 +863,15 @@ eel_editable_label_finalize (GObject *object)
g_free (label->text);
label->text = NULL;
- if (label->layout)
- {
- g_object_unref (G_OBJECT (label->layout));
- label->layout = NULL;
- }
+ g_clear_object (&label->layout);
G_OBJECT_CLASS (eel_editable_label_parent_class)->finalize (object);
}
static void
-eel_editable_label_clear_layout (EelEditableLabel *label)
-{
- if (label->layout)
- {
- g_object_unref (G_OBJECT (label->layout));
- label->layout = NULL;
- }
-}
-
-static void
eel_editable_label_recompute (EelEditableLabel *label)
{
- eel_editable_label_clear_layout (label);
+ g_clear_object (&label->layout);
eel_editable_label_check_cursor_blink (label);
}
@@ -962,8 +938,10 @@ eel_editable_label_ensure_layout (EelEditableLabel *label,
include_preedit = include_preedit != 0;
if (label->preedit_length > 0 &&
- include_preedit != label->layout_includes_preedit)
- eel_editable_label_clear_layout (label);
+ include_preedit != label->layout_includes_preedit)
+ {
+ g_clear_object (&label->layout);
+ }
widget = GTK_WIDGET (label);
@@ -1000,7 +978,7 @@ eel_editable_label_ensure_layout (EelEditableLabel *label,
{
label->layout = gtk_widget_create_pango_layout (widget, label->text);
}
- label->layout_includes_preedit = include_preedit;
+ label->layout_includes_preedit = (include_preedit != FALSE);
if (label->font_desc != NULL)
pango_layout_set_font_description (label->layout, label->font_desc);
@@ -1050,7 +1028,6 @@ eel_editable_label_ensure_layout (EelEditableLabel *label,
else
{
gint wrap_width;
- gint scale;
pango_layout_set_width (label->layout, -1);
pango_layout_get_extents (label->layout, NULL, &logical_rect);
@@ -1061,10 +1038,9 @@ eel_editable_label_ensure_layout (EelEditableLabel *label,
longest_paragraph = width;
wrap_width = get_label_wrap_width (label);
- scale = gtk_widget_get_scale_factor (widget);
width = MIN (width, wrap_width);
width = MIN (width,
- PANGO_SCALE * (WidthOfScreen (gdk_x11_screen_get_xscreen (gdk_screen_get_default ())) / scale + 1) / 2);
+ PANGO_SCALE * (gdk_screen_width () + 1) / 2);
pango_layout_set_width (label->layout, width);
pango_layout_get_extents (label->layout, NULL, &logical_rect);
diff --git a/eel/eel-editable-label.h b/eel/eel-editable-label.h
index ab5f7d1c..5664807c 100644
--- a/eel/eel-editable-label.h
+++ b/eel/eel-editable-label.h
@@ -129,7 +129,6 @@ extern "C" {
void eel_editable_label_get_layout_offsets (EelEditableLabel *label,
gint *x,
gint *y);
- PangoFontDescription *eel_editable_label_get_font_description (EelEditableLabel *label);
void eel_editable_label_set_font_description (EelEditableLabel *label,
const PangoFontDescription *desc);
diff --git a/eel/eel-gtk-extensions.c b/eel/eel-gtk-extensions.c
index b2a47d95..a36c579e 100644
--- a/eel/eel-gtk-extensions.c
+++ b/eel/eel-gtk-extensions.c
@@ -80,57 +80,56 @@ eel_gtk_window_get_geometry_string (GtkWindow *window)
static void
sanity_check_window_position (int *left, int *top)
{
- GdkScreen *screen;
- gint scale;
-
g_assert (left != NULL);
g_assert (top != NULL);
-
- screen = gdk_screen_get_default ();
- scale = gdk_window_get_scale_factor (gdk_screen_get_root_window (screen));
+ GdkDisplay *display;
+ GdkWindow *root_window;
+ GdkRectangle workarea = {0};
/* Make sure the top of the window is on screen, for
* draggability (might not be necessary with all window managers,
* but seems reasonable anyway). Make sure the top of the window
* isn't off the bottom of the screen, or so close to the bottom
* that it might be obscured by the panel.
+ *
*/
- *top = CLAMP (*top, 0, HeightOfScreen (gdk_x11_screen_get_xscreen (screen)) / scale - MINIMUM_ON_SCREEN_HEIGHT);
-
- /* FIXME bugzilla.eazel.com 669:
- * If window has negative left coordinate, set_uposition sends it
- * somewhere else entirely. Not sure what level contains this bug (XWindows?).
- * Hacked around by pinning the left edge to zero, which just means you
- * can't set a window to be partly off the left of the screen using
- * this routine.
- */
- /* Make sure the left edge of the window isn't off the right edge of
- * the screen, or so close to the right edge that it might be
- * obscured by the panel.
- */
- *left = CLAMP (*left, 0, WidthOfScreen (gdk_x11_screen_get_xscreen (screen)) / scale - MINIMUM_ON_SCREEN_WIDTH);
+ display = gdk_display_get_default ();
+ /*This is x11 only, there is no root window in wayland*/
+ if (GDK_IS_X11_DISPLAY (display))
+ {
+ root_window = gdk_screen_get_root_window (gdk_screen_get_default());
+ gdk_monitor_get_workarea(gdk_display_get_monitor_at_window (display, root_window), &workarea);
+ *top = CLAMP (*top, 0, workarea.height - MINIMUM_ON_SCREEN_HEIGHT);
+
+ /* FIXME bugzilla.eazel.com 669:
+ * If window has negative left coordinate, set_uposition sends it
+ * somewhere else entirely. Not sure what level contains this bug (XWindows?).
+ * Hacked around by pinning the left edge to zero, which just means you
+ * can't set a window to be partly off the left of the screen using
+ * this routine.
+ */
+ /* Make sure the left edge of the window isn't off the right edge of
+ * the screen, or so close to the right edge that it might be
+ * obscured by the panel.
+ */
+ *left = CLAMP (*left, 0, workarea.width - MINIMUM_ON_SCREEN_WIDTH);
+ }
}
static void
sanity_check_window_dimensions (guint *width, guint *height)
{
- GdkScreen *screen;
- gint scale;
-
g_assert (width != NULL);
g_assert (height != NULL);
- screen = gdk_screen_get_default ();
- scale = gdk_window_get_scale_factor (gdk_screen_get_root_window (screen));
-
/* Pin the size of the window to the screen, so we don't end up in
* a state where the window is so big essential parts of it can't
* be reached (might not be necessary with all window managers,
* but seems reasonable anyway).
*/
- *width = MIN (*width, WidthOfScreen (gdk_x11_screen_get_xscreen (screen)) / scale);
- *height = MIN (*height, HeightOfScreen (gdk_x11_screen_get_xscreen (screen)) / scale);
-}
+ *width = MIN ((int)*width, gdk_screen_width());
+ *height = MIN ((int)*height, gdk_screen_height());
+ }
/**
* eel_gtk_window_set_initial_geometry:
@@ -156,7 +155,9 @@ eel_gtk_window_set_initial_geometry (GtkWindow *window,
guint width,
guint height)
{
+ GdkScreen *screen;
int real_left, real_top;
+ int screen_width, screen_height;
g_return_if_fail (GTK_IS_WINDOW (window));
@@ -168,17 +169,12 @@ eel_gtk_window_set_initial_geometry (GtkWindow *window,
if ((geometry_flags & EEL_GDK_X_VALUE) && (geometry_flags & EEL_GDK_Y_VALUE))
{
- GdkScreen *screen;
- int screen_width, screen_height;
- int scale;
-
real_left = left;
real_top = top;
screen = gtk_window_get_screen (window);
- scale = gtk_widget_get_scale_factor (GTK_WIDGET (window));
- screen_width = WidthOfScreen (gdk_x11_screen_get_xscreen (screen)) / scale;
- screen_height = HeightOfScreen (gdk_x11_screen_get_xscreen (screen)) / scale;
+ screen_width = gdk_screen_get_width (screen);
+ screen_height = gdk_screen_get_height (screen);
/* This is sub-optimal. GDK doesn't allow us to set win_gravity
* to South/East types, which should be done if using negative
diff --git a/eel/eel-labeled-image.c b/eel/eel-labeled-image.c
index 838da9cb..200f1e41 100644
--- a/eel/eel-labeled-image.c
+++ b/eel/eel-labeled-image.c
@@ -90,6 +90,10 @@ static GType eel_labeled_image_toggle_button_get_type (void);
/* GtkWidgetClass methods */
static GType eel_labeled_image_accessible_get_type (void);
+static GType eel_labeled_image_button_accessible_get_type (void);
+static GType eel_labeled_image_check_button_accessible_get_type (void);
+static GType eel_labeled_image_toggle_button_accessible_get_type (void);
+static GType eel_labeled_image_radio_button_accessible_get_type (void);
/* Private EelLabeledImage methods */
static EelDimensions labeled_image_get_image_dimensions (const EelLabeledImage *labeled_image);
@@ -2178,17 +2182,6 @@ eel_labeled_image_set_can_focus (EelLabeledImage *labeled_image,
gtk_widget_set_can_focus (GTK_WIDGET (labeled_image), can_focus);
}
-static AtkObjectClass *a11y_parent_class = NULL;
-
-static void
-eel_labeled_image_accessible_initialize (AtkObject *accessible,
- gpointer widget)
-{
- a11y_parent_class->initialize (accessible, widget);
- atk_object_set_role (accessible, ATK_ROLE_IMAGE);
-
-}
-
static EelLabeledImage *
get_image (gpointer object)
{
@@ -2248,29 +2241,27 @@ eel_labeled_image_accessible_image_interface_init (AtkImageIface *iface)
iface->get_image_size = eel_labeled_image_accessible_image_get_size;
}
-typedef struct _EelLabeledImageAccessible EelLabeledImageAccessible;
-typedef struct _EelLabeledImageAccessibleClass EelLabeledImageAccessibleClass;
-
-struct _EelLabeledImageAccessible
-{
- GtkContainerAccessible parent;
-};
-
-struct _EelLabeledImageAccessibleClass
-{
- GtkContainerAccessibleClass parent_class;
-};
+typedef GtkContainerAccessible EelLabeledImageAccessible;
+typedef GtkContainerAccessibleClass EelLabeledImageAccessibleClass;
G_DEFINE_TYPE_WITH_CODE (EelLabeledImageAccessible,
eel_labeled_image_accessible,
GTK_TYPE_CONTAINER_ACCESSIBLE,
G_IMPLEMENT_INTERFACE (ATK_TYPE_IMAGE,
eel_labeled_image_accessible_image_interface_init));
+
+static void
+eel_labeled_image_accessible_initialize (AtkObject *accessible,
+ gpointer widget)
+{
+ ATK_OBJECT_CLASS (eel_labeled_image_accessible_parent_class)->initialize (accessible, widget);
+ atk_object_set_role (accessible, ATK_ROLE_IMAGE);
+}
+
static void
eel_labeled_image_accessible_class_init (EelLabeledImageAccessibleClass *klass)
{
AtkObjectClass *atk_class = ATK_OBJECT_CLASS (klass);
- a11y_parent_class = g_type_class_peek_parent (klass);
atk_class->get_name = eel_labeled_image_accessible_get_name;
atk_class->initialize = eel_labeled_image_accessible_initialize;
@@ -2281,119 +2272,63 @@ eel_labeled_image_accessible_init (EelLabeledImageAccessible *accessible)
{
}
-static void
-eel_labeled_image_button_class_init (GtkWidgetClass *klass)
-{
-}
-
-static GType
-eel_labeled_image_button_get_type (void)
-{
- static GType type = 0;
-
- if (!type)
- {
- GTypeInfo info =
- {
- sizeof (GtkButtonClass),
- (GBaseInitFunc) NULL,
- (GBaseFinalizeFunc) NULL,
- (GClassInitFunc) eel_labeled_image_button_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (GtkButton),
- 0, /* n_preallocs */
- (GInstanceInitFunc) NULL
- };
-
- type = g_type_register_static
- (GTK_TYPE_BUTTON,
- "EelLabeledImageButton", &info, 0);
- }
-
- return type;
-}
-
-static GType
-eel_labeled_image_check_button_get_type (void)
-{
- static GType type = 0;
-
- if (!type)
- {
- GTypeInfo info =
- {
- sizeof (GtkCheckButtonClass),
- (GBaseInitFunc) NULL,
- (GBaseFinalizeFunc) NULL,
- (GClassInitFunc) eel_labeled_image_button_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (GtkCheckButton),
- 0, /* n_preallocs */
- (GInstanceInitFunc) NULL
- };
-
- type = g_type_register_static
- (GTK_TYPE_CHECK_BUTTON,
- "EelLabeledImageCheckButton", &info, 0);
- }
-
- return type;
-}
-
-static GType
-eel_labeled_image_toggle_button_get_type (void)
-{
- static GType type = 0;
-
- if (!type)
- {
- GTypeInfo info =
- {
- sizeof (GtkToggleButtonClass),
- (GBaseInitFunc) NULL,
- (GBaseFinalizeFunc) NULL,
- (GClassInitFunc) eel_labeled_image_button_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (GtkToggleButton),
- 0, /* n_preallocs */
- (GInstanceInitFunc) NULL
- };
-
- type = g_type_register_static
- (GTK_TYPE_TOGGLE_BUTTON,
- "EelLabeledImageToggleButton", &info, 0);
- }
-
- return type;
-}
-
-static GType
-eel_labeled_image_radio_button_get_type (void)
-{
- static GType type = 0;
-
- if (!type)
- {
- GTypeInfo info =
- {
- sizeof (GtkRadioButtonClass),
- (GBaseInitFunc) NULL,
- (GBaseFinalizeFunc) NULL,
- (GClassInitFunc) eel_labeled_image_button_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (GtkRadioButton),
- 0, /* n_preallocs */
- (GInstanceInitFunc) NULL
- };
-
- type = g_type_register_static
- (GTK_TYPE_RADIO_BUTTON,
- "EelLabeledImageRadioButton", &info, 0);
- }
-
- return type;
-}
+/* Defines GObject types for the various buttons. This takes care of creating
+ * the related accessible type as well and to plug it to the base
+ * EelLabeledImageAccessible which handles those cases as well -- having
+ * different accessible types for each of those is only required to inherit
+ * from the correct GTK accessible parent. */
+
+#define DEFINE_LABELLED_IMAGE_BUTTON_TYPE(TN, t_n, TP, T_P, ATP, A_T_P) \
+ typedef TP TN; \
+ typedef TP##Class TN##Class; \
+ typedef ATP TN##Accessible; \
+ typedef ATP##Class TN##AccessibleClass; \
+ G_DEFINE_TYPE (TN, t_n, T_P) \
+ G_DEFINE_TYPE_WITH_CODE (TN##Accessible, t_n##_accessible, A_T_P, \
+ G_IMPLEMENT_INTERFACE (ATK_TYPE_IMAGE, \
+ eel_labeled_image_accessible_image_interface_init)) \
+ static void t_n##_class_init(TN##Class *klass) \
+ { \
+ gtk_widget_class_set_accessible_type (GTK_WIDGET_CLASS (klass), \
+ t_n##_accessible_get_type ()); \
+ } \
+ static void t_n##_init (TN *obj) \
+ { \
+ } \
+ static void t_n##_accessible_class_init(TN##AccessibleClass *klass) \
+ { \
+ AtkObjectClass *atk_class = ATK_OBJECT_CLASS (klass); \
+ atk_class->get_name = eel_labeled_image_accessible_get_name; \
+ } \
+ static void t_n##_accessible_init (TN##Accessible *obj) \
+ { \
+ }
+
+
+DEFINE_LABELLED_IMAGE_BUTTON_TYPE (EelLabeledImageButton,
+ eel_labeled_image_button,
+ GtkButton,
+ GTK_TYPE_BUTTON,
+ GtkButtonAccessible,
+ GTK_TYPE_BUTTON_ACCESSIBLE)
+
+DEFINE_LABELLED_IMAGE_BUTTON_TYPE (EelLabeledImageCheckButton,
+ eel_labeled_image_check_button,
+ GtkCheckButton,
+ GTK_TYPE_CHECK_BUTTON,
+ GtkToggleButtonAccessible,
+ GTK_TYPE_TOGGLE_BUTTON_ACCESSIBLE)
+
+DEFINE_LABELLED_IMAGE_BUTTON_TYPE (EelLabeledImageToggleButton,
+ eel_labeled_image_toggle_button,
+ GtkToggleButton,
+ GTK_TYPE_TOGGLE_BUTTON,
+ GtkToggleButtonAccessible,
+ GTK_TYPE_TOGGLE_BUTTON_ACCESSIBLE)
+
+DEFINE_LABELLED_IMAGE_BUTTON_TYPE (EelLabeledImageRadioButton,
+ eel_labeled_image_radio_button,
+ GtkRadioButton,
+ GTK_TYPE_RADIO_BUTTON,
+ GtkRadioButtonAccessible,
+ GTK_TYPE_RADIO_BUTTON_ACCESSIBLE)