using System; using System.Collections.Generic; using System.Reflection; using System.IO; using System.Text.RegularExpressions; using System.Runtime.InteropServices; using Gtk; using GtkSharp; using WebKit; namespace bytex64.WebThing { public enum CompassDirection { N, E, S, W, Interior } public class WebThing { public Gtk.Window Window { get { return _Window; } } public Gtk.Window w { get { return _Window; } } public Gtk.ScrolledWindow ScrolledWindow { get { return _ScrolledWindow; } } public Gtk.ScrolledWindow sw { get { return _ScrolledWindow; } } public WebKit.WebView WebView { get { return _WebView; } } public WebKit.WebView wv { get { return _WebView; } } private Gtk.Window _Window; private ScrolledWindow _ScrolledWindow; private WebKit.WebView _WebView; private Gtk.Table WidgetGrid; private Gtk.Alignment InteriorOverlay; public Dictionary Plugins; public Dictionary Options; public string[] Arguments; [DllImport ("SoupSettings.dll")] private static extern void soup_settings(); public void Run() { Application.Init(); ParseArgs(); _Window = new Gtk.Window("WebThing"); _Window.SetWmclass("webthing", "WebThing"); _Window.Role = "browser"; _Window.Destroyed += delegate { Quit(); }; WidgetGrid = new Gtk.Table(3, 3, false); _Window.Add(WidgetGrid); _ScrolledWindow = new Gtk.ScrolledWindow(); WidgetGrid.Attach(_ScrolledWindow, 1, 2, 1, 2); InteriorOverlay = new Gtk.Alignment(1, 0, 0, 0); WidgetGrid.Attach(InteriorOverlay, 1, 2, 1, 2); _WebView = new WebKit.WebView(); _WebView.TitleChanged += delegate(object o, TitleChangedArgs e) { _Window.Title = e.Title + " - WebThing"; }; soup_settings(); _ScrolledWindow.Add(_WebView); _Window.ShowAll(); Plugins = new Dictionary(); // TODO: Conf.Get("plugins") instead of hard-coded path? using (TextReader f = new StreamReader("plugins.conf")) { string line; while ((line = f.ReadLine()) != null) { line = line.Trim(); LoadPlugin(line); } } Application.Run(); } protected void ParseArgs() { Options = new Dictionary(); Queue q = new Queue(); foreach (string s in System.Environment.GetCommandLineArgs()) { q.Enqueue(s); } q.Dequeue(); // Remove self argument Regex SimpleOpt = new Regex(@"^-([a-zA-Z0-9]+)$"); Regex LongOpt = new Regex(@"^--([\w-]+)$"); string OptLast = null; List args = new List(); while (q.Count > 0) { string opt = q.Dequeue(); Match m; m = SimpleOpt.Match(opt); if (m.Success) { string s = m.Groups[1].Value; if (s.Length > 1) { foreach (char c in s) { Options[c.ToString()] = ""; } OptLast = null; } else { Options[s] = ""; OptLast = s; } continue; } m = LongOpt.Match(opt); if (m.Success) { string s = m.Groups[1].Value; Options[s] = ""; OptLast = s; continue; } // else if (OptLast != null) { Options[OptLast] = opt; OptLast = null; } else { args.Add(opt); } } Arguments = args.ToArray(); /* Console.WriteLine("Options:"); foreach (string key in Options.Keys) Console.WriteLine(" {0}\t{1}", key, Options[key]); Console.WriteLine("Arguments: {0}", String.Join(" ", Arguments)); */ } public void LoadPlugin(string assemblyname) { Assembly a = Assembly.LoadFile("plugins/" + assemblyname + ".dll"); object obj = a.CreateInstance("Plugin", false, BindingFlags.ExactBinding, null, new object[] { this }, null, null); Plugins[assemblyname] = obj; } public void AttachWidget(Gtk.Widget widget, CompassDirection direction, AttachOptions xoptions, AttachOptions yoptions) { switch(direction) { case CompassDirection.N: WidgetGrid.Attach(widget, 0, 3, 0, 1, xoptions, yoptions, 0, 0); break; case CompassDirection.E: WidgetGrid.Attach(widget, 2, 3, 1, 2, xoptions, yoptions, 0, 0); break; case CompassDirection.S: WidgetGrid.Attach(widget, 0, 3, 2, 3, xoptions, yoptions, 0, 0); break; case CompassDirection.W: WidgetGrid.Attach(widget, 0, 1, 1, 2, xoptions, yoptions, 0, 0); break; case CompassDirection.Interior: InteriorOverlay.Add(widget); break; } } public void AttachWidget(Gtk.Widget widget, CompassDirection direction) { AttachWidget(widget, direction, 0, 0); } public void OpenUri(string Uri) { if (!Regex.IsMatch(Uri, @"://")) { Uri = String.Format("http://{0}", Uri); } wv.Open(Uri); } public void Quit() { // TODO: Create a way of shutting down plugins Application.Quit(); } } }