[gnome-builder/wip/alexl/emacs-css-keys: 5/5] Replace gb-emacs-source with CSS based keybindings



commit d21fa4ec2e9ac9149f40b3c0dc4d3b4cf73e8032
Author: Alexander Larsson <alexl redhat com>
Date:   Wed Feb 18 18:17:13 2015 +0100

    Replace gb-emacs-source with CSS based keybindings
    
    This also adds a bunch of stuff from the default.ini keybindings
    file that was not bound in emacs mode before.

 src/app/gb-application.c                  |   21 +-
 src/editor/gb-source-view.c               |   22 -
 src/editor/gb-source-view.h               |    2 -
 src/emacs/gb-source-emacs.c               | 1365 -----------------------------
 src/emacs/gb-source-emacs.h               |   65 --
 src/gnome-builder.mk                      |    2 -
 src/resources/css/emacs.css               |  107 +++
 src/resources/gnome-builder.gresource.xml |    1 +
 8 files changed, 128 insertions(+), 1457 deletions(-)
---
diff --git a/src/app/gb-application.c b/src/app/gb-application.c
index d7f6271..ec59bf9 100644
--- a/src/app/gb-application.c
+++ b/src/app/gb-application.c
@@ -37,6 +37,7 @@
 #include "gb-workbench.h"
 
 #define ADWAITA_CSS  "resource:///org/gnome/builder/css/builder.Adwaita.css"
+#define EMACS_CSS  "resource:///org/gnome/builder/css/emacs.css"
 #define LANGUAGE_SCHEMA "org.gnome.builder.editor.language"
 #define LANGUAGE_PATH "/org/gnome/builder/editor/language/"
 #define GSV_PATH "resource:///org/gnome/builder/styles/"
@@ -46,6 +47,7 @@ struct _GbApplicationPrivate
   GbKeybindings       *keybindings;
   GSettings           *editor_settings;
   GbPreferencesWindow *preferences_window;
+  GtkCssProvider      *emacs_provider;
 };
 
 G_DEFINE_TYPE_WITH_PRIVATE (GbApplication, gb_application, GTK_TYPE_APPLICATION)
@@ -356,11 +358,28 @@ gb_application_emacs_mode_changed (GbApplication *self,
 
   if (g_settings_get_boolean (settings, "emacs-mode"))
     {
+      if (self->priv->emacs_provider == NULL)
+        {
+          GFile *file = g_file_new_for_uri (EMACS_CSS);
+          self->priv->emacs_provider = gtk_css_provider_new ();
+          gtk_css_provider_load_from_file (self->priv->emacs_provider, file, NULL);
+          g_object_unref (file);
+        }
+
+      gtk_style_context_add_provider_for_screen (gdk_screen_get_default (),
+                                                 GTK_STYLE_PROVIDER (self->priv->emacs_provider),
+                                                 GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
+
       g_settings_set_boolean (settings, "vim-mode", FALSE);
       gb_application_load_keybindings (self, "emacs");
     }
   else
-    gb_application_load_keybindings (self, "default");
+    {
+      if (self->priv->emacs_provider)
+        gtk_style_context_remove_provider_for_screen (gdk_screen_get_default (),
+                                                      GTK_STYLE_PROVIDER (self->priv->emacs_provider));
+      gb_application_load_keybindings (self, "default");
+    }
 }
 
 static void
diff --git a/src/editor/gb-source-view.c b/src/editor/gb-source-view.c
index fa98f46..09c58d4 100644
--- a/src/editor/gb-source-view.c
+++ b/src/editor/gb-source-view.c
@@ -44,7 +44,6 @@
 #include "gb-source-snippet-private.h"
 #include "gb-source-view.h"
 #include "gb-source-vim.h"
-#include "gb-source-emacs.h" 
 #include "gb-source-view-mode.h"
 #include "gb-widget.h"
 
@@ -62,7 +61,6 @@ struct _GbSourceViewPrivate
   GtkSourceCompletionProvider *snippets_provider;
   GtkSourceCompletionProvider *words_provider;
   GbSourceVim                 *vim;
-  GbSourceEmacs               *emacs;
   GtkCssProvider              *css_provider;
   GbSourceViewMode            *mode;
 
@@ -131,14 +129,6 @@ gb_source_view_get_vim (GbSourceView *view)
   return view->priv->vim;
 }
 
