wmii/cmd/wm/page.c

173 lines
3.5 KiB
C
Raw Normal View History

2005-11-18 18:54:58 +03:00
/*
* (C)opyright MMIV-MMV Anselm R. Garbe <garbeam at gmail dot com>
* See LICENSE file for license details.
*/
#include <assert.h>
#include <stdlib.h>
#include <string.h>
#include "wm.h"
static void handle_after_write_page(IXPServer *s, File *file);
2005-11-18 18:54:58 +03:00
static void toggle_area(void *obj, char *arg);
2005-12-12 19:04:40 +03:00
/* action table for /?/ namespace */
2005-12-05 01:45:59 +03:00
Action page_acttbl[] = {
{"toggle", toggle_area},
2005-11-18 18:54:58 +03:00
{0, 0}
};
2005-12-05 22:38:03 +03:00
Page *alloc_page()
2005-11-18 18:54:58 +03:00
{
Page *p, *new = cext_emallocz(sizeof(Page));
char buf[MAX_BUF], buf2[16];
snprintf(buf2, sizeof(buf2), "%d", npages);
snprintf(buf, sizeof(buf), "/%d", npages);
new->file[P_PREFIX] = ixp_create(ixps, buf);
snprintf(buf, sizeof(buf), "/%d/name", npages);
new->file[P_NAME] = wmii_create_ixpfile(ixps, buf, buf2);
snprintf(buf, sizeof(buf), "/%d/layout/", npages);
new->file[P_AREA_PREFIX] = ixp_create(ixps, buf);
snprintf(buf, sizeof(buf), "/%d/layout/sel", npages);
new->file[P_SEL_AREA] = ixp_create(ixps, buf);
new->file[P_SEL_AREA]->bind = 1; /* mount point */
snprintf(buf, sizeof(buf), "/%d/ctl", npages);
new->file[P_CTL] = ixp_create(ixps, buf);
new->file[P_CTL]->after_write = handle_after_write_page;
new->floating = alloc_area(new, "float");
new->sel = new->managed = alloc_area(new, def[WM_LAYOUT]->content);
for (p = pages; p && p->next; p = p->next);
if (!p)
pages = new;
else {
new->prev = p;
p->next = new;
}
selpage = new;
def[WM_SEL_PAGE]->content = new->file[P_PREFIX]->content;
2005-12-09 01:48:32 +03:00
invoke_wm_event(def[WM_EVENT_PAGE_UPDATE]);
2005-12-17 16:59:25 +03:00
npages++;
return new;
2005-11-18 18:54:58 +03:00
}
void destroy_page(Page *p)
{
destroy_area(p->floating);
destroy_area(p->managed);
2005-12-05 04:50:02 +03:00
def[WM_SEL_PAGE]->content = 0;
2005-12-05 22:38:03 +03:00
ixp_remove_file(ixps, p->file[P_PREFIX]);
if (p == selpage) {
if (p->prev)
selpage = p->prev;
else
selpage = nil;
}
if (p == pages) {
if (p->next)
p->next->prev = nil;
pages = p->next;
}
else {
p->prev->next = p->next;
if (p->next)
p->next->prev = p->prev;
}
2005-11-18 18:54:58 +03:00
free(p);
if (!selpage)
selpage = pages;
2005-12-17 16:59:25 +03:00
npages--;
if (selpage)
focus_page(selpage);
2005-11-18 18:54:58 +03:00
}
void focus_page(Page *p)
{
if (selpage != p)
hide_page(selpage);
selpage = p;
show_page(p);
def[WM_SEL_PAGE]->content = p->file[P_PREFIX]->content;
2005-12-05 22:38:03 +03:00
invoke_wm_event(def[WM_EVENT_PAGE_UPDATE]);
focus_area(sel_area());
}
2005-12-05 01:45:59 +03:00
XRectangle *rectangles(unsigned int *num)
2005-11-18 18:54:58 +03:00
{
2005-12-05 01:45:59 +03:00
XRectangle *result = 0;
int i, j = 0;
Window d1, d2;
Window *wins;
2005-11-18 18:54:58 +03:00
XWindowAttributes wa;
2005-12-05 01:45:59 +03:00
XRectangle r;
2005-11-18 18:54:58 +03:00
if (XQueryTree(dpy, root, &d1, &d2, &wins, num)) {
result = cext_emallocz(*num * sizeof(XRectangle));
2005-11-18 18:54:58 +03:00
for (i = 0; i < *num; i++) {
if (!XGetWindowAttributes(dpy, wins[i], &wa))
continue;
if (wa.override_redirect && (wa.map_state == IsViewable)) {
r.x = wa.x;
r.y = wa.y;
r.width = wa.width;
r.height = wa.height;
result[j++] = r;
}
}
}
if (wins) {
XFree(wins);
}
*num = j;
return result;
}
void hide_page(Page *p)
2005-11-18 18:54:58 +03:00
{
hide_area(p->managed);
hide_area(p->floating);
}
2005-11-18 18:54:58 +03:00
void show_page(Page *p)
{
show_area(p->managed, False);
show_area(p->floating, False);
2005-11-18 18:54:58 +03:00
}
static void handle_after_write_page(IXPServer *s, File *file)
2005-11-18 18:54:58 +03:00
{
Page *p;
for (p = pages; p; p = p->next) {
if (file == p->file[P_CTL]) {
run_action(file, p, page_acttbl);
return;
}
2005-11-18 18:54:58 +03:00
}
}
static void toggle_area(void *obj, char *arg)
2005-11-18 18:54:58 +03:00
{
Page *p = obj;
if (p->sel == p->managed)
p->sel = p->floating;
else
p->sel = p->managed;
2005-12-16 19:18:00 +03:00
focus_area(p->sel);
invoke_wm_event(def[WM_EVENT_PAGE_UPDATE]);
}
2005-12-12 19:04:40 +03:00
2005-12-16 19:18:00 +03:00
Page *pageat(unsigned int idx)
2005-12-12 19:04:40 +03:00
{
unsigned int i = 0;
2005-12-17 16:59:25 +03:00
Page *p;
for (p = pages; p && i != idx; p = p->next);
return p;
2005-12-12 19:04:40 +03:00
}