Fix scrolling functionality
[WebThing.git] / plugins / Vimish.cs
index bb56ed0..22f2532 100644 (file)
 using System;
 using System.Text.RegularExpressions;
 using Gtk;
+using WebKit;
 using bytex64.WebThing;
 
-public class Plugin {
-       WebThing wt;
-       Gtk.Entry commandline;
-
-       public Plugin(WebThing wt) {
-               this.wt = wt;
-               wt.WebView.KeyPressEvent += WebView_KeyPress;
-
-               commandline = new Gtk.Entry();
-               commandline.Activated += command_Activate;
-               commandline.KeyPressEvent += command_KeyPress;
-               wt.AttachWidget(commandline, CompassDirection.S, AttachOptions.Fill, AttachOptions.Shrink);
-
-               commandline.Hide();
-       }
-
-       private void WebView_KeyPress(object o, KeyPressEventArgs e) {
-               Console.WriteLine(e.Event.Key);
-               switch(e.Event.Key) {
-               case Gdk.Key.j:
-                       wt.ScrolledWindow.Vadjustment.Value += wt.ScrolledWindow.Vadjustment.StepIncrement;
-                       break;
-               case Gdk.Key.k:
-                       wt.ScrolledWindow.Vadjustment.Value -= wt.ScrolledWindow.Vadjustment.StepIncrement;
-                       break;
-               case Gdk.Key.l:
-                       wt.ScrolledWindow.Hadjustment.Value += wt.ScrolledWindow.Hadjustment.StepIncrement;
-                       break;
-               case Gdk.Key.h:
-                       wt.ScrolledWindow.Hadjustment.Value -= wt.ScrolledWindow.Hadjustment.StepIncrement;
-                       break;
-               case Gdk.Key.o:
-                       CommandStart("open ");
-                       break;
-               case Gdk.Key.t:
-                       CommandStart("tabopen ");
-                       break;
-               case Gdk.Key.BackSpace:
-                       wt.WebView.GoBack();
-                       break;
-               case Gdk.Key.colon:
-                       CommandlineShow();
-                       break;
-               }
-       }
-
-       public void CommandStart(string text) {
-               commandline.Text = text;
-               commandline.GrabFocus();
-               commandline.Position = text.Length;
-               commandline.Show();
-       }
-
-       public void CommandlineShow() {
-               commandline.Show();
-               commandline.GrabFocus();
-       }
-
-       public void CommandlineHide() {
-               commandline.Hide();
-               wt.WebView.GrabFocus();
-       }
-
-       private void command_Activate(object o, EventArgs e) {
-               string[] args = Regex.Split(commandline.Text, @"\s+");
-               switch(args[0]) {
-               case "open":
-                       if (args.Length < 2) return;
-                       wt.WebView.Open(args[1]);
-                       break;
-               }
-               commandline.Text = "";
-               CommandlineHide();
-       }
-
-       private void command_KeyPress(object o, KeyPressEventArgs e) {
-               if (e.Event.Key == Gdk.Key.Escape)
-                       CommandlineHide();
-       }
+public class Vimish : WebThingPlugin {
+    WebThing wt;
+    Gtk.Entry commandline;
+
+    public override void Init(WebThing wt) {
+        this.wt = wt;
+        wt.Tabs.ShowTabs = false;
+
+        wt.Window.KeyPressEvent += Window_KeyPress;
+
+        commandline = new Gtk.Entry();
+        commandline.Activated += command_Activate;
+        commandline.KeyPressEvent += command_KeyPress;
+        wt.AttachWidget(commandline, AttachPoint.S, AttachOptions.Fill, AttachOptions.Shrink);
+
+        commandline.Hide();
+
+        ApplyOptions();
+    }
+
+    public override void InitWebView(WebView wv) {
+        wv.KeyPressEvent += WebView_KeyPress;
+    }
+
+    private void Window_KeyPress(object o, KeyPressEventArgs e) {
+        if ((Gdk.ModifierType.ControlMask & e.Event.State) != 0) {
+            switch(e.Event.Key) {
+            case Gdk.Key.n:
+                wt.Tabs.NextPage();
+                break;
+            case Gdk.Key.p:
+                wt.Tabs.PrevPage();
+                break;
+            }
+        } else {
+            switch(e.Event.Key) {
+            case Gdk.Key.o:
+                CommandStart("open ");
+                break;
+            case Gdk.Key.O:
+                CommandStart("open " + wt.WebView.MainFrame.Uri);
+                break;
+            case Gdk.Key.t:
+                CommandStart("tabopen ");
+                break;
+            case Gdk.Key.T:
+                CommandStart("tabopen " + wt.WebView.MainFrame.Uri);
+                break;
+            case Gdk.Key.colon:
+                CommandlineShow();
+                break;
+            }
+        }
+    }
+
+    private void WebView_KeyPress(object o, KeyPressEventArgs e) {
+        WebView wv = (WebView)o;
+
+        Console.WriteLine(e.Event.Key);
+        if (e.Event.State == Gdk.ModifierType.None) {
+            switch(e.Event.Key) {
+            case Gdk.Key.j:
+                wt.Bump(0, 1);
+                break;
+            case Gdk.Key.k:
+                wt.Bump(0, -1);
+                break;
+            case Gdk.Key.l:
+                wt.Bump(1, 0);
+                break;
+            case Gdk.Key.h:
+                wt.Bump(-1, 0);
+                break;
+            case Gdk.Key.r:
+                wv.Reload();
+                break;
+            case Gdk.Key.Escape:
+                wv.ExecuteScript("document.activeElement.blur()");
+                break;
+            }
+        }
+    }
+
+    public void CommandStart(string text) {
+        commandline.Text = text;
+        commandline.GrabFocus();
+        commandline.Position = text.Length;
+        commandline.Show();
+    }
+
+    public void CommandlineShow() {
+        commandline.Show();
+        commandline.GrabFocus();
+    }
+
+    public void CommandlineHide() {
+        commandline.Hide();
+        wt.WebView.GrabFocus();
+    }
+
+    private void command_Activate(object o, EventArgs e) {
+        string[] args = Regex.Split(commandline.Text, @"\s+");
+        if (args.Length == 0) return;
+        string cmd = args[0];
+        string[] tmp = new string[args.Length - 1];
+        Array.Copy(args, 1, tmp, 0, tmp.Length);
+        args = tmp;
+        string query = Regex.Replace(commandline.Text, String.Format(@"^{0}\s+", cmd), "");
+
+        switch(cmd) {
+        case "close":
+            wt.CloseTab();
+            break;
+        case "open":
+            if (args.Length < 1) return;
+            if (!wt.Open(query))
+                Error("Could not open query");
+            break;
+        case "tabopen":
+            if (args.Length < 1) return;
+            if (wt.OpenTab(query))
+                wt.Tabs.CurrentPage = wt.Tabs.NPages - 1;
+            else
+                Error("Could not open query");
+            break;
+        case "n":
+            wt.Tabs.NextPage();
+            break;
+        case "p":
+            wt.Tabs.PrevPage();
+            break;
+        case "q":
+            wt.Quit();
+            break;
+        case "set":
+            if (args.Length == 1)
+                Options[args[0]] = null;
+            else
+                Options[args[0]] = args[1];
+            ApplyOptions();
+            break;
+        case "save":
+            SaveConfig();
+            break;
+        default:
+            bool found;
+            if (args.Length > 0) {
+                found = wt.Plugins.Call(cmd, args);
+                if (!found)
+                    Error("No function {0}({1}) found", cmd, String.Join(", ", args));
+            } else {
+                found = wt.Plugins.Call(cmd);
+                if (!found)
+                    Error("No function {0}() found", cmd);
+            }
+            if (found)
+                Console.WriteLine("Plugin function {0} called successfully", cmd);
+            break;
+        }
+        CommandlineHide();
+    }
+
+    private void ApplyOptions() {
+        foreach (string key in Options.Keys) {
+            switch(key) {
+            case "ShowTabs":
+                bool v = Config.ParseBool(Options[key]);
+                wt.Tabs.ShowTabs = v;
+                break;
+            default:
+                Error("No variable {0}", key);
+                break;
+            }
+        }
+    }
+
+    private void Error(string format, params object[] values) {
+        Console.WriteLine(format, values);
+    }
+
+    private void command_KeyPress(object o, KeyPressEventArgs e) {
+        if (e.Event.Key == Gdk.Key.Escape)
+            CommandlineHide();
+    }
 }