-GbSourceEmacs *
-gb_source_view_get_emacs (GbSourceView *view)
-{
-  g_return_val_if_fail (GB_IS_SOURCE_VIEW (view), NULL);
-
-  return view->priv->emacs;
-}
-
 gboolean
 gb_source_view_get_insert_matching_brace (GbSourceView *view)
 {
@@ -249,7 +239,6 @@ gb_source_view_disconnect_settings (GbSourceView *view)
   g_settings_unbind (view, "tab-width");
   g_settings_unbind (view, "font-name");
   g_settings_unbind (view->priv->vim, "enabled");
-  g_settings_unbind (view->priv->emacs, "enabled");
 
   g_clear_object (&view->priv->language_settings);
   g_clear_object (&view->priv->editor_settings);
@@ -316,8 +305,6 @@ gb_source_view_connect_settings (GbSourceView *view)
                    buffer, "style-scheme-name", G_SETTINGS_BIND_GET);
   g_settings_bind (view->priv->editor_settings, "vim-mode",
                    view->priv->vim, "enabled", G_SETTINGS_BIND_GET);
-  g_settings_bind (view->priv->editor_settings, "emacs-mode",
-                   view->priv->emacs, "enabled", G_SETTINGS_BIND_GET);
   g_settings_bind (view->priv->editor_settings, "word-completion",
                    view, "enable-word-completion", G_SETTINGS_BIND_GET);
   g_settings_bind (view->priv->editor_settings, "show-line-numbers",
@@ -2158,7 +2145,6 @@ gb_source_view_finalize (GObject *object)
   g_clear_object (&priv->snippets_provider);
   g_clear_object (&priv->words_provider);
   g_clear_object (&priv->vim);
-  g_clear_object (&priv->emacs);
   g_clear_object (&priv->css_provider);
   g_clear_object (&priv->mode);
 
@@ -2544,14 +2530,6 @@ gb_source_view_init (GbSourceView *view)
                            G_CONNECT_SWAPPED);
 
   /*
-   * Setup Emacs integration.
-   */
-    view->priv->emacs = g_object_new (GB_TYPE_SOURCE_EMACS,
-                                      "enabled", FALSE,
-                                      "text-view", view,
-                                      NULL);
-
-  /*
    * We block completion when we are not focused so that two SourceViews
    * viewing the same GtkTextBuffer do not both show completion windows.
    */
diff --git a/src/editor/gb-source-view.h b/src/editor/gb-source-view.h
index 53a094c..11bc2dd 100644
--- a/src/editor/gb-source-view.h
+++ b/src/editor/gb-source-view.h
@@ -24,7 +24,6 @@
 #include "gb-source-auto-indenter.h"
 #include "gb-source-snippet.h"
 #include "gb-source-vim.h"
-#include "gb-source-emacs.h"
 
 G_BEGIN_DECLS
 
