From 707f70682abe0dfaadbf76843a0dccb33f0eaeda Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Thu, 23 Jan 2003 09:01:40 +0000 Subject: [PATCH] linear focus cycling --- scripts/Makefile.am | 2 +- scripts/builtins.py | 30 ++-------------- scripts/focus.py | 86 +++++++++++++++++++++++++++++++++++++++++++++ src/openbox.cc | 1 + src/openbox.py | 4 +++ src/openbox_wrap.cc | 43 +++++++++++++++++++++-- src/python.hh | 3 ++ 7 files changed, 137 insertions(+), 32 deletions(-) create mode 100644 scripts/focus.py diff --git a/scripts/Makefile.am b/scripts/Makefile.am index cafe6928..ee0287a4 100644 --- a/scripts/Makefile.am +++ b/scripts/Makefile.am @@ -1,6 +1,6 @@ scriptdir = $(libdir)/openbox/python MAINTAINERCLEANFILES = Makefile.in -script_DATA = config.py builtins.py defaults.py +script_DATA = config.py builtins.py defaults.py focus.py EXTRA_DIST = $(script_DATA) distclean-local: diff --git a/scripts/builtins.py b/scripts/builtins.py index e3424001..4ae4587b 100644 --- a/scripts/builtins.py +++ b/scripts/builtins.py @@ -287,34 +287,8 @@ def setup_scroll(): def setup_fallback_focus(): """Sets up a focus fallback routine so that when no windows are focused, the last window to have focus on the desktop will be focused.""" - focus_stack = [] - def focused(data): - #global focus_stack - if data.client: - window = data.client.window() - # add to front the stack - if window in focus_stack: - focus_stack.remove(window) - focus_stack.insert(0, window) - else: - # pass around focus - desktop = openbox.screen(data.screen).desktop() - l = len(focus_stack) - i = 0 - while i < l: - w = focus_stack[i] - client = openbox.findClient(w) - if not client: # window is gone, remove it - focus_stack.pop(i) - l = l - 1 - elif client.desktop() == desktop and \ - client.normal() and client.focus(): - break - else: - i = i + 1 - - ebind(EventFocus, focused) - + global ob_focus_fallback # see focus.py + ob_focus_fallback = 1 ############################################################################ ### Window placement algorithms, choose one of these and ebind it to the ### diff --git a/scripts/focus.py b/scripts/focus.py new file mode 100644 index 00000000..084faeba --- /dev/null +++ b/scripts/focus.py @@ -0,0 +1,86 @@ +########################################################################### +### Functions for helping out with your window focus. ### +########################################################################### + +ob_focus_raise = 1 +ob_focus_fallback = 0 +ob_focus_stack = [] + +def ob_focused(data): + global ob_focus_raise + global ob_focus_fallback + global ob_focus_stack + if data.client: + window = data.client.window() + # add/move to front the stack + if window in ob_focus_stack: + ob_focus_stack.remove(window) + ob_focus_stack.insert(0, window) + elif ob_focus_fallback: + # pass around focus + desktop = openbox.screen(data.screen).desktop() + l = len(ob_focus_stack) + i = 0 + while i < l: + w = ob_focus_stack[i] + client = openbox.findClient(w) + if not client: # window is gone, remove it + ob_focus_stack.pop(i) + l = l - 1 + elif client.desktop() == desktop and \ + client.normal() and client.focus(): + break + else: + i = i + 1 + +ebind(EventFocus, ob_focused) + +def focus_next(data, num=1, forward=1): + """Focus the next (or previous, with forward=0) window in a linear + order.""" + screen = openbox.screen(data.screen) + count = screen.clientCount() + + if not count: return # no clients + + target = 0 + if data.client: + client_win = data.client.window() + found = 0 + r = range(count) + if not forward: + r.reverse() + for i in r: + if found: + target = i + break + elif screen.client(i).window() == client_win: + found = 1 + if not found: # wraparound + if forward: target = 0 + else: target = count - 1 + + t = target + curdesk = screen.desktop() + while 1: + client = screen.client(t) + if client.normal() and \ + (client.desktop() == curdesk or client.desktop() == 0xffffffff)\ + and client.focus(): + if ob_focus_raise: + screen.raiseWindow(client) + return + if forward: + t += 1 + if t == count: t = 0 + else: + t -= 1 + if t < 0: t = count - 1 + if t == target: return # nothing to focus + +def focus_prev(data, num=1): + """Focus the previous window in a linear order.""" + focus_next(data, num, forward=0) + + +print "Loaded focus.py" diff --git a/src/openbox.cc b/src/openbox.cc index 6436140d..edee736e 100644 --- a/src/openbox.cc +++ b/src/openbox.cc @@ -150,6 +150,7 @@ Openbox::Openbox(int argc, char **argv) python_exec(SCRIPTDIR"/config.py"); // load openbox config values // run all of the python scripts python_exec(SCRIPTDIR"/builtins.py"); // builtin callbacks + python_exec(SCRIPTDIR"/focus.py"); // focus helpers // run the user's script or the system defaults if that fails if (!python_exec(_scriptfilepath.c_str())) python_exec(SCRIPTDIR"/defaults.py"); // system default bahaviors diff --git a/src/openbox.py b/src/openbox.py index ea88e12a..91e5031f 100644 --- a/src/openbox.py +++ b/src/openbox.py @@ -910,6 +910,7 @@ EventNewWindow = _openbox.EventNewWindow EventCloseWindow = _openbox.EventCloseWindow EventStartup = _openbox.EventStartup EventShutdown = _openbox.EventShutdown +EventKey = _openbox.EventKey EventFocus = _openbox.EventFocus EventBell = _openbox.EventBell NUM_EVENTS = _openbox.NUM_EVENTS @@ -1026,6 +1027,9 @@ class KeyData(_object): __swig_setmethods__["key"] = _openbox.KeyData_key_set __swig_getmethods__["key"] = _openbox.KeyData_key_get if _newclass:key = property(_openbox.KeyData_key_get,_openbox.KeyData_key_set) + __swig_setmethods__["action"] = _openbox.KeyData_action_set + __swig_getmethods__["action"] = _openbox.KeyData_action_get + if _newclass:action = property(_openbox.KeyData_action_get,_openbox.KeyData_action_set) def __init__(self,*args): self.this = apply(_openbox.new_KeyData,args) self.thisown = 1 diff --git a/src/openbox_wrap.cc b/src/openbox_wrap.cc index 43b0e95e..67cf06d1 100644 --- a/src/openbox_wrap.cc +++ b/src/openbox_wrap.cc @@ -1008,7 +1008,7 @@ static PyObject *_wrap_Display_screenInfo(PyObject *self, PyObject *args) { if(!PyArg_ParseTuple(args,(char *)"Oi:Display_screenInfo",&obj0,&arg2)) goto fail; if ((SWIG_ConvertPtr(obj0,(void **) &arg1, SWIGTYPE_p_otk__Display,SWIG_POINTER_EXCEPTION | 0 )) == -1) SWIG_fail; - result = (otk::ScreenInfo *)(arg1)->screenInfo(arg2); + result = (otk::ScreenInfo *)((otk::Display const *)arg1)->screenInfo(arg2); resultobj = SWIG_NewPointerObj((void *) result, SWIGTYPE_p_otk__ScreenInfo, 0); return resultobj; @@ -1029,7 +1029,7 @@ static PyObject *_wrap_Display_findScreen(PyObject *self, PyObject *args) { if ((SWIG_ConvertPtr(obj0,(void **) &arg1, SWIGTYPE_p_otk__Display,SWIG_POINTER_EXCEPTION | 0 )) == -1) SWIG_fail; arg2 = (Window) PyInt_AsLong(obj1); if (PyErr_Occurred()) SWIG_fail; - result = (otk::ScreenInfo *)(arg1)->findScreen(arg2); + result = (otk::ScreenInfo *)((otk::Display const *)arg1)->findScreen(arg2); resultobj = SWIG_NewPointerObj((void *) result, SWIGTYPE_p_otk__ScreenInfo, 0); return resultobj; @@ -1047,7 +1047,7 @@ static PyObject *_wrap_Display_renderControl(PyObject *self, PyObject *args) { if(!PyArg_ParseTuple(args,(char *)"Oi:Display_renderControl",&obj0,&arg2)) goto fail; if ((SWIG_ConvertPtr(obj0,(void **) &arg1, SWIGTYPE_p_otk__Display,SWIG_POINTER_EXCEPTION | 0 )) == -1) SWIG_fail; - result = (otk::RenderControl *)(arg1)->renderControl(arg2); + result = (otk::RenderControl *)((otk::Display const *)arg1)->renderControl(arg2); resultobj = SWIG_NewPointerObj((void *) result, SWIGTYPE_p_otk__RenderControl, 0); return resultobj; @@ -11144,6 +11144,40 @@ static PyObject *_wrap_KeyData_key_get(PyObject *self, PyObject *args) { } +static PyObject *_wrap_KeyData_action_set(PyObject *self, PyObject *args) { + PyObject *resultobj; + ob::KeyData *arg1 = (ob::KeyData *) 0 ; + int arg2 ; + PyObject * obj0 = 0 ; + + if(!PyArg_ParseTuple(args,(char *)"Oi:KeyData_action_set",&obj0,&arg2)) goto fail; + if ((SWIG_ConvertPtr(obj0,(void **) &arg1, SWIGTYPE_p_ob__KeyData,SWIG_POINTER_EXCEPTION | 0 )) == -1) SWIG_fail; + if (arg1) (arg1)->action = (ob::EventAction )arg2; + + Py_INCREF(Py_None); resultobj = Py_None; + return resultobj; + fail: + return NULL; +} + + +static PyObject *_wrap_KeyData_action_get(PyObject *self, PyObject *args) { + PyObject *resultobj; + ob::KeyData *arg1 = (ob::KeyData *) 0 ; + int result; + PyObject * obj0 = 0 ; + + if(!PyArg_ParseTuple(args,(char *)"O:KeyData_action_get",&obj0)) goto fail; + if ((SWIG_ConvertPtr(obj0,(void **) &arg1, SWIGTYPE_p_ob__KeyData,SWIG_POINTER_EXCEPTION | 0 )) == -1) SWIG_fail; + result = (int) ((arg1)->action); + + resultobj = PyInt_FromLong((long)result); + return resultobj; + fail: + return NULL; +} + + static PyObject *_wrap_new_KeyData(PyObject *self, PyObject *args) { PyObject *resultobj; int arg1 ; @@ -11781,6 +11815,8 @@ static PyMethodDef SwigMethods[] = { { (char *)"KeyData_state_get", _wrap_KeyData_state_get, METH_VARARGS }, { (char *)"KeyData_key_set", _wrap_KeyData_key_set, METH_VARARGS }, { (char *)"KeyData_key_get", _wrap_KeyData_key_get, METH_VARARGS }, + { (char *)"KeyData_action_set", _wrap_KeyData_action_set, METH_VARARGS }, + { (char *)"KeyData_action_get", _wrap_KeyData_action_get, METH_VARARGS }, { (char *)"new_KeyData", _wrap_new_KeyData, METH_VARARGS }, { (char *)"KeyData_swigregister", KeyData_swigregister, METH_VARARGS }, { (char *)"mbind", _wrap_mbind, METH_VARARGS }, @@ -12053,6 +12089,7 @@ static swig_const_info swig_const_table[] = { { SWIG_PY_INT, (char *)"EventCloseWindow", (long) ob::EventCloseWindow, 0, 0, 0}, { SWIG_PY_INT, (char *)"EventStartup", (long) ob::EventStartup, 0, 0, 0}, { SWIG_PY_INT, (char *)"EventShutdown", (long) ob::EventShutdown, 0, 0, 0}, +{ SWIG_PY_INT, (char *)"EventKey", (long) ob::EventKey, 0, 0, 0}, { SWIG_PY_INT, (char *)"EventFocus", (long) ob::EventFocus, 0, 0, 0}, { SWIG_PY_INT, (char *)"EventBell", (long) ob::EventBell, 0, 0, 0}, { SWIG_PY_INT, (char *)"NUM_EVENTS", (long) ob::NUM_EVENTS, 0, 0, 0}, diff --git a/src/python.hh b/src/python.hh index b9798781..7cec7667 100644 --- a/src/python.hh +++ b/src/python.hh @@ -61,6 +61,7 @@ enum EventAction { EventCloseWindow, EventStartup, EventShutdown, + EventKey, EventFocus, EventBell, NUM_EVENTS @@ -147,6 +148,7 @@ public: Time time; unsigned int state; std::string key; + EventAction action; // this is here so that all the Data structs have .action KeyData(int screen, Client *client, Time time, unsigned int state, unsigned int key) { @@ -156,6 +158,7 @@ public: this->state = state; this->key = XKeysymToString(XKeycodeToKeysym(**otk::display, key, 0)); + this->action = EventKey; } }; -- 2.39.2