aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--Makefile2
-rw-r--r--README8
-rw-r--r--docs/TODO8
-rwxr-xr-xexamples/data/uzbl/scripts/dispatcher.sh97
-rwxr-xr-xexamples/data/uzbl/scripts/event_manager.py113
5 files changed, 122 insertions, 106 deletions
diff --git a/Makefile b/Makefile
index 7549f97..498791d 100644
--- a/Makefile
+++ b/Makefile
@@ -22,7 +22,7 @@ test-dev: uzbl
XDG_DATA_HOME=./examples/data XDG_CONFIG_HOME=./examples/config ./uzbl --uri http://www.uzbl.org --verbose
test-dev-dispatched: uzbl
- XDG_DATA_HOME=./examples/data XDG_CONFIG_HOME=./examples/config ./uzbl --uri http://www.uzbl.org --verbose | ./examples/data/uzbl/scripts/dispatcher.sh
+ XDG_DATA_HOME=./examples/data XDG_CONFIG_HOME=./examples/config ./uzbl --uri http://www.uzbl.org --verbose | ./examples/data/uzbl/scripts/event_manager.py
test-share: uzbl
XDG_DATA_HOME=${PREFIX}/share/uzbl/examples/data XDG_CONFIG_HOME=${PREFIX}/share/uzbl/examples/config ./uzbl --uri http://www.uzbl.org --verbose
diff --git a/README b/README
index 2f939fa..54366bd 100644
--- a/README
+++ b/README
@@ -412,15 +412,15 @@ Copying the Uzbl object and creating public functions should be taken with care
### EVENTS ###
-unlike commands, events are not handled in uzbl itself, but are propagated asynchronously through text stream on
-stdout. You'll usually use uzbl by piping it's output to a so called 'dispatcher'
+unlike commands, events are not handled in uzbl itself, but are propagated (dispatched) asynchronously through
+a text stream on stdout. You'll usually use uzbl by piping it's output to a so called 'event handler'
- makes it possible to use whichever language you want for event handling (python, perl, bash, .. you name it).
you'll usually send commands (see above) back to uzbl through its fifo or socket
- keybindings use x keysyms
- many finegrained events (hover_over_link, key_press, key_down,..)
-- see example dispatcher.sh
+- see example event_handler.py
-Note: cookie events are not sent to a dispatcher but handled internally through the cookie handler because of their synchronous nature.
+Note: cookie events are not sent to an event handler but handled internally through the cookie handler because of their synchronous nature.
Cookie events are really something completely different from all other events. maybe someday we'll use http proxies or something for cookies, but
for now we still use the handler code)
diff --git a/docs/TODO b/docs/TODO
index 1613053..3722d45 100644
--- a/docs/TODO
+++ b/docs/TODO
@@ -1,13 +1,13 @@
== event-messages specific ==
* throw out all old code
-* document the dispatching mechanism, all events, how to get started with sample dispatcher
+* document the event handling mechanism, all events, how to get started with sample event handler
* add key_release callback and event
* remove all binding ('bind = ' etc.) stuff and port to new system
* VARIABLE_SET for all types (but probably not useful for custom vars)
-* port keycmd to dispatcher. we can now more cleanly send BackSpace instead of keycmd_bs and so on
+* port keycmd to evt handler. we can now more cleanly send BackSpace instead of keycmd_bs and so on
+* use a data-driven new config format which supports keypresses and keyreleases, modkey and all x keysyms
-
-= key handling (example dispatcher.sh) =
+= key handling (example event_handler.py) =
* on escape:
if insert mode: set_insert_mode(uzbl.behave.always_insert_mode); update_title
else: clear_keycmd(); update_title; dehilight(uzbl.gui.web_view, NULL, NULL);
diff --git a/examples/data/uzbl/scripts/dispatcher.sh b/examples/data/uzbl/scripts/dispatcher.sh
deleted file mode 100755
index e8c3aed..0000000
--- a/examples/data/uzbl/scripts/dispatcher.sh
+++ /dev/null
@@ -1,97 +0,0 @@
-#!/bin/sh
-#
-# Sample uzbl eventhandler
-#
-# demonstrating one possible way to access and process
-# uzbl's event messages
-#
-# Usage: uzbl | eventhandler
-#
-
-VERBOSE=1
-
-
-ALTPRESSED=0
-KEYCMD= # buffer for building up commands
-
-log () {
- [ -n "$VERBOSE" ] && echo "$1"
-}
-
-fifo () {
- log "$1 > ${FIFO_PATH:-unset}"
- [ -n "$FIFO_PATH" ] && echo "$1" > "$FIFO_PATH"
-}
-
-log "Init eventhandler"
-
-clear_modifiers() {
- ALT_PRESSED=0
- CONTROL_PRESSED=0
- #etc.
- fifo 'set status_message = '
-}
-
-while read EVENT; do
- if [ "$(echo $EVENT | cut -d ' ' -f 1)" != 'EVENT' ]; then
- continue;
- fi
- EVENT="`echo $EVENT | sed 's/^EVENT //'`"
- # get eventname
- ENAME=`echo "$EVENT" | sed -ne 's/\([A-Z]*\) .*/\1/p'`
-
- if [ x"$ENAME" = 'xFIFO_SET' ]; then
- FIFO_PATH=`echo $EVENT | cut -d ' ' -f 3`
-
- elif [ x"$ENAME" = x'KEY_PRESS' ]; then
- KEY=$(echo "$EVENT" | sed -ne 's/KEY_PRESS \[.*\] \(.*$\)/\1/p')
-
- # Clear mofifiers on Escape
- #
- [ "$KEY" = Escape ] && clear_modifiers
-
- # Modifier: Alt_L
- #
- if [ x"$KEY" = x'Alt_L' ];then
- clear_modifiers
- ALT_PRESSED=1
-
- # place an indicator showing the active modifier
- # on uzbl's statusbar
- #
- fifo 'set status_message = @status_message <span foreground="red" weight="bold">Alt</span>'
- fi
-
- if [ "$ALT_PRESSED" = 1 ]; then
-
- # Keys
- #
- if [ x"$KEY" = x'a' ]; then
- ALT_PRESSED=0
- fifo 'set inject_html = <html><body> <h1>You pressed Alt+a </h1> </body></html>'
- fifo 'set status_message = '
-
- # delete keycmd
- # here not needed. loading a new page
- # resets it by default
- #
- #echo 'set keycmd = ' > "$F_PATH"
- fi
- if [ x"$KEY" = x'b' ]; then
- ALT_PRESSED=0
- fifo 'set inject_html = <html><body> <h1>You pressed Alt+b </h1> </body></html>'
- fifo 'set status_message = '
- fi
-
- fi
-
- # Modifier: Control_L and Control_R.
- #
- if [ x"$KEY" = x'Control_L' -o x"$KEY" = x'Control_R' ];then
- clear_modifiers
- CONTROL_PRESSED=1
- fifo 'set status_message = @status_message <span foreground="red" weight="bold">Control</span>'
- #etc.
- fi
- fi
-done
diff --git a/examples/data/uzbl/scripts/event_manager.py b/examples/data/uzbl/scripts/event_manager.py
new file mode 100755
index 0000000..d6f4a36
--- /dev/null
+++ b/examples/data/uzbl/scripts/event_manager.py
@@ -0,0 +1,113 @@
+#!/usr/bin/env python
+
+# Uzbl sample event manager
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+'''
+The Python Event Manager
+========================
+
+Sample event manager written in python
+
+Usage
+====
+uzbl | <path to event_manager.py>
+
+'''
+
+import sys
+import os
+
+# config dir. needed for bindings config
+if 'XDG_CONFIG_HOME' in os.environ.keys() and os.environ['XDG_CONFIG_HOME']:
+ CONFIG_DIR = os.path.join(os.environ['XDG_CONFIG_HOME'], 'uzbl/')
+else:
+ CONFIG_DIR = os.path.join(os.environ['HOME'], '.config/uzbl/')
+
+
+# Default config
+config = {
+
+ 'uzbl_fifo': '',
+ 'verbose': True,
+
+} # End of config dictionary.
+
+# buffer for building up commands
+keycmd = ''
+
+
+_SCRIPTNAME = os.path.basename(sys.argv[0])
+def echo(msg):
+ '''Prints only if the verbose flag has been set.'''
+
+ if config['verbose']:
+ sys.stderr.write("%s: %s\n" % (_SCRIPTNAME, msg))
+
+
+def error(msg):
+ '''Prints error message and exits.'''
+
+ sys.stderr.write("%s: error: %s\n" % (_SCRIPTNAME, msg))
+ sys.exit(1)
+
+def fifo(msg):
+ '''Writes commands to uzbl's fifo, if the fifo path is known'''
+
+ echo ('Fifo msg: ' + msg + '(fifo path: ' + config['uzbl_fifo'] + ')')
+ if config['uzbl_fifo']:
+ fd = os.open(config['uzbl_fifo'], os.O_WRONLY)
+ os.write(fd, msg)
+ os.close(fd)
+
+def submit_keycmd():
+ '''Sends the updated keycmd to uzbl, which can render it and stuff'''
+
+ fifo ('set keycmd = ' + keycmd)
+
+
+def main():
+ '''Main function.'''
+
+ echo ("Init eventhandler")
+
+ for line in sys.stdin:
+ line = line.strip()
+ data = line.partition('EVENT ')
+ if (data[0] == ""):
+ line = data[2]
+ echo ("Got event: " + line)
+ data = line.partition(' ')
+ event_name = data[0]
+ event_data = data[2]
+ else:
+ echo ("Non-event: " + line)
+ continue
+
+ if (event_name == 'FIFO_SET'):
+ config['uzbl_fifo'] = event_data.split()[-1]
+ elif (event_name == 'KEY_PRESS'):
+ # todo: keep a table of pressed modkeys. do we work with Mod[1-4] here or Alt_L and such?
+ key = event_data.split()[-1]
+ if (key == 'Escape'):
+ keycmd = ''
+ submit_keycmd
+ elif (event_name == 'KEY_RELEASE'):
+ #todo : update table of pressed modkeys
+ submit_keycmd
+
+if __name__ == "__main__":
+ main()
+ \ No newline at end of file