4 #include <gdk/gdkkeysyms.h>
6 gboolean escape_clear_focus_widget(ui::Widget widget, GdkEventKey *event, gpointer data)
8 if (event->keyval == GDK_KEY_Escape) {
9 gtk_window_set_focus(GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(widget))), NULL);
15 void widget_connect_escape_clear_focus_widget(ui::Widget widget)
17 widget.connect("key_press_event", G_CALLBACK(escape_clear_focus_widget), 0);
20 gboolean NonModalEntry::focus_in(ui::Entry entry, GdkEventFocus *event, NonModalEntry *self)
22 self->m_editing = false;
26 gboolean NonModalEntry::focus_out(ui::Entry entry, GdkEventFocus *event, NonModalEntry *self)
28 if (self->m_editing && gtk_widget_get_visible(GTK_WIDGET(entry))) {
31 self->m_editing = false;
35 gboolean NonModalEntry::changed(ui::Entry entry, NonModalEntry *self)
37 self->m_editing = true;
41 gboolean NonModalEntry::enter(ui::Entry entry, GdkEventKey *event, NonModalEntry *self)
43 if (event->keyval == GDK_KEY_Return) {
45 self->m_editing = false;
46 gtk_window_set_focus(GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(entry))), NULL);
52 gboolean NonModalEntry::escape(ui::Entry entry, GdkEventKey *event, NonModalEntry *self)
54 if (event->keyval == GDK_KEY_Escape) {
56 self->m_editing = false;
57 gtk_window_set_focus(GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(entry))), NULL);
63 void NonModalEntry::connect(ui::Entry entry)
65 entry.connect("focus_in_event", G_CALLBACK(focus_in), this);
66 entry.connect("focus_out_event", G_CALLBACK(focus_out), this);
67 entry.connect("key_press_event", G_CALLBACK(enter), this);
68 entry.connect("key_press_event", G_CALLBACK(escape), this);
69 entry.connect("changed", G_CALLBACK(changed), this);
72 gboolean NonModalSpinner::changed(ui::SpinButton spin, NonModalSpinner *self)
78 gboolean NonModalSpinner::enter(ui::SpinButton spin, GdkEventKey *event, NonModalSpinner *self)
80 if (event->keyval == GDK_KEY_Return) {
81 gtk_window_set_focus(GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(spin))), NULL);
87 gboolean NonModalSpinner::escape(ui::SpinButton spin, GdkEventKey *event, NonModalSpinner *self)
89 if (event->keyval == GDK_KEY_Escape) {
91 gtk_window_set_focus(GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(spin))), NULL);
97 void NonModalSpinner::connect(ui::SpinButton spin)
99 auto adj = ui::Adjustment(gtk_spin_button_get_adjustment(spin));
100 guint handler = adj.connect("value_changed", G_CALLBACK(changed), this);
101 g_object_set_data(G_OBJECT(spin), "handler", gint_to_pointer(handler));
102 spin.connect("key_press_event", G_CALLBACK(enter), this);
103 spin.connect("key_press_event", G_CALLBACK(escape), this);
106 void NonModalRadio::connect(ui::RadioButton radio)
108 GSList *group = gtk_radio_button_get_group(radio);
109 for (; group != 0; group = g_slist_next(group)) {
110 toggle_button_connect_callback(ui::ToggleButton(GTK_TOGGLE_BUTTON(group->data)), m_changed);