linear focus cycling

This commit is contained in:
Dana Jansens 2003-01-23 09:01:40 +00:00
parent 9a64438a5a
commit 707f70682a
7 changed files with 137 additions and 32 deletions

View file

@ -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:

View file

@ -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 ###

86
scripts/focus.py Normal file
View file

@ -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"

View file

@ -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

View file

@ -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

View file

@ -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},

View file

@ -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;
}
};