@@ -96,7 +95,6 @@ void                  gb_source_view_set_overwrite_braces (GbSourceView
 void                  gb_source_view_set_show_shadow      (GbSourceView         *view,
                                                            gboolean              show_shadow);
 GbSourceVim          *gb_source_view_get_vim              (GbSourceView         *view);
-GbSourceEmacs        *gb_source_view_get_emacs            (GbSourceView         *view);
 
 G_END_DECLS
 
diff --git a/src/gnome-builder.mk b/src/gnome-builder.mk
index da9a579..6a29c32 100644
--- a/src/gnome-builder.mk
+++ b/src/gnome-builder.mk
@@ -102,8 +102,6 @@ libgnome_builder_la_SOURCES = \
        src/editor/gb-source-view.h \
        src/editor/gb-source-view-mode.c \
        src/editor/gb-source-view-mode.h \
-       src/emacs/gb-source-emacs.c \
-       src/emacs/gb-source-emacs.h \
        src/fuzzy/fuzzy.c \
        src/fuzzy/fuzzy.h \
        src/gca/gca-diagnostics.c \
diff --git a/src/resources/css/emacs.css b/src/resources/css/emacs.css
new file mode 100644
index 0000000..528ecf6
--- /dev/null
+++ b/src/resources/css/emacs.css
@@ -0,0 +1,107 @@
+ binding-set builder-emacs-text-entry
+{
+  bind "<ctrl>b" { "move-cursor" (logical-positions, -1, 0) };
+  bind "<shift><ctrl>b" { "move-cursor" (logical-positions, -1, 1) };
+  bind "<ctrl>f" { "move-cursor" (logical-positions, 1, 0) };
+  bind "<shift><ctrl>f" { "move-cursor" (logical-positions, 1, 1) };
+
+  bind "<alt>b" { "move-cursor" (words, -1, 0) };
+  bind "<shift><alt>b" { "move-cursor" (words, -1, 1) };
+  bind "<alt>f" { "move-cursor" (words, 1, 0) };
+  bind "<shift><alt>f" { "move-cursor" (words, 1, 1) };
+
+  bind "<ctrl>a" { "move-cursor" (paragraph-ends, -1, 0) };
+  bind "<shift><ctrl>a" { "move-cursor" (paragraph-ends, -1, 1) };
+  bind "<ctrl>e" { "move-cursor" (paragraph-ends, 1, 0) };
+  bind "<shift><ctrl>e" { "move-cursor" (paragraph-ends, 1, 1) };
+
+  bind "<ctrl>w" { "cut-clipboard" () };
+  bind "<alt>w" { "copy-clipboard" () };
+  bind "<ctrl>y" { "paste-clipboard" () };
+
+  bind "<ctrl>d" { "delete-from-cursor" (chars, 1) };
+  bind "<alt>d" { "delete-from-cursor" (word-ends, 1) };
+  bind "<ctrl>k" { "delete-from-cursor" (paragraph-ends, 1) };
+  bind "<alt>backslash" { "delete-from-cursor" (whitespace, 1) };
+
+  bind "<alt>space" { "delete-from-cursor" (whitespace, 1)
+                      "insert-at-cursor" (" ") };
+  bind "<alt>KP_Space" { "delete-from-cursor" (whitespace, 1)
+                         "insert-at-cursor" (" ")  };
+}
+
+/*
+ * Bindings for GtkTextView
+ */
+ binding-set builder-emacs-text-view
+{
+  bind "<ctrl>p" { "move-cursor" (display-lines, -1, 0) };
+  bind "<shift><ctrl>p" { "move-cursor" (display-lines, -1, 1) };
+  bind "<ctrl>n" { "move-cursor" (display-lines, 1, 0) };
+  bind "<shift><ctrl>n" { "move-cursor" (display-lines, 1, 1) };
+
+  bind "<ctrl>space" { "set-anchor" () };
+  bind "<ctrl>KP_Space" { "set-anchor" () };
+}
+
+ binding-set builder-emacs-source-view
+{
+  bind "<ctrl>x" { "set-mode" ("emacs-x", transient) };
+  bind "<ctrl>underscore" { "undo" () };
+  bind "<alt>x" { "action" ("win", "show-command-bar", "") };
+  bind "<ctrl>s" { "action" ("editor-frame", "find", "") };
+  bind "<ctrl>period" { "action" ("win", "global-search", "") };
+  bind "<ctrl>comma" { "action" ("app", "preferences", "") };
+  bind "<alt>n" { "action" ("editor-frame", "next-diagnostic", "") };
+  bind "<alt>p" { "action" ("editor-frame", "previous-diagnostic", "") };
+  bind "<ctrl>j" { "action" ("editor-view", "switch-pane", "") };
+  bind "<shift><ctrl>j" { "action" ("editor-view", "toggle-split", "") };
+  bind "<ctrl><alt>Page_Up" { "action" ("stack", "previous-document", "") };
+  bind "<ctrl><alt>Page_Down" { "action" ("stack", "next-document", "") };
+}
+
+ binding-set builder-emacs-source-view-x
+{
+  bind "<ctrl>c" { "action" ("app", "quit", "") };
+  bind "0" { "action" ("stack", "close", "") };
+  bind "k" { "action" ("stack", "close", "") };
+  bind "<ctrl>f" { "action" ("workspace", "open", "") };
+  bind "<ctrl>s" { "action" ("stack", "save", "") };
+  bind "s" { "action" ("win", "save-all", "") };
+  bind "b" { "action" ("workspace", "new-document", "") };
+  bind "<ctrl>w" { "action" ("stack", "save-as", "") };
+  bind "u" { "redo" () };
+  bind "2" { "action" ("editor-view", "toggle-split", "") };
+  bind "3" { "action" ("stack", "split-document-right", "") };
+  bind "o" { "action" ("stack", "focus-right", "") };
+}
+
+/*
+ * Bindings for GtkTreeView
+ */
+ binding-set builder-emacs-tree-view
+{
+  bind "<ctrl>s" { "start-interactive-search" () };
+  bind "<ctrl>f" { "move-cursor" (logical-positions, 1) };
+  bind "<ctrl>b" { "move-cursor" (logical-positions, -1) };
+}
+
+GtkEntry {
+  gtk-key-bindings: builder-emacs-text-entry;
+}
+
+GtkTextView {
+  gtk-key-bindings: builder-emacs-text-entry, builder-emacs-text-view;
+}
+
+GtkSourceView {
+  gtk-key-bindings: builder-emacs-text-entry, builder-emacs-source-view, builder-emacs-text-view;
+}
+
+GbSourceViewMode.emacs-x {
+  gtk-key-bindings: builder-emacs-source-view-x;
+}
+
+GtkTreeView {
+  gtk-key-bindings: builder-emacs-tree-view;
+}
diff --git a/src/resources/gnome-builder.gresource.xml b/src/resources/gnome-builder.gresource.xml
index c6c6c57..5298619 100644
--- a/src/resources/gnome-builder.gresource.xml
+++ b/src/resources/gnome-builder.gresource.xml
@@ -2,6 +2,7 @@
 <gresources>
   <gresource prefix="/org/gnome/builder">
     <file>css/builder.Adwaita.css</file>
+    <file>css/emacs.css</file>
     <file>css/markdown.css</file>
 
     <file>editor/uncrustify/uncrustify.c.cfg</file>


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]