792 lines
25 KiB
C
792 lines
25 KiB
C
#include "clientwrap.h"
|
|
#include "client.h"
|
|
#include "frame.h"
|
|
#include "stacking.h"
|
|
#include "focus.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_window(ClientWrap *self, PyObject *args)
|
|
{
|
|
CHECK_CWRAP(self, "window");
|
|
if (!PyArg_ParseTuple(args, ":window"))
|
|
return NULL;
|
|
return PyInt_FromLong(self->client->window);
|
|
}
|
|
|
|
static PyObject *cwrap_group(ClientWrap *self, PyObject *args)
|
|
{
|
|
CHECK_CWRAP(self, "group");
|
|
if (!PyArg_ParseTuple(args, ":group"))
|
|
return NULL;
|
|
return PyInt_FromLong(self->client->group);
|
|
}
|
|
|
|
static PyObject *cwrap_parent(ClientWrap *self, PyObject *args)
|
|
{
|
|
CHECK_CWRAP(self, "parent");
|
|
if (!PyArg_ParseTuple(args, ":parent"))
|
|
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_children(ClientWrap *self, PyObject *args)
|
|
{
|
|
PyObject *list;
|
|
GSList *it;
|
|
guint i, s;
|
|
|
|
CHECK_CWRAP(self, "children");
|
|
if (!PyArg_ParseTuple(args, ":children"))
|
|
return NULL;
|
|
s = g_slist_length(self->client->transients);
|
|
list = PyList_New(s);
|
|
for (i = 0, it = self->client->transients; i < s; ++i, it = it->next)
|
|
PyList_SET_ITEM(list, i, clientwrap_new(it->data));
|
|
return list;
|
|
}
|
|
|
|
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_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_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_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_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_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->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_screenArea(ClientWrap *self, PyObject *args)
|
|
{
|
|
PyObject *tuple;
|
|
|
|
CHECK_CWRAP(self, "screenArea");
|
|
if (!PyArg_ParseTuple(args, ":screenArea"))
|
|
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_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_minRatio(ClientWrap *self, PyObject *args)
|
|
{
|
|
CHECK_CWRAP(self, "minRatio");
|
|
if (!PyArg_ParseTuple(args, ":minRatio"))
|
|
return NULL;
|
|
return PyFloat_FromDouble(self->client->min_ratio);
|
|
}
|
|
|
|
static PyObject *cwrap_maxRatio(ClientWrap *self, PyObject *args)
|
|
{
|
|
CHECK_CWRAP(self, "maxRatio");
|
|
if (!PyArg_ParseTuple(args, ":maxRatio"))
|
|
return NULL;
|
|
return PyFloat_FromDouble(self->client->max_ratio);
|
|
}
|
|
|
|
static PyObject *cwrap_minSize(ClientWrap *self, PyObject *args)
|
|
{
|
|
PyObject *tuple;
|
|
|
|
CHECK_CWRAP(self, "minSize");
|
|
if (!PyArg_ParseTuple(args, ":minSize"))
|
|
return NULL;
|
|
tuple = PyTuple_New(2);
|
|
PyTuple_SET_ITEM(tuple, 0, PyInt_FromLong(self->client->min_size.width));
|
|
PyTuple_SET_ITEM(tuple, 1, PyInt_FromLong(self->client->min_size.height));
|
|
return tuple;
|
|
}
|
|
|
|
static PyObject *cwrap_maxSize(ClientWrap *self, PyObject *args)
|
|
{
|
|
PyObject *tuple;
|
|
|
|
CHECK_CWRAP(self, "maxSize");
|
|
if (!PyArg_ParseTuple(args, ":maxSize"))
|
|
return NULL;
|
|
tuple = PyTuple_New(2);
|
|
PyTuple_SET_ITEM(tuple, 0, PyInt_FromLong(self->client->max_size.width));
|
|
PyTuple_SET_ITEM(tuple, 1, PyInt_FromLong(self->client->max_size.height));
|
|
return tuple;
|
|
}
|
|
|
|
static PyObject *cwrap_sizeIncrement(ClientWrap *self, PyObject *args)
|
|
{
|
|
PyObject *tuple;
|
|
|
|
CHECK_CWRAP(self, "sizeIncrement");
|
|
if (!PyArg_ParseTuple(args, ":sizeIncrement"))
|
|
return NULL;
|
|
tuple = PyTuple_New(2);
|
|
PyTuple_SET_ITEM(tuple, 0, PyInt_FromLong(self->client->size_inc.width));
|
|
PyTuple_SET_ITEM(tuple, 1, PyInt_FromLong(self->client->size_inc.height));
|
|
return tuple;
|
|
}
|
|
|
|
static PyObject *cwrap_baseSize(ClientWrap *self, PyObject *args)
|
|
{
|
|
PyObject *tuple;
|
|
|
|
CHECK_CWRAP(self, "baseSize");
|
|
if (!PyArg_ParseTuple(args, ":baseSize"))
|
|
return NULL;
|
|
tuple = PyTuple_New(2);
|
|
PyTuple_SET_ITEM(tuple, 0, PyInt_FromLong(self->client->base_size.width));
|
|
PyTuple_SET_ITEM(tuple, 1, PyInt_FromLong(self->client->base_size.height));
|
|
return tuple;
|
|
}
|
|
|
|
static PyObject *cwrap_gravity(ClientWrap *self, PyObject *args)
|
|
{
|
|
CHECK_CWRAP(self, "gravity");
|
|
if (!PyArg_ParseTuple(args, ":gravity"))
|
|
return NULL;
|
|
return PyInt_FromLong(self->client->gravity);
|
|
}
|
|
|
|
static PyObject *cwrap_canClose(ClientWrap *self, PyObject *args)
|
|
{
|
|
CHECK_CWRAP(self, "canClose");
|
|
if (!PyArg_ParseTuple(args, ":canClose"))
|
|
return NULL;
|
|
return PyInt_FromLong(self->client->delete_window ? 1 : 0);
|
|
}
|
|
|
|
static PyObject *cwrap_positionRequested(ClientWrap *self, PyObject *args)
|
|
{
|
|
CHECK_CWRAP(self, "positionRequested");
|
|
if (!PyArg_ParseTuple(args, ":positionRequested"))
|
|
return NULL;
|
|
return PyInt_FromLong(self->client->positioned ? 1 : 0);
|
|
}
|
|
|
|
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 ||
|
|
self->client->focus_notify);
|
|
}
|
|
|
|
static PyObject *cwrap_urgent(ClientWrap *self, PyObject *args)
|
|
{
|
|
CHECK_CWRAP(self, "urgent");
|
|
if (!PyArg_ParseTuple(args, ":urgent"))
|
|
return NULL;
|
|
return PyInt_FromLong(self->client->urgent ? 1 : 0);
|
|
}
|
|
|
|
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 ? 1 : 0);
|
|
}
|
|
|
|
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 ? 1 : 0);
|
|
}
|
|
|
|
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 ? 1 : 0);
|
|
}
|
|
|
|
static PyObject *cwrap_iconic(ClientWrap *self, PyObject *args)
|
|
{
|
|
CHECK_CWRAP(self, "iconic");
|
|
if (!PyArg_ParseTuple(args, ":iconc"))
|
|
return NULL;
|
|
return PyInt_FromLong(self->client->iconic ? 1 : 0);
|
|
}
|
|
|
|
static PyObject *cwrap_maximizedVertical(ClientWrap *self, PyObject *args)
|
|
{
|
|
CHECK_CWRAP(self, "maximizedVertical");
|
|
if (!PyArg_ParseTuple(args, ":maximizedVertical"))
|
|
return NULL;
|
|
return PyInt_FromLong(self->client->max_vert ? 1 : 0);
|
|
}
|
|
|
|
static PyObject *cwrap_maximizedHorizontal(ClientWrap *self, PyObject *args)
|
|
{
|
|
CHECK_CWRAP(self, "maximizedHorizontal");
|
|
if (!PyArg_ParseTuple(args, ":maximizedHorizontal"))
|
|
return NULL;
|
|
return PyInt_FromLong(self->client->max_horz ? 1 : 0);
|
|
}
|
|
|
|
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 ? 1 : 0);
|
|
}
|
|
|
|
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 ? 1 : 0);
|
|
}
|
|
|
|
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 ? 1 : 0);
|
|
}
|
|
|
|
static PyObject *cwrap_above(ClientWrap *self, PyObject *args)
|
|
{
|
|
CHECK_CWRAP(self, "above");
|
|
if (!PyArg_ParseTuple(args, ":above"))
|
|
return NULL;
|
|
return PyInt_FromLong(self->client->above ? 1 : 0);
|
|
}
|
|
|
|
static PyObject *cwrap_below(ClientWrap *self, PyObject *args)
|
|
{
|
|
CHECK_CWRAP(self, "below");
|
|
if (!PyArg_ParseTuple(args, ":below"))
|
|
return NULL;
|
|
return PyInt_FromLong(self->client->below ? 1 : 0);
|
|
}
|
|
|
|
static PyObject *cwrap_layer(ClientWrap *self, PyObject *args)
|
|
{
|
|
CHECK_CWRAP(self, "layer");
|
|
if (!PyArg_ParseTuple(args, ":layer"))
|
|
return NULL;
|
|
return PyInt_FromLong(self->client->layer);
|
|
}
|
|
|
|
static PyObject *cwrap_decorations(ClientWrap *self, PyObject *args)
|
|
{
|
|
CHECK_CWRAP(self, "decorations");
|
|
if (!PyArg_ParseTuple(args, ":decorations"))
|
|
return NULL;
|
|
return PyInt_FromLong(self->client->decorations);
|
|
}
|
|
|
|
static PyObject *cwrap_disabledDecorations(ClientWrap *self, PyObject *args)
|
|
{
|
|
CHECK_CWRAP(self, "disabledDecorations");
|
|
if (!PyArg_ParseTuple(args, ":disabledDecorations"))
|
|
return NULL;
|
|
return PyInt_FromLong(self->client->disabled_decorations);
|
|
}
|
|
|
|
static PyObject *cwrap_functions(ClientWrap *self, PyObject *args)
|
|
{
|
|
CHECK_CWRAP(self, "functions");
|
|
if (!PyArg_ParseTuple(args, ":functions"))
|
|
return NULL;
|
|
return PyInt_FromLong(self->client->functions);
|
|
}
|
|
|
|
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 ? 1 : 0);
|
|
}
|
|
|
|
static PyObject *cwrap_decorationSize(ClientWrap *self, PyObject *args)
|
|
{
|
|
PyObject *tuple;
|
|
|
|
CHECK_CWRAP(self, "decorationSize");
|
|
if (!PyArg_ParseTuple(args, ":decorationSize"))
|
|
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_normal(ClientWrap *self, PyObject *args)
|
|
{
|
|
CHECK_CWRAP(self, "normal");
|
|
if (!PyArg_ParseTuple(args, ":normal"))
|
|
return NULL;
|
|
return PyInt_FromLong(client_normal(self->client) ? 1 : 0);
|
|
}
|
|
|
|
static PyObject *cwrap_setVisible(ClientWrap *self, PyObject *args)
|
|
{
|
|
int i;
|
|
|
|
CHECK_CWRAP(self, "setVisible");
|
|
if (!PyArg_ParseTuple(args, "i:setVisible", &i))
|
|
return NULL;
|
|
if (i)
|
|
frame_show(self->client->frame);
|
|
else
|
|
frame_hide(self->client->frame);
|
|
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_focus(ClientWrap *self, PyObject *args)
|
|
{
|
|
CHECK_CWRAP(self, "focus");
|
|
if (!PyArg_ParseTuple(args, ":focus"))
|
|
return NULL;
|
|
return PyInt_FromLong(client_focus(self->client) ? 1 : 0);
|
|
}
|
|
|
|
static PyObject *cwrap_unfocus(ClientWrap *self, PyObject *args)
|
|
{
|
|
CHECK_CWRAP(self, "unfocus");
|
|
if (!PyArg_ParseTuple(args, ":unfocus"))
|
|
return NULL;
|
|
client_unfocus(self->client);
|
|
Py_INCREF(Py_None);
|
|
return Py_None;
|
|
}
|
|
|
|
static PyObject *cwrap_move(ClientWrap *self, PyObject *args)
|
|
{
|
|
int x, y;
|
|
int final = TRUE;
|
|
CHECK_CWRAP(self, "move");
|
|
if (!PyArg_ParseTuple(args, "ii|i:unfocus", &x, &y, &final))
|
|
return NULL;
|
|
/* get the client's position based on x,y for the frame */
|
|
frame_frame_gravity(self->client->frame, &x, &y);
|
|
|
|
client_configure(self->client, Corner_TopLeft, x, y,
|
|
self->client->area.width, self->client->area.height,
|
|
TRUE, final);
|
|
Py_INCREF(Py_None);
|
|
return Py_None;
|
|
}
|
|
|
|
#define ATTRMETH(n, d) {#n, (PyCFunction)cwrap_##n, METH_VARARGS, #d}
|
|
|
|
static PyMethodDef ClientWrapMethods[] = {
|
|
ATTRMETH(window,
|
|
"c.window() -- Returns the window id for the Client."),
|
|
ATTRMETH(group,
|
|
"c.group() -- Returns the group id for the Client."),
|
|
ATTRMETH(parent,
|
|
"c.parent() -- Returns the parent Client for the Client, or the "
|
|
"Client for which this Client is a transient. Returns None if it "
|
|
"is not a transient."),
|
|
ATTRMETH(children,
|
|
"c.parent() -- Returns a list of child Clients for the Client, "
|
|
"or the Clients transients."),
|
|
ATTRMETH(desktop,
|
|
"c.desktop() -- Returns the desktop on which the Client resides, "
|
|
"or 0xffffffff for 'all desktops'."),
|
|
ATTRMETH(title,
|
|
"c.title() -- Returns the Client's title string. This is in "
|
|
"UTF-8 encoding."),
|
|
ATTRMETH(iconTitle,
|
|
"c.iconTitle() -- Returns the Client's icon title string. This "
|
|
"is in UTF-8 encoding."),
|
|
ATTRMETH(resName,
|
|
"c.resName() -- Returns the application's specified resource "
|
|
"name."),
|
|
ATTRMETH(resClass,
|
|
"c.resClass() -- Returns the application's specified resource "
|
|
"class."),
|
|
ATTRMETH(role,
|
|
"c.role() -- Returns the window's role, which should be unique "
|
|
"for every window of an application, if it is not empty."),
|
|
ATTRMETH(type,
|
|
"c.type() -- Returns the window's type, one of the ob.Type_ "
|
|
"constants. This is the logical type of the window."),
|
|
ATTRMETH(area,
|
|
"c.area() -- Returns the area rectangle for the Client in a "
|
|
"tuple. The tuple's format is (x, y, width, height). This is "
|
|
"not the area on-screen that the Client and frame occupies, but "
|
|
"rather, the position and size that the Client has requested, "
|
|
"before its gravity() and decorations have been applied. You "
|
|
"should use the c.screenArea() to get the actual on-screen area "
|
|
"for the Client."),
|
|
ATTRMETH(screenArea,
|
|
"c.screenArea() -- Returns the on-screen area rectangle for the "
|
|
"Client in a tuple. The tuple's format is (x, y, width, height). "
|
|
"This is the actual position and size of the Client plus its "
|
|
"decorations."),
|
|
ATTRMETH(strut,
|
|
"c.strut() -- Returns the strut requested by the Client in a "
|
|
"tuple. The format of the tuple is (left, top, right, bottom)."),
|
|
ATTRMETH(logicalSize,
|
|
"c.logicalSize() -- Returns the logical size of the Client. This "
|
|
"is the 'user friendly' size for the Client, such as for an "
|
|
"xterm, it will be the number of characters in the xterm "
|
|
"instead of the number of pixels it takes up."),
|
|
ATTRMETH(minRatio,
|
|
"c.minRatio() -- Returns the minimum width:height ratio for "
|
|
"the Client. A value of 0 implies no ratio enforcement."),
|
|
ATTRMETH(maxRatio,
|
|
"c.maxRatio() -- Returns the maximum width:height ratio for "
|
|
"the Client. A value of 0 implies no ratio enforcement."),
|
|
ATTRMETH(minSize,
|
|
"c.minSize() -- Returns the minimum size of the Client."),
|
|
ATTRMETH(maxSize,
|
|
"c.maxSize() -- Returns the maximum size of the Client."),
|
|
ATTRMETH(sizeIncrement,
|
|
"c.sizeIncrement() -- Returns the size increments in which the "
|
|
"Client must be resized."),
|
|
ATTRMETH(baseSize,
|
|
"c.baseSize() -- Returns the base size of the Client, which is "
|
|
"subtracted from the Client's size before comparing to its "
|
|
"various sizing constraints."),
|
|
ATTRMETH(gravity,
|
|
"c.gravity() -- Returns the gravity for the Client. One of the "
|
|
"ob.Gravity_ constants."),
|
|
ATTRMETH(canClose,
|
|
"c.canClose() -- Returns whether or not the Client provides a "
|
|
"means for Openbox to request that it close."),
|
|
ATTRMETH(positionRequested,
|
|
"c.positionRequested() -- Returns whether or not the Client has "
|
|
"requested a specified position on screen. When it has it should "
|
|
"probably not be placed using an algorithm when it is managed."),
|
|
ATTRMETH(canFocus,
|
|
"c.canFocus() -- Returns whether or not the Client can be "
|
|
"given input focus."),
|
|
ATTRMETH(urgent,
|
|
"c.urgent() -- Returns the urgent state of the window (on/off)."),
|
|
ATTRMETH(focused,
|
|
"c.focused() -- Returns whether or not the Client has the input "
|
|
"focus."),
|
|
ATTRMETH(modal,
|
|
"c.modal() -- Returns whether or not the Client is modal. A "
|
|
"modal Client implies that it needs to be closed before its "
|
|
"parent() can be used (focsed) again."),
|
|
ATTRMETH(shaded,
|
|
"c.shaded() -- Returns whether or not the Client is shaded. "
|
|
"Shaded clients are hidden except for their titlebar."),
|
|
ATTRMETH(iconic,
|
|
"c.iconic() -- Returns whether or not the Client is iconic. "
|
|
"Iconic windows are represented only by icons, or possibly "
|
|
"hidden entirely."),
|
|
ATTRMETH(maximizedVertical,
|
|
"c.maximizedVertical() -- Returns whether or not the Client is "
|
|
"maxized vertically. When a Client is maximized it will expand "
|
|
"to fill as much of the screen as it can in that direction."),
|
|
ATTRMETH(maximizedHorizontal,
|
|
"c.maximizedHorizontal() -- Returns whether or not the Client is "
|
|
"maxized horizontally. When a Client is maximized it will expand "
|
|
"to fill as much of the screen as it can in that direction."),
|
|
ATTRMETH(skipPager,
|
|
"c.skipPager() -- Returns whether the Client as requested to be "
|
|
"skipped by pagers."),
|
|
ATTRMETH(skipTaskbar,
|
|
"c.skipTaskbar() -- Returns whether the Client as requested to "
|
|
"be skipped by taskbars."),
|
|
ATTRMETH(fullscreen,
|
|
"c.fullscreen() -- Returns whether the Client is in fullscreen "
|
|
"mode."),
|
|
ATTRMETH(above,
|
|
"c.above() -- Returns whether the Client should be stacked above "
|
|
"other windows of the same type."),
|
|
ATTRMETH(below,
|
|
"c.below() -- Returns whether the Client should be stacked below "
|
|
"other windows of the same type."),
|
|
ATTRMETH(layer,
|
|
"c.layer() -- Returns the layer in which the window should be "
|
|
"stacked. This is one of the ob.Layer_ constants. Windows in "
|
|
"layers with higher values should be kept above windows in lower "
|
|
"valued layers."),
|
|
ATTRMETH(decorations,
|
|
"c.decorations() -- Returns a mask of decorations which the "
|
|
"Client will be given. It is made up of the ob.Decor_ constants. "
|
|
"These can be turned off with the "
|
|
" disabledDecorations()."),
|
|
ATTRMETH(disabledDecorations,
|
|
"c.disabledDecorations() -- returns a mask of decorations which "
|
|
"are disabled on the Client. This is made up of the ob.Decor_ "
|
|
"constants."),
|
|
ATTRMETH(functions,
|
|
"ob.functions() -- Returns the list of functionality for the "
|
|
"Client, in a mask made up of the ob.Func_ constants."),
|
|
ATTRMETH(visible,
|
|
"ob.visible() -- Returns if the client is currently visible "
|
|
"or hidden."),
|
|
ATTRMETH(decorationSize,
|
|
"c.decorationSize() -- Returns the size of the Client's "
|
|
"decorations around the Client window, in a tuple. The format of "
|
|
"the tuple is (left, top, right, bottom)."),
|
|
ATTRMETH(normal,
|
|
"c.normal() -- Returns if the window should be treated as a "
|
|
"normal window. Some windows (desktops, docks, splash screens) "
|
|
"should have special rules applied to them in a number of "
|
|
"places regarding focus or user interaction."),
|
|
ATTRMETH(setVisible,
|
|
"c.setVisible(show) -- Shows or hides the Client."),
|
|
ATTRMETH(raiseWindow,
|
|
"c.raiseWindow() -- Raises the Client to the top of its layer."),
|
|
ATTRMETH(lowerWindow,
|
|
"c.lowerWindow() -- Lowers the Client to the bottom of its "
|
|
"layer."),
|
|
ATTRMETH(focus,
|
|
"c.focus() -- Focuses the Client. Returns 1 if the Client will "
|
|
"be focused, or 0 if it will not."),
|
|
ATTRMETH(unfocus,
|
|
"c.unfocus() -- Unfocuses the Client, leaving nothing focused."),
|
|
ATTRMETH(move,
|
|
"c.move(x, y) -- Moves the Client to the specified position. The "
|
|
"top left corner of the Client's decorations is positioned at "
|
|
"the given x, y."),
|
|
{ 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("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 = self->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 */
|
|
};
|
|
|
|
/***************************************************************************
|
|
|
|
External methods
|
|
|
|
***************************************************************************/
|
|
|
|
void clientwrap_startup()
|
|
{
|
|
ClientWrapType.ob_type = &PyType_Type;
|
|
ClientWrapType.tp_methods = ClientWrapMethods;
|
|
PyType_Ready(&ClientWrapType);
|
|
}
|
|
|
|
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;
|
|
}
|