static void nsgtk_tree_window_input_method_commit(GtkIMContext *ctx, const gchar *str, gpointer data) { struct nsgtk_treeview *tw = (struct nsgtk_treeview *) data; size_t len = strlen(str), offset = 0; while (offset < len) { uint32_t nskey = utf8_to_ucs4(str + offset, len - offset); tree_keypress(tw->tree, nskey); offset = utf8_next(str, len, offset); } }
gboolean nsgtk_tree_window_keypress_event(GtkWidget *widget, GdkEventKey *event, gpointer g) { struct nsgtk_treeview *tw = (struct nsgtk_treeview *) g; struct tree *tree = tw->tree; uint32_t nskey; double value; GtkAdjustment *vscroll; GtkAdjustment *hscroll; GtkAdjustment *scroll = NULL; gdouble hpage, vpage; nskey = gtk_gui_gdkkey_to_nskey(event); if (tree_keypress(tree, nskey) == true) return TRUE; vscroll = gtk_scrolled_window_get_vadjustment(tw->scrolled); hscroll = gtk_scrolled_window_get_hadjustment(tw->scrolled); g_object_get(vscroll, "page-size", &vpage, NULL); g_object_get(hscroll, "page-size", &hpage, NULL); switch (event->keyval) { case GDK_KEY(Home): case GDK_KEY(KP_Home): scroll = vscroll; value = nsgtk_adjustment_get_lower(scroll); break; case GDK_KEY(End): case GDK_KEY(KP_End): scroll = vscroll; value = nsgtk_adjustment_get_upper(scroll) - vpage; if (value < nsgtk_adjustment_get_lower(scroll)) value = nsgtk_adjustment_get_lower(scroll); break; case GDK_KEY(Left): case GDK_KEY(KP_Left): scroll = hscroll; value = gtk_adjustment_get_value(scroll) - nsgtk_adjustment_get_step_increment(scroll); if (value < nsgtk_adjustment_get_lower(scroll)) value = nsgtk_adjustment_get_lower(scroll); break; case GDK_KEY(Up): case GDK_KEY(KP_Up): scroll = vscroll; value = gtk_adjustment_get_value(scroll) - nsgtk_adjustment_get_step_increment(scroll); if (value < nsgtk_adjustment_get_lower(scroll)) value = nsgtk_adjustment_get_lower(scroll); break; case GDK_KEY(Right): case GDK_KEY(KP_Right): scroll = hscroll; value = gtk_adjustment_get_value(scroll) + nsgtk_adjustment_get_step_increment(scroll); if (value > nsgtk_adjustment_get_upper(scroll) - hpage) value = nsgtk_adjustment_get_upper(scroll) - hpage; break; case GDK_KEY(Down): case GDK_KEY(KP_Down): scroll = vscroll; value = gtk_adjustment_get_value(scroll) + nsgtk_adjustment_get_step_increment(scroll); if (value > nsgtk_adjustment_get_upper(scroll) - vpage) value = nsgtk_adjustment_get_upper(scroll) - vpage; break; case GDK_KEY(Page_Up): case GDK_KEY(KP_Page_Up): scroll = vscroll; value = gtk_adjustment_get_value(scroll) - nsgtk_adjustment_get_page_increment(scroll); if (value < nsgtk_adjustment_get_lower(scroll)) value = nsgtk_adjustment_get_lower(scroll); break; case GDK_KEY(Page_Down): case GDK_KEY(KP_Page_Down): scroll = vscroll; value = gtk_adjustment_get_value(scroll) + nsgtk_adjustment_get_page_increment(scroll); if (value > nsgtk_adjustment_get_upper(scroll) - vpage) value = nsgtk_adjustment_get_upper(scroll) - vpage; break; default: break; } if (scroll != NULL) gtk_adjustment_set_value(scroll, value); return TRUE; }
static bool ro_treeview_keypress(wimp_key *key) { ro_treeview *tv; uint32_t c; tv = (ro_treeview *) ro_gui_wimp_event_get_user_data(key->w); if (tv == NULL) { LOG(("NULL treeview block for window: 0x%x", (unsigned int) key->w)); return false; } c = (uint32_t) key->c; if ((unsigned)c < 0x20 || (0x7f <= c && c <= 0x9f) || (c & IS_WIMP_KEY)) { /* Munge control keys into unused control chars */ /* We can't map onto 1->26 (reserved for ctrl+<qwerty> That leaves 27->31 and 128->159 */ switch (c & ~IS_WIMP_KEY) { case wimp_KEY_TAB: c = 9; break; case wimp_KEY_SHIFT | wimp_KEY_TAB: c = 11; break; /* cursor movement keys */ case wimp_KEY_HOME: case wimp_KEY_CONTROL | wimp_KEY_LEFT: c = KEY_LINE_START; break; case wimp_KEY_END: if (os_version >= RISCOS5) c = KEY_LINE_END; else c = KEY_DELETE_RIGHT; break; case wimp_KEY_CONTROL | wimp_KEY_RIGHT: c = KEY_LINE_END; break; case wimp_KEY_CONTROL | wimp_KEY_UP: c = KEY_TEXT_START; break; case wimp_KEY_CONTROL | wimp_KEY_DOWN: c = KEY_TEXT_END; break; case wimp_KEY_SHIFT | wimp_KEY_LEFT: c = KEY_WORD_LEFT ; break; case wimp_KEY_SHIFT | wimp_KEY_RIGHT: c = KEY_WORD_RIGHT; break; case wimp_KEY_SHIFT | wimp_KEY_UP: c = KEY_PAGE_UP; break; case wimp_KEY_SHIFT | wimp_KEY_DOWN: c = KEY_PAGE_DOWN; break; case wimp_KEY_LEFT: c = KEY_LEFT; break; case wimp_KEY_RIGHT: c = KEY_RIGHT; break; case wimp_KEY_UP: c = KEY_UP; break; case wimp_KEY_DOWN: c = KEY_DOWN; break; /* editing */ case wimp_KEY_CONTROL | wimp_KEY_END: c = KEY_DELETE_LINE_END; break; case wimp_KEY_DELETE: if (ro_gui_ctrl_pressed()) c = KEY_DELETE_LINE_START; else if (os_version < RISCOS5) c = KEY_DELETE_LEFT; break; default: break; } } if (!(c & IS_WIMP_KEY)) { if (tree_keypress(tv->tree, c)) { if (tv->callbacks && tv->callbacks->toolbar_button_update != NULL) tv->callbacks->toolbar_button_update(); return true; } } return false; }