summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Dywan <christian@twotoasts.de>2018-08-30 09:36:46 +0200
committerChristian Dywan <christian@twotoasts.de>2018-08-30 09:36:46 +0200
commit6477d4d7087af033ea4d209aa924bde1c7484c45 (patch)
treead70f42b6935547e0c6a70a4e76dd74a1e32a8fa
parent10eca362366ed25b2b0be83eb5b814306c68ff4f (diff)
downloadmidori-git-page-menu-cut-copy-paste.tar.gz
Implement cut/ copy/ paste in page menupage-menu-cut-copy-paste
-rw-r--r--core/browser.vala65
-rw-r--r--ui/menus.ui21
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">&lt;Primary&gt;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">&lt;Primary&gt;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">&lt;Primary&gt;v</attribute>
+ </item>
+ </section>
+ <section>
<item>
<attribute name="action">win.find</attribute>
<attribute name="label" translatable="yes">_Find in Page</attribute>