rm this garbage...
This commit is contained in:
parent
c4a5149016
commit
0d55e6cb7d
3 changed files with 0 additions and 652 deletions
|
@ -1 +0,0 @@
|
|||
SUBDIRS = slit
|
|
@ -1,17 +0,0 @@
|
|||
rcdir=$(datadir)/openbox
|
||||
|
||||
INCLUDES=-I../..
|
||||
|
||||
CPPFLAGS=$(X_CFLAGS) $(XFT_CFLAGS) $(GLIB_CFLAGS) @CPPFLAGS@ \
|
||||
-DRCDIR=\"$(rcdir)\" \
|
||||
-DG_LOG_DOMAIN=\"ObSlit\"
|
||||
LIBS=$(X_LIBS) $(XFT_LIBS) $(GLIB_LIBS) @LIBS@ @LIBINTL@
|
||||
|
||||
bin_PROGRAMS=obslit
|
||||
|
||||
obslit_LDADD=-lobrender -L../../render
|
||||
obslit_SOURCES=slit.c
|
||||
MAINTAINERCLEANFILES=Makefile.in
|
||||
|
||||
distclean-local:
|
||||
$(RM) *\~ *.orig *.rej .\#*
|
|
@ -1,634 +0,0 @@
|
|||
#include "render/render.h"
|
||||
#include "render/theme.h"
|
||||
|
||||
#include <X11/Xlib.h>
|
||||
#include <stdlib.h>
|
||||
#include <glib.h>
|
||||
#ifdef HAVE_SIGNAL_H
|
||||
# include <signal.h>
|
||||
#endif
|
||||
#ifdef HAVE_SYS_SELECT_H
|
||||
# include <sys/select.h>
|
||||
#endif
|
||||
|
||||
#define TITLE_EVENT_MASK (ButtonPressMask | ButtonReleaseMask | \
|
||||
ButtonMotionMask)
|
||||
#define ROOT_EVENT_MASK (PropertyChangeMask | StructureNotifyMask | \
|
||||
SubstructureNotifyMask)
|
||||
#define SLITAPP_EVENT_MASK (StructureNotifyMask)
|
||||
|
||||
Display *ob_display;
|
||||
Window ob_root;
|
||||
int ob_screen;
|
||||
|
||||
static struct Slit {
|
||||
Window frame;
|
||||
Window title;
|
||||
|
||||
/* user-requested position stuff */
|
||||
int gravity;
|
||||
int user_x, user_y;
|
||||
|
||||
/* actual position (when not auto-hidden) */
|
||||
int x, y;
|
||||
int w, h;
|
||||
|
||||
gboolean horz;
|
||||
|
||||
Appearance *a_frame;
|
||||
Appearance *a_title;
|
||||
|
||||
GList *slit_apps;
|
||||
} *slit;
|
||||
static int nslits;
|
||||
|
||||
struct SlitApp {
|
||||
Window icon_win;
|
||||
Window win;
|
||||
int x;
|
||||
int y;
|
||||
int w;
|
||||
int h;
|
||||
};
|
||||
|
||||
static Atom atom_atom;
|
||||
static Atom atom_card;
|
||||
static Atom atom_theme;
|
||||
static Atom atom_type;
|
||||
static Atom atom_type_dock;
|
||||
static Atom atom_desktop;
|
||||
static Atom atom_state;
|
||||
static Atom atom_strut;
|
||||
|
||||
static gboolean quit = FALSE;
|
||||
static gboolean reconfig = FALSE;
|
||||
|
||||
void slit_read_theme();
|
||||
void slit_configure();
|
||||
void event_handle(XEvent *e);
|
||||
void slit_add_existing();
|
||||
void slit_add_app(Window win);
|
||||
void slit_remove_app(struct Slit *slit, struct SlitApp *app,gboolean reparent);
|
||||
|
||||
void sighandler(int signal)
|
||||
{
|
||||
if (signal == SIGUSR1)
|
||||
reconfig =TRUE;
|
||||
else
|
||||
quit = TRUE;
|
||||
}
|
||||
|
||||
int xerrorhandler(Display *d, XErrorEvent *e)
|
||||
{
|
||||
char errtxt[128];
|
||||
XGetErrorText(d, e->error_code, errtxt, 127);
|
||||
g_error("X Error: %s", errtxt);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
int i;
|
||||
guint desk = 0xffffffff;
|
||||
XEvent e;
|
||||
XSetWindowAttributes attrib;
|
||||
struct sigaction action;
|
||||
sigset_t sigset;
|
||||
int xfd;
|
||||
fd_set selset;
|
||||
|
||||
/* set up signal handler */
|
||||
sigemptyset(&sigset);
|
||||
action.sa_handler = sighandler;
|
||||
action.sa_mask = sigset;
|
||||
action.sa_flags = SA_NOCLDSTOP;
|
||||
sigaction(SIGUSR1, &action, (struct sigaction *) NULL);
|
||||
sigaction(SIGPIPE, &action, (struct sigaction *) NULL);
|
||||
sigaction(SIGSEGV, &action, (struct sigaction *) NULL);
|
||||
sigaction(SIGFPE, &action, (struct sigaction *) NULL);
|
||||
sigaction(SIGTERM, &action, (struct sigaction *) NULL);
|
||||
sigaction(SIGINT, &action, (struct sigaction *) NULL);
|
||||
sigaction(SIGHUP, &action, (struct sigaction *) NULL);
|
||||
|
||||
ob_display = XOpenDisplay(NULL);
|
||||
ob_screen = DefaultScreen(ob_display);
|
||||
ob_root = RootWindow(ob_display, ob_screen);
|
||||
|
||||
XSetErrorHandler(xerrorhandler);
|
||||
|
||||
render_startup();
|
||||
theme_startup();
|
||||
|
||||
atom_atom = XInternAtom(ob_display, "ATOM", False);
|
||||
atom_card = XInternAtom(ob_display, "CARDINAL", False);
|
||||
atom_theme = XInternAtom(ob_display, "_OPENBOX_THEME", False);
|
||||
atom_type = XInternAtom(ob_display, "_NET_WM_WINDOW_TYPE", False);
|
||||
atom_type_dock = XInternAtom(ob_display, "_NET_WM_WINDOW_TYPE_DOCK",False);
|
||||
atom_desktop =XInternAtom(ob_display, "_NET_WM_DESKTOP", False);
|
||||
atom_state = XInternAtom(ob_display, "WM_STATE", False);
|
||||
atom_strut = XInternAtom(ob_display, "_NET_WM_STRUT", False);
|
||||
|
||||
nslits = 1;
|
||||
slit = g_new0(struct Slit, nslits);
|
||||
|
||||
for (i = 0; i < nslits; ++i) {
|
||||
slit[i].horz = TRUE;
|
||||
|
||||
slit[i].frame = XCreateWindow(ob_display, ob_root, 0, 0, 1, 1, 0,
|
||||
render_depth, InputOutput, render_visual,
|
||||
0, NULL);
|
||||
attrib.event_mask = TITLE_EVENT_MASK;
|
||||
slit[i].title = XCreateWindow(ob_display, slit[i].frame, 0, 0, 1, 1, 0,
|
||||
render_depth, InputOutput, render_visual,
|
||||
CWEventMask, &attrib);
|
||||
XMapWindow(ob_display, slit[i].title);
|
||||
|
||||
XChangeProperty(ob_display, slit[i].frame, atom_type, atom_atom,
|
||||
32, PropModeReplace, (guchar*)&atom_type_dock, 1);
|
||||
|
||||
XChangeProperty(ob_display, slit[i].frame, atom_desktop, atom_card,
|
||||
32, PropModeReplace, (guchar*)&desk, 1);
|
||||
}
|
||||
|
||||
slit_read_theme();
|
||||
|
||||
XSelectInput(ob_display, ob_root, ROOT_EVENT_MASK);
|
||||
|
||||
slit_add_existing();
|
||||
|
||||
xfd = ConnectionNumber(ob_display);
|
||||
FD_ZERO(&selset);
|
||||
FD_SET(xfd, &selset);
|
||||
while (!quit) {
|
||||
gboolean hadevent = FALSE;
|
||||
while (XPending(ob_display)) {
|
||||
XNextEvent(ob_display, &e);
|
||||
event_handle(&e);
|
||||
hadevent = TRUE;
|
||||
}
|
||||
if (!hadevent) {
|
||||
if (reconfig)
|
||||
slit_read_theme();
|
||||
|
||||
if (!quit)
|
||||
select(xfd + 1, &selset, NULL, NULL, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < nslits; ++i) {
|
||||
while (slit[i].slit_apps)
|
||||
slit_remove_app(&slit[i], slit[i].slit_apps->data, TRUE);
|
||||
|
||||
XDestroyWindow(ob_display, slit[i].title);
|
||||
XDestroyWindow(ob_display, slit[i].frame);
|
||||
|
||||
appearance_free(slit[i].a_frame);
|
||||
appearance_free(slit[i].a_title);
|
||||
}
|
||||
|
||||
theme_shutdown();
|
||||
render_shutdown();
|
||||
XCloseDisplay(ob_display);
|
||||
return 0;
|
||||
}
|
||||
|
||||
Window find_client(Window win)
|
||||
{
|
||||
Window r, *children;
|
||||
unsigned int n, i;
|
||||
Atom ret_type;
|
||||
int ret_format;
|
||||
unsigned long ret_items, ret_bytesleft;
|
||||
unsigned long *prop_return;
|
||||
|
||||
XQueryTree(ob_display, win, &r, &r, &children, &n);
|
||||
for (i = 0; i < n; ++i) {
|
||||
Window w = find_client(children[i]);
|
||||
if (w) return w;
|
||||
}
|
||||
|
||||
/* try me */
|
||||
XGetWindowProperty(ob_display, win, atom_state, 0, 1,
|
||||
False, atom_state, &ret_type, &ret_format,
|
||||
&ret_items, &ret_bytesleft,
|
||||
(unsigned char**) &prop_return);
|
||||
if (ret_type == None || ret_items < 1)
|
||||
return None;
|
||||
return win; /* found it! */
|
||||
}
|
||||
|
||||
void event_handle(XEvent *e)
|
||||
{
|
||||
int i;
|
||||
Window win;
|
||||
static guint button = 0;
|
||||
int sw, sh;
|
||||
int xpos, ypos;
|
||||
int x, y, g;
|
||||
|
||||
switch (e->type) {
|
||||
case ButtonPress:
|
||||
if (!button) {
|
||||
button = e->xbutton.button;
|
||||
}
|
||||
break;
|
||||
case ButtonRelease:
|
||||
if (button == e->xbutton.button)
|
||||
button = 0;
|
||||
break;
|
||||
case MotionNotify:
|
||||
if (button == 1) {
|
||||
for (i = 0; i < nslits; ++i)
|
||||
if (slit[i].title == e->xmotion.window) {
|
||||
/* pick a corner and move it */
|
||||
sw = WidthOfScreen(ScreenOfDisplay(ob_display, ob_screen));
|
||||
sh = HeightOfScreen(ScreenOfDisplay(ob_display,ob_screen));
|
||||
|
||||
if (e->xmotion.x_root < sw / 3) /* left edge */
|
||||
xpos = 0;
|
||||
else if (e->xmotion.x_root < sw / 3 * 2) /* middle */
|
||||
xpos = 1;
|
||||
else /* right edge */
|
||||
xpos = 2;
|
||||
if (e->xmotion.y_root < sh / 3) /* top edge */
|
||||
ypos = 0;
|
||||
else if (e->xmotion.y_root < sh / 3 * 2) /* middle */
|
||||
ypos = 1;
|
||||
else /* bottom edge */
|
||||
ypos = 2;
|
||||
|
||||
if (xpos == 1 && ypos == 1)
|
||||
return; /* cant go in middle middle */
|
||||
|
||||
if (xpos == 0) {
|
||||
if (ypos == 0) {
|
||||
x = 0;
|
||||
y = 0;
|
||||
g = NorthWestGravity;
|
||||
} else if (ypos == 1) {
|
||||
x = 0;
|
||||
y = sh / 2;
|
||||
g = WestGravity;
|
||||
} else {
|
||||
x = 0;
|
||||
y = sh;
|
||||
g = SouthWestGravity;
|
||||
}
|
||||
} else if (xpos == 1) {
|
||||
if (ypos == 0) {
|
||||
x = sw / 2;
|
||||
y = 0;
|
||||
g = NorthGravity;
|
||||
} else {
|
||||
x = sw / 2;
|
||||
y = sh;
|
||||
g = SouthGravity;
|
||||
}
|
||||
} else {
|
||||
if (ypos == 0) {
|
||||
x = sw;
|
||||
y = 0;
|
||||
g = NorthEastGravity;
|
||||
} else if (ypos == 1) {
|
||||
x = sw;
|
||||
y = sh / 2;
|
||||
g = EastGravity;
|
||||
} else {
|
||||
x = sw;
|
||||
y = sh;
|
||||
g = SouthEastGravity;
|
||||
}
|
||||
}
|
||||
if (x != slit[i].x || y != slit[i].y ||
|
||||
g != slit[i].gravity) {
|
||||
slit[i].user_x = x;
|
||||
slit[i].user_y = y;
|
||||
slit[i].gravity = g;
|
||||
slit_configure();
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case PropertyNotify:
|
||||
g_message("PropertyNotify on 0x%lx", e->xproperty.window);
|
||||
if (e->xproperty.window == ob_root) {
|
||||
if (e->xproperty.atom == atom_theme)
|
||||
slit_read_theme();
|
||||
}
|
||||
break;
|
||||
case ConfigureNotify:
|
||||
g_message("ConfigureNotify on 0x%lx", e->xconfigure.window);
|
||||
if (e->xconfigure.window == ob_root) {
|
||||
slit_configure();
|
||||
return;
|
||||
}
|
||||
|
||||
/* an owned slitapp? */
|
||||
for (i = 0; i < nslits; ++i) {
|
||||
GList *it;
|
||||
|
||||
for (it = slit[i].slit_apps; it; it = it->next) {
|
||||
struct SlitApp *app = it->data;
|
||||
if (e->xconfigure.window == app->icon_win) {
|
||||
if (app->w != e->xconfigure.width ||
|
||||
app->h != e->xconfigure.height) {
|
||||
g_message("w %d h %d w %d h %d",
|
||||
app->w, e->xconfigure.width,
|
||||
app->h, e->xconfigure.height);
|
||||
app->w = e->xconfigure.width;
|
||||
app->h = e->xconfigure.height;
|
||||
slit_configure();
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case MapNotify:
|
||||
g_message("MapNotify on 0x%lx", e->xmap.window);
|
||||
|
||||
win = find_client(e->xmap.window);
|
||||
if (!win) return;
|
||||
|
||||
for (i = 0; i < nslits; ++i)
|
||||
if (win == slit[i].frame)
|
||||
return;
|
||||
|
||||
slit_add_app(win);
|
||||
break;
|
||||
case UnmapNotify:
|
||||
g_message("UnmapNotify on 0x%lx", e->xunmap.window);
|
||||
for (i = 0; i < nslits; ++i) {
|
||||
GList *it;
|
||||
|
||||
for (it = slit[i].slit_apps; it; it = it->next) {
|
||||
struct SlitApp *app = it->data;
|
||||
if (e->xunmap.window == app->icon_win) {
|
||||
gboolean r;
|
||||
XEvent e;
|
||||
|
||||
r = !XCheckTypedWindowEvent(ob_display, app->icon_win,
|
||||
DestroyNotify, &e);
|
||||
if (r) {
|
||||
if (XCheckTypedWindowEvent(ob_display, app->icon_win,
|
||||
ReparentNotify, &e)) {
|
||||
XPutBackEvent(ob_display, &e);
|
||||
r = FALSE;
|
||||
}
|
||||
}
|
||||
slit_remove_app(&slit[i], app, r);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case ReparentNotify:
|
||||
g_message("ReparentNotify on 0x%lx", e->xdestroywindow.window);
|
||||
for (i = 0; i < nslits; ++i) {
|
||||
GList *it;
|
||||
|
||||
for (it = slit[i].slit_apps; it; it = it->next) {
|
||||
struct SlitApp *app = it->data;
|
||||
if (e->xdestroywindow.window == app->icon_win) {
|
||||
slit_remove_app(&slit[i], app, FALSE);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
case DestroyNotify:
|
||||
g_message("DestroyNotify on 0x%lx", e->xdestroywindow.window);
|
||||
for (i = 0; i < nslits; ++i) {
|
||||
GList *it;
|
||||
|
||||
for (it = slit[i].slit_apps; it; it = it->next) {
|
||||
struct SlitApp *app = it->data;
|
||||
if (e->xdestroywindow.window == app->icon_win) {
|
||||
slit_remove_app(&slit[i], app, FALSE);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void slit_add_existing()
|
||||
{
|
||||
unsigned int i, nchild;
|
||||
int j;
|
||||
Window w, *children;
|
||||
XWindowAttributes attrib;
|
||||
|
||||
XQueryTree(ob_display, ob_root, &w, &w, &children, &nchild);
|
||||
|
||||
for (i = 0; i < nchild; ++i) {
|
||||
for (j = 0; j < nslits; ++j)
|
||||
if (children[i] == slit[j].frame)
|
||||
continue;
|
||||
if (children[i] == None)
|
||||
continue;
|
||||
if ((children[i] = find_client(children[i])) == None)
|
||||
continue;
|
||||
if (XGetWindowAttributes(ob_display, children[i], &attrib)) {
|
||||
if (attrib.override_redirect) continue;
|
||||
|
||||
slit_add_app(children[i]);
|
||||
}
|
||||
}
|
||||
XFree(children);
|
||||
}
|
||||
|
||||
void slit_add_app(Window win)
|
||||
{
|
||||
int i;
|
||||
XWMHints *h;
|
||||
XWindowAttributes attrib;
|
||||
struct Slit *s;
|
||||
|
||||
s = &slit[0];
|
||||
|
||||
if ((h = XGetWMHints(ob_display, win))) {
|
||||
if (h->flags & StateHint && h->initial_state == WithdrawnState) {
|
||||
struct SlitApp *app = g_new(struct SlitApp, 1);
|
||||
|
||||
app->win = win;
|
||||
app->icon_win = (h->flags & IconWindowHint) ?
|
||||
h->icon_window : win;
|
||||
|
||||
XFree(h);
|
||||
|
||||
for (i = 0; i < nslits; ++i) {
|
||||
GList *it;
|
||||
for (it = slit[i].slit_apps; it; it = it->next)
|
||||
if (app->icon_win ==
|
||||
((struct SlitApp*)it->data)->icon_win)
|
||||
/* already managed! */
|
||||
return;
|
||||
}
|
||||
|
||||
if (XGetWindowAttributes(ob_display, app->icon_win, &attrib)) {
|
||||
app->w = attrib.width;
|
||||
app->h = attrib.height;
|
||||
} else {
|
||||
g_free(app);
|
||||
app = NULL;
|
||||
}
|
||||
|
||||
if (app) {
|
||||
s->slit_apps = g_list_append(s->slit_apps, app);
|
||||
slit_configure();
|
||||
XReparentWindow(ob_display, app->icon_win,
|
||||
s->frame, app->x, app->y);
|
||||
/* if (app->win != app->icon_win)
|
||||
XUnmapWindow(ob_display, app->win);*/
|
||||
XSync(ob_display, False);
|
||||
XSelectInput(ob_display, app->icon_win,
|
||||
SLITAPP_EVENT_MASK);
|
||||
}
|
||||
g_message("Managed: 0x%lx", app->icon_win);
|
||||
} else
|
||||
XFree(h);
|
||||
}
|
||||
}
|
||||
|
||||
void slit_remove_app(struct Slit *slit, struct SlitApp *app, gboolean reparent)
|
||||
{
|
||||
|
||||
XSelectInput(ob_display, app->icon_win, NoEventMask);
|
||||
XSync(ob_display, False);
|
||||
if (reparent) {
|
||||
g_message("reparenting");
|
||||
/* if (app->win != app->icon_win)
|
||||
XMapWindow(ob_display, app->win);*/
|
||||
XReparentWindow(ob_display, app->icon_win, ob_root, 0, 0);
|
||||
}
|
||||
|
||||
g_free(app);
|
||||
slit->slit_apps = g_list_remove(slit->slit_apps, app);
|
||||
slit_configure();
|
||||
}
|
||||
|
||||
void slit_read_theme()
|
||||
{
|
||||
XTextProperty prop;
|
||||
int i;
|
||||
char *theme = NULL;
|
||||
|
||||
if (XGetTextProperty(ob_display, ob_root, &prop,
|
||||
XInternAtom(ob_display, "_OPENBOX_THEME", False))) {
|
||||
theme = theme_load((char*)prop.value);
|
||||
XFree(prop.value);
|
||||
} else
|
||||
theme = theme_load(NULL);
|
||||
|
||||
g_free(theme);
|
||||
if (!theme) exit(EXIT_FAILURE);
|
||||
|
||||
for (i = 0; i < nslits; ++i) {
|
||||
appearance_free(slit[i].a_frame);
|
||||
appearance_free(slit[i].a_title);
|
||||
|
||||
slit[i].a_frame = appearance_copy(theme_a_unfocused_title);
|
||||
slit[i].a_title = appearance_copy(theme_a_unfocused_title);
|
||||
|
||||
XSetWindowBorder(ob_display, slit[i].frame, theme_b_color->pixel);
|
||||
XSetWindowBorderWidth(ob_display, slit[i].frame, theme_bwidth);
|
||||
XSetWindowBorder(ob_display, slit[i].frame, BlackPixel(ob_display, ob_screen));
|
||||
XSetWindowBorderWidth(ob_display, slit[i].frame, 30);
|
||||
}
|
||||
|
||||
slit_configure();
|
||||
}
|
||||
|
||||
void slit_configure()
|
||||
{
|
||||
int i;
|
||||
int titleh;
|
||||
GList *it;
|
||||
int spot;
|
||||
|
||||
titleh = 4;
|
||||
|
||||
for (i = 0; i < nslits; ++i) {
|
||||
if (slit[i].horz) {
|
||||
slit[i].w = titleh;
|
||||
slit[i].h = 0;
|
||||
} else {
|
||||
slit[i].w = 0;
|
||||
slit[i].h = titleh;
|
||||
}
|
||||
spot = titleh;
|
||||
|
||||
for (it = slit[i].slit_apps; it; it = it->next) {
|
||||
struct SlitApp *app = it->data;
|
||||
if (slit[i].horz) {
|
||||
g_message("%d", spot);
|
||||
app->x = spot;
|
||||
app->y = 0;
|
||||
slit[i].w += app->w;
|
||||
slit[i].h = MAX(slit[i].h, app->h);
|
||||
spot += app->w;
|
||||
} else {
|
||||
app->x = 0;
|
||||
app->y = spot;
|
||||
slit[i].w = MAX(slit[i].h, app->w);
|
||||
slit[i].h += app->h;
|
||||
spot += app->h;
|
||||
}
|
||||
|
||||
XMoveWindow(ob_display, app->icon_win, app->x, app->y);
|
||||
}
|
||||
|
||||
/* calculate position */
|
||||
slit[i].x = slit[i].user_x;
|
||||
slit[i].y = slit[i].user_y;
|
||||
|
||||
switch(slit[i].gravity) {
|
||||
case NorthGravity:
|
||||
case CenterGravity:
|
||||
case SouthGravity:
|
||||
slit[i].x -= slit[i].w / 2;
|
||||
break;
|
||||
case NorthEastGravity:
|
||||
case EastGravity:
|
||||
case SouthEastGravity:
|
||||
slit[i].x -= slit[i].w;
|
||||
break;
|
||||
}
|
||||
switch(slit[i].gravity) {
|
||||
case WestGravity:
|
||||
case CenterGravity:
|
||||
case EastGravity:
|
||||
slit[i].y -= slit[i].h / 2;
|
||||
break;
|
||||
case SouthWestGravity:
|
||||
case SouthGravity:
|
||||
case SouthEastGravity:
|
||||
slit[i].y -= slit[i].h;
|
||||
break;
|
||||
}
|
||||
|
||||
if (slit[i].w > 0 && slit[i].h > 0) {
|
||||
RECT_SET(slit[i].a_frame->area, 0, 0, slit[i].w, slit[i].h);
|
||||
XMoveResizeWindow(ob_display, slit[i].frame,
|
||||
slit[i].x - theme_bwidth,
|
||||
slit[i].y - theme_bwidth,
|
||||
slit[i].w, slit[i].h);
|
||||
|
||||
if (slit[i].horz) {
|
||||
RECT_SET(slit[i].a_title->area, 0, 0, titleh, slit[i].h);
|
||||
XMoveResizeWindow(ob_display, slit[i].title, 0, 0,
|
||||
titleh, slit[i].h);
|
||||
} else {
|
||||
RECT_SET(slit[i].a_title->area, 0, 0, slit[i].w, titleh);
|
||||
XMoveResizeWindow(ob_display, slit[i].title, 0, 0,
|
||||
slit[i].w, titleh);
|
||||
}
|
||||
|
||||
paint(slit[i].frame, slit[i].a_frame);
|
||||
paint(slit[i].title, slit[i].a_title);
|
||||
XMapWindow(ob_display, slit[i].frame);
|
||||
} else
|
||||
XUnmapWindow(ob_display, slit[i].frame);
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue