/plugins/Vimish.cs
using System;
using System.Text.RegularExpressions;
using Gtk;
using WebKit;
using bytex64.WebThing;
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();
}
}