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:
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 ###
--- /dev/null
+###########################################################################
+### 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"
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
EventCloseWindow = _openbox.EventCloseWindow
EventStartup = _openbox.EventStartup
EventShutdown = _openbox.EventShutdown
+EventKey = _openbox.EventKey
EventFocus = _openbox.EventFocus
EventBell = _openbox.EventBell
NUM_EVENTS = _openbox.NUM_EVENTS
__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
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;
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;
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;
}
+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 ;
{ (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 },
{ 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},
EventCloseWindow,
EventStartup,
EventShutdown,
+ EventKey,
EventFocus,
EventBell,
NUM_EVENTS
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) {
this->state = state;
this->key = XKeysymToString(XKeycodeToKeysym(**otk::display,
key, 0));
+ this->action = EventKey;
}
};