Created
November 4, 2016 11:14
-
-
Save freundTech/38599c7c01e8e4c24b2f05e0712066fc to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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