diff options
Diffstat (limited to 'src/widgets/spinbutton-events.cpp')
| -rw-r--r-- | src/widgets/spinbutton-events.cpp | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/src/widgets/spinbutton-events.cpp b/src/widgets/spinbutton-events.cpp new file mode 100644 index 000000000..14ac51422 --- /dev/null +++ b/src/widgets/spinbutton-events.cpp @@ -0,0 +1,137 @@ +/* + * Common callbacks for spinbuttons + * + * Authors: + * bulia byak <bulia@users.sourceforge.net> + * + * Copyright (C) 2003 authors + * + * Released under GNU GPL, read the file 'COPYING' for more information + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include <gtk/gtk.h> +#include <gdk/gdkkeysyms.h> + +#include "../event-context.h" + +#include "sp-widget.h" +#include "widget-sizes.h" + + +gboolean +spinbutton_focus_in (GtkWidget *w, GdkEventKey *event, gpointer data) +{ + gdouble *ini; + + ini = (gdouble *) gtk_object_get_data (GTK_OBJECT (w), "ini"); + if (ini) g_free (ini); // free the old value if any + + // retrieve the value + ini = g_new (gdouble, 1); + *ini = gtk_spin_button_get_value (GTK_SPIN_BUTTON(w)); + + // remember it + gtk_object_set_data (GTK_OBJECT (w), "ini", ini); + + return FALSE; // I didn't consume the event +} + +void +spinbutton_undo (GtkWidget *w) +{ + gdouble *ini = (gdouble *) gtk_object_get_data (GTK_OBJECT (w), "ini"); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(w), *ini); +} + +void +spinbutton_defocus (GtkObject *container) +{ + // defocus spinbuttons by moving focus to the canvas, unless "stay" is on + gboolean stay = GPOINTER_TO_INT(gtk_object_get_data (GTK_OBJECT (container), "stay")); + if (stay) { + gtk_object_set_data (GTK_OBJECT (container), "stay", GINT_TO_POINTER (FALSE)); + } else { + GtkWidget *canvas = (GtkWidget *) gtk_object_get_data (GTK_OBJECT (container), "dtw"); + if (canvas) { + gtk_widget_grab_focus (GTK_WIDGET(canvas)); + } + } +} + +gboolean +spinbutton_keypress (GtkWidget *w, GdkEventKey *event, gpointer data) +{ + SPWidget *spw = (SPWidget *) data; + gdouble v; + + switch (get_group0_keyval (event)) { + case GDK_Escape: // defocus + spinbutton_undo (w); + spinbutton_defocus (GTK_OBJECT (spw)); + return TRUE; // I consumed the event + break; + case GDK_Return: // defocus + case GDK_KP_Enter: + spinbutton_defocus (GTK_OBJECT (spw)); + return TRUE; // I consumed the event + break; + case GDK_Tab: + case GDK_ISO_Left_Tab: + // set the flag meaning "do not leave toolbar when changing value" + gtk_object_set_data (GTK_OBJECT (spw), "stay", GINT_TO_POINTER(TRUE)); + return FALSE; // I didn't consume the event + break; + + // The following keys are processed manually because GTK implements them in strange ways + // (increments start with double step value and seem to grow as you press the key continuously) + + case GDK_Up: + case GDK_KP_Up: + gtk_object_set_data (GTK_OBJECT (spw), "stay", GINT_TO_POINTER(TRUE)); + v = gtk_spin_button_get_value(GTK_SPIN_BUTTON (w)); + v += SPIN_STEP; + gtk_spin_button_set_value(GTK_SPIN_BUTTON(w), v); + return TRUE; // I consumed the event + break; + case GDK_Down: + case GDK_KP_Down: + gtk_object_set_data (GTK_OBJECT (spw), "stay", GINT_TO_POINTER(TRUE)); + v = gtk_spin_button_get_value(GTK_SPIN_BUTTON (w)); + v -= SPIN_STEP; + gtk_spin_button_set_value(GTK_SPIN_BUTTON(w), v); + return TRUE; // I consumed the event + break; + case GDK_Page_Up: + case GDK_KP_Page_Up: + gtk_object_set_data (GTK_OBJECT (spw), "stay", GINT_TO_POINTER(TRUE)); + v = gtk_spin_button_get_value(GTK_SPIN_BUTTON (w)); + v += SPIN_PAGE_STEP; + gtk_spin_button_set_value(GTK_SPIN_BUTTON(w), v); + return TRUE; // I consumed the event + break; + case GDK_Page_Down: + case GDK_KP_Page_Down: + gtk_object_set_data (GTK_OBJECT (spw), "stay", GINT_TO_POINTER(TRUE)); + v = gtk_spin_button_get_value(GTK_SPIN_BUTTON (w)); + v -= SPIN_PAGE_STEP; + gtk_spin_button_set_value(GTK_SPIN_BUTTON(w), v); + return TRUE; // I consumed the event + break; + case GDK_z: + case GDK_Z: + gtk_object_set_data (GTK_OBJECT (spw), "stay", GINT_TO_POINTER(TRUE)); + if (event->state & GDK_CONTROL_MASK) { + spinbutton_undo (w); + return TRUE; // I consumed the event + } + break; + default: + return FALSE; + break; + } + return FALSE; // I didn't consume the event +} |
