Skip to content

Instantly share code, notes, and snippets.

@freundTech
Created November 4, 2016 11:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save freundTech/38599c7c01e8e4c24b2f05e0712066fc to your computer and use it in GitHub Desktop.
Save freundTech/38599c7c01e8e4c24b2f05e0712066fc to your computer and use it in GitHub Desktop.
#!/usr/bin/env python2
import sys
import os
import gtk
import gobject
import webkit
import Queue
import threading
from time import sleep
import re
import subprocess
import shlex
import dbus
import dbus.service
from dbus.mainloop.glib import DBusGMainLoop
dir_ = os.path.dirname(os.path.realpath(__file__))
DEFAULT_URL = 'file://{}/index.html'.format(dir_)
class SimpleBrowser: # needs GTK, Python, Webkit-GTK
command = None
process = None
def __init__(self):
self.isPageLoaded = False
self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
self.window.set_position(gtk.WIN_POS_CENTER_ALWAYS)
self.window.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_DESKTOP)
self.window.connect('delete_event', self.close_application)
screen = self.window.get_screen()
self.window.set_default_size(screen.get_width(), screen.get_height())
vbox = gtk.VBox(spacing=0)
vbox.set_border_width(0)
self.scrolled_window = gtk.ScrolledWindow()
self.webview = webkit.WebView()
self.webview.connect("title-changed", self.title_changed) #Hack. Using title for message passing.
self.webview.connect("context-menu", self.context_menu)
self.webview.connect("navigation-policy-decision-requested", self.navigation_requested)
self.scrolled_window.add(self.webview)
vbox.pack_start(self.scrolled_window, fill=True, expand=True)
self.window.add(vbox)
def open(self, url):
self.webview.open(url)
def title_changed(self, widget, frame, msg):
def getoutput(out, script):
#print "Starting out"
for line in iter(out.readline, b''):
#print("injecting: " + "(" + script + ")('" + line.strip().replace("'","\\'") + "')")
gobject.idle_add(self.webview.execute_script, "(" + script + ")('" + line.strip().replace("'","\\'") + "')")
def geterror(err, script):
#print "Starting err"
for line in iter(err.readline, b''):
#print("injecting: " + "(" + script + ")('" + line.strip().replace("'","\\'") + "')")
gobject.idle_add(self.webview.execute_script, "(" + script + ")('<i>" + line.strip().replace("'","\\'") + "</i>')")
if self.command == None:
self.command = msg
else:
#print("executing: " + self.command)
self.process = subprocess.Popen(self.command, shell=True, bufsize=1, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
tOut = threading.Thread(target=getoutput, args=(self.process.stdout, msg))
tOut.deamon = True
tOut.start()
tErr = threading.Thread(target=geterror, args=(self.process.stderr, msg))
tErr.deamon = True
tErr.start()
self.command = None
def navigation_requested(self, widget, frame, request, action, decision):
if self.isPageLoaded:
#print request.get_uri()
return True
else:
self.isPageLoaded = True
def context_menu(self, widget, result, keyboard, user_data):
return True
def show(self):
self.window.show_all()
def close_application(self, widget, event, data=None):
gtk.main_quit()
class DBusService(dbus.service.Object):
def __init__(self):
bus_name = dbus.service.BusName('com.freundtech.ingressdesktop', bus=dbus.SessionBus())
dbus.service.Object.__init__(self, bus_name, '/com/freundtech/ingressdesktop')
@dbus.service.method('com.freundtech.ingressdesktop', in_signature='s')
def execute(self, script):
gobject.idle_add(browser.webview.execute_script, script)
if __name__ == '__main__':
if len(sys.argv) > 1:
url = sys.argv[1]
else:
url = DEFAULT_URL
gtk.gdk.threads_init()
gobject.threads_init()
import signal
signal.signal(signal.SIGINT, signal.SIG_DFL)
browser = SimpleBrowser()
browser.open(url)
browser.show()
DBusGMainLoop(set_as_default=True)
service = DBusService()
gtk.main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment