diff options
author | Christian Dywan <christian@twotoasts.de> | 2018-08-30 09:36:46 +0200 |
---|---|---|
committer | Christian Dywan <christian@twotoasts.de> | 2018-08-30 09:36:46 +0200 |
commit | 6477d4d7087af033ea4d209aa924bde1c7484c45 (patch) | |
tree | ad70f42b6935547e0c6a70a4e76dd74a1e32a8fa | |
parent | 10eca362366ed25b2b0be83eb5b814306c68ff4f (diff) | |
download | midori-git-page-menu-cut-copy-paste.tar.gz |
Implement cut/ copy/ paste in page menupage-menu-cut-copy-paste
-rw-r--r-- | core/browser.vala | 65 | ||||
-rw-r--r-- | ui/menus.ui | 21 |
2 files changed, 86 insertions, 0 deletions
diff --git a/core/browser.vala b/core/browser.vala index fa29617c..3657b6be 100644 --- a/core/browser.vala +++ b/core/browser.vala @@ -78,6 +78,9 @@ namespace Midori { Gtk.SearchEntry search_entry; List<Binding> bindings; + SimpleAction action_cut; + SimpleAction action_copy; + SimpleAction action_paste; construct { overlay.add_events (Gdk.EventMask.ENTER_NOTIFY_MASK); @@ -136,6 +139,19 @@ namespace Midori { action = new SimpleAction ("tab-zoom", VariantType.DOUBLE); action.activate.connect (tab_zoom_activated); add_action (action); + // Actions for editing + action_cut = new SimpleAction ("edit-cut", null); + action_cut.activate.connect (edit_cut_activated); + add_action (action_cut); + action_copy = new SimpleAction ("edit-copy", null); + action_copy.activate.connect (edit_copy_activated); + add_action (action_copy); + action_paste = new SimpleAction ("edit-paste", null); + action_paste.activate.connect (edit_paste_activated); + add_action (action_paste); + menubutton.clicked.connect (() => { + update_edit_actions.begin (); + }); // Action for panel toggling action = new SimpleAction.stateful ("panel", null, false); action.change_state.connect (panel_activated); @@ -345,6 +361,55 @@ namespace Midori { downloads.show_downloads (); } + async void update_edit_actions (Cancellable? cancellable=null) { + bool can_cut, can_copy, can_paste; + var editable = get_focus () as Gtk.Editable; + if (editable != null) { + can_copy = editable.get_selection_bounds (null, null); + can_cut = can_copy && editable.get_editable (); + can_paste = editable.get_editable (); + } else { + try { + can_cut = yield tab.can_execute_editing_command (WebKit.EDITING_COMMAND_CUT, cancellable); + can_copy = yield tab.can_execute_editing_command (WebKit.EDITING_COMMAND_COPY, cancellable); + can_paste = yield tab.can_execute_editing_command (WebKit.EDITING_COMMAND_PASTE, cancellable); + } catch (Error error) { + warning ("Failed to query editing command: %s", error.message); + can_cut = can_copy = can_paste = false; + } + } + action_cut.set_enabled (can_cut); + action_copy.set_enabled (can_copy); + action_paste.set_enabled (can_paste); + } + + void edit_cut_activated () { + var editable = get_focus () as Gtk.Editable; + if (editable != null) { + editable.cut_clipboard (); + } else { + tab.execute_editing_command (WebKit.EDITING_COMMAND_CUT); + } + } + + void edit_copy_activated () { + var editable = get_focus () as Gtk.Editable; + if (editable != null) { + editable.copy_clipboard (); + } else { + tab.execute_editing_command (WebKit.EDITING_COMMAND_COPY); + } + } + + void edit_paste_activated () { + var editable = get_focus () as Gtk.Editable; + if (editable != null) { + editable.paste_clipboard (); + } else { + tab.execute_editing_command (WebKit.EDITING_COMMAND_PASTE); + } + } + void find_activated () { search.show (); search.search_mode_enabled = true; diff --git a/ui/menus.ui b/ui/menus.ui index 0f648ea0..65f13b60 100644 --- a/ui/menus.ui +++ b/ui/menus.ui @@ -41,6 +41,27 @@ </menu> <menu id="browser-menu"> <section> + <attribute name="display-hint">horizontal-buttons</attribute> + <item> + <attribute name="action">win.edit-cut</attribute> + <attribute name="label" translatable="yes">_Cut</attribute> + <attribute name="verb-icon">edit-cut-symbolic</attribute> + <attribute name="accel"><Primary>x</attribute> + </item> + <item> + <attribute name="action">win.edit-copy</attribute> + <attribute name="label" translatable="yes">_Copy</attribute> + <attribute name="verb-icon">edit-copy-symbolic</attribute> + <attribute name="accel"><Primary>c</attribute> + </item> + <item> + <attribute name="action">win.edit-paste</attribute> + <attribute name="label" translatable="yes">_Paste</attribute> + <attribute name="verb-icon">edit-paste-symbolic</attribute> + <attribute name="accel"><Primary>v</attribute> + </item> + </section> + <section> <item> <attribute name="action">win.find</attribute> <attribute name="label" translatable="yes">_Find in Page</attribute> |