X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fui%2Fgui%2Fpsppire-cell-renderer-button.c;h=703ff3ddfd3056572b168dbc095cc58199bb2cd4;hb=a6f1c88d9d4dee24e1f79048c8a5d8274f68c405;hp=6f7269842505e3bebe8a0f701af25f59936eccf1;hpb=f95002ec226b18f52773e747cae7e1d00302ad1a;p=pspp diff --git a/src/ui/gui/psppire-cell-renderer-button.c b/src/ui/gui/psppire-cell-renderer-button.c index 6f72698425..703ff3ddfd 100644 --- a/src/ui/gui/psppire-cell-renderer-button.c +++ b/src/ui/gui/psppire-cell-renderer-button.c @@ -30,7 +30,7 @@ #include "gettext.h" #define _(msgid) gettext (msgid) -static void psppire_cell_renderer_button_destroy (GtkObject *); +static void psppire_cell_renderer_button_dispose (GObject *); static void psppire_cell_renderer_button_finalize (GObject *); static void update_style_cache (PsppireCellRendererButton *button, @@ -59,7 +59,8 @@ enum { PROP_0, PROP_EDITABLE, - PROP_LABEL + PROP_LABEL, + PROP_SLASH }; static void @@ -85,6 +86,11 @@ psppire_cell_renderer_button_set_property (GObject *object, obj->label = g_value_dup_string (value); break; + case PROP_SLASH: + psppire_cell_renderer_button_set_slash (obj, + g_value_get_boolean (value)); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -109,6 +115,11 @@ psppire_cell_renderer_button_get_property (GObject *object, g_value_set_string (value, obj->label); break; + case PROP_SLASH: + g_value_set_boolean (value, + psppire_cell_renderer_button_get_slash (obj)); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -123,13 +134,6 @@ on_style_set (GtkWidget *base, update_style_cache (button, NULL); } -static void -on_destroy (GtkObject *base, - PsppireCellRendererButton *button) -{ - update_style_cache (button, NULL); -} - static void update_style_cache (PsppireCellRendererButton *button, GtkWidget *widget) @@ -156,11 +160,6 @@ update_style_cache (PsppireCellRendererButton *button, button->style_set_handler); button->style_set_handler = 0; } - if (button->destroy_handler) - { - g_signal_handler_disconnect (button->base, button->destroy_handler); - button->destroy_handler = 0; - } g_object_unref (button->base); button->base = NULL; } @@ -175,10 +174,6 @@ update_style_cache (PsppireCellRendererButton *button, button->style_set_handler = g_signal_connect (widget, "style-set", G_CALLBACK (on_style_set), button); - button->destroy_handler = g_signal_connect (widget, "destroy", - G_CALLBACK (on_destroy), - button); - g_object_ref (widget); g_object_ref (button->button_style); g_object_ref (button->label_style); @@ -222,6 +217,13 @@ psppire_cell_renderer_button_render (GtkCellRenderer *cell, state_type, button->label_style, button->label, button->xpad, button->ypad, cell->xalign, cell->yalign); + + if (button->slash) + gdk_draw_line (window, button->button_style->black_gc, + cell_area->x, + cell_area->y + cell_area->height, + cell_area->x + cell_area->width, + cell_area->y); } static void @@ -290,25 +292,6 @@ psppire_cell_renderer_button_clicked (GtkButton *button, g_free (path); } -static gboolean -psppire_cell_renderer_button_focus_out_event (GtkWidget *widget, - GdkEvent *event, - gpointer data) -{ - PsppireCellRendererButton *cell_button = data; - - g_signal_handlers_disconnect_by_func (widget, - psppire_cell_renderer_button_focus_out_event, - data); - g_signal_handlers_disconnect_by_func (widget, - psppire_cell_renderer_button_clicked, - data); - - gtk_cell_renderer_stop_editing (GTK_CELL_RENDERER (cell_button), FALSE); - - return FALSE; -} - #define IDLE_ID_STRING "psppire-cell-renderer-button-idle-id" static gboolean @@ -316,8 +299,8 @@ psppire_cell_renderer_button_initial_click (gpointer data) { GtkButton *button = data; - gtk_button_clicked (button); g_object_steal_data (G_OBJECT (button), IDLE_ID_STRING); + gtk_button_clicked (button); return FALSE; } @@ -352,6 +335,26 @@ psppire_cell_renderer_button_press_event (GtkButton *button, { PsppireCellRendererButton *cell_button = data; + if (event->button == 3) + { + /* Allow right-click events to propagate upward in the widget hierarchy. + Otherwise right-click menus, that trigger on a button-press-event on + the containing PsppSheetView, will pop up if the button is rendered as + a facade but not if the button widget exists. + + We have to translate the event's data by hand to be relative to the + parent window, because the normal GObject signal propagation mechanism + won't do it for us. (This might be a hint that we're doing this + wrong.) */ + gint x, y; + + gdk_window_get_position (event->window, &x, &y); + event->x += x; + event->y += y; + g_signal_stop_emission_by_name (button, "button-press-event"); + return FALSE; + } + if (cell_button->click_time != 0) { GdkScreen *screen = gtk_widget_get_screen (GTK_WIDGET (button)); @@ -406,9 +409,6 @@ psppire_cell_renderer_button_start_editing (GtkCellRenderer *cell, "path", path, NULL); - g_signal_connect (G_OBJECT (cell_button->button), "focus-out-event", - G_CALLBACK (psppire_cell_renderer_button_focus_out_event), - cell); g_signal_connect (G_OBJECT (cell_button->button), "clicked", G_CALLBACK (psppire_cell_renderer_button_clicked), cell); @@ -447,14 +447,12 @@ static void psppire_cell_renderer_button_class_init (PsppireCellRendererButtonClass *class) { GObjectClass *gobject_class = G_OBJECT_CLASS (class); - GtkObjectClass *gtk_object_class = GTK_OBJECT_CLASS (class); GtkCellRendererClass *cell_class = GTK_CELL_RENDERER_CLASS (class); gobject_class->set_property = psppire_cell_renderer_button_set_property; gobject_class->get_property = psppire_cell_renderer_button_get_property; gobject_class->finalize = psppire_cell_renderer_button_finalize; - - gtk_object_class->destroy = psppire_cell_renderer_button_destroy; + gobject_class->dispose = psppire_cell_renderer_button_dispose; cell_class->get_size = psppire_cell_renderer_button_get_size; cell_class->render = psppire_cell_renderer_button_render; @@ -493,6 +491,15 @@ psppire_cell_renderer_button_class_init (PsppireCellRendererButtonClass *class) "Text to appear in button.", "", G_PARAM_READWRITE)); + + g_object_class_install_property (gobject_class, + PROP_SLASH, + g_param_spec_boolean ("slash", + _("Diagonal slash"), + _("Whether to draw a diagonal slash across the button."), + FALSE, + G_PARAM_READWRITE)); + } static void @@ -504,13 +511,15 @@ psppire_cell_renderer_button_init (PsppireCellRendererButton *obj) obj->xpad = 0; obj->ypad = 0; + obj->slash = FALSE; + obj->button = NULL; obj->button_style = NULL; obj->label_style = NULL; obj->base = NULL; obj->style_set_handler = 0; - obj->destroy_handler = 0; + obj->dispose_has_run = FALSE; } static void @@ -522,13 +531,20 @@ psppire_cell_renderer_button_finalize (GObject *obj) } static void -psppire_cell_renderer_button_destroy (GtkObject *obj) +psppire_cell_renderer_button_dispose (GObject *obj) { PsppireCellRendererButton *button = PSPPIRE_CELL_RENDERER_BUTTON (obj); + if (button->dispose_has_run) + return; + + button->dispose_has_run = TRUE; + + /* When called with NULL, as we are doing here, update_style_cache + does nothing more than to drop references */ update_style_cache (button, NULL); - GTK_OBJECT_CLASS (psppire_cell_renderer_button_parent_class)->destroy (obj); + G_OBJECT_CLASS (psppire_cell_renderer_button_parent_class)->dispose (obj); } GtkCellRenderer * @@ -536,3 +552,18 @@ psppire_cell_renderer_button_new (void) { return GTK_CELL_RENDERER (g_object_new (PSPPIRE_TYPE_CELL_RENDERER_BUTTON, NULL)); } + +void +psppire_cell_renderer_button_set_slash (PsppireCellRendererButton *button, + gboolean slash) +{ + g_return_if_fail (button != NULL); + button->slash = slash; +} + +gboolean +psppire_cell_renderer_button_get_slash (const PsppireCellRendererButton *button) +{ + g_return_val_if_fail (button != NULL, FALSE); + return button->slash; +}