From 44ce183a25714df673d63ea702b7f780bf0a3a0c Mon Sep 17 00:00:00 2001 From: eidheim Date: Tue, 28 Jul 2015 16:56:54 +0200 Subject: [PATCH] Implemented use of command-arrow keys on OS X. --- juci/notebook.cc | 6 ++---- juci/window.cc | 49 +++++++++++++++++++++++++++++++++++++++++++----- juci/window.h | 5 +++-- 3 files changed, 49 insertions(+), 11 deletions(-) diff --git a/juci/notebook.cc b/juci/notebook.cc index da1c8fa..e2c70b5 100644 --- a/juci/notebook.cc +++ b/juci/notebook.cc @@ -59,10 +59,8 @@ void Notebook::Controller::CreateKeybindings() { auto widget=window->get_focus(); if(auto entry=dynamic_cast(widget)) entry->copy_clipboard(); - else { - if (Pages() != 0) - CurrentSourceView()->get_buffer()->copy_clipboard(clipboard); - } + else if(auto text_view=dynamic_cast(widget)) + text_view->get_buffer()->copy_clipboard(clipboard); }); menu->action_group->add(Gtk::Action::create("EditCut", "Cut"), Gtk::AccelKey(menu->key_map["edit_cut"]), [this]() { auto window=(Gtk::Window*)view.get_toplevel(); diff --git a/juci/window.cc b/juci/window.cc index 06379d5..35220d6 100644 --- a/juci/window.cc +++ b/juci/window.cc @@ -80,11 +80,6 @@ Window::Window() : window_box_.pack_end(paned_); show_all_children(); - signal_key_press_event().connect([this](GdkEventKey* key) { - if(key->keyval==GDK_KEY_Escape) - Singleton::notebook()->entry_box.hide(); - return false; - }); Singleton::notebook()->entry_box.signal_show().connect([this](){ std::vector focus_chain; focus_chain.emplace_back(&Singleton::notebook()->entry_box); @@ -97,6 +92,50 @@ Window::Window() : INFO("Window created"); } // Window constructor +bool Window::on_key_press_event(GdkEventKey *event) { + if(event->keyval==GDK_KEY_Escape) { + Singleton::notebook()->entry_box.hide(); + return true; + } + +#ifdef __APPLE__ //For Apple's Command-left, right, up, down keys + if((event->state & GDK_META_MASK)>0) { + if(event->keyval==GDK_KEY_Left) { + event->keyval=GDK_KEY_Home; + event->state=event->state & GDK_SHIFT_MASK; + event->hardware_keycode=115; + } + else if(event->keyval==GDK_KEY_Right) { + event->keyval=GDK_KEY_End; + event->state=event->state & GDK_SHIFT_MASK; + event->hardware_keycode=119; + } + else if(event->keyval==GDK_KEY_Up) { + if(auto text_view=dynamic_cast(get_focus())) { + if(event->state & GDK_SHIFT_MASK) + text_view->get_buffer()->select_range(text_view->get_buffer()->begin(), text_view->get_buffer()->get_insert()->get_iter()); + else + text_view->get_buffer()->place_cursor(text_view->get_buffer()->begin()); + text_view->scroll_to(text_view->get_buffer()->get_insert()); + } + return true; + } + else if(event->keyval==GDK_KEY_Down) { + if(auto text_view=dynamic_cast(get_focus())) { + if(event->state & GDK_SHIFT_MASK) + text_view->get_buffer()->select_range(text_view->get_buffer()->end(), text_view->get_buffer()->get_insert()->get_iter()); + else + text_view->get_buffer()->place_cursor(text_view->get_buffer()->end()); + text_view->scroll_to(text_view->get_buffer()->get_insert()); + } + return true; + } + } +#endif + + return Gtk::Window::on_key_press_event(event); +} + void Window::OnWindowHide() { auto size=Singleton::notebook()->source_views.size(); for(size_t c=0;c