diff options
Diffstat (limited to 'openbox/clientwrap.c')
| -rw-r--r-- | openbox/clientwrap.c | 1029 |
1 files changed, 0 insertions, 1029 deletions
diff --git a/openbox/clientwrap.c b/openbox/clientwrap.c deleted file mode 100644 index fe3783ed..00000000 --- a/openbox/clientwrap.c +++ /dev/null @@ -1,1029 +0,0 @@ -#include "clientwrap.h" -#include "client.h" -#include "frame.h" -#include "engine.h" -#include "stacking.h" -#include "focus.h" -#include "prop.h" -#include <glib.h> - -/*************************************************************************** - - Define the type 'ClientWrap' - - ***************************************************************************/ - -#define IS_CWRAP(v) ((v)->ob_type == &ClientWrapType) -#define IS_VALID_CWRAP(v) ((v)->client != NULL) -#define CHECK_CWRAP(self, funcname) { \ - if (!IS_CWRAP(self)) { \ - PyErr_SetString(PyExc_TypeError, \ - "descriptor '" funcname "' requires a 'Client' " \ - "object"); \ - return NULL; \ - } \ - if (!IS_VALID_CWRAP(self)) { \ - PyErr_SetString(PyExc_ValueError, \ - "This 'Client' is wrapping a client which no longer "\ - "exists."); \ - return NULL; \ - } \ -} - - -staticforward PyTypeObject ClientWrapType; - -/*************************************************************************** - - Attribute methods - - ***************************************************************************/ - -static PyObject *cwrap_valid(ClientWrap *self, PyObject *args) -{ - if (!IS_CWRAP(self)) { - PyErr_SetString(PyExc_TypeError, - "descriptor 'valid' requires a 'Client' object"); - return NULL; - } - return PyInt_FromLong(self->client != NULL); -} - -static PyObject *cwrap_title(ClientWrap *self, PyObject *args) -{ - CHECK_CWRAP(self, "title"); - if (!PyArg_ParseTuple(args, ":title")) - return NULL; - return PyString_FromString(self->client->title); -} - -static PyObject *cwrap_setTitle(ClientWrap *self, PyObject *args) -{ - char *title; - - CHECK_CWRAP(self, "setTitle"); - if (!PyArg_ParseTuple(args, "s:setTitle", &title)) - return NULL; - - PROP_SETS(self->client->window, net_wm_name, utf8, title); - - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject *cwrap_iconTitle(ClientWrap *self, PyObject *args) -{ - CHECK_CWRAP(self, "iconTitle"); - if (!PyArg_ParseTuple(args, ":iconTitle")) - return NULL; - return PyString_FromString(self->client->icon_title); -} - -static PyObject *cwrap_setIconTitle(ClientWrap *self, PyObject *args) -{ - char *title; - - CHECK_CWRAP(self, "setIconTitle"); - if (!PyArg_ParseTuple(args, "s:setIconTitle", &title)) - return NULL; - - PROP_SETS(self->client->window, net_wm_icon_name, utf8, title); - - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject *cwrap_desktop(ClientWrap *self, PyObject *args) -{ - CHECK_CWRAP(self, "desktop"); - if (!PyArg_ParseTuple(args, ":desktop")) - return NULL; - return PyInt_FromLong(self->client->desktop); -} - -static PyObject *cwrap_setDesktop(ClientWrap *self, PyObject *args) -{ - int desktop; - CHECK_CWRAP(self, "setDesktop"); - if (!PyArg_ParseTuple(args, "i:setDesktop", &desktop)) - return NULL; - client_set_desktop(self->client, desktop); - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject *cwrap_resName(ClientWrap *self, PyObject *args) -{ - CHECK_CWRAP(self, "resName"); - if (!PyArg_ParseTuple(args, ":resName")) - return NULL; - return PyString_FromString(self->client->res_name); -} - -static PyObject *cwrap_resClass(ClientWrap *self, PyObject *args) -{ - CHECK_CWRAP(self, "resClass"); - if (!PyArg_ParseTuple(args, ":resClass")) - return NULL; - return PyString_FromString(self->client->res_class); -} - -static PyObject *cwrap_role(ClientWrap *self, PyObject *args) -{ - CHECK_CWRAP(self, "role"); - if (!PyArg_ParseTuple(args, ":role")) - return NULL; - return PyString_FromString(self->client->role); -} - -static PyObject *cwrap_transient(ClientWrap *self, PyObject *args) -{ - CHECK_CWRAP(self, "transient"); - if (!PyArg_ParseTuple(args, ":transient")) - return NULL; - return PyInt_FromLong(!!self->client->transient); -} - -static PyObject *cwrap_transientFor(ClientWrap *self, PyObject *args) -{ - CHECK_CWRAP(self, "transientFor"); - if (!PyArg_ParseTuple(args, ":transientFor")) - return NULL; - if (self->client->transient_for != NULL) - return clientwrap_new(self->client->transient_for); - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject *cwrap_transients(ClientWrap *self, PyObject *args) -{ - PyObject *tuple; - GSList *it; - guint i, s; - - CHECK_CWRAP(self, "transients"); - if (!PyArg_ParseTuple(args, ":transients")) - return NULL; - s = g_slist_length(self->client->transients); - tuple = PyTuple_New(s); - for (i = 0, it = self->client->transients; i < s; ++i, it = it->next) - PyTuple_SET_ITEM(tuple, i, clientwrap_new(it->data)); - return tuple; -} - -static PyObject *cwrap_type(ClientWrap *self, PyObject *args) -{ - CHECK_CWRAP(self, "type"); - if (!PyArg_ParseTuple(args, ":type")) - return NULL; - return PyInt_FromLong(self->client->type); -} - -static PyObject *cwrap_normal(ClientWrap *self, PyObject *args) -{ - CHECK_CWRAP(self, "normal"); - if (!PyArg_ParseTuple(args, ":normal")) - return NULL; - return PyInt_FromLong(!!client_normal(self->client)); -} - -static PyObject *cwrap_area(ClientWrap *self, PyObject *args) -{ - PyObject *tuple; - - CHECK_CWRAP(self, "area"); - if (!PyArg_ParseTuple(args, ":area")) - return NULL; - tuple = PyTuple_New(4); - PyTuple_SET_ITEM(tuple, 0, PyInt_FromLong(self->client->frame->area.x)); - PyTuple_SET_ITEM(tuple, 1, PyInt_FromLong(self->client->frame->area.y)); - PyTuple_SET_ITEM(tuple, 2, - PyInt_FromLong(self->client->frame->area.width)); - PyTuple_SET_ITEM(tuple, 3, - PyInt_FromLong(self->client->frame->area.height)); - return tuple; -} - -static PyObject *cwrap_setArea(ClientWrap *self, PyObject *args) -{ - int x, y, w, h, final = TRUE; - - CHECK_CWRAP(self, "setArea"); - if (!PyArg_ParseTuple(args, "(iiii)|i:setArea", &x, &y, &w, &h, &final)) - return NULL; - - frame_frame_gravity(self->client->frame, &x, &y); - w -= self->client->frame->size.left + self->client->frame->size.right; - h -= self->client->frame->size.top + self->client->frame->size.bottom; - client_configure(self->client, Corner_TopLeft, x, y, w, h, TRUE, final); - - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject *cwrap_clientArea(ClientWrap *self, PyObject *args) -{ - PyObject *tuple; - - CHECK_CWRAP(self, "clientArea"); - if (!PyArg_ParseTuple(args, ":clientArea")) - return NULL; - tuple = PyTuple_New(4); - PyTuple_SET_ITEM(tuple, 0, PyInt_FromLong(self->client->area.x)); - PyTuple_SET_ITEM(tuple, 1, PyInt_FromLong(self->client->area.y)); - PyTuple_SET_ITEM(tuple, 2, PyInt_FromLong(self->client->area.width)); - PyTuple_SET_ITEM(tuple, 3, PyInt_FromLong(self->client->area.height)); - return tuple; -} - -static PyObject *cwrap_setClientArea(ClientWrap *self, PyObject *args) -{ - int x, y, w, h; - - CHECK_CWRAP(self, "setClientArea"); - if (!PyArg_ParseTuple(args, "(iiii)|i:setClientArea", &x, &y, &w, &h)) - return NULL; - - client_configure(self->client, Corner_TopLeft, x, y, w, h, TRUE, TRUE); - - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject *cwrap_frameSize(ClientWrap *self, PyObject *args) -{ - PyObject *tuple; - - CHECK_CWRAP(self, "frameSize"); - if (!PyArg_ParseTuple(args, ":frameSize")) - return NULL; - tuple = PyTuple_New(4); - PyTuple_SET_ITEM(tuple, 0, PyInt_FromLong(self->client->frame->size.left)); - PyTuple_SET_ITEM(tuple, 1, PyInt_FromLong(self->client->frame->size.top)); - PyTuple_SET_ITEM(tuple, 2, - PyInt_FromLong(self->client->frame->size.right)); - PyTuple_SET_ITEM(tuple, 3, - PyInt_FromLong(self->client->frame->size.bottom)); - return tuple; -} - -static PyObject *cwrap_strut(ClientWrap *self, PyObject *args) -{ - PyObject *tuple; - - CHECK_CWRAP(self, "strut"); - if (!PyArg_ParseTuple(args, ":strut")) - return NULL; - tuple = PyTuple_New(4); - PyTuple_SET_ITEM(tuple, 0, PyInt_FromLong(self->client->strut.left)); - PyTuple_SET_ITEM(tuple, 1, PyInt_FromLong(self->client->strut.top)); - PyTuple_SET_ITEM(tuple, 2, PyInt_FromLong(self->client->strut.right)); - PyTuple_SET_ITEM(tuple, 3, PyInt_FromLong(self->client->strut.bottom)); - return tuple; -} - -static PyObject *cwrap_logicalSize(ClientWrap *self, PyObject *args) -{ - PyObject *tuple; - - CHECK_CWRAP(self, "logicalSize"); - if (!PyArg_ParseTuple(args, ":logicalSize")) - return NULL; - tuple = PyTuple_New(2); - PyTuple_SET_ITEM(tuple, 0, - PyInt_FromLong(self->client->logical_size.width)); - PyTuple_SET_ITEM(tuple, 1, - PyInt_FromLong(self->client->logical_size.height)); - return tuple; -} - -static PyObject *cwrap_canFocus(ClientWrap *self, PyObject *args) -{ - CHECK_CWRAP(self, "canFocus"); - if (!PyArg_ParseTuple(args, ":canFocus")) - return NULL; - return PyInt_FromLong(!!self->client->can_focus); -} - -static PyObject *cwrap_focus(ClientWrap *self, PyObject *args) -{ - int focus = TRUE; - - CHECK_CWRAP(self, "focus"); - if (!PyArg_ParseTuple(args, "|i:focus", &focus)) - return NULL; - if (focus) - return PyInt_FromLong(!!client_focus(self->client)); - else { - if (focus_client == self->client) - client_unfocus(self->client); - Py_INCREF(Py_None); - return Py_None; - } -} - -static PyObject *cwrap_focused(ClientWrap *self, PyObject *args) -{ - CHECK_CWRAP(self, "focused"); - if (!PyArg_ParseTuple(args, ":focused")) - return NULL; - return PyInt_FromLong(!!self->client->focused); -} - -static PyObject *cwrap_visible(ClientWrap *self, PyObject *args) -{ - CHECK_CWRAP(self, "visible"); - if (!PyArg_ParseTuple(args, ":visible")) - return NULL; - return PyInt_FromLong(!!self->client->frame->visible); -} - -static PyObject *cwrap_setVisible(ClientWrap *self, PyObject *args) -{ - int show; - - CHECK_CWRAP(self, "setVisible"); - if (!PyArg_ParseTuple(args, "i:setVisible", &show)) - return NULL; - if (show) - engine_frame_show(self->client->frame); - else - engine_frame_hide(self->client->frame); - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject *cwrap_modal(ClientWrap *self, PyObject *args) -{ - CHECK_CWRAP(self, "modal"); - if (!PyArg_ParseTuple(args, ":modal")) - return NULL; - return PyInt_FromLong(!!self->client->modal); -} - -static PyObject *cwrap_setModal(ClientWrap *self, PyObject *args) -{ - int modal; - - CHECK_CWRAP(self, "setModal"); - if (!PyArg_ParseTuple(args, "i:setModal", &modal)) - return NULL; - - client_set_state(self->client, - (modal ? prop_atoms.net_wm_state_add : - prop_atoms.net_wm_state_remove), - prop_atoms.net_wm_state_modal, 0); - - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject *cwrap_shaded(ClientWrap *self, PyObject *args) -{ - CHECK_CWRAP(self, "shaded"); - if (!PyArg_ParseTuple(args, ":shaded")) - return NULL; - return PyInt_FromLong(!!self->client->shaded); -} - -static PyObject *cwrap_setShaded(ClientWrap *self, PyObject *args) -{ - int shaded; - - CHECK_CWRAP(self, "setShaded"); - if (!PyArg_ParseTuple(args, "i:setShaded", &shaded)) - return NULL; - - client_shade(self->client, shaded); - - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject *cwrap_iconic(ClientWrap *self, PyObject *args) -{ - CHECK_CWRAP(self, "iconic"); - if (!PyArg_ParseTuple(args, ":iconic")) - return NULL; - return PyInt_FromLong(!!self->client->iconic); -} - -static PyObject *cwrap_setIconic(ClientWrap *self, PyObject *args) -{ - int iconify, current = TRUE; - - CHECK_CWRAP(self, "setIconic"); - if (!PyArg_ParseTuple(args, "i|i:setIconic", &iconify, ¤t)) - return NULL; - - client_iconify(self->client, iconify, current); - - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject *cwrap_maximizedHorz(ClientWrap *self, PyObject *args) -{ - CHECK_CWRAP(self, "maximizedHorz"); - if (!PyArg_ParseTuple(args, ":maximizedHorz")) - return NULL; - return PyInt_FromLong(!!self->client->max_horz); -} - -static PyObject *cwrap_setMaximizedHorz(ClientWrap *self, PyObject *args) -{ - int max; - - CHECK_CWRAP(self, "setMaximizedHorz"); - if (!PyArg_ParseTuple(args, "i:setMaximizedHorz", &max)) - return NULL; - - client_set_state(self->client, - (max ? prop_atoms.net_wm_state_add : - prop_atoms.net_wm_state_remove), - prop_atoms.net_wm_state_maximized_horz, 0); - - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject *cwrap_maximizedVert(ClientWrap *self, PyObject *args) -{ - CHECK_CWRAP(self, "maximizedVert"); - if (!PyArg_ParseTuple(args, ":maximizedVert")) - return NULL; - return PyInt_FromLong(!!self->client->max_vert); -} - -static PyObject *cwrap_setMaximizedVert(ClientWrap *self, PyObject *args) -{ - int max; - - CHECK_CWRAP(self, "setMaximizedVert"); - if (!PyArg_ParseTuple(args, "i:setMaximizedVert", &max)) - return NULL; - - client_set_state(self->client, - (max ? prop_atoms.net_wm_state_add : - prop_atoms.net_wm_state_remove), - prop_atoms.net_wm_state_maximized_vert, 0); - - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject *cwrap_maximized(ClientWrap *self, PyObject *args) -{ - CHECK_CWRAP(self, "maximized"); - if (!PyArg_ParseTuple(args, ":maximized")) - return NULL; - return PyInt_FromLong(self->client->max_vert || self->client->max_horz); -} - -static PyObject *cwrap_setMaximized(ClientWrap *self, PyObject *args) -{ - int max; - - CHECK_CWRAP(self, "setMaximized"); - if (!PyArg_ParseTuple(args, "i:setMaximized", &max)) - return NULL; - - client_set_state(self->client, - (max ? prop_atoms.net_wm_state_add : - prop_atoms.net_wm_state_remove), - prop_atoms.net_wm_state_maximized_vert, - prop_atoms.net_wm_state_maximized_horz); - - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject *cwrap_fullscreen(ClientWrap *self, PyObject *args) -{ - CHECK_CWRAP(self, "fullscreen"); - if (!PyArg_ParseTuple(args, ":fullscreen")) - return NULL; - return PyInt_FromLong(!!self->client->fullscreen); -} - -static PyObject *cwrap_setFullscreen(ClientWrap *self, PyObject *args) -{ - int fs; - - CHECK_CWRAP(self, "setFullscreen"); - if (!PyArg_ParseTuple(args, "i:setFullscreen", &fs)) - return NULL; - - client_set_state(self->client, - (fs ? prop_atoms.net_wm_state_add : - prop_atoms.net_wm_state_remove), - prop_atoms.net_wm_state_fullscreen, 0); - - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject *cwrap_stacking(ClientWrap *self, PyObject *args) -{ - CHECK_CWRAP(self, "stacking"); - if (!PyArg_ParseTuple(args, ":stacking")) - return NULL; - return PyInt_FromLong(self->client->above ? 1 : - self->client->below ? -1 : 0); -} - -static PyObject *cwrap_setStacking(ClientWrap *self, PyObject *args) -{ - int stack; - - CHECK_CWRAP(self, "setStacking"); - if (!PyArg_ParseTuple(args, "i:setStacking", &stack)) - return NULL; - client_set_state(self->client, - (stack > 0 ? prop_atoms.net_wm_state_add : - prop_atoms.net_wm_state_remove), - prop_atoms.net_wm_state_above, 0); - client_set_state(self->client, - (stack < 0 ? prop_atoms.net_wm_state_add : - prop_atoms.net_wm_state_remove), - prop_atoms.net_wm_state_below, 0); - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject *cwrap_raiseWindow(ClientWrap *self, PyObject *args) -{ - CHECK_CWRAP(self, "raiseWindow"); - if (!PyArg_ParseTuple(args, ":raiseWindow")) - return NULL; - stacking_raise(self->client); - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject *cwrap_lowerWindow(ClientWrap *self, PyObject *args) -{ - CHECK_CWRAP(self, "lowerWindow"); - if (!PyArg_ParseTuple(args, ":lowerWindow")) - return NULL; - stacking_lower(self->client); - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject *cwrap_skipPager(ClientWrap *self, PyObject *args) -{ - CHECK_CWRAP(self, "skipPager"); - if (!PyArg_ParseTuple(args, ":skipPager")) - return NULL; - return PyInt_FromLong(!!self->client->skip_pager); -} - -static PyObject *cwrap_setSkipPager(ClientWrap *self, PyObject *args) -{ - int skip; - - CHECK_CWRAP(self, "setSkipPager"); - if (!PyArg_ParseTuple(args, "i:setSkipPager", &skip)) - return NULL; - - client_set_state(self->client, - (skip ? prop_atoms.net_wm_state_add : - prop_atoms.net_wm_state_remove), - prop_atoms.net_wm_state_skip_pager, 0); - - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject *cwrap_skipTaskbar(ClientWrap *self, PyObject *args) -{ - CHECK_CWRAP(self, "skipTaskbar"); - if (!PyArg_ParseTuple(args, ":skipTaskbar")) - return NULL; - return PyInt_FromLong(!!self->client->skip_taskbar); -} - -static PyObject *cwrap_setSkipTaskbar(ClientWrap *self, PyObject *args) -{ - int skip; - - CHECK_CWRAP(self, "setSkipTaskbar"); - if (!PyArg_ParseTuple(args, "i:setSkipTaskbar", &skip)) - return NULL; - - client_set_state(self->client, - (skip ? prop_atoms.net_wm_state_add : - prop_atoms.net_wm_state_remove), - prop_atoms.net_wm_state_skip_taskbar, 0); - - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject *cwrap_disableDecorations(ClientWrap *self, PyObject *args) -{ - int title, handle, border; - - CHECK_CWRAP(self, "disableDecorations"); - if (!PyArg_ParseTuple(args, "iii:disableDecorations", &title, &handle, - &border)) - return NULL; - - self->client->disabled_decorations = 0; - if (title) self->client->disabled_decorations |= Decor_Titlebar; - if (handle) self->client->disabled_decorations |= Decor_Handle; - if (border) self->client->disabled_decorations |= Decor_Border; - client_setup_decor_and_functions(self->client); - - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject *cwrap_close(ClientWrap *self, PyObject *args) -{ - CHECK_CWRAP(self, "close"); - if (!PyArg_ParseTuple(args, ":close")) - return NULL; - client_close(self->client); - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject *cwrap_window(ClientWrap *self, PyObject *args) -{ - CHECK_CWRAP(self, "window"); - if (!PyArg_ParseTuple(args, ":window")) - return NULL; - return PyInt_FromLong(self->client->window); -} - -#define METH(n, d) {#n, (PyCFunction)cwrap_##n, METH_VARARGS, #d} - -static PyMethodDef ClientWrapMethods[] = { - METH(valid, - "Returns if the Client instance is still valid. Client instances are " - "marked as invalid when the Client they are associated is " - "closed/destroyed/released."), - METH(title, - "Returns the client's title."), - METH(setTitle, - "Change the client's title to the given string. This change will be " - "overwritten if/when the client changes its title."), - METH(iconTitle, - "Returns's the client's icon title. The icon title is the title to " - "be displayed when the client is iconified."), - METH(setIconTitle, - "Change the client's icon title to the given string. This change " - "will be overwritten if/when the client changes its icon title."), - METH(desktop, - "Returns the desktop on which the client is visible. This value will " - "always be in the range [0, ob.Openbox.numDesktops()), unless it is " - "0xffffffff. A value of 0xffffffff indicates the client is visible " - "on all desktops."), - METH(setDesktop, - "Moves the client to the specified desktop. The desktop must be in " - "the range [0, ob.Openbox.numDesktops()), unless it is 0xffffffff. A " - "value of 0xffffffff indicates the client is visible on all " - "desktops."), - METH(resName, - "Returns the resouce name of the client. The resource name is meant " - "to provide an instance name for the client."), - METH(resClass, - "Returns the resouce class of the client. The resource class is " - "meant to provide the genereal class of the application. e.g. " - "'Emacs', 'Xterm', 'XClock', 'XLoad', and so on."), - METH(role, - "Returns the client's role. The role is meant to distinguish between " - "different windows of an application. Each window should have a " - "unique role."), - METH(transient, - "Returns True or False describing if the client is a transient " - "window. Transient windows are 'temporary' windows, such as " - "preference dialogs, and usually have a parent window, which can be " - "found from transientFor()."), - METH(transientFor, - "Returns the client for which this client is a transient. See " - "transient() for a description of transience."), - METH(transients, - "Returns a tuple containing all the Clients which are transients of " - "this window. See transient() for a description of transience."), - METH(type, - "Returns the logical type of the window. This is one of the " - "ClientType constants. See also normal()."), - METH(normal, - "Returns True or False for if the client is a 'normal' window. " - "Normal windows make up most applications. Non-normal windows have " - "special rules applied to them at times such as for focus handling. " - "An example of a non-normal window is 'gnome-panel'. This value is " - "determined from the client's type(), but does not imply that the " - "window is ClientType.Normal. Rather this is a more generic " - "definition of 'normal' windows, and includes dialogs and others."), - METH(area, - "Returns the area of the screen which the client occupies. It may be " - "important to note that this is the position and size of the client " - "*with* its decorations. If you want the underlying position and " - "size of the client itself, you should use clientArea(). See also " - "logicalSize()."), - - METH(setArea, - "Sets the client's area, moving and resizing it as specified (or as " - "close as can be accomidated)."), - METH(clientArea, - "Returns the area of the screen which the client considers itself to " - "be occupying. This value is not what you see and should not be used " - "for most things (it should, for example, be used for persisting a " - "client's dimentions across sessions). See also area()."), - METH(setClientArea, - "Sets the area of the screen which the client considers itself to be " - "occupying. This is not the on-screen visible position and size, and " - "should be used with care. You probably want to use setArea() to " - "adjust the client. This should be used if you want the client " - "window (inside the decorations) to be a specific size. Adjusting " - "the client's position with this function is probably always a bad " - "idea, because of window gravity."), - METH(strut, - "Returns the application's specified strut. The strut is the amount " - "of space that should be reserved for the application on each side " - "of the screen."), - METH(frameSize, - "Returns the size of the decorations around the client window."), - METH(logicalSize, - "Returns the client's logical size. The logical size is the client's " - "size in more user friendly terms. For many apps this is simply the " - "size of the client in pixels, however for some apps this will " - "differ (e.g. terminal emulators). This value should be used when " - "displaying an applications size to the user."), - METH(canFocus, - "Returns True or False for if the client can be focused."), - METH(focus, - "Focuses (or unfocuses) the client window. Windows which return " - "False for canFocus() or visible() cannot be focused. When this " - "function returns, the client's focused() state will not be changed " - "yet. This only sends the request through the X server. You should " - "wait for the hooks.focused hook to fire, and not assume the client " - "has been focused."), - METH(focused, - "Returns True or False for if the client has the input focus."), - METH(visible, - "Returns True or False for if the client is visible. A client is not " - "visible if it is iconic() or if its desktop() is not visible."), - METH(setVisible, - "Shows or hides the client. This has no effect if its current " - "visible() state is requested."), - METH(modal, - "Returns True or False for if the client is a modal window. Modal " - "windows indicate that they must be dealt with before the program " - "can continue. When a modal window is a transient(), its " - "transientFor() client cannot be focused or raised above it."), - METH(setModal, - "Make the client window modal or non-modal."), - METH(shaded, - "Returns True or False for if the client is shaded. Shaded windows " - "have only their titlebar decorations showing."), - METH(setShaded, - "Shade or unshade the client. Shaded windows have only their " - "titlebar decorations showing. Windows which do not have a titlebar " - "cannot be shaded."), - METH(iconic, - "Returns True or False for if the window is iconified. Iconified " - "windows are not visible on any desktops."), - METH(setIconic, - "Iconifies or restores the client window. Iconified windows are not " - "visible on any desktops. Iconified windows can be restored to the " - "currently visible desktop or to their original (native) desktop."), - METH(maximizedHorz, - "Returns whether the client is maximized in the horizontal " - "direction."), - METH(setMaximizedHorz, - "Maximizes or restores a client horizontally."), - METH(maximizedVert, - "Returns whether the client is maximized in the vertical direction."), - METH(setMaximizedVert, - "Maximizes or restores a client vertically."), - METH(maximized, - "Returns whether the client is maximized in the horizontal or " - "vertical direction."), - METH(setMaximized, - "Maximizes or restores a client vertically and horzontally."), - METH(fullscreen, - "Returns if the client is in fullscreen mode. Fullscreen windows are " - "kept above all other windows and are stretched to fill the entire " - "physical display."), - METH(setFullscreen, - "Set a client into or out of fullscreen mode. Fullscreen windows are " - "kept above all other windows and are stretched to fill the entire " - "physical display."), - METH(stacking, - "Returns if the client will be stacked above/below other clients in " - "the same layer."), - METH(setStacking, - "Set how the client will be stacked according to other clients in " - "its layer."), - METH(raiseWindow, - "Raises the window to the top of its stacking layer."), - METH(lowerWindow, - "Lowers the window to the bottom of its stacking layer."), - METH(skipPager, - "Returns if the client has requested to be skipped (not displayed) " - "by pagers."), - METH(setSkipPager, - "Set whether the client should be skipped (not displayed) by " - "pagers."), - METH(skipTaskbar, - "Returns if the client has requested to be skipped (not displayed) " - "by taskbars."), - METH(setSkipTaskbar, - "Set whether the client should be skipped (not displayed) by " - "taskbars."), - METH(disableDecorations, - "Choose which decorations to disable on the client. Note that " - "decorations can only be disabled, and decorations that would " - "normally not be shown cannot be added. These values may have " - "slightly different meanings in different theme engines."), - METH(close, - "Requests the client to close its window."), - METH(window, - "Returns the client's window id. This is the id by which the X " - "server knows the client."), - { NULL, NULL, 0, NULL } -}; - -/*************************************************************************** - - Type methods/struct - - ***************************************************************************/ - -/*static PyObject *cwrap_getattr(ClientWrap *self, char *name) -{ - CHECK_CWRAP(self, "getattr"); - return Py_FindMethod(ClientWrapAttributeMethods, (PyObject*)self, name); -}*/ - -static void cwrap_dealloc(ClientWrap *self) -{ - if (self->client != NULL) - self->client->wrap = NULL; - PyObject_Del((PyObject*) self); -} - -static PyObject *cwrap_repr(ClientWrap *self) -{ - CHECK_CWRAP(self, "repr"); - return PyString_FromFormat("Client: 0x%x", (guint)self->client->window); -} - -static int cwrap_compare(ClientWrap *self, ClientWrap *other) -{ - Window w1, w2; - if (!IS_VALID_CWRAP(self)) { - PyErr_SetString(PyExc_ValueError, - "This 'Client' is wrapping a client which no longer " - "exists."); - } - - w1 = self->client->window; - w2 = other->client->window; - return w1 > w2 ? 1 : w1 < w2 ? -1 : 0; -} - -static PyTypeObject ClientWrapType = { - PyObject_HEAD_INIT(NULL) - 0, - "Client", - sizeof(ClientWrap), - 0, - (destructor) cwrap_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - (cmpfunc) cwrap_compare, /*tp_compare*/ - (reprfunc) cwrap_repr, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash */ -}; - - -/*************************************************************************** - - Define the type 'ClientType' - - ***************************************************************************/ - -#define IS_CTYPE(v) ((v)->ob_type == &ClientTypeType) -#define CHECK_CTYPE(self, funcname) { \ - if (!IS_CTYPE(self)) { \ - PyErr_SetString(PyExc_TypeError, \ - "descriptor '" funcname "' requires a 'ClientType' " \ - "object"); \ - return NULL; \ - } \ -} - -staticforward PyTypeObject ClientTypeType; - -typedef struct ClientType { - PyObject_HEAD -} ClientType; - -static void ctype_dealloc(PyObject *self) -{ - PyObject_Del(self); -} - -static PyObject *ctype_getattr(ClientType *self, char *name) -{ - struct S { char *name; int val; }; - struct S s[] = { - { "Normal", Type_Normal }, - { "Dialog", Type_Dialog }, - { "Desktop", Type_Desktop }, - { "Dock", Type_Dock }, - { "Toolbar", Type_Toolbar }, - { "Menu", Type_Menu }, - { "Utility", Type_Utility }, - { "Splash", Type_Splash }, - { NULL, 0 } }; - int i; - - CHECK_CTYPE(self, "__getattr__"); - - for (i = 0; s[i].name != NULL; ++i) - if (!strcmp(s[i].name, name)) - return PyInt_FromLong(s[i].val); - PyErr_SetString(PyExc_AttributeError, "invalid attribute"); - return NULL; -} - -static PyTypeObject ClientTypeType = { - PyObject_HEAD_INIT(NULL) - 0, - "Type", - sizeof(ClientType), - 0, - (destructor) ctype_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - (getattrfunc) ctype_getattr, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash */ -}; - -/*************************************************************************** - - External methods - - ***************************************************************************/ - -void clientwrap_startup() -{ - PyObject *ob, *obdict, *type; - - ClientWrapType.ob_type = &PyType_Type; - ClientWrapType.tp_methods = ClientWrapMethods; - PyType_Ready(&ClientWrapType); - - ClientTypeType.ob_type = &PyType_Type; - PyType_Ready(&ClientTypeType); - - /* get the ob module/dict */ - ob = PyImport_ImportModule("ob"); /* new */ - g_assert(ob != NULL); - obdict = PyModule_GetDict(ob); /* borrowed */ - g_assert(obdict != NULL); - - /* add the Client type to the ob module */ - PyDict_SetItemString(obdict, "Client", (PyObject*) &ClientWrapType); - - /* add an instance of ClientType */ - type = (PyObject*) PyObject_New(ClientType, &ClientTypeType); - PyDict_SetItemString(obdict, "ClientType", type); - Py_DECREF(type); - - Py_DECREF(ob); -} - -void clientwrap_shutdown() -{ -} - -PyObject *clientwrap_new(Client *client) -{ - g_assert(client != NULL); - - if (client->wrap != NULL) { - /* already has a wrapper! */ - Py_INCREF((PyObject*) client->wrap); - } else { - client->wrap = PyObject_New(ClientWrap, &ClientWrapType); - client->wrap->client = client; - } - return (PyObject*) client->wrap; -} |
