Compare commits
103 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6d1bd844f7 | ||
|
|
1d9bb77d83 | ||
|
|
d24e5e911f | ||
|
|
07db3fafbd | ||
|
|
d38e7598a4 | ||
|
|
add85a7509 | ||
|
|
f9157a4dda | ||
|
|
f8115d686d | ||
|
|
236b86ff0a | ||
|
|
46608a14be | ||
|
|
0e8ffff152 | ||
|
|
52dba6418e | ||
|
|
e6b26eafc2 | ||
|
|
a635e7c2d6 | ||
|
|
5271222e38 | ||
|
|
7119d3cc25 | ||
|
|
c81312feff | ||
|
|
fe22703fea | ||
|
|
2da44ff4d8 | ||
|
|
892b705f95 | ||
|
|
feadae05c8 | ||
|
|
ba841c74b3 | ||
|
|
129a21bada | ||
|
|
dd3d490c39 | ||
|
|
f8a3cc0e0e | ||
|
|
de672fc7ad | ||
|
|
06d014722f | ||
|
|
5ccc31f7ec | ||
|
|
37d6d105d8 | ||
|
|
3e2d4a6a01 | ||
|
|
eb16ebfb7f | ||
|
|
d0d62c798b | ||
|
|
0f25f75f0d | ||
|
|
8c0e37cb38 | ||
|
|
3811d61858 | ||
|
|
84f6aa31d0 | ||
|
|
5875af2949 | ||
|
|
49b9a08fab | ||
|
|
c7824780fa | ||
|
|
b472a08490 | ||
|
|
55e74cd849 | ||
|
|
8e3e10f041 | ||
|
|
d5e1f1da78 | ||
|
|
aca9e78491 | ||
|
|
18b702c112 | ||
|
|
7f7bbd1f09 | ||
|
|
d6c2902d77 | ||
|
|
c8bb465bb0 | ||
|
|
891760bfac | ||
|
|
657dc33d63 | ||
|
|
5363a7a8a9 | ||
|
|
3274e3f4ad | ||
|
|
fb905b55c5 | ||
|
|
41bf8e2052 | ||
|
|
5c5e137fdd | ||
|
|
9f7f4c40e4 | ||
|
|
8975e04777 | ||
|
|
d37dc481a1 | ||
|
|
77d95275f0 | ||
|
|
81e6a63c1f | ||
|
|
0d9f8d887d | ||
|
|
9a38a64ced | ||
|
|
b4705bbaa7 | ||
|
|
005f06c15e | ||
|
|
761afe51a0 | ||
|
|
9b33623d33 | ||
|
|
6f2d6385ac | ||
|
|
a713e34b87 | ||
|
|
db90cf65c9 | ||
|
|
1ddc714196 | ||
|
|
611a5fc38d | ||
|
|
b0b74b46eb | ||
|
|
b31d54b7e6 | ||
|
|
7908d3075c | ||
|
|
cf652aab50 | ||
|
|
914b9f11c9 | ||
|
|
dcb48cc2c5 | ||
|
|
9c693212bb | ||
|
|
d525e3ace1 | ||
|
|
0bed70e52c | ||
|
|
61858bbe64 | ||
|
|
f6486d803c | ||
|
|
8b16176edc | ||
|
|
4138894db1 | ||
|
|
8a45d219bd | ||
|
|
b4c326ebaf | ||
|
|
c5c307deea | ||
|
|
590acffb62 | ||
|
|
a0258c13d0 | ||
|
|
466ebca9ea | ||
|
|
fbb36877dc | ||
|
|
ffaa243644 | ||
|
|
87a41561e7 | ||
|
|
5c439c245c | ||
|
|
e920b99951 | ||
|
|
22b405cba8 | ||
|
|
6f82c73409 | ||
|
|
b38db34de5 | ||
|
|
8c24370a9f | ||
|
|
fb8daed2b5 | ||
|
|
ee13255297 | ||
|
|
9c154fd0f3 | ||
|
|
b5dd942fd1 |
@@ -24,8 +24,7 @@ project(${PROJECT_NAME} C)
|
|||||||
|
|
||||||
# Definition of the wmfs source
|
# Definition of the wmfs source
|
||||||
set(wmfs_src
|
set(wmfs_src
|
||||||
src/confparse/util.c
|
src/parse/parse.c
|
||||||
src/confparse/confparse.c
|
|
||||||
src/barwin.c
|
src/barwin.c
|
||||||
src/client.c
|
src/client.c
|
||||||
src/config.c
|
src/config.c
|
||||||
@@ -52,11 +51,10 @@ set(wmfs_src
|
|||||||
add_executable(wmfs ${wmfs_src})
|
add_executable(wmfs ${wmfs_src})
|
||||||
|
|
||||||
# Set the version
|
# Set the version
|
||||||
set(VERSION "WMFS-201003")
|
set(VERSION "WMFS-201004")
|
||||||
|
|
||||||
# FLAGS
|
# FLAGS
|
||||||
set(CFLAGS "-Wall -ansi")
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -ansi")
|
||||||
set(CMAKE_C_FLAGS ${CFLAGS})
|
|
||||||
|
|
||||||
# Linker FLAGS
|
# Linker FLAGS
|
||||||
|
|
||||||
@@ -139,7 +137,7 @@ target_link_libraries(wmfs ${LIBRARIES_TO_LINK})
|
|||||||
|
|
||||||
# Messages
|
# Messages
|
||||||
message("Project version: ${VERSION}")
|
message("Project version: ${VERSION}")
|
||||||
message("Using these CFLAGS: ${CFLAGS}")
|
message("Using these CFLAGS: ${CMAKE_C_FLAGS}")
|
||||||
message("Using these LDFLAGS: ${LDFLAGS}")
|
message("Using these LDFLAGS: ${LDFLAGS}")
|
||||||
message("Linking with theses libraries : ${LIBRARIES_TO_LINK}")
|
message("Linking with theses libraries : ${LIBRARIES_TO_LINK}")
|
||||||
|
|
||||||
@@ -228,7 +226,7 @@ endif()
|
|||||||
set(WMFS_VERSION ${VERSION})
|
set(WMFS_VERSION ${VERSION})
|
||||||
set(WMFS_COMPILE_MACHINE ${CMAKE_SYSTEM_PROCESSOR})
|
set(WMFS_COMPILE_MACHINE ${CMAKE_SYSTEM_PROCESSOR})
|
||||||
set(WMFS_COMPILE_BY $ENV{USER})
|
set(WMFS_COMPILE_BY $ENV{USER})
|
||||||
set(WMFS_COMPILE_FLAGS ${CFLAGS})
|
set(WMFS_COMPILE_FLAGS ${CMAKE_C_FLAGS})
|
||||||
set(WMFS_LINKED_LIBS ${LIBRARIES_TO_LINK})
|
set(WMFS_LINKED_LIBS ${LIBRARIES_TO_LINK})
|
||||||
set(WMFS_SYSCONFDIR ${XDG_CONFIG_DIR}/${PROJECT_NAME})
|
set(WMFS_SYSCONFDIR ${XDG_CONFIG_DIR}/${PROJECT_NAME})
|
||||||
set(WMFS_SOURCE_DIR ${SOURCE_DIR})
|
set(WMFS_SOURCE_DIR ${SOURCE_DIR})
|
||||||
|
|||||||
3
README
3
README
@@ -13,6 +13,7 @@ REQUIREMENT :
|
|||||||
- freetype2
|
- freetype2
|
||||||
- libxinerama (optional)
|
- libxinerama (optional)
|
||||||
- libxrandr (optional)
|
- libxrandr (optional)
|
||||||
|
- imlib2 (optional)
|
||||||
- libxft
|
- libxft
|
||||||
- libx11
|
- libx11
|
||||||
- CMake >= 2.6
|
- CMake >= 2.6
|
||||||
@@ -33,4 +34,4 @@ If you have doxygen installed you can generate doxygen documentation via custom
|
|||||||
|
|
||||||
DISTROS :
|
DISTROS :
|
||||||
- wmfs port for FreeBSD at x11-wm/wmfs
|
- wmfs port for FreeBSD at x11-wm/wmfs
|
||||||
- wmfs is available with AUR in ArchLinux
|
- wmfs is available with AUR in ArchLinux (wmfs or wmfs-git)
|
||||||
|
|||||||
12
src/barwin.c
12
src/barwin.c
@@ -67,6 +67,7 @@ barwin_create(Window parent,
|
|||||||
|ButtonMask|MouseMask
|
|ButtonMask|MouseMask
|
||||||
|ExposureMask|VisibilityChangeMask
|
|ExposureMask|VisibilityChangeMask
|
||||||
|StructureNotifyMask|SubstructureRedirectMask;
|
|StructureNotifyMask|SubstructureRedirectMask;
|
||||||
|
|
||||||
if(entermask)
|
if(entermask)
|
||||||
at.event_mask |= EnterWindowMask|LeaveWindowMask|FocusChangeMask;
|
at.event_mask |= EnterWindowMask|LeaveWindowMask|FocusChangeMask;
|
||||||
|
|
||||||
@@ -217,12 +218,10 @@ barwin_unmap_subwin(BarWindow *bw)
|
|||||||
void
|
void
|
||||||
barwin_move(BarWindow *bw, int x, int y)
|
barwin_move(BarWindow *bw, int x, int y)
|
||||||
{
|
{
|
||||||
CHECK(bw);
|
if(!bw || (bw->geo.x == x && bw->geo.y == y))
|
||||||
|
return;
|
||||||
|
|
||||||
bw->geo.x = x;
|
XMoveWindow(dpy, bw->win, (bw->geo.x = x), (bw->geo.y = y));
|
||||||
bw->geo.y = y;
|
|
||||||
|
|
||||||
XMoveWindow(dpy, bw->win, x, y);
|
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -235,7 +234,8 @@ barwin_move(BarWindow *bw, int x, int y)
|
|||||||
void
|
void
|
||||||
barwin_resize(BarWindow *bw, uint w, uint h)
|
barwin_resize(BarWindow *bw, uint w, uint h)
|
||||||
{
|
{
|
||||||
CHECK(bw);
|
if(!bw || (bw->geo.width == w && bw->geo.height == h))
|
||||||
|
return;
|
||||||
|
|
||||||
bw->geo.width = w;
|
bw->geo.width = w;
|
||||||
bw->geo.height = h;
|
bw->geo.height = h;
|
||||||
|
|||||||
154
src/client.c
154
src/client.c
@@ -40,6 +40,7 @@ client_attach(Client *c)
|
|||||||
{
|
{
|
||||||
if(clients)
|
if(clients)
|
||||||
clients->prev = c;
|
clients->prev = c;
|
||||||
|
|
||||||
c->next = clients;
|
c->next = clients;
|
||||||
clients = c;
|
clients = c;
|
||||||
|
|
||||||
@@ -96,7 +97,8 @@ client_get_next(void)
|
|||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
for(c = sel->next; c && ishide(c, selscreen); c = c->next);
|
for(c = sel->next; c && ishide(c, selscreen); c = c->next);
|
||||||
if(!c)
|
|
||||||
|
if(!c && conf.client_round)
|
||||||
for(c = clients; c && ishide(c, selscreen); c = c->next);
|
for(c = clients; c && ishide(c, selscreen); c = c->next);
|
||||||
|
|
||||||
return c;
|
return c;
|
||||||
@@ -117,7 +119,7 @@ client_get_prev(void)
|
|||||||
if(!ishide(d, selscreen))
|
if(!ishide(d, selscreen))
|
||||||
c = d;
|
c = d;
|
||||||
|
|
||||||
if(!c)
|
if(!c && conf.client_round)
|
||||||
for(; d; d = d->next)
|
for(; d; d = d->next)
|
||||||
if(!ishide(d, selscreen))
|
if(!ishide(d, selscreen))
|
||||||
c = d;
|
c = d;
|
||||||
@@ -242,7 +244,7 @@ client_focus(Client *c)
|
|||||||
sel->flags &= ~AboveFlag;
|
sel->flags &= ~AboveFlag;
|
||||||
|
|
||||||
frame_update(sel);
|
frame_update(sel);
|
||||||
mouse_grabbuttons(sel, False);
|
mouse_grabbuttons(sel, !conf.focus_pclick);
|
||||||
}
|
}
|
||||||
|
|
||||||
if((sel = c))
|
if((sel = c))
|
||||||
@@ -265,10 +267,16 @@ client_focus(Client *c)
|
|||||||
client_raise(c);
|
client_raise(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(tags[sel->screen][sel->tag].abovefc
|
if(tags[sel->screen][sel->tag].abovefc && !conf.focus_fmouse)
|
||||||
&& !conf.focus_fmouse)
|
|
||||||
client_above(sel);
|
client_above(sel);
|
||||||
|
|
||||||
|
if(c->flags & UrgentFlag)
|
||||||
|
{
|
||||||
|
c->flags &= ~UrgentFlag;
|
||||||
|
tags[c->screen][c->tag].urgent = False;
|
||||||
|
infobar_draw_taglist(c->screen);
|
||||||
|
}
|
||||||
|
|
||||||
XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime);
|
XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime);
|
||||||
|
|
||||||
if(conf.bars.selbar)
|
if(conf.bars.selbar)
|
||||||
@@ -284,7 +292,7 @@ client_focus(Client *c)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The following function have the same point :
|
/* The following functions have the same point :
|
||||||
* find a client member with a Window {{{
|
* find a client member with a Window {{{
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -380,6 +388,8 @@ client_get_name(Client *c)
|
|||||||
int rf;
|
int rf;
|
||||||
ulong ir, il;
|
ulong ir, il;
|
||||||
|
|
||||||
|
IFREE(c->title);
|
||||||
|
|
||||||
/* This one instead XFetchName for utf8 name support */
|
/* This one instead XFetchName for utf8 name support */
|
||||||
if(XGetWindowProperty(dpy, c->win, net_atom[net_wm_name], 0, 4096,
|
if(XGetWindowProperty(dpy, c->win, net_atom[net_wm_name], 0, 4096,
|
||||||
False, net_atom[utf8_string], &rt, &rf, &ir, &il, (uchar**)&c->title) != Success)
|
False, net_atom[utf8_string], &rt, &rf, &ir, &il, (uchar**)&c->title) != Success)
|
||||||
@@ -390,6 +400,7 @@ client_get_name(Client *c)
|
|||||||
if(!c->title)
|
if(!c->title)
|
||||||
{
|
{
|
||||||
XFetchName(dpy, c->win, &(c->title));
|
XFetchName(dpy, c->win, &(c->title));
|
||||||
|
|
||||||
if(!c->title)
|
if(!c->title)
|
||||||
c->title = _strdup("WMFS");
|
c->title = _strdup("WMFS");
|
||||||
}
|
}
|
||||||
@@ -424,7 +435,8 @@ client_hide(Client *c)
|
|||||||
Bool
|
Bool
|
||||||
ishide(Client *c, int screen)
|
ishide(Client *c, int screen)
|
||||||
{
|
{
|
||||||
if(c->tag == seltag[screen] && c->screen == screen)
|
if(((c->tag == seltag[screen] || c->tag == MAXTAG + 1) && c->screen == screen)
|
||||||
|
|| tags[screen][seltag[screen]].tagad & TagFlag(c->tag))
|
||||||
return False;
|
return False;
|
||||||
|
|
||||||
return True;
|
return True;
|
||||||
@@ -576,13 +588,21 @@ client_manage(Window w, XWindowAttributes *wa, Bool ar)
|
|||||||
frame_create(c);
|
frame_create(c);
|
||||||
client_size_hints(c);
|
client_size_hints(c);
|
||||||
XChangeWindowAttributes(dpy, c->win, CWEventMask, &at);
|
XChangeWindowAttributes(dpy, c->win, CWEventMask, &at);
|
||||||
XSetWindowBorderWidth(dpy, c->win, 0); /* client win sould _not_ have borders */
|
|
||||||
|
/* client win should _not_ have borders */
|
||||||
|
XSetWindowBorderWidth(dpy, c->win, 0);
|
||||||
mouse_grabbuttons(c, False);
|
mouse_grabbuttons(c, False);
|
||||||
|
|
||||||
|
/* Transient */
|
||||||
if((rettrans = XGetTransientForHint(dpy, w, &trans) == Success))
|
if((rettrans = XGetTransientForHint(dpy, w, &trans) == Success))
|
||||||
for(t = clients; t && t->win != trans; t = t->next);
|
for(t = clients; t && t->win != trans; t = t->next);
|
||||||
|
|
||||||
if(t)
|
if(t)
|
||||||
|
{
|
||||||
c->tag = t->tag;
|
c->tag = t->tag;
|
||||||
|
c->screen = t->screen;
|
||||||
|
}
|
||||||
|
|
||||||
if(!(c->flags & FreeFlag)
|
if(!(c->flags & FreeFlag)
|
||||||
&& (rettrans == Success || (c->flags & HintFlag)))
|
&& (rettrans == Success || (c->flags & HintFlag)))
|
||||||
c->flags |= FreeFlag;
|
c->flags |= FreeFlag;
|
||||||
@@ -680,7 +700,11 @@ client_moveresize(Client *c, XRectangle geo, Bool r)
|
|||||||
c->flags &= ~MaxFlag;
|
c->flags &= ~MaxFlag;
|
||||||
c->geo = c->ogeo = geo;
|
c->geo = c->ogeo = geo;
|
||||||
|
|
||||||
if((c->screen = screen_get_with_geo(c->geo.x, c->geo.y)) != os)
|
if(c->flags & FreeFlag || tags[c->screen][c->tag].layout.func == freelayout)
|
||||||
|
c->free_geo = geo;
|
||||||
|
|
||||||
|
if((c->screen = screen_get_with_geo(c->geo.x, c->geo.y)) != os
|
||||||
|
&& c->tag != MAXTAG + 1)
|
||||||
c->tag = seltag[c->screen];
|
c->tag = seltag[c->screen];
|
||||||
|
|
||||||
frame_moveresize(c, c->geo);
|
frame_moveresize(c, c->geo);
|
||||||
@@ -856,7 +880,10 @@ client_set_wanted_tag(Client *c)
|
|||||||
c->tag = j;
|
c->tag = j;
|
||||||
|
|
||||||
if(c->tag != seltag[selscreen])
|
if(c->tag != seltag[selscreen])
|
||||||
|
{
|
||||||
tags[c->screen][c->tag].request_update = True;
|
tags[c->screen][c->tag].request_update = True;
|
||||||
|
client_focus(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
tags[c->screen][c->tag].layout.func(c->screen);
|
tags[c->screen][c->tag].layout.func(c->screen);
|
||||||
}
|
}
|
||||||
@@ -879,7 +906,7 @@ client_update_attributes(Client *c)
|
|||||||
XChangeProperty(dpy, c->win, ATOM("_WMFS_SCREEN"), XA_CARDINAL, 32,
|
XChangeProperty(dpy, c->win, ATOM("_WMFS_SCREEN"), XA_CARDINAL, 32,
|
||||||
PropModeReplace, (uchar*)&(c->screen), 1);
|
PropModeReplace, (uchar*)&(c->screen), 1);
|
||||||
|
|
||||||
f = (c->flags & FreeFlag) ? True : False;
|
f = (c->flags & FreeFlag);
|
||||||
|
|
||||||
XChangeProperty(dpy, c->win, ATOM("_WMFS_ISFREE"), XA_CARDINAL, 32,
|
XChangeProperty(dpy, c->win, ATOM("_WMFS_ISFREE"), XA_CARDINAL, 32,
|
||||||
PropModeReplace, (uchar*)&f, 1);
|
PropModeReplace, (uchar*)&f, 1);
|
||||||
@@ -907,6 +934,8 @@ client_raise(Client *c)
|
|||||||
void
|
void
|
||||||
uicb_client_raise(uicb_t cmd)
|
uicb_client_raise(uicb_t cmd)
|
||||||
{
|
{
|
||||||
|
CHECK(sel);
|
||||||
|
|
||||||
client_raise(sel);
|
client_raise(sel);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
@@ -1148,4 +1177,109 @@ uicb_ignore_next_client_rules(uicb_t cmd)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Show clientlist menu
|
||||||
|
*\param cmd uicb_t type
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
uicb_clientlist(uicb_t cmd)
|
||||||
|
{
|
||||||
|
int i, d, u, x, y;
|
||||||
|
int n = 0;
|
||||||
|
Window w;
|
||||||
|
Client *c = NULL;
|
||||||
|
|
||||||
|
screen_get_sel();
|
||||||
|
|
||||||
|
for(c = clients; c; c = c->next)
|
||||||
|
if(!ishide(c, selscreen))
|
||||||
|
++n;
|
||||||
|
|
||||||
|
if(n > 0)
|
||||||
|
{
|
||||||
|
if(clientlist.nitem)
|
||||||
|
menu_clear(&clientlist);
|
||||||
|
|
||||||
|
menu_init(&clientlist, "clientlist", n,
|
||||||
|
/* Colors */
|
||||||
|
conf.colors.tagselbg,
|
||||||
|
conf.colors.tagselfg,
|
||||||
|
conf.colors.bar,
|
||||||
|
conf.colors.text);
|
||||||
|
|
||||||
|
for(i = 0, c = clients; c; c = c->next)
|
||||||
|
if(!ishide(c, selscreen))
|
||||||
|
{
|
||||||
|
sprintf(clist_index[i].key, "%d", i);
|
||||||
|
clist_index[i].client = c;
|
||||||
|
|
||||||
|
menu_new_item(&clientlist.item[i], c->title,
|
||||||
|
uicb_client_select, clist_index[i].key);
|
||||||
|
|
||||||
|
if(c == sel)
|
||||||
|
clientlist.item[i].check = name_to_func("check_clist", func_list);
|
||||||
|
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
clist_index[i].client = NULL;
|
||||||
|
|
||||||
|
XQueryPointer(dpy, ROOT, &w, &w, &x, &y, &d, &d, (uint *)&u);
|
||||||
|
menu_draw(clientlist, x, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Select client
|
||||||
|
*\param cmd uicb_t type clientlist index
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
uicb_client_select(uicb_t cmd)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
Window w;
|
||||||
|
int d, x, y;
|
||||||
|
|
||||||
|
|
||||||
|
for(i = 0; i < MAXCLIST && clist_index[i].client; ++i)
|
||||||
|
if(!strcmp(cmd, clist_index[i].key))
|
||||||
|
{
|
||||||
|
client_focus(clist_index[i].client);
|
||||||
|
client_raise(clist_index[i].client);
|
||||||
|
|
||||||
|
/* Move pointer on client */
|
||||||
|
XQueryPointer(dpy, ROOT, &w, &w, &x, &y, &d, &d, (uint *)&d);
|
||||||
|
XWarpPointer(dpy, ROOT, ROOT, x, y, d, d,
|
||||||
|
clist_index[i].client->geo.x + clist_index[i].client->geo.width / 2,
|
||||||
|
clist_index[i].client->geo.y + clist_index[i].client->geo.height / 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Check clientlist menu fake function
|
||||||
|
* \param cmd uicb_t type unused
|
||||||
|
*/
|
||||||
|
Bool
|
||||||
|
uicb_checkclist(uicb_t cmd)
|
||||||
|
{
|
||||||
|
return True;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Set selected client on all tag (ignore tags
|
||||||
|
*\para cmd uicb_t type unused
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
uicb_client_ignore_tag(uicb_t cmd)
|
||||||
|
{
|
||||||
|
CHECK(sel);
|
||||||
|
|
||||||
|
screen_get_sel();
|
||||||
|
|
||||||
|
sel->tag = ((sel->tag == MAXTAG + 1) ? seltag[selscreen] : MAXTAG + 1);
|
||||||
|
|
||||||
|
arrange(sel->screen, True);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
540
src/config.c
540
src/config.c
@@ -32,9 +32,6 @@
|
|||||||
|
|
||||||
#include "wmfs.h"
|
#include "wmfs.h"
|
||||||
|
|
||||||
/* local function definition */
|
|
||||||
static void conf_section(void (*)(char*), char *, char *);
|
|
||||||
|
|
||||||
func_name_list_t tmp_func_list[] =
|
func_name_list_t tmp_func_list[] =
|
||||||
{
|
{
|
||||||
{"spawn", uicb_spawn },
|
{"spawn", uicb_spawn },
|
||||||
@@ -47,16 +44,26 @@ func_name_list_t tmp_func_list[] =
|
|||||||
{"client_screen_prev", uicb_client_screen_prev },
|
{"client_screen_prev", uicb_client_screen_prev },
|
||||||
{"client_move", uicb_client_move },
|
{"client_move", uicb_client_move },
|
||||||
{"client_resize", uicb_client_resize },
|
{"client_resize", uicb_client_resize },
|
||||||
|
{"client_ignore_tag", uicb_client_ignore_tag },
|
||||||
{"toggle_max", uicb_togglemax },
|
{"toggle_max", uicb_togglemax },
|
||||||
{"layout_next", uicb_layout_next },
|
{"layout_next", uicb_layout_next },
|
||||||
{"layout_prev", uicb_layout_prev },
|
{"layout_prev", uicb_layout_prev },
|
||||||
{"tag", uicb_tag },
|
{"tag", uicb_tag },
|
||||||
{"tag_next", uicb_tag_next },
|
{"tag_next", uicb_tag_next },
|
||||||
{"tag_prev", uicb_tag_prev },
|
{"tag_prev", uicb_tag_prev },
|
||||||
|
{"tag_next_visible", uicb_tag_next_visible },
|
||||||
|
{"tag_prev_visible", uicb_tag_prev_visible },
|
||||||
{"tag_prev_sel", uicb_tag_prev_sel },
|
{"tag_prev_sel", uicb_tag_prev_sel },
|
||||||
{"tag_transfert", uicb_tagtransfert },
|
{"tag_transfert", uicb_tagtransfert },
|
||||||
{"tag_transfert_next", uicb_tagtransfert_next },
|
{"tag_transfert_next", uicb_tagtransfert_next },
|
||||||
{"tag_transfert_prev", uicb_tagtransfert_prev },
|
{"tag_transfert_prev", uicb_tagtransfert_prev },
|
||||||
|
{"tag_urgent", uicb_tag_urgent },
|
||||||
|
{"tag_toggle_additional", uicb_tag_toggle_additional },
|
||||||
|
{"tag_swap", uicb_tag_swap },
|
||||||
|
{"tag_swap_next", uicb_tag_swap_next },
|
||||||
|
{"tag_swap_prev", uicb_tag_swap_previous },
|
||||||
|
{"tag_new", uicb_tag_new },
|
||||||
|
{"tag_del", uicb_tag_del },
|
||||||
{"set_mwfact", uicb_set_mwfact },
|
{"set_mwfact", uicb_set_mwfact },
|
||||||
{"set_nmaster", uicb_set_nmaster },
|
{"set_nmaster", uicb_set_nmaster },
|
||||||
{"quit", uicb_quit },
|
{"quit", uicb_quit },
|
||||||
@@ -77,7 +84,13 @@ func_name_list_t tmp_func_list[] =
|
|||||||
{"menu", uicb_menu },
|
{"menu", uicb_menu },
|
||||||
{"set_client_layer", uicb_set_client_layer },
|
{"set_client_layer", uicb_set_client_layer },
|
||||||
{"set_layer", uicb_set_layer },
|
{"set_layer", uicb_set_layer },
|
||||||
{"ignore_next_client_rules", uicb_ignore_next_client_rules }
|
{"ignore_next_client_rules", uicb_ignore_next_client_rules },
|
||||||
|
{"check_max", uicb_checkmax },
|
||||||
|
{"check_free", uicb_checkfree },
|
||||||
|
{"check_layout", uicb_checklayout },
|
||||||
|
{"clientlist", uicb_clientlist },
|
||||||
|
{"check_clist", uicb_checkclist },
|
||||||
|
{"toggle_tagautohide", uicb_toggle_tagautohide }
|
||||||
};
|
};
|
||||||
|
|
||||||
key_name_list_t key_list[] =
|
key_name_list_t key_list[] =
|
||||||
@@ -90,6 +103,7 @@ key_name_list_t key_list[] =
|
|||||||
{"Mod3", Mod3Mask },
|
{"Mod3", Mod3Mask },
|
||||||
{"Mod4", Mod4Mask },
|
{"Mod4", Mod4Mask },
|
||||||
{"Super", Mod4Mask },
|
{"Super", Mod4Mask },
|
||||||
|
{"Home", Mod4Mask },
|
||||||
{"Mod5", Mod5Mask },
|
{"Mod5", Mod5Mask },
|
||||||
{NULL, NoSymbol }
|
{NULL, NoSymbol }
|
||||||
};
|
};
|
||||||
@@ -109,43 +123,38 @@ name_to_uint_t mouse_button_list[] =
|
|||||||
};
|
};
|
||||||
|
|
||||||
void
|
void
|
||||||
mouse_section(MouseBinding mb[], char *src, int ns)
|
mouse_section(MouseBinding mb[], struct conf_sec **sec)
|
||||||
{
|
{
|
||||||
int i;
|
int n;
|
||||||
char *tmp;
|
|
||||||
|
|
||||||
for(i = 0; i < ns; ++i)
|
for (n = 0; sec[n]; n++)
|
||||||
{
|
{
|
||||||
tmp = get_nsec(src, "mouse", i);
|
mb[n].tag = fetch_opt_first(sec[n], "-1", "tag").num;
|
||||||
|
mb[n].screen = fetch_opt_first(sec[n], "-1", "screen").num;
|
||||||
cfg_set_sauv(tmp);
|
mb[n].button = char_to_button(fetch_opt_first(sec[n], "1", "button").str, mouse_button_list);
|
||||||
|
mb[n].func = name_to_func(fetch_opt_first(sec[n], "", "func").str, func_list);
|
||||||
mb[i].tag = get_opt(tmp, "-1", "tag").num;
|
mb[n].cmd = fetch_opt_first(sec[n], "", "cmd").str;
|
||||||
mb[i].screen = get_opt(tmp, "-1", "screen").num;
|
|
||||||
mb[i].button = char_to_button(get_opt(tmp, "1", "button").str, mouse_button_list);
|
|
||||||
mb[i].func = name_to_func(get_opt(tmp, "", "func").str, func_list);
|
|
||||||
mb[i].cmd = get_opt(tmp, "", "cmd").str;
|
|
||||||
|
|
||||||
cfg_set_sauv(src);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
conf_misc_section(char *src)
|
conf_misc_section(void)
|
||||||
{
|
{
|
||||||
int pad = 12;
|
int pad = 12;
|
||||||
|
struct conf_sec *sec;
|
||||||
|
|
||||||
cfg_set_sauv(src);
|
sec = fetch_section_first(NULL, "misc");
|
||||||
|
|
||||||
conf.font = get_opt(src, "sans-9", "font").str;
|
conf.font = fetch_opt_first(sec, "sans-9", "font").str;
|
||||||
conf.raisefocus = get_opt(src, "false", "raisefocus").bool;
|
conf.raisefocus = fetch_opt_first(sec, "false", "raisefocus").bool;
|
||||||
conf.raiseswitch = get_opt(src, "false", "raiseswitch").bool;
|
conf.raiseswitch = fetch_opt_first(sec, "false", "raiseswitch").bool;
|
||||||
conf.focus_fmouse = get_opt(src, "true", "focus_follow_mouse").bool;
|
conf.focus_fmouse = fetch_opt_first(sec, "true", "focus_follow_mouse").bool;
|
||||||
conf.status_timing = get_opt(src, "1", "status_timing").num;
|
conf.focus_pclick = fetch_opt_first(sec, "true", "focus_pointer_click").bool;
|
||||||
conf.status_path = get_opt(src, "", "status_path").str;
|
conf.status_timing = fetch_opt_first(sec, "1", "status_timing").num;
|
||||||
pad = get_opt(src, "12", "pad").num;
|
conf.status_path = fetch_opt_first(sec, "", "status_path").str;
|
||||||
|
conf.autostart_path = fetch_opt_first(sec, "", "autostart_path").str;
|
||||||
|
conf.autostart_command = fetch_opt_first(sec, "", "autostart_command").str;
|
||||||
|
pad = fetch_opt_first(sec, "12", "pad").num;
|
||||||
|
|
||||||
if(pad > 24 || pad < 1)
|
if(pad > 24 || pad < 1)
|
||||||
{
|
{
|
||||||
@@ -156,7 +165,7 @@ conf_misc_section(char *src)
|
|||||||
|
|
||||||
conf.pad = pad;
|
conf.pad = pad;
|
||||||
|
|
||||||
if(conf.status_timing <= 0)
|
if(conf.status_timing < 0)
|
||||||
{
|
{
|
||||||
warnx("configuration : status_timing value (%d) incorrect.", conf.status_timing);
|
warnx("configuration : status_timing value (%d) incorrect.", conf.status_timing);
|
||||||
conf.status_timing = 1;
|
conf.status_timing = 1;
|
||||||
@@ -166,154 +175,194 @@ conf_misc_section(char *src)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
conf_bar_section(char *src)
|
conf_bar_section(void)
|
||||||
{
|
{
|
||||||
cfg_set_sauv(src);
|
struct conf_sec *bar, **mouse, *selbar;
|
||||||
|
char *barbg;
|
||||||
|
|
||||||
conf.border.bar = get_opt(src, "false", "border").bool;
|
bar = fetch_section_first(NULL, "bar");
|
||||||
conf.bars.height = get_opt(src, "-1", "height").num;
|
|
||||||
conf.colors.bar = getcolor(get_opt(src, "#000000", "bg").str);
|
|
||||||
conf.colors.text = get_opt(src, "#ffffff", "fg").str;
|
|
||||||
conf.bars.selbar = get_opt(src, "false", "selbar").bool;
|
|
||||||
|
|
||||||
if((conf.bars.nmouse = get_size_sec(src, "mouse")))
|
conf.border.bar = fetch_opt_first(bar, "false", "border").bool;
|
||||||
|
conf.bars.height = fetch_opt_first(bar, "-1", "height").num;
|
||||||
|
conf.colors.bar = getcolor((barbg = fetch_opt_first(bar, "#000000", "bg").str));
|
||||||
|
conf.colors.text = fetch_opt_first(bar, "#ffffff", "fg").str;
|
||||||
|
|
||||||
|
mouse = fetch_section(bar, "mouse");
|
||||||
|
|
||||||
|
if ((conf.bars.nmouse = fetch_section_count(mouse)) > 0)
|
||||||
{
|
{
|
||||||
conf.bars.mouse = emalloc(conf.bars.nmouse, sizeof(MouseBinding));
|
conf.bars.mouse = emalloc(conf.bars.nmouse, sizeof(MouseBinding));
|
||||||
mouse_section(conf.bars.mouse, src, conf.bars.nmouse);
|
mouse_section(conf.bars.mouse, mouse);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
free(mouse);
|
||||||
|
|
||||||
|
selbar = fetch_section_first(bar, "selbar");
|
||||||
|
conf.bars.selbar = selbar ? True : False;
|
||||||
|
|
||||||
|
conf.selbar.bg = getcolor(fetch_opt_first(selbar, barbg, "bg").str);
|
||||||
|
conf.selbar.fg = fetch_opt_first(selbar, conf.colors.text, "fg").str;
|
||||||
|
conf.selbar.maxlenght = fetch_opt_first(selbar, "-1", "max_lenght").num;
|
||||||
|
|
||||||
|
mouse = fetch_section(selbar, "mouse");
|
||||||
|
|
||||||
|
if ((conf.selbar.nmouse = fetch_section_count(mouse)))
|
||||||
|
{
|
||||||
|
conf.selbar.mouse = emalloc(conf.selbar.nmouse, sizeof(MouseBinding));
|
||||||
|
mouse_section(conf.selbar.mouse, mouse);
|
||||||
|
}
|
||||||
|
|
||||||
|
free(mouse);
|
||||||
|
free(barbg);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
conf_root_section(char *src)
|
conf_root_section(void)
|
||||||
{
|
{
|
||||||
cfg_set_sauv(src);
|
struct conf_sec *root, **mouse;
|
||||||
|
|
||||||
conf.root.background_command = get_opt(src, "", "background_command").str;
|
root = fetch_section_first(NULL, "root");
|
||||||
|
|
||||||
if((conf.root.nmouse = get_size_sec(src, "mouse")))
|
conf.root.background_command = fetch_opt_first(root, "", "background_command").str;
|
||||||
|
|
||||||
|
mouse = fetch_section(root, "mouse");
|
||||||
|
|
||||||
|
if ((conf.root.nmouse = fetch_section_count(mouse)) > 0)
|
||||||
{
|
{
|
||||||
conf.root.mouse = emalloc(conf.root.nmouse, sizeof(MouseBinding));
|
conf.root.mouse = emalloc(conf.root.nmouse, sizeof(MouseBinding));
|
||||||
mouse_section(conf.root.mouse, src, conf.root.nmouse);
|
mouse_section(conf.root.mouse, mouse);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
free(mouse);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
conf_client_section(char *src)
|
conf_client_section(void)
|
||||||
{
|
{
|
||||||
int i, j, d;
|
int i, j;
|
||||||
char *tmp, *tmp2, *tmp3, *p;
|
char *flags, *p;
|
||||||
opt_type *buf;
|
struct conf_sec *sec, **mouse, *titlebar, **button, **line;
|
||||||
|
struct opt_type *opt;
|
||||||
|
|
||||||
/* Client misc */
|
sec = fetch_section_first(NULL, "client");
|
||||||
cfg_set_sauv(src);
|
|
||||||
|
|
||||||
conf.client.borderheight = (get_opt(src, "1", "border_height").num) ? get_opt(src, "1", "border_height").num : 1;
|
conf.client_round = fetch_opt_first(sec, "true", "client_round").bool;
|
||||||
conf.client.border_shadow = get_opt(src, "false", "border_shadow").bool;
|
|
||||||
conf.client.place_at_mouse = get_opt(src, "false", "place_at_mouse").bool;
|
|
||||||
conf.client.bordernormal = getcolor(get_opt(src, "#000000", "border_normal").str);
|
|
||||||
conf.client.borderfocus = getcolor(get_opt(src, "#ffffff", "border_focus").str);
|
|
||||||
conf.client.resizecorner_normal = getcolor(get_opt(src, "#222222", "resize_corner_normal").str);
|
|
||||||
conf.client.resizecorner_focus = getcolor(get_opt(src, "#DDDDDD", "resize_corner_focus").str);
|
|
||||||
conf.client.mod |= char_to_modkey(get_opt(src, "Alt", "modifier").str, key_list);
|
|
||||||
conf.client.set_new_win_master = get_opt(src, "true", "set_new_win_master").bool;
|
|
||||||
|
|
||||||
if((conf.client.nmouse = get_size_sec(src, "mouse")))
|
if ((conf.client.borderheight = fetch_opt_first(sec, "1", "border_height").num) < 1)
|
||||||
|
conf.client.borderheight = 1;
|
||||||
|
|
||||||
|
conf.client.border_shadow = fetch_opt_first(sec, "false", "border_shadow").bool;
|
||||||
|
conf.client.place_at_mouse = fetch_opt_first(sec, "false", "place_at_mouse").bool;
|
||||||
|
conf.client.bordernormal = getcolor(fetch_opt_first(sec, "#000000", "border_normal").str);
|
||||||
|
conf.client.borderfocus = getcolor(fetch_opt_first(sec, "#ffffff", "border_focus").str);
|
||||||
|
conf.client.resizecorner_normal = getcolor(fetch_opt_first(sec, "#222222", "resize_corner_normal").str);
|
||||||
|
conf.client.resizecorner_focus = getcolor(fetch_opt_first(sec, "#DDDDDD", "resize_corner_focus").str);
|
||||||
|
conf.client.mod |= char_to_modkey(fetch_opt_first(sec, "Alt", "modifier").str, key_list);
|
||||||
|
conf.client.set_new_win_master = fetch_opt_first(sec, "true", "set_new_win_master").bool;
|
||||||
|
|
||||||
|
mouse = fetch_section(sec, "mouse");
|
||||||
|
|
||||||
|
if((conf.client.nmouse = fetch_section_count(mouse)) > 0)
|
||||||
{
|
{
|
||||||
conf.client.mouse = emalloc(conf.client.nmouse, sizeof(MouseBinding));
|
conf.client.mouse = emalloc(conf.client.nmouse, sizeof(MouseBinding));
|
||||||
mouse_section(conf.client.mouse, src, conf.client.nmouse);
|
mouse_section(conf.client.mouse, mouse);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Titlebar part {{ */
|
free(mouse);
|
||||||
tmp = get_sec(src, "titlebar");
|
|
||||||
cfg_set_sauv(tmp);
|
|
||||||
|
|
||||||
conf.titlebar.height = get_opt(tmp, "0", "height").num;
|
titlebar = fetch_section_first(sec, "titlebar");
|
||||||
conf.titlebar.fg_normal = get_opt(tmp, "#ffffff", "fg_normal").str;
|
|
||||||
conf.titlebar.fg_focus = get_opt(tmp, "#000000", "fg_focus").str;
|
|
||||||
|
|
||||||
/* Stipple */
|
conf.titlebar.height = fetch_opt_first(titlebar, "0", "height").num;
|
||||||
conf.titlebar.stipple.active = get_opt(tmp, "false", "stipple").bool;
|
conf.titlebar.fg_normal = fetch_opt_first(titlebar, "#ffffff", "fg_normal").str;
|
||||||
|
conf.titlebar.fg_focus = fetch_opt_first(titlebar, "#000000", "fg_focus").str;
|
||||||
|
|
||||||
if(!strcmp((p = get_opt(tmp, "-1", "stipple_normal").str), "-1"))
|
conf.titlebar.stipple.active = fetch_opt_first(titlebar, "false", "stipple").bool;
|
||||||
|
|
||||||
|
if(!strcmp((p = fetch_opt_first(titlebar, "-1", "stipple_normal").str), "-1"))
|
||||||
conf.titlebar.stipple.colors.normal = getcolor(conf.titlebar.fg_normal);
|
conf.titlebar.stipple.colors.normal = getcolor(conf.titlebar.fg_normal);
|
||||||
else
|
else
|
||||||
conf.titlebar.stipple.colors.normal = getcolor(p);
|
conf.titlebar.stipple.colors.normal = getcolor(p);
|
||||||
|
|
||||||
if(!strcmp((p = get_opt(tmp, "-1", "stipple_focus").str), "-1"))
|
if(!strcmp((p = fetch_opt_first(titlebar, "-1", "stipple_focus").str), "-1"))
|
||||||
conf.titlebar.stipple.colors.focus = getcolor(conf.titlebar.fg_focus);
|
conf.titlebar.stipple.colors.focus = getcolor(conf.titlebar.fg_focus);
|
||||||
else
|
else
|
||||||
conf.titlebar.stipple.colors.focus = getcolor(p);
|
conf.titlebar.stipple.colors.focus = getcolor(p);
|
||||||
|
|
||||||
if((conf.titlebar.nmouse = get_size_sec(tmp, "mouse")))
|
mouse = fetch_section(titlebar, "mouse");
|
||||||
|
|
||||||
|
if((conf.titlebar.nmouse = fetch_section_count(mouse)) > 0)
|
||||||
{
|
{
|
||||||
conf.titlebar.mouse = emalloc(conf.titlebar.nmouse, sizeof(MouseBinding));
|
conf.titlebar.mouse = emalloc(conf.titlebar.nmouse, sizeof(MouseBinding));
|
||||||
mouse_section(conf.titlebar.mouse, tmp, conf.titlebar.nmouse);
|
mouse_section(conf.titlebar.mouse, mouse);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
free(mouse);
|
||||||
|
|
||||||
/* Multi button part */
|
/* Multi button part */
|
||||||
if((conf.titlebar.nbutton = get_size_sec(tmp, "button")))
|
button = fetch_section(titlebar, "button");
|
||||||
|
|
||||||
|
if((conf.titlebar.nbutton = fetch_section_count(button)) > 0)
|
||||||
{
|
{
|
||||||
conf.titlebar.button = emalloc(conf.titlebar.nbutton, sizeof(Button));
|
conf.titlebar.button = emalloc(conf.titlebar.nbutton, sizeof(Button));
|
||||||
for(i = 0; i < conf.titlebar.nbutton; ++i)
|
for(i = 0; i < conf.titlebar.nbutton; ++i)
|
||||||
{
|
{
|
||||||
tmp2 = get_nsec(tmp, "button", i);
|
flags = fetch_opt_first(button[i], "none", "flags").str;
|
||||||
|
|
||||||
cfg_set_sauv(tmp2);
|
|
||||||
|
|
||||||
tmp3 = get_opt(tmp2, "none", "flags").str;
|
|
||||||
conf.titlebar.button[i].flags = 0;
|
conf.titlebar.button[i].flags = 0;
|
||||||
if(strstr(tmp3, "free"))
|
if(strstr(flags, "free"))
|
||||||
conf.titlebar.button[i].flags |= FreeFlag;
|
conf.titlebar.button[i].flags |= FreeFlag;
|
||||||
if(strstr(tmp3, "max"))
|
if(strstr(flags, "max"))
|
||||||
conf.titlebar.button[i].flags |= MaxFlag;
|
conf.titlebar.button[i].flags |= MaxFlag;
|
||||||
if(strstr(tmp3, "tile"))
|
if(strstr(flags, "tile"))
|
||||||
conf.titlebar.button[i].flags |= TileFlag;
|
conf.titlebar.button[i].flags |= TileFlag;
|
||||||
|
|
||||||
/* Multi mouse section */
|
/* Multi mouse section */
|
||||||
if((conf.titlebar.button[i].nmouse = get_size_sec(tmp2, "mouse")))
|
mouse = fetch_section(button[i], "mouse");
|
||||||
|
|
||||||
|
if((conf.titlebar.button[i].nmouse = fetch_section_count(mouse)) > 0)
|
||||||
{
|
{
|
||||||
conf.titlebar.button[i].mouse = emalloc(conf.titlebar.button[i].nmouse, sizeof(MouseBinding));
|
conf.titlebar.button[i].mouse = emalloc(conf.titlebar.button[i].nmouse, sizeof(MouseBinding));
|
||||||
mouse_section(conf.titlebar.button[i].mouse, tmp2, conf.titlebar.button[i].nmouse);
|
mouse_section(conf.titlebar.button[i].mouse, mouse);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
free(mouse);
|
||||||
|
|
||||||
/* Multi line section */
|
/* Multi line section */
|
||||||
if((conf.titlebar.button[i].nlines = get_size_sec(tmp2, "line")))
|
line = fetch_section(button[i], "line");
|
||||||
|
|
||||||
|
if((conf.titlebar.button[i].nlines = fetch_section_count(line)) > 0)
|
||||||
{
|
{
|
||||||
conf.titlebar.button[i].linecoord = emalloc(conf.titlebar.button[i].nlines, sizeof(XSegment));
|
conf.titlebar.button[i].linecoord = emalloc(conf.titlebar.button[i].nlines, sizeof(XSegment));
|
||||||
|
|
||||||
for(j = 0; j < conf.titlebar.button[i].nlines; ++j)
|
for(j = 0; j < conf.titlebar.button[i].nlines; ++j)
|
||||||
{
|
{
|
||||||
tmp3 = get_nsec(tmp2, "line", j);
|
opt = fetch_opt(line[j], "0", "coord");
|
||||||
cfg_set_sauv(tmp3);
|
conf.titlebar.button[i].linecoord[j].x1 = opt[0].num;
|
||||||
|
conf.titlebar.button[i].linecoord[j].y1 = opt[1].num;
|
||||||
buf = get_list_opt(tmp3, "{0, 0, 0, 0}", "coord", &d);
|
conf.titlebar.button[i].linecoord[j].x2 = opt[2].num;
|
||||||
|
conf.titlebar.button[i].linecoord[j].y2 = opt[3].num;
|
||||||
conf.titlebar.button[i].linecoord[j].x1 = buf[0].num;
|
free(opt);
|
||||||
conf.titlebar.button[i].linecoord[j].y1 = buf[1].num;
|
|
||||||
conf.titlebar.button[i].linecoord[j].x2 = buf[2].num;
|
|
||||||
conf.titlebar.button[i].linecoord[j].y2 = buf[3].num;
|
|
||||||
|
|
||||||
cfg_set_sauv(tmp2);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cfg_set_sauv(tmp);
|
free(line);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* }} */
|
free(button);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
conf_layout_section(char *src)
|
conf_layout_section(void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
char *tmp = NULL, *p;
|
char *tmp = NULL, *p;
|
||||||
|
struct conf_sec *layouts, **layout;
|
||||||
|
|
||||||
/* Set conf.layout NULL for conf reload */
|
/* Set conf.layout NULL for conf reload */
|
||||||
for(i = 0; i < NUM_OF_LAYOUT; ++i)
|
for(i = 0; i < NUM_OF_LAYOUT; ++i)
|
||||||
@@ -322,20 +371,21 @@ conf_layout_section(char *src)
|
|||||||
conf.layout[i].func = NULL;
|
conf.layout[i].func = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
cfg_set_sauv(src);
|
layouts = fetch_section_first(NULL, "layouts");
|
||||||
|
|
||||||
conf.border.layout = get_opt(src, "false", "border").bool;
|
conf.border.layout = fetch_opt_first(layouts, "false", "border").bool;
|
||||||
conf.colors.layout_fg = get_opt(src, "#ffffff", "fg").str;
|
conf.colors.layout_fg = fetch_opt_first(layouts, "#ffffff", "fg").str;
|
||||||
conf.colors.layout_bg = getcolor((get_opt(src, "#000000", "bg").str));
|
conf.colors.layout_bg = getcolor((fetch_opt_first(layouts, "#000000", "bg").str));
|
||||||
|
|
||||||
|
|
||||||
if((tmp = get_opt(src, "menu", "system").str) && !strcmp(tmp, "menu"))
|
if((tmp = fetch_opt_first(layouts, "menu", "system").str) && !strcmp(tmp, "menu"))
|
||||||
conf.layout_system = True;
|
conf.layout_system = True;
|
||||||
|
|
||||||
if((tmp = get_opt(src, "right", "placement").str) && !strcmp(tmp, "left"))
|
if((tmp = fetch_opt_first(layouts, "right", "placement").str) && !strcmp(tmp, "left"))
|
||||||
conf.layout_placement = True;
|
conf.layout_placement = True;
|
||||||
|
|
||||||
conf.nlayout = get_size_sec(src, "layout");
|
layout = fetch_section(layouts, "layout");
|
||||||
|
conf.nlayout = fetch_section_count(layout);
|
||||||
|
|
||||||
if(conf.nlayout > NUM_OF_LAYOUT || !(conf.nlayout))
|
if(conf.nlayout > NUM_OF_LAYOUT || !(conf.nlayout))
|
||||||
{
|
{
|
||||||
@@ -360,50 +410,67 @@ conf_layout_section(char *src)
|
|||||||
{
|
{
|
||||||
for(i = 0; i < conf.nlayout; ++i)
|
for(i = 0; i < conf.nlayout; ++i)
|
||||||
{
|
{
|
||||||
tmp = get_nsec(src, "layout", i);
|
if(!name_to_func((p = fetch_opt_first(layout[i], "tile", "type").str), layout_list))
|
||||||
|
|
||||||
cfg_set_sauv(tmp);
|
|
||||||
|
|
||||||
if(!name_to_func((p = get_opt(tmp, "tile", "type").str), layout_list))
|
|
||||||
warnx("configuration : Unknown Layout type : \"%s\".", p);
|
warnx("configuration : Unknown Layout type : \"%s\".", p);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if(conf.layout_system && conf.nlayout > 1)
|
if(conf.layout_system && conf.nlayout > 1)
|
||||||
menu_new_item(&menulayout.item[i], get_opt(tmp, "", "symbol").str,
|
{
|
||||||
|
menu_new_item(&menulayout.item[i], fetch_opt_first(layout[i], "", "symbol").str,
|
||||||
uicb_set_layout, p);
|
uicb_set_layout, p);
|
||||||
|
|
||||||
conf.layout[i].symbol = get_opt(tmp, "TILE (default)", "symbol").str;
|
menulayout.item[i].check = name_to_func("check_layout", func_list);
|
||||||
conf.layout[i].func = name_to_func(p, layout_list);
|
}
|
||||||
}
|
|
||||||
|
|
||||||
cfg_set_sauv(src);
|
conf.layout[i].symbol = fetch_opt_first(layout[i], "TILE (default)", "symbol").str;
|
||||||
|
conf.layout[i].func = name_to_func(p, layout_list);
|
||||||
|
conf.layout[i].type = p;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
free(layout);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
conf_tag_section(char *src)
|
conf_tag_section(void)
|
||||||
{
|
{
|
||||||
int i, j, k, l = 0, m, n, sc;
|
int i, j, k, l = 0, m, n, sc, count;
|
||||||
char *cfgtmp, *tmp;
|
char *tmp;
|
||||||
opt_type *buf;
|
struct conf_sec *sec, **tag, **mouse;
|
||||||
|
struct opt_type *opt;
|
||||||
|
|
||||||
/* If there is no tag in the conf or more than
|
/* If there is no tag in the conf or more than
|
||||||
* MAXTAG (32) print an error and create only one.
|
* MAXTAG (32) print an error and create only one.
|
||||||
*/
|
*/
|
||||||
Tag default_tag = { "WMFS", NULL, 0, 1,
|
Tag default_tag = { "WMFS", NULL, 0, 1,
|
||||||
0.50, 1, False, False, False, IB_Top,
|
0.50, 1, False, False, False, False, IB_Top,
|
||||||
layout_name_to_struct(conf.layout, "tile_right", conf.nlayout, layout_list) };
|
layout_name_to_struct(conf.layout, "tile_right", conf.nlayout, layout_list),
|
||||||
|
0, NULL, 0 };
|
||||||
|
|
||||||
cfg_set_sauv(src);
|
sec = fetch_section_first(NULL, "tags");
|
||||||
|
|
||||||
conf.tag_round = get_opt(src, "false", "tag_round").bool;
|
conf.tag_round = fetch_opt_first(sec, "false", "tag_round").bool;
|
||||||
conf.colors.tagselfg = get_opt(src, "#ffffff", "sel_fg").str;
|
conf.colors.tagselfg = fetch_opt_first(sec, "#ffffff", "sel_fg").str;
|
||||||
conf.colors.tagselbg = getcolor(get_opt(src, "#000000", "sel_bg").str);
|
conf.colors.tagselbg = getcolor(fetch_opt_first(sec, "#000000", "sel_bg").str);
|
||||||
conf.colors.tag_occupied_bg = getcolor(get_opt(src, "#222222", "occupied_bg").str);
|
conf.colors.tagurfg = fetch_opt_first(sec, "#000000", "urgent_fg").str;
|
||||||
conf.border.tag = get_opt(src, "false", "border").bool;
|
conf.colors.tagurbg = getcolor(fetch_opt_first(sec, "#DD1111", "urgent_bg").str);
|
||||||
|
conf.colors.tag_occupied_bg = getcolor(fetch_opt_first(sec, "#222222", "occupied_bg").str);
|
||||||
|
conf.border.tag = fetch_opt_first(sec, "false", "border").bool;
|
||||||
|
conf.tagautohide = fetch_opt_first(sec, "false", "autohide").bool;
|
||||||
|
|
||||||
|
/* Mouse button action on tag */
|
||||||
|
conf.mouse_tag_action[TagSel] =
|
||||||
|
char_to_button(fetch_opt_first(sec, "1", "mouse_button_tag_sel").str, mouse_button_list);
|
||||||
|
conf.mouse_tag_action[TagTransfert] =
|
||||||
|
char_to_button(fetch_opt_first(sec, "2", "mouse_button_tag_transfert").str, mouse_button_list);
|
||||||
|
conf.mouse_tag_action[TagAdd] =
|
||||||
|
char_to_button(fetch_opt_first(sec, "3", "mouse_button_tag_add").str, mouse_button_list);
|
||||||
|
conf.mouse_tag_action[TagNext] =
|
||||||
|
char_to_button(fetch_opt_first(sec, "4", "mouse_button_tag_next").str, mouse_button_list);
|
||||||
|
conf.mouse_tag_action[TagPrev] =
|
||||||
|
char_to_button(fetch_opt_first(sec, "5", "mouse_button_tag_prev").str, mouse_button_list);
|
||||||
|
|
||||||
sc = screen_count();
|
sc = screen_count();
|
||||||
|
|
||||||
@@ -416,16 +483,16 @@ conf_tag_section(char *src)
|
|||||||
for(i = 0; i < sc; ++i)
|
for(i = 0; i < sc; ++i)
|
||||||
seltag[i] = 1;
|
seltag[i] = 1;
|
||||||
|
|
||||||
|
tag = fetch_section(sec, "tag");
|
||||||
|
|
||||||
|
n = fetch_section_count(tag);
|
||||||
|
|
||||||
for(i = 0; i < sc; ++i)
|
for(i = 0; i < sc; ++i)
|
||||||
tags[i] = emalloc(get_size_sec(src, "tag") + 2, sizeof(Tag));
|
tags[i] = emalloc(n + 2, sizeof(Tag));
|
||||||
|
|
||||||
for(i = 0; i < get_size_sec(src, "tag"); ++i)
|
for(i = 0; i < n; i++)
|
||||||
{
|
{
|
||||||
/* printf("%d -> %s\n", i, (cfgtmp = get_nsec(src, "tag", i)));*/
|
j = fetch_opt_first(tag[i], "-1", "screen").num;
|
||||||
cfgtmp = get_nsec(src, "tag", i);
|
|
||||||
cfg_set_sauv(cfgtmp);
|
|
||||||
|
|
||||||
j = get_opt(cfgtmp, "-1", "screen").num;
|
|
||||||
|
|
||||||
if(j < 0 || j > sc - 1)
|
if(j < 0 || j > sc - 1)
|
||||||
j = -1;
|
j = -1;
|
||||||
@@ -435,14 +502,14 @@ conf_tag_section(char *src)
|
|||||||
((j == -1) ? ++k : --l))
|
((j == -1) ? ++k : --l))
|
||||||
{
|
{
|
||||||
++conf.ntag[k];
|
++conf.ntag[k];
|
||||||
tags[k][conf.ntag[k]].name = get_opt(cfgtmp, "", "name").str;
|
tags[k][conf.ntag[k]].name = fetch_opt_first(tag[i], "", "name").str;
|
||||||
tags[k][conf.ntag[k]].mwfact = get_opt(cfgtmp, "0.65", "mwfact").fnum;
|
tags[k][conf.ntag[k]].mwfact = fetch_opt_first(tag[i], "0.65", "mwfact").fnum;
|
||||||
tags[k][conf.ntag[k]].nmaster = get_opt(cfgtmp, "1", "nmaster").num;
|
tags[k][conf.ntag[k]].nmaster = fetch_opt_first(tag[i], "1", "nmaster").num;
|
||||||
tags[k][conf.ntag[k]].resizehint = get_opt(cfgtmp, "false", "resizehint").bool;
|
tags[k][conf.ntag[k]].resizehint = fetch_opt_first(tag[i], "false", "resizehint").bool;
|
||||||
tags[k][conf.ntag[k]].abovefc = get_opt(cfgtmp, "false", "abovefc").bool;
|
tags[k][conf.ntag[k]].abovefc = fetch_opt_first(tag[i], "false", "abovefc").bool;
|
||||||
tags[k][conf.ntag[k]].layers = 1;
|
tags[k][conf.ntag[k]].layers = 1;
|
||||||
|
|
||||||
tmp = _strdup(get_opt(cfgtmp, "top", "infobar_position").str);
|
tmp = fetch_opt_first(tag[i], "top", "infobar_position").str;
|
||||||
|
|
||||||
if(!strcmp(tmp ,"none") || !strcmp(tmp, "hide") || !strcmp(tmp, "hidden"))
|
if(!strcmp(tmp ,"none") || !strcmp(tmp, "hide") || !strcmp(tmp, "hidden"))
|
||||||
tags[k][conf.ntag[k]].barpos = IB_Hide;
|
tags[k][conf.ntag[k]].barpos = IB_Hide;
|
||||||
@@ -452,23 +519,35 @@ conf_tag_section(char *src)
|
|||||||
tags[k][conf.ntag[k]].barpos = IB_Top;
|
tags[k][conf.ntag[k]].barpos = IB_Top;
|
||||||
|
|
||||||
tags[k][conf.ntag[k]].layout = layout_name_to_struct(conf.layout,
|
tags[k][conf.ntag[k]].layout = layout_name_to_struct(conf.layout,
|
||||||
get_opt(cfgtmp, "tile_right", "layout").str,
|
fetch_opt_first(tag[i], "tile_right", "layout").str,
|
||||||
conf.nlayout,
|
conf.nlayout,
|
||||||
layout_list);
|
layout_list);
|
||||||
|
|
||||||
/* Clients list */
|
/* Clients list */
|
||||||
buf = get_list_opt(cfgtmp, "", "clients", &n);
|
opt = fetch_opt(tag[i], "", "clients");
|
||||||
if(n)
|
|
||||||
|
if ((count = fetch_opt_count(opt)))
|
||||||
{
|
{
|
||||||
tags[k][conf.ntag[k]].nclients = n;
|
tags[k][conf.ntag[k]].nclients = count;
|
||||||
tags[k][conf.ntag[k]].clients = emalloc(n, sizeof(char *));
|
tags[k][conf.ntag[k]].clients = emalloc(count, sizeof(char *));
|
||||||
for(m = 0; m < n; ++m)
|
for(m = 0; m < count; ++m)
|
||||||
tags[k][conf.ntag[k]].clients[m] = (buf[m].str) ? buf[m].str : NULL;
|
tags[k][conf.ntag[k]].clients[m] = opt[m].str;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
free(opt);
|
||||||
|
|
||||||
|
/* Multi mouse sections */
|
||||||
|
mouse = fetch_section(tag[i], "mouse");
|
||||||
|
|
||||||
|
if((tags[k][conf.ntag[k]].nmouse = fetch_section_count(mouse)))
|
||||||
|
{
|
||||||
|
tags[k][conf.ntag[k]].mouse = emalloc(tags[k][conf.ntag[k]].nmouse, sizeof(MouseBinding));
|
||||||
|
mouse_section(tags[k][conf.ntag[k]].mouse, mouse);
|
||||||
|
}
|
||||||
|
|
||||||
|
free(mouse);
|
||||||
}
|
}
|
||||||
l = 0;
|
l = 0;
|
||||||
cfg_set_sauv(src);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for(i = 0; i < sc; ++i)
|
for(i = 0; i < sc; ++i)
|
||||||
@@ -479,126 +558,134 @@ conf_tag_section(char *src)
|
|||||||
tags[i][1] = default_tag;
|
tags[i][1] = default_tag;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
free(tag);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
conf_menu_section(char *src)
|
conf_menu_section(void)
|
||||||
{
|
{
|
||||||
char *tmp, *tmp2;
|
char *tmp2;
|
||||||
int i, j;
|
int i, j;
|
||||||
|
struct conf_sec *menu, **set_menu, **item;
|
||||||
|
|
||||||
cfg_set_sauv(src);
|
menu = fetch_section_first(NULL, "menu");
|
||||||
|
|
||||||
CHECK((conf.nmenu = get_size_sec(src, "set_menu")));
|
set_menu = fetch_section(menu, "set_menu");
|
||||||
|
|
||||||
|
CHECK((conf.nmenu = fetch_section_count(set_menu)));
|
||||||
|
|
||||||
conf.menu = calloc(conf.nmenu, sizeof(Menu));
|
conf.menu = calloc(conf.nmenu, sizeof(Menu));
|
||||||
|
|
||||||
for(i = 0; i < conf.nmenu; ++i)
|
for(i = 0; i < conf.nmenu; ++i)
|
||||||
{
|
{
|
||||||
tmp = get_nsec(src, "set_menu", i);
|
|
||||||
cfg_set_sauv(tmp);
|
|
||||||
|
|
||||||
conf.menu[i].name = get_opt(tmp, "menu_wname", "name").str;
|
conf.menu[i].name = fetch_opt_first(set_menu[i], "menu_wname", "name").str;
|
||||||
|
|
||||||
if(!(conf.menu[i].place_at_mouse = get_opt(tmp, "true", "place_at_mouse").bool))
|
if(!(conf.menu[i].place_at_mouse = fetch_opt_first(set_menu[i], "true", "place_at_mouse").bool))
|
||||||
{
|
{
|
||||||
conf.menu[i].x = get_opt(tmp, "0", "x").num;
|
conf.menu[i].x = fetch_opt_first(set_menu[i], "0", "x").num;
|
||||||
conf.menu[i].y = get_opt(tmp, "0", "y").num;
|
conf.menu[i].y = fetch_opt_first(set_menu[i], "0", "y").num;
|
||||||
}
|
}
|
||||||
|
|
||||||
conf.menu[i].colors.focus.bg = getcolor(get_opt(tmp, "#000000", "bg_focus").str);
|
tmp2 = fetch_opt_first(set_menu[i], "center", "align").str;
|
||||||
conf.menu[i].colors.focus.fg = get_opt(tmp, "#ffffff", "fg_focus").str;
|
|
||||||
conf.menu[i].colors.normal.bg = getcolor(get_opt(tmp, "#000000", "bg_normal").str);
|
|
||||||
conf.menu[i].colors.normal.fg = get_opt(tmp, "#ffffff", "fg_normal").str;
|
|
||||||
|
|
||||||
if((conf.menu[i].nitem = get_size_sec(tmp, "item")))
|
if(!strcmp(tmp2 ,"left"))
|
||||||
|
conf.menu[i].align = MA_Left;
|
||||||
|
else if(!strcmp(tmp2, "right"))
|
||||||
|
conf.menu[i].align = MA_Right;
|
||||||
|
else
|
||||||
|
conf.menu[i].align = MA_Center;
|
||||||
|
|
||||||
|
conf.menu[i].colors.focus.bg = getcolor(fetch_opt_first(set_menu[i], "#000000", "bg_focus").str);
|
||||||
|
conf.menu[i].colors.focus.fg = fetch_opt_first(set_menu[i], "#ffffff", "fg_focus").str;
|
||||||
|
conf.menu[i].colors.normal.bg = getcolor(fetch_opt_first(set_menu[i], "#000000", "bg_normal").str);
|
||||||
|
conf.menu[i].colors.normal.fg = fetch_opt_first(set_menu[i], "#ffffff", "fg_normal").str;
|
||||||
|
|
||||||
|
item = fetch_section(set_menu[i], "item");
|
||||||
|
|
||||||
|
if((conf.menu[i].nitem = fetch_section_count(item)))
|
||||||
{
|
{
|
||||||
conf.menu[i].item = emalloc(conf.menu[i].nitem, sizeof(MenuItem));
|
conf.menu[i].item = emalloc(conf.menu[i].nitem, sizeof(MenuItem));
|
||||||
for(j = 0; j < get_size_sec(tmp, "item"); ++j)
|
for(j = 0; j < conf.menu[i].nitem; ++j)
|
||||||
{
|
{
|
||||||
tmp2 = get_nsec(tmp, "item", j);
|
conf.menu[i].item[j].name = fetch_opt_first(item[j], "item_wname", "name").str;
|
||||||
cfg_set_sauv(tmp2);
|
conf.menu[i].item[j].func = name_to_func(fetch_opt_first(item[j], "", "func").str, func_list);
|
||||||
|
conf.menu[i].item[j].cmd = fetch_opt_first(item[j], "", "cmd").str;
|
||||||
conf.menu[i].item[j].name = get_opt(tmp2, "item_wname", "name").str;
|
conf.menu[i].item[j].check = name_to_func(fetch_opt_first(item[j], "", "check").str, func_list);
|
||||||
conf.menu[i].item[j].func = name_to_func(get_opt(tmp2, "", "func").str, func_list);
|
conf.menu[i].item[j].submenu = fetch_opt_first(item[j], "", "submenu").str;
|
||||||
conf.menu[i].item[j].cmd = (!get_opt(tmp2, "", "cmd").str) ? NULL : get_opt(tmp2, "", "cmd").str;
|
|
||||||
|
|
||||||
cfg_set_sauv(tmp);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
free(item);
|
||||||
cfg_set_sauv(src);
|
|
||||||
}
|
}
|
||||||
|
free(set_menu);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
conf_launcher_section(char *src)
|
conf_launcher_section(void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
char *tmp;
|
struct conf_sec *launcher, **set_launcher;
|
||||||
|
|
||||||
cfg_set_sauv(src);
|
launcher = fetch_section_first(NULL, "launcher");
|
||||||
|
set_launcher = fetch_section(launcher, "set_launcher");
|
||||||
|
|
||||||
CHECK((conf.nlauncher = get_size_sec(src, "set_launcher")));
|
CHECK((conf.nlauncher = fetch_section_count(set_launcher)));
|
||||||
|
|
||||||
conf.launcher = emalloc(conf.nlauncher, sizeof(Launcher));
|
conf.launcher = emalloc(conf.nlauncher, sizeof(Launcher));
|
||||||
|
|
||||||
for(i = 0; i < conf.nlauncher; ++i)
|
for(i = 0; i < conf.nlauncher; ++i)
|
||||||
{
|
{
|
||||||
tmp = get_nsec(src, "set_launcher", i);
|
conf.launcher[i].name = fetch_opt_first(set_launcher[i], "launcher", "name").str;
|
||||||
cfg_set_sauv(tmp);
|
conf.launcher[i].prompt = fetch_opt_first(set_launcher[i], "Exec:", "prompt").str;
|
||||||
|
conf.launcher[i].command = fetch_opt_first(set_launcher[i], "exec", "command").str;
|
||||||
conf.launcher[i].name = get_opt(tmp, "launcher", "name").str;
|
conf.launcher[i].nhisto = 1;
|
||||||
conf.launcher[i].prompt = get_opt(tmp, "Exec:", "prompt").str;
|
|
||||||
conf.launcher[i].command = get_opt(tmp, "exec", "command").str;
|
|
||||||
|
|
||||||
cfg_set_sauv(src);
|
|
||||||
}
|
}
|
||||||
|
free(set_launcher);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
conf_keybind_section(char *src)
|
conf_keybind_section(void)
|
||||||
{
|
{
|
||||||
int i, j, n = 0;
|
int i, j;
|
||||||
char *tmp;
|
struct conf_sec *sec, **ks;
|
||||||
opt_type *buf;
|
struct opt_type *opt;
|
||||||
|
|
||||||
cfg_set_sauv(src);
|
sec = fetch_section_first(NULL, "keys");
|
||||||
|
ks = fetch_section(sec, "key");
|
||||||
|
|
||||||
conf.nkeybind = get_size_sec(src, "key");
|
conf.nkeybind = fetch_section_count(ks);
|
||||||
keys = emalloc(conf.nkeybind, sizeof(Key));
|
keys = emalloc(conf.nkeybind, sizeof(Key));
|
||||||
|
|
||||||
for(i = 0; i < conf.nkeybind; ++i)
|
for(i = 0; i < conf.nkeybind; ++i)
|
||||||
{
|
{
|
||||||
tmp = get_nsec(src, "key", i);
|
opt = fetch_opt(ks[i], "", "mod");
|
||||||
|
|
||||||
cfg_set_sauv(tmp);
|
for(j = 0; j < fetch_opt_count(opt); ++j)
|
||||||
|
keys[i].mod |= char_to_modkey(opt[j].str, key_list);
|
||||||
|
|
||||||
buf = get_list_opt(tmp, "", "mod", &n);
|
free(opt);
|
||||||
|
|
||||||
for(j = 0; j < n; ++j)
|
keys[i].keysym = XStringToKeysym(fetch_opt_first(ks[i], "None", "key").str);
|
||||||
keys[i].mod |= char_to_modkey(buf[j].str, key_list);
|
|
||||||
|
|
||||||
keys[i].keysym = XStringToKeysym(get_opt(tmp, "None", "key").str);
|
keys[i].func = name_to_func(fetch_opt_first(ks[i], "", "func").str, func_list);
|
||||||
|
|
||||||
keys[i].func = name_to_func(get_opt(tmp, "", "func").str, func_list);
|
|
||||||
|
|
||||||
if(keys[i].func == NULL)
|
if(keys[i].func == NULL)
|
||||||
{
|
{
|
||||||
warnx("configuration : Unknown Function \"%s\".", get_opt(tmp, "", "func").str);
|
warnx("configuration : Unknown Function \"%s\".", fetch_opt_first(ks[i], "", "func").str);
|
||||||
keys[i].func = uicb_spawn;
|
keys[i].func = uicb_spawn;
|
||||||
}
|
}
|
||||||
|
|
||||||
keys[i].cmd = (!get_opt(tmp, "", "cmd").str) ? NULL : get_opt(tmp, "", "cmd").str;
|
keys[i].cmd = fetch_opt_first(ks[i], "", "cmd").str;
|
||||||
|
|
||||||
cfg_set_sauv(src);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
free(ks);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -607,46 +694,31 @@ conf_keybind_section(char *src)
|
|||||||
void
|
void
|
||||||
init_conf(void)
|
init_conf(void)
|
||||||
{
|
{
|
||||||
char *file;
|
if (get_conf(conf.confpath) == -1)
|
||||||
|
|
||||||
if(!(file = file_to_str(conf.confpath)))
|
|
||||||
{
|
{
|
||||||
warnx("parsing configuration file (%s) failed.", conf.confpath);
|
warnx("parsing configuration file (%s) failed.", conf.confpath);
|
||||||
sprintf(conf.confpath, "%s/wmfs/wmfsrc", XDG_CONFIG_DIR);
|
sprintf(conf.confpath, "%s/wmfs/wmfsrc", XDG_CONFIG_DIR);
|
||||||
warnx("Use the default configuration (%s).", conf.confpath);
|
warnx("Use the default configuration (%s).", conf.confpath);
|
||||||
file = file_to_str(conf.confpath);
|
if (get_conf(conf.confpath) == -1)
|
||||||
|
errx(1, "parsing configuration file (%s) failed.", conf.confpath);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set func_list */
|
/* Set func_list */
|
||||||
func_list = emalloc(LEN(tmp_func_list), sizeof(func_name_list_t));
|
func_list = emalloc(LEN(tmp_func_list), sizeof(func_name_list_t));
|
||||||
memcpy(func_list, tmp_func_list, LEN(tmp_func_list) * sizeof(func_name_list_t));
|
memcpy(func_list, tmp_func_list, LEN(tmp_func_list) * sizeof(func_name_list_t));
|
||||||
|
|
||||||
conf_section(conf_misc_section, file, "misc");
|
conf_misc_section();
|
||||||
conf_section(conf_bar_section, file, "bar");
|
conf_bar_section();
|
||||||
conf_section(conf_root_section, file, "root");
|
conf_root_section();
|
||||||
conf_section(conf_client_section, file, "client");
|
conf_client_section();
|
||||||
conf_section(conf_layout_section, file, "layouts");
|
conf_layout_section();
|
||||||
conf_section(conf_tag_section, file, "tags");
|
conf_tag_section();
|
||||||
conf_section(conf_menu_section, file, "menu");
|
conf_menu_section();
|
||||||
conf_section(conf_launcher_section, file, "launcher");
|
conf_launcher_section();
|
||||||
conf_section(conf_keybind_section, file, "keys");
|
conf_keybind_section();
|
||||||
|
|
||||||
free(file);
|
print_unused(NULL);
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** Simple wrapper for calling functions and free pointer
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
conf_section(void (*func)(char*), char *src, char *name)
|
|
||||||
{
|
|
||||||
char *sec;
|
|
||||||
|
|
||||||
sec = get_sec(src, name);
|
|
||||||
func(sec);
|
|
||||||
IFREE(sec);
|
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,289 +0,0 @@
|
|||||||
/*
|
|
||||||
* confparse.c
|
|
||||||
* Copyright © 2008, 2009 Martin Duquesnoy <xorg62@gmail.com>
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions are
|
|
||||||
* met:
|
|
||||||
*
|
|
||||||
* * Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* * Redistributions in binary form must reproduce the above
|
|
||||||
* copyright notice, this list of conditions and the following disclaimer
|
|
||||||
* in the documentation and/or other materials provided with the
|
|
||||||
* distribution.
|
|
||||||
* * Neither the name of the nor the names of its
|
|
||||||
* contributors may be used to endorse or promote products derived from
|
|
||||||
* this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "confparse.h"
|
|
||||||
|
|
||||||
char*
|
|
||||||
file_to_str(char *path)
|
|
||||||
{
|
|
||||||
char *buf, *ret, *p, *c;
|
|
||||||
int fd, i;
|
|
||||||
struct stat st;
|
|
||||||
Bool is_char = False;
|
|
||||||
|
|
||||||
if (!path)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
if (!(fd = open(path, O_RDONLY)))
|
|
||||||
{
|
|
||||||
warn("%s", path);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Get the file size */
|
|
||||||
stat(path, &st);
|
|
||||||
|
|
||||||
/* Bufferize file */
|
|
||||||
if((buf = (char*)mmap(0, st.st_size, PROT_READ, MAP_PRIVATE, fd, SEEK_SET)) == (char*) MAP_FAILED)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
/* Copy buffer without comments in return value */
|
|
||||||
ret = emalloc(strlen(buf) + 1, sizeof(char));
|
|
||||||
|
|
||||||
for(p = buf, i = 0; *p != '\0'; p++)
|
|
||||||
{
|
|
||||||
if(!is_char && (c = strchr("\"'", *p)))
|
|
||||||
is_char = !is_char;
|
|
||||||
else if (is_char && *p == *c)
|
|
||||||
is_char = !is_char;
|
|
||||||
|
|
||||||
if(*p == COMMENT_CHAR && !is_char)
|
|
||||||
{
|
|
||||||
if(!(p = strchr(p, '\n')))
|
|
||||||
break;
|
|
||||||
ret[i++] = '\n';
|
|
||||||
}
|
|
||||||
else
|
|
||||||
ret[i++] = *p;
|
|
||||||
}
|
|
||||||
ret[i++] = '\0';
|
|
||||||
|
|
||||||
/* Unmap buffer, thanks linkdd. */
|
|
||||||
munmap(buf, st.st_size);
|
|
||||||
close(fd);
|
|
||||||
|
|
||||||
warnx("%s read.", path);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
char*
|
|
||||||
get_sec(char *src, char *name)
|
|
||||||
{
|
|
||||||
char *ret = NULL, *start, *end, *p;
|
|
||||||
char **sec;
|
|
||||||
size_t len;
|
|
||||||
|
|
||||||
if(!src)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
if(!name)
|
|
||||||
return src;
|
|
||||||
|
|
||||||
sec = secname(name);
|
|
||||||
len = strlen(sec[SecStart]);
|
|
||||||
|
|
||||||
/* Find start section pointer */
|
|
||||||
for(start = src; *start != '\0'; start++)
|
|
||||||
{
|
|
||||||
if( (p = strchr("\"'", *start)) )
|
|
||||||
while (*(++start) && *start != *p);
|
|
||||||
|
|
||||||
if(!strncmp(start, sec[SecStart], len))
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(*start != '\0')
|
|
||||||
{
|
|
||||||
/* Here is_char == False */
|
|
||||||
start += len;
|
|
||||||
/* Find end section pointer */
|
|
||||||
for(end = start; *end != '\0'; end++)
|
|
||||||
{
|
|
||||||
if( (p = strchr("\"'", *start)) )
|
|
||||||
while (*(++start) && *start != *p);
|
|
||||||
|
|
||||||
if(!strncmp(end, sec[SecEnd], len+1))
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Allocate and set ret */
|
|
||||||
if(end != '\0')
|
|
||||||
{
|
|
||||||
len = end - start;
|
|
||||||
ret = emalloc(len + 1, sizeof(char));
|
|
||||||
memcpy(ret, start, len);
|
|
||||||
ret[len] = '\0';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
free_secname(sec);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
char*
|
|
||||||
get_nsec(char *src, char *name, int n)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
char *ret, *buf, **sec;
|
|
||||||
|
|
||||||
if(!src || !strlen(src))
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
if(!name)
|
|
||||||
return src;
|
|
||||||
|
|
||||||
if(!n)
|
|
||||||
return get_sec(src, name);
|
|
||||||
|
|
||||||
sec = secname(name);
|
|
||||||
|
|
||||||
buf = _strdup(sauv_delimc);
|
|
||||||
|
|
||||||
for(i = 0; i < n && (buf = strstr(buf, sec[SecStart])); ++i, buf += strlen(sec[SecStart]));
|
|
||||||
|
|
||||||
ret = get_sec(src + strlen(src) - strlen(buf), name);
|
|
||||||
|
|
||||||
free_secname(sec);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
get_size_sec(char *src, char *name)
|
|
||||||
{
|
|
||||||
int ret;
|
|
||||||
char **sec, *buf;
|
|
||||||
|
|
||||||
if(!src || !name)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
sec = secname(name);
|
|
||||||
|
|
||||||
buf = _strdup(sauv_secc);
|
|
||||||
|
|
||||||
for(ret = 0; (buf = strstr(buf, sec[SecStart])); ++ret, buf += strlen(sec[SecStart]));
|
|
||||||
|
|
||||||
free_secname(sec);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
opt_type
|
|
||||||
get_opt(char *src, char *def, char *name)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
char *p = NULL, *p2 = NULL;
|
|
||||||
opt_type ret = null_opt_type;
|
|
||||||
|
|
||||||
if(!src || !name)
|
|
||||||
return (def) ? str_to_opt(def) : ret;
|
|
||||||
|
|
||||||
if((p = opt_srch(sauv_secc, name)))
|
|
||||||
{
|
|
||||||
for(i = 0; p[i] && p[i] != '\n'; ++i);
|
|
||||||
p[i] = '\0';
|
|
||||||
|
|
||||||
p2 = _strdup(p + strlen(name));
|
|
||||||
|
|
||||||
if((p = strchr(p, '=')) && !is_in_delimiter(p, 0))
|
|
||||||
{
|
|
||||||
for(i = 0; p2[i] && p2[i] != '='; ++i);
|
|
||||||
p2[i] = '\0';
|
|
||||||
|
|
||||||
/* Check if there is anything else that spaces
|
|
||||||
* between option name and '=' */
|
|
||||||
for(i = 0; i < strlen(p2); ++i)
|
|
||||||
if(p2[i] != ' ')
|
|
||||||
{
|
|
||||||
warnx("Configuration warning: Missing '=' after option: '%s'"
|
|
||||||
" and before expression: '%s'\n", name, p2);
|
|
||||||
return str_to_opt(def);
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = str_to_opt(clean_value(++p));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!ret.str)
|
|
||||||
ret = str_to_opt(def);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* option = {val1, val2, val3} */
|
|
||||||
opt_type*
|
|
||||||
get_list_opt(char *src, char *def, char *name, int *n)
|
|
||||||
{
|
|
||||||
int i, j;
|
|
||||||
char *p, *p2;
|
|
||||||
opt_type *ret;
|
|
||||||
|
|
||||||
if(!src || !name)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
*n = 0;
|
|
||||||
|
|
||||||
if(!(p = get_opt(src, def, name).str))
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
for(i = 0; p[i] && (p[i] != LIST_DEL_E || is_in_delimiter(p, i)); ++i);
|
|
||||||
p[i + 1] = '\0';
|
|
||||||
|
|
||||||
/* Syntax of list {val1, val2, ..., valx} */
|
|
||||||
if(*p != LIST_DEL_S || *(p + strlen(p) - 1) != LIST_DEL_E)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
/* Erase ( ) */
|
|
||||||
++p;
|
|
||||||
*(p + strlen(p) - 1) = '\0';
|
|
||||||
|
|
||||||
/* > 1 value in list */
|
|
||||||
if(strchr(p, ','))
|
|
||||||
{
|
|
||||||
/* Count ',' */
|
|
||||||
for(i = 0, *n = 1; i < strlen(p); ++i)
|
|
||||||
if(p[i] == ',' && !is_in_delimiter(p, i))
|
|
||||||
++(*n);
|
|
||||||
|
|
||||||
ret = emalloc(*n, sizeof(opt_type));
|
|
||||||
|
|
||||||
p2 = _strdup(p);
|
|
||||||
|
|
||||||
/* Set all value in return array */
|
|
||||||
for(i = j = 0; i < *n; ++i, p2 += ++j)
|
|
||||||
{
|
|
||||||
for(j = 0; j < strlen(p2) && (p2[j] != ',' || is_in_delimiter(p2, j)); ++j);
|
|
||||||
p2[j] = '\0';
|
|
||||||
|
|
||||||
ret[i] = str_to_opt(clean_value(p2));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ret = emalloc((*n = 1), sizeof(opt_type));
|
|
||||||
*ret = str_to_opt(clean_value(p));
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
@@ -1,87 +0,0 @@
|
|||||||
/*
|
|
||||||
* confparse.h
|
|
||||||
* Copyright © 2008, 2009 Martin Duquesnoy <xorg62@gmail.com>
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions are
|
|
||||||
* met:
|
|
||||||
*
|
|
||||||
* * Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* * Redistributions in binary form must reproduce the above
|
|
||||||
* copyright notice, this list of conditions and the following disclaimer
|
|
||||||
* in the documentation and/or other materials provided with the
|
|
||||||
* distribution.
|
|
||||||
* * Neither the name of the nor the names of its
|
|
||||||
* contributors may be used to endorse or promote products derived from
|
|
||||||
* this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef CONFPARSE_H
|
|
||||||
#define CONFPARSE_H
|
|
||||||
|
|
||||||
#include <sys/mman.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
|
|
||||||
#include "../wmfs.h"
|
|
||||||
|
|
||||||
/* Section delimiter */
|
|
||||||
#define SEC_DEL_S '['
|
|
||||||
#define SEC_DEL_E ']'
|
|
||||||
|
|
||||||
/* List delimiter */
|
|
||||||
#define LIST_DEL_S '{'
|
|
||||||
#define LIST_DEL_E '}'
|
|
||||||
|
|
||||||
/* Comment character */
|
|
||||||
#define COMMENT_CHAR '#'
|
|
||||||
|
|
||||||
enum { SecStart, SecEnd, SecLast };
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
long int num;
|
|
||||||
float fnum;
|
|
||||||
Bool bool;
|
|
||||||
char *str;
|
|
||||||
} opt_type;
|
|
||||||
|
|
||||||
/* util.c */
|
|
||||||
char *erase_delim_content(char *buf);
|
|
||||||
Bool is_in_delimiter(char *buf, int p);
|
|
||||||
char *erase_sec_content(char *buf);
|
|
||||||
char *opt_srch(char *buf, char *opt);
|
|
||||||
opt_type str_to_opt(char *str);
|
|
||||||
char *clean_value(char *str);
|
|
||||||
void cfg_set_sauv(char *str);
|
|
||||||
char **secname(char *name);
|
|
||||||
void free_secname(char **secname);
|
|
||||||
|
|
||||||
/* confparse.c */
|
|
||||||
char *file_to_str(char *path);
|
|
||||||
char *get_sec(char *src, char *name);
|
|
||||||
char *get_nsec(char *src, char *name, int n);
|
|
||||||
int get_size_sec(char *src, char *name);
|
|
||||||
opt_type get_opt(char *src, char *def, char *name);
|
|
||||||
opt_type *get_list_opt(char *src, char *def, char *name, int *n);
|
|
||||||
|
|
||||||
static const opt_type null_opt_type = {0, 0, 0, NULL};
|
|
||||||
|
|
||||||
char *sauv_delimc;
|
|
||||||
char *sauv_secc;
|
|
||||||
|
|
||||||
#endif /* CONFPARSE_H */
|
|
||||||
@@ -1,220 +0,0 @@
|
|||||||
/*
|
|
||||||
* confparse/util.c
|
|
||||||
* Copyright © 2008, 2009 Martin Duquesnoy <xorg62@gmail.com>
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions are
|
|
||||||
* met:
|
|
||||||
*
|
|
||||||
* * Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* * Redistributions in binary form must reproduce the above
|
|
||||||
* copyright notice, this list of conditions and the following disclaimer
|
|
||||||
* in the documentation and/or other materials provided with the
|
|
||||||
* distribution.
|
|
||||||
* * Neither the name of the nor the names of its
|
|
||||||
* contributors may be used to endorse or promote products derived from
|
|
||||||
* this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "confparse.h"
|
|
||||||
|
|
||||||
char*
|
|
||||||
erase_delim_content(char *buf)
|
|
||||||
{
|
|
||||||
int i, j;
|
|
||||||
char *str, c;
|
|
||||||
|
|
||||||
if(!buf || !(str = _strdup(buf)))
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
for(i = 0; i < strlen(str); ++i)
|
|
||||||
if(strchr("\"'", (c = str[i])))
|
|
||||||
{
|
|
||||||
for(*(str + (j = i)) = ' '; str[j] && str[j] != c; str[j++] = ' ');
|
|
||||||
str[j] = ' ';
|
|
||||||
}
|
|
||||||
|
|
||||||
return str;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Erase all content of all delimiters, put it
|
|
||||||
* int str, and check if buf[p] is in an delimiter. */
|
|
||||||
Bool
|
|
||||||
is_in_delimiter(char *buf, int p)
|
|
||||||
{
|
|
||||||
if(*(erase_delim_content(buf) + p) != buf[p])
|
|
||||||
return True;
|
|
||||||
|
|
||||||
return False;
|
|
||||||
}
|
|
||||||
|
|
||||||
char*
|
|
||||||
erase_sec_content(char *buf)
|
|
||||||
{
|
|
||||||
int i, j;
|
|
||||||
char *p, *str, *name, *ret;
|
|
||||||
char **sec;
|
|
||||||
|
|
||||||
if(!buf || !(str = _strdup(sauv_delimc)))
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
ret = _strdup(buf);
|
|
||||||
|
|
||||||
for(i = 1, name = _strdup(str + i); strchr(str + i, SEC_DEL_S); ++i, name = _strdup(str + i))
|
|
||||||
{
|
|
||||||
for(; str[i] && str[i] != SEC_DEL_S; ++i);
|
|
||||||
for(j = 0; str[i] && str[i] != SEC_DEL_E; name[j++] = str[i++]);
|
|
||||||
++name;
|
|
||||||
name[j - 1] = '\0';
|
|
||||||
|
|
||||||
if(*name == '/')
|
|
||||||
continue;
|
|
||||||
|
|
||||||
sec = secname(name);
|
|
||||||
|
|
||||||
if((p = strstr(str + i, sec[SecEnd])))
|
|
||||||
for(++i; i < strlen(ret) - strlen(p); ret[i++] = ' ');
|
|
||||||
else
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
free_secname(sec);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* To get the RIGHT name of an option; if option needed is
|
|
||||||
* pwet and there is tagadapwettagada in the configuration,
|
|
||||||
* with strstr(), the name will matchs */
|
|
||||||
char*
|
|
||||||
opt_srch(char *buf, char *opt)
|
|
||||||
{
|
|
||||||
char *p;
|
|
||||||
|
|
||||||
if(!buf || !opt)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
if((p = strstr(sauv_delimc /*erase_delim_content(buf)*/, opt)))
|
|
||||||
if((*(p + strlen(opt)) == ' ' || *(p + strlen(opt)) == '=')
|
|
||||||
&& (*(p - 1) == ' ' || *(p - 1) == '\n' || *(p - 1) == '\t' || !(*(p - 1))))
|
|
||||||
return _strdup(buf + (strlen(buf) - strlen(p)));
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
opt_type
|
|
||||||
str_to_opt(char *str)
|
|
||||||
{
|
|
||||||
opt_type ret = null_opt_type;
|
|
||||||
|
|
||||||
if(!strlen(str))
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
/* Integer */
|
|
||||||
ret.num = atoi(str);
|
|
||||||
|
|
||||||
/* Float */
|
|
||||||
sscanf(str, "%f", &ret.fnum);
|
|
||||||
|
|
||||||
/* Boolean */
|
|
||||||
if(strstr(str, "true") || strstr(str, "True")
|
|
||||||
|| strstr(str, "TRUE") || strstr(str, "1"))
|
|
||||||
ret.bool = True;
|
|
||||||
|
|
||||||
/* String */
|
|
||||||
ret.str = _strdup(str);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
char*
|
|
||||||
clean_value(char *str)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
char c, *p;
|
|
||||||
|
|
||||||
if(!str || !(p = _strdup(str)))
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
/* Remove useless spaces */
|
|
||||||
for(; *p == ' '; ++p);
|
|
||||||
for(; *(p + strlen(p) - 1) == ' '; *(p + strlen(p) - 1) = '\0');
|
|
||||||
|
|
||||||
/* For string delimiter (" or ') */
|
|
||||||
if(((c = *p) == '"' || (c = *p) == '\'') && strchr(p + 1, c))
|
|
||||||
{
|
|
||||||
for(++p, i = 0; p[i] && p[i] != c; ++i);
|
|
||||||
p[i] = '\0';
|
|
||||||
}
|
|
||||||
|
|
||||||
return p;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
cfg_set_sauv(char *str)
|
|
||||||
{
|
|
||||||
if(!str)
|
|
||||||
{
|
|
||||||
sauv_delimc = NULL;
|
|
||||||
sauv_secc = NULL;
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
sauv_delimc = erase_delim_content(_strdup(str));
|
|
||||||
sauv_secc = erase_sec_content(_strdup(str));
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
char**
|
|
||||||
secname(char *name)
|
|
||||||
{
|
|
||||||
char **ret = NULL;
|
|
||||||
|
|
||||||
if(!name)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
ret = emalloc(SecLast, sizeof(char*));
|
|
||||||
|
|
||||||
/* Len of name + '[' + ']' + '\0' */
|
|
||||||
ret[SecStart] = emalloc(strlen(name) + 3, sizeof(char));
|
|
||||||
|
|
||||||
/* Len of name + '[' + '/' + ']' + '\0' */
|
|
||||||
ret[SecEnd] = emalloc(strlen(name) + 4, sizeof(char));
|
|
||||||
|
|
||||||
sprintf(ret[SecStart], "%c%s%c", SEC_DEL_S, name, SEC_DEL_E);
|
|
||||||
sprintf(ret[SecEnd], "%c/%s%c", SEC_DEL_S, name, SEC_DEL_E);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
free_secname(char **secname)
|
|
||||||
{
|
|
||||||
if(!secname || LEN(secname) != SecLast)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if(secname[SecStart])
|
|
||||||
free(secname[SecStart]);
|
|
||||||
if(secname[SecEnd])
|
|
||||||
free(secname[SecEnd]);
|
|
||||||
|
|
||||||
free(secname);
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
26
src/draw.c
26
src/draw.c
@@ -109,6 +109,32 @@ draw_rectangle(Drawable dr, int x, int y, uint w, uint h, uint color)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Draw a Graph in a drawable
|
||||||
|
* \param dr Drawable
|
||||||
|
* \param x X position
|
||||||
|
* \param y Y position
|
||||||
|
* \param w Width
|
||||||
|
* \param h Height
|
||||||
|
* \param color Color of the graph
|
||||||
|
* \param data Array of bytes that will be draw
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
draw_graph(Drawable dr, int x, int y, uint w, uint h, uint color, char *data)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
XSetForeground(dpy, gc, color);
|
||||||
|
|
||||||
|
for(i = 0; i < w; ++i)
|
||||||
|
{
|
||||||
|
XRectangle r = { (x + i), (y + h - data[i]), 1, data[i] };
|
||||||
|
|
||||||
|
XFillRectangles(dpy, dr, gc, &r, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef HAVE_IMLIB
|
#ifdef HAVE_IMLIB
|
||||||
/** Draw an image in a drawable
|
/** Draw an image in a drawable
|
||||||
* \param dr Drawable
|
* \param dr Drawable
|
||||||
|
|||||||
57
src/event.c
57
src/event.c
@@ -49,6 +49,8 @@ buttonpress(XButtonEvent *ev)
|
|||||||
{
|
{
|
||||||
client_focus(c);
|
client_focus(c);
|
||||||
client_raise(c);
|
client_raise(c);
|
||||||
|
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Titlebar */
|
/* Titlebar */
|
||||||
@@ -96,16 +98,36 @@ buttonpress(XButtonEvent *ev)
|
|||||||
if(conf.bars.mouse[j].func)
|
if(conf.bars.mouse[j].func)
|
||||||
conf.bars.mouse[j].func(conf.bars.mouse[j].cmd);
|
conf.bars.mouse[j].func(conf.bars.mouse[j].cmd);
|
||||||
|
|
||||||
|
/* Selbar */
|
||||||
|
if(conf.bars.selbar && ev->window == infobar[selscreen].selbar->win)
|
||||||
|
for(i = 0; i < conf.selbar.nmouse; ++i)
|
||||||
|
if(conf.selbar.mouse[i].tag == seltag[conf.selbar.mouse[i].screen]
|
||||||
|
|| conf.selbar.mouse[i].tag < 0)
|
||||||
|
if(ev->button == conf.selbar.mouse[i].button)
|
||||||
|
if(conf.selbar.mouse[i].func)
|
||||||
|
conf.selbar.mouse[i].func(conf.selbar.mouse[i].cmd);
|
||||||
|
|
||||||
/* Tags */
|
/* Tags */
|
||||||
for(i = 1; i < conf.ntag[selscreen] + 1; ++i)
|
for(i = 1; i < conf.ntag[selscreen] + 1; ++i)
|
||||||
if(ev->window == infobar[selscreen].tags[i]->win)
|
if(ev->window == infobar[selscreen].tags[i]->win)
|
||||||
switch(ev->button)
|
{
|
||||||
{
|
for(j = 0; j < tags[selscreen][i].nmouse; ++j)
|
||||||
case Button1: tag_set(i); break;
|
if(ev->button == tags[selscreen][i].mouse[j].button)
|
||||||
case Button3: tag_transfert(sel, i); break;
|
if(tags[selscreen][i].mouse[j].func)
|
||||||
case Button4: tag_set(seltag[selscreen] + 1); break;
|
tags[selscreen][i].mouse[j].func(tags[selscreen][i].mouse[j].cmd);
|
||||||
case Button5: tag_set(seltag[selscreen] - 1); break;
|
|
||||||
}
|
/* Mouse button action on tag */
|
||||||
|
if(ev->button == conf.mouse_tag_action[TagSel])
|
||||||
|
tag_set(i);
|
||||||
|
else if(ev->button == conf.mouse_tag_action[TagTransfert])
|
||||||
|
tag_transfert(sel, i);
|
||||||
|
else if(ev->button == conf.mouse_tag_action[TagAdd])
|
||||||
|
tag_additional(selscreen, seltag[selscreen], i);
|
||||||
|
else if(ev->button == conf.mouse_tag_action[TagNext])
|
||||||
|
tag_set(seltag[selscreen] + 1);
|
||||||
|
else if(ev->button == conf.mouse_tag_action[TagPrev])
|
||||||
|
tag_set(seltag[selscreen] - 1);
|
||||||
|
}
|
||||||
|
|
||||||
/* Layout button */
|
/* Layout button */
|
||||||
if(ev->window == infobar[selscreen].layout_button->win && conf.nlayout > 1)
|
if(ev->window == infobar[selscreen].layout_button->win && conf.nlayout > 1)
|
||||||
@@ -425,6 +447,8 @@ keypress(XKeyPressedEvent *ev)
|
|||||||
void
|
void
|
||||||
mappingnotify(XMappingEvent *ev)
|
mappingnotify(XMappingEvent *ev)
|
||||||
{
|
{
|
||||||
|
XRefreshKeyboardMapping(ev);
|
||||||
|
|
||||||
if(ev->request == MappingKeyboard)
|
if(ev->request == MappingKeyboard)
|
||||||
grabkeys();
|
grabkeys();
|
||||||
|
|
||||||
@@ -457,6 +481,7 @@ propertynotify(XPropertyEvent *ev)
|
|||||||
{
|
{
|
||||||
Client *c;
|
Client *c;
|
||||||
Window trans;
|
Window trans;
|
||||||
|
XWMHints *h;
|
||||||
|
|
||||||
if(ev->state == PropertyDelete)
|
if(ev->state == PropertyDelete)
|
||||||
return;
|
return;
|
||||||
@@ -465,7 +490,6 @@ propertynotify(XPropertyEvent *ev)
|
|||||||
{
|
{
|
||||||
switch(ev->atom)
|
switch(ev->atom)
|
||||||
{
|
{
|
||||||
default: break;
|
|
||||||
case XA_WM_TRANSIENT_FOR:
|
case XA_WM_TRANSIENT_FOR:
|
||||||
XGetTransientForHint(dpy, c->win, &trans);
|
XGetTransientForHint(dpy, c->win, &trans);
|
||||||
if((c->flags & TileFlag || c->flags & MaxFlag))
|
if((c->flags & TileFlag || c->flags & MaxFlag))
|
||||||
@@ -476,12 +500,25 @@ propertynotify(XPropertyEvent *ev)
|
|||||||
case XA_WM_NORMAL_HINTS:
|
case XA_WM_NORMAL_HINTS:
|
||||||
client_size_hints(c);
|
client_size_hints(c);
|
||||||
break;
|
break;
|
||||||
|
case XA_WM_HINTS:
|
||||||
|
if((h = XGetWMHints(dpy, c->win)) && (h->flags & XUrgencyHint) && c != sel)
|
||||||
|
{
|
||||||
|
c->flags |= UrgentFlag;
|
||||||
|
|
||||||
|
tags[c->screen][c->tag].urgent = True;
|
||||||
|
infobar_draw_taglist(c->screen);
|
||||||
|
|
||||||
|
XFree(h);
|
||||||
|
}
|
||||||
|
break;
|
||||||
case XA_WM_NAME:
|
case XA_WM_NAME:
|
||||||
client_get_name(c);
|
client_get_name(c);
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
if(ev->atom == net_atom[net_wm_name])
|
||||||
|
client_get_name(c);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
if(ev->atom == net_atom[net_wm_name])
|
|
||||||
client_get_name(c);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|||||||
12
src/ewmh.c
12
src/ewmh.c
@@ -149,13 +149,11 @@ void
|
|||||||
ewmh_update_current_tag_prop(void)
|
ewmh_update_current_tag_prop(void)
|
||||||
{
|
{
|
||||||
int t;
|
int t;
|
||||||
char *s = NULL;
|
char s[8] = { 0 };
|
||||||
|
|
||||||
screen_get_sel();
|
screen_get_sel();
|
||||||
t = seltag[selscreen] - 1;
|
t = seltag[selscreen] - 1;
|
||||||
|
|
||||||
s = emalloc(8, sizeof(char));
|
|
||||||
|
|
||||||
/* Get current desktop (tag) */
|
/* Get current desktop (tag) */
|
||||||
XChangeProperty(dpy, ROOT, net_atom[net_current_desktop], XA_CARDINAL, 32,
|
XChangeProperty(dpy, ROOT, net_atom[net_current_desktop], XA_CARDINAL, 32,
|
||||||
PropModeReplace, (uchar*)&t, 1);
|
PropModeReplace, (uchar*)&t, 1);
|
||||||
@@ -180,8 +178,6 @@ ewmh_update_current_tag_prop(void)
|
|||||||
PropModeReplace, (uchar*)tags[selscreen][seltag[selscreen]].layout.symbol,
|
PropModeReplace, (uchar*)tags[selscreen][seltag[selscreen]].layout.symbol,
|
||||||
strlen(tags[selscreen][seltag[selscreen]].layout.symbol));
|
strlen(tags[selscreen][seltag[selscreen]].layout.symbol));
|
||||||
|
|
||||||
free(s);
|
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -203,7 +199,7 @@ ewmh_get_client_list(void)
|
|||||||
XChangeProperty(dpy, ROOT, net_atom[net_client_list], XA_WINDOW, 32,
|
XChangeProperty(dpy, ROOT, net_atom[net_client_list], XA_WINDOW, 32,
|
||||||
PropModeReplace, (uchar *)list, win_n);
|
PropModeReplace, (uchar *)list, win_n);
|
||||||
|
|
||||||
free(list);
|
XFree(list);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -214,7 +210,7 @@ void
|
|||||||
ewmh_get_desktop_names(void)
|
ewmh_get_desktop_names(void)
|
||||||
{
|
{
|
||||||
char *str = NULL;
|
char *str = NULL;
|
||||||
int S, s, i, len = 0, pos = 0;
|
int S, s, i = 0, len = 0, pos = 0;
|
||||||
|
|
||||||
S = screen_count();
|
S = screen_count();
|
||||||
|
|
||||||
@@ -304,7 +300,6 @@ ewmh_manage_net_wm_state(long data_l[], Client *c)
|
|||||||
if(data_l[0] == _NET_WM_STATE_ADD && !(c->flags & FSSFlag))
|
if(data_l[0] == _NET_WM_STATE_ADD && !(c->flags & FSSFlag))
|
||||||
{
|
{
|
||||||
c->screen = screen_get_with_geo(c->geo.x, c->geo.y);
|
c->screen = screen_get_with_geo(c->geo.x, c->geo.y);
|
||||||
client_unmap(c);
|
|
||||||
c->flags &= ~UnmapFlag;
|
c->flags &= ~UnmapFlag;
|
||||||
XMapWindow(dpy, c->win);
|
XMapWindow(dpy, c->win);
|
||||||
XReparentWindow(dpy, c->win, ROOT, spgeo[c->screen].x, spgeo[c->screen].y);
|
XReparentWindow(dpy, c->win, ROOT, spgeo[c->screen].x, spgeo[c->screen].y);
|
||||||
@@ -321,6 +316,7 @@ ewmh_manage_net_wm_state(long data_l[], Client *c)
|
|||||||
|
|
||||||
client_raise(c);
|
client_raise(c);
|
||||||
client_focus(c);
|
client_focus(c);
|
||||||
|
XUnmapWindow(dpy, c->frame);
|
||||||
}
|
}
|
||||||
else if(data_l[0] == _NET_WM_STATE_REMOVE && (c->flags & FSSFlag))
|
else if(data_l[0] == _NET_WM_STATE_REMOVE && (c->flags & FSSFlag))
|
||||||
{
|
{
|
||||||
|
|||||||
162
src/infobar.c
162
src/infobar.c
@@ -108,7 +108,7 @@ infobar_init(void)
|
|||||||
: infobar[sc].layout_button->geo.x + infobar[sc].layout_button->geo.width + PAD / 2), 1,
|
: infobar[sc].layout_button->geo.x + infobar[sc].layout_button->geo.width + PAD / 2), 1,
|
||||||
(sel) ? textw(sel->title) + PAD : 1,
|
(sel) ? textw(sel->title) + PAD : 1,
|
||||||
infobar[sc].geo.height - 2,
|
infobar[sc].geo.height - 2,
|
||||||
conf.colors.bar, conf.colors.text, False, False, False);
|
conf.selbar.bg, conf.selbar.fg, False, False, False);
|
||||||
|
|
||||||
/* Map/Refresh all */
|
/* Map/Refresh all */
|
||||||
barwin_map(infobar[sc].bar);
|
barwin_map(infobar[sc].bar);
|
||||||
@@ -127,8 +127,7 @@ infobar_init(void)
|
|||||||
barwin_refresh(infobar[sc].bar);
|
barwin_refresh(infobar[sc].bar);
|
||||||
|
|
||||||
/* Default statustext is set here */
|
/* Default statustext is set here */
|
||||||
for(i = 0; i < s; ++i)
|
infobar[sc].statustext = _strdup(WMFS_VERSION);
|
||||||
infobar[i].statustext = _strdup(WMFS_VERSION);
|
|
||||||
|
|
||||||
infobar_draw(sc);
|
infobar_draw(sc);
|
||||||
}
|
}
|
||||||
@@ -157,6 +156,9 @@ infobar_draw(int sc)
|
|||||||
void
|
void
|
||||||
infobar_draw_layout(int sc)
|
infobar_draw_layout(int sc)
|
||||||
{
|
{
|
||||||
|
if(!conf.layout_placement)
|
||||||
|
barwin_move(infobar[sc].layout_button, infobar[sc].tags_board->geo.width + PAD / 2, 0);
|
||||||
|
|
||||||
barwin_resize(infobar[sc].layout_button, textw(tags[sc][seltag[sc]].layout.symbol) + PAD, infobar[sc].geo.height);
|
barwin_resize(infobar[sc].layout_button, textw(tags[sc][seltag[sc]].layout.symbol) + PAD, infobar[sc].geo.height);
|
||||||
barwin_refresh_color(infobar[sc].layout_button);
|
barwin_refresh_color(infobar[sc].layout_button);
|
||||||
|
|
||||||
@@ -172,20 +174,42 @@ infobar_draw_layout(int sc)
|
|||||||
void
|
void
|
||||||
infobar_draw_selbar(int sc)
|
infobar_draw_selbar(int sc)
|
||||||
{
|
{
|
||||||
|
char *str = NULL;
|
||||||
|
|
||||||
if(!conf.bars.selbar)
|
if(!conf.bars.selbar)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if(!sel)
|
||||||
|
{
|
||||||
|
barwin_unmap(infobar[sc].selbar);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if(sel && !infobar[sc].selbar->mapped)
|
||||||
|
barwin_map(infobar[sc].selbar);
|
||||||
|
|
||||||
|
if(conf.selbar.maxlenght >= 0 && sel)
|
||||||
|
{
|
||||||
|
str = emalloc(conf.selbar.maxlenght + 4, sizeof(char));
|
||||||
|
strncpy(str, sel->title, conf.selbar.maxlenght);
|
||||||
|
|
||||||
|
if(strlen(sel->title) > conf.selbar.maxlenght)
|
||||||
|
strcat(str, "...");
|
||||||
|
}
|
||||||
|
|
||||||
|
barwin_resize(infobar[sc].selbar, textw(str ? str : sel->title) + PAD, infobar[sc].geo.height - 2);
|
||||||
|
|
||||||
barwin_move(infobar[sc].selbar,
|
barwin_move(infobar[sc].selbar,
|
||||||
((conf.layout_placement)
|
((conf.layout_placement)
|
||||||
? (infobar[sc].tags_board->geo.x + infobar[sc].tags_board->geo.width + PAD / 2)
|
? (infobar[sc].tags_board->geo.x + infobar[sc].tags_board->geo.width + PAD / 2)
|
||||||
: (infobar[sc].layout_button->geo.x + infobar[sc].layout_button->geo.width + PAD / 2)), 1);
|
: (infobar[sc].layout_button->geo.x + infobar[sc].layout_button->geo.width + PAD / 2)), 1);
|
||||||
|
|
||||||
barwin_resize(infobar[sc].selbar, textw(sel ? sel->title : NULL) + PAD, infobar[sc].geo.height - 2);
|
|
||||||
barwin_refresh_color(infobar[sc].selbar);
|
barwin_refresh_color(infobar[sc].selbar);
|
||||||
barwin_draw_text(infobar[sc].selbar, PAD / 2, FHINFOBAR - 1, (sel) ? sel->title : NULL);
|
barwin_draw_text(infobar[sc].selbar, PAD / 2, FHINFOBAR - 1, ((str) ? str : sel->title));
|
||||||
|
|
||||||
barwin_refresh(infobar[sc].selbar);
|
barwin_refresh(infobar[sc].selbar);
|
||||||
|
|
||||||
|
IFREE(str);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -195,27 +219,58 @@ infobar_draw_selbar(int sc)
|
|||||||
void
|
void
|
||||||
infobar_draw_taglist(int sc)
|
infobar_draw_taglist(int sc)
|
||||||
{
|
{
|
||||||
int i;
|
int i, x, j;
|
||||||
Client *c;
|
Client *c;
|
||||||
|
Bool is_occupied[MAXTAG];
|
||||||
|
|
||||||
if(conf.layout_placement)
|
if(conf.layout_placement)
|
||||||
barwin_move(infobar[sc].tags_board, textw(tags[sc][seltag[sc]].layout.symbol) + PAD * 1.5, 0);
|
barwin_move(infobar[sc].tags_board, textw(tags[sc][seltag[sc]].layout.symbol) + PAD * 1.5, 0);
|
||||||
|
|
||||||
for(i = 1; i < conf.ntag[sc] + 1; ++i)
|
for(i = 0; i < MAXTAG; i++)
|
||||||
|
is_occupied[i] = False;
|
||||||
|
|
||||||
|
for(c = clients; c; c = c->next)
|
||||||
|
if(c->screen == sc)
|
||||||
|
is_occupied[c->tag] = True;
|
||||||
|
|
||||||
|
for(i = 1, x = j = 0; i < conf.ntag[sc] + 1; ++i)
|
||||||
{
|
{
|
||||||
infobar[sc].tags[i]->bg = ((i == seltag[sc]) ? conf.colors.tagselbg : conf.colors.bar);
|
/* Autohide tag feature */
|
||||||
infobar[sc].tags[i]->fg = ((i == seltag[sc]) ? conf.colors.tagselfg : conf.colors.text);
|
if(conf.tagautohide)
|
||||||
|
{
|
||||||
|
if(!is_occupied[i] && i != seltag[sc])
|
||||||
|
{
|
||||||
|
barwin_unmap(infobar[sc].tags[i]);
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!infobar[sc].tags[i]->mapped)
|
||||||
|
barwin_map(infobar[sc].tags[i]);
|
||||||
|
|
||||||
|
barwin_move(infobar[sc].tags[i], x, 0);
|
||||||
|
|
||||||
|
x += infobar[sc].tags[i]->geo.width;
|
||||||
|
|
||||||
|
barwin_resize(infobar[sc].tags_board, x, infobar[sc].geo.height);
|
||||||
|
}
|
||||||
|
|
||||||
|
infobar[sc].tags[i]->bg = tags[sc][i].urgent
|
||||||
|
? conf.colors.tagurbg
|
||||||
|
: ((i == seltag[sc] || tags[sc][seltag[sc]].tagad & TagFlag(i))
|
||||||
|
? conf.colors.tagselbg
|
||||||
|
: (is_occupied[i]
|
||||||
|
? conf.colors.tag_occupied_bg
|
||||||
|
: conf.colors.bar));
|
||||||
|
|
||||||
|
infobar[sc].tags[i]->fg = tags[sc][i].urgent
|
||||||
|
? conf.colors.tagurfg
|
||||||
|
: ((i == seltag[sc] || tags[sc][seltag[sc]].tagad & TagFlag(i))
|
||||||
|
? conf.colors.tagselfg
|
||||||
|
: conf.colors.text);
|
||||||
|
|
||||||
barwin_refresh_color(infobar[sc].tags[i]);
|
barwin_refresh_color(infobar[sc].tags[i]);
|
||||||
|
|
||||||
/* Colorize a tag if there are clients in this */
|
|
||||||
for(c = clients; c; c = c->next)
|
|
||||||
{
|
|
||||||
if(c->screen == sc)
|
|
||||||
{
|
|
||||||
infobar[sc].tags[c->tag]->bg = ((c->tag == seltag[sc]) ? conf.colors.tagselbg : conf.colors.tag_occupied_bg);
|
|
||||||
barwin_refresh_color(infobar[sc].tags[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(tags[sc][i].name)
|
if(tags[sc][i].name)
|
||||||
barwin_draw_text(infobar[sc].tags[i], PAD / 2, FHINFOBAR, tags[sc][i].name);
|
barwin_draw_text(infobar[sc].tags[i], PAD / 2, FHINFOBAR, tags[sc][i].name);
|
||||||
}
|
}
|
||||||
@@ -223,6 +278,46 @@ infobar_draw_taglist(int sc)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Update taglist geo
|
||||||
|
*\param sc Screen number
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
infobar_update_taglist(int sc)
|
||||||
|
{
|
||||||
|
int i, j;
|
||||||
|
|
||||||
|
for(i = 1, j = 0; i < conf.ntag[sc] + 1; ++i)
|
||||||
|
{
|
||||||
|
/* If the tag i does not exist yet (graphically) or need full update */
|
||||||
|
if(!infobar[sc].tags[i] || infobar[sc].need_update)
|
||||||
|
{
|
||||||
|
infobar[sc].tags[i] = barwin_create(infobar[sc].tags_board->win, j, 0,
|
||||||
|
textw(tags[sc][i].name) + PAD,
|
||||||
|
infobar[sc].geo.height,
|
||||||
|
conf.colors.bar, conf.colors.text, False, False, conf.border.tag);
|
||||||
|
|
||||||
|
barwin_map(infobar[sc].tags[i]);
|
||||||
|
barwin_map_subwin(infobar[sc].tags[i]);
|
||||||
|
|
||||||
|
j += textw(tags[sc][i].name) + PAD;
|
||||||
|
|
||||||
|
barwin_resize(infobar[sc].tags_board, j, infobar[sc].geo.height);
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
barwin_move(infobar[sc].tags[i], j, 0);
|
||||||
|
j += textw(tags[sc][i].name) + PAD;
|
||||||
|
barwin_resize(infobar[sc].tags[i], textw(tags[sc][i].name) + PAD, infobar[sc].geo.height);
|
||||||
|
barwin_resize(infobar[sc].tags_board, j, infobar[sc].geo.height);
|
||||||
|
}
|
||||||
|
|
||||||
|
infobar[sc].need_update = False;
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/** Destroy the InfoBar
|
/** Destroy the InfoBar
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
@@ -243,6 +338,7 @@ infobar_destroy(void)
|
|||||||
|
|
||||||
barwin_delete_subwin(infobar[sc].tags_board);
|
barwin_delete_subwin(infobar[sc].tags_board);
|
||||||
barwin_delete(infobar[sc].tags_board);
|
barwin_delete(infobar[sc].tags_board);
|
||||||
|
barwin_delete(infobar[sc].selbar);
|
||||||
barwin_delete_subwin(infobar[sc].bar);
|
barwin_delete_subwin(infobar[sc].bar);
|
||||||
barwin_delete(infobar[sc].bar);
|
barwin_delete(infobar[sc].bar);
|
||||||
}
|
}
|
||||||
@@ -303,3 +399,33 @@ uicb_infobar_togglepos(uicb_t cmd)
|
|||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Toggle the tag_autohide mode
|
||||||
|
* \param cmd uicb_t type unused
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
uicb_toggle_tagautohide(uicb_t cmd)
|
||||||
|
{
|
||||||
|
int i, x;
|
||||||
|
|
||||||
|
screen_get_sel();
|
||||||
|
conf.tagautohide = !conf.tagautohide;
|
||||||
|
|
||||||
|
if(!conf.tagautohide)
|
||||||
|
{
|
||||||
|
for(i = 1, x = 0; i < conf.ntag[selscreen] + 1; ++i)
|
||||||
|
{
|
||||||
|
if(!infobar[selscreen].tags[i]->mapped)
|
||||||
|
barwin_map(infobar[selscreen].tags[i]);
|
||||||
|
|
||||||
|
barwin_move(infobar[selscreen].tags[i], x, 0);
|
||||||
|
x += infobar[selscreen].tags[i]->geo.width;
|
||||||
|
}
|
||||||
|
|
||||||
|
barwin_resize(infobar[selscreen].tags_board, x, infobar[selscreen].geo.height);
|
||||||
|
}
|
||||||
|
|
||||||
|
infobar_draw(selscreen);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|||||||
54
src/init.c
54
src/init.c
@@ -35,23 +35,23 @@
|
|||||||
|
|
||||||
const func_name_list_t layout_list[] =
|
const func_name_list_t layout_list[] =
|
||||||
{
|
{
|
||||||
{"tile", tile },
|
{"tile", tile },
|
||||||
{"tile_right", tile },
|
{"tile_right", tile },
|
||||||
{"tile_left", tile_left },
|
{"tile_left", tile_left },
|
||||||
{"tile_top", tile_top },
|
{"tile_top", tile_top },
|
||||||
{"tile_bottom", tile_bottom },
|
{"tile_bottom", tile_bottom },
|
||||||
{"tile_grid", grid },
|
{"tile_grid", grid },
|
||||||
{"grid", grid },
|
{"grid", grid },
|
||||||
{"mirror_vertical", mirror_vertical },
|
{"mirror_vertical", mirror_vertical },
|
||||||
{"tile_mirror_vertical", mirror_vertical },
|
{"tile_mirror_vertical", mirror_vertical },
|
||||||
{"mirror_horizontal", mirror_horizontal },
|
{"mirror_horizontal", mirror_horizontal },
|
||||||
{"tile_mirror_horizontal", mirror_horizontal },
|
{"tile_mirror_horizontal", mirror_horizontal },
|
||||||
{"layer", layer },
|
{"layer", layer },
|
||||||
{"max", maxlayout },
|
{"max", maxlayout },
|
||||||
{"maxlayout", maxlayout },
|
{"maxlayout", maxlayout },
|
||||||
{"freelayout", freelayout },
|
{"freelayout", freelayout },
|
||||||
{"free", freelayout },
|
{"free", freelayout },
|
||||||
{ NULL, NULL }
|
{ NULL, NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Init WMFS
|
/** Init WMFS
|
||||||
@@ -180,45 +180,35 @@ init_root(void)
|
|||||||
void
|
void
|
||||||
init_status(void)
|
init_status(void)
|
||||||
{
|
{
|
||||||
int fd;
|
|
||||||
struct stat st;
|
struct stat st;
|
||||||
char *home;
|
char *home;
|
||||||
|
|
||||||
|
conf.status_pid = -1;
|
||||||
|
estatus = False;
|
||||||
|
|
||||||
if(!conf.status_path)
|
if(!conf.status_path)
|
||||||
{
|
{
|
||||||
if(!(home = getenv("HOME")))
|
if(!(home = getenv("HOME")))
|
||||||
{
|
{
|
||||||
warnx("HOME not set, can't launch status.sh");
|
warnx("HOME not set, can't launch status.sh");
|
||||||
estatus = False;
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
conf.status_path = emalloc(strlen(home) + strlen(DEF_STATUS) + 2, sizeof(char));
|
conf.status_path = emalloc(strlen(home) + strlen(DEF_STATUS) + 2, sizeof(char));
|
||||||
|
|
||||||
sprintf(conf.status_path, "%s/"DEF_STATUS, home);
|
sprintf(conf.status_path, "%s/"DEF_STATUS, home);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!(fd = open(conf.status_path, O_RDONLY))
|
if (stat(conf.status_path, &st) == -1)
|
||||||
|| !fopen(conf.status_path, "r"))
|
|
||||||
{
|
{
|
||||||
free(conf.status_path);
|
warn("%s", conf.status_path);
|
||||||
estatus = False;
|
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
stat(conf.status_path, &st);
|
|
||||||
|
|
||||||
if(st.st_size && st.st_mode & S_IXUSR)
|
if(st.st_size && st.st_mode & S_IXUSR)
|
||||||
{
|
|
||||||
estatus = True;
|
estatus = True;
|
||||||
spawn(conf.status_path);
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
warnx("status file specified in configuratin (status_path) or present in wmfs directory can't be executed, try 'chmod +x %s'.", conf.status_path);
|
warnx("status file specified in configuratin (status_path) or present in wmfs directory can't be executed, try 'chmod +x %s'.", conf.status_path);
|
||||||
|
|
||||||
close(fd);
|
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ static char *complete_on_command(char*, size_t);
|
|||||||
static char *complete_on_files(char*, size_t);
|
static char *complete_on_files(char*, size_t);
|
||||||
|
|
||||||
void
|
void
|
||||||
launcher_execute(Launcher launcher)
|
launcher_execute(Launcher *launcher)
|
||||||
{
|
{
|
||||||
BarWindow *bw;
|
BarWindow *bw;
|
||||||
Bool found;
|
Bool found;
|
||||||
@@ -52,7 +52,7 @@ launcher_execute(Launcher launcher)
|
|||||||
char buf[512] = { 0 };
|
char buf[512] = { 0 };
|
||||||
char tmpbuf[512] = { 0 };
|
char tmpbuf[512] = { 0 };
|
||||||
char *complete;
|
char *complete;
|
||||||
int pos = 0, x;
|
int i, pos = 0, histpos = 0, x;
|
||||||
int tabhits = 0;
|
int tabhits = 0;
|
||||||
KeySym ks;
|
KeySym ks;
|
||||||
XEvent ev;
|
XEvent ev;
|
||||||
@@ -76,12 +76,16 @@ launcher_execute(Launcher launcher)
|
|||||||
|
|
||||||
/* First draw of the cursor */
|
/* First draw of the cursor */
|
||||||
XSetForeground(dpy, gc, getcolor(infobar[selscreen].bar->fg));
|
XSetForeground(dpy, gc, getcolor(infobar[selscreen].bar->fg));
|
||||||
XDrawLine(dpy, bw->dr, gc, textw(launcher.prompt) + textw(" "),
|
/*XDrawLine(dpy, bw->dr, gc, 1 + textw(launcher->prompt) + textw(" "),
|
||||||
2, textw(launcher.prompt) + textw(" "), INFOBARH - 4);
|
, 1 + textw(launcher->prompt) + textw(" "), INFOBARH - 4);
|
||||||
|
*/
|
||||||
|
XDrawLine(dpy, bw->dr, gc,
|
||||||
|
1 + textw(launcher->prompt) + textw(" ") + textw(buf), 2,
|
||||||
|
1 + textw(launcher->prompt) + textw(" ") + textw(buf), INFOBARH - 4);
|
||||||
|
|
||||||
barwin_refresh(bw);
|
barwin_refresh(bw);
|
||||||
|
|
||||||
barwin_draw_text(bw, 1, FHINFOBAR - 1, launcher.prompt);
|
barwin_draw_text(bw, 1, FHINFOBAR - 1, launcher->prompt);
|
||||||
|
|
||||||
while(my_guitar_gently_wheeps)
|
while(my_guitar_gently_wheeps)
|
||||||
{
|
{
|
||||||
@@ -91,8 +95,14 @@ launcher_execute(Launcher launcher)
|
|||||||
|
|
||||||
/* Check Ctrl-c / Ctrl-d */
|
/* Check Ctrl-c / Ctrl-d */
|
||||||
if(ev.xkey.state & ControlMask)
|
if(ev.xkey.state & ControlMask)
|
||||||
|
{
|
||||||
if(ks == XK_c || ks == XK_d)
|
if(ks == XK_c || ks == XK_d)
|
||||||
ks = XK_Escape;
|
ks = XK_Escape;
|
||||||
|
else if(ks == XK_p)
|
||||||
|
ks = XK_Up;
|
||||||
|
else if(ks == XK_n)
|
||||||
|
ks = XK_Down;
|
||||||
|
}
|
||||||
|
|
||||||
/* Check if there is a keypad */
|
/* Check if there is a keypad */
|
||||||
if(IsKeypadKey(ks) && ks == XK_KP_Enter)
|
if(IsKeypadKey(ks) && ks == XK_KP_Enter)
|
||||||
@@ -100,13 +110,43 @@ launcher_execute(Launcher launcher)
|
|||||||
|
|
||||||
switch(ks)
|
switch(ks)
|
||||||
{
|
{
|
||||||
|
case XK_Up:
|
||||||
|
if(launcher->nhisto)
|
||||||
|
{
|
||||||
|
if(histpos >= launcher->nhisto)
|
||||||
|
histpos = 0;
|
||||||
|
strncpy(buf, launcher->histo[launcher->nhisto - ++histpos], sizeof(buf));
|
||||||
|
pos = strlen(buf);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case XK_Down:
|
||||||
|
if(launcher->nhisto && histpos > 0 && histpos < launcher->nhisto)
|
||||||
|
{
|
||||||
|
strncpy(buf, launcher->histo[launcher->nhisto - --histpos], sizeof(buf));
|
||||||
|
pos = strlen(buf);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case XK_Return:
|
case XK_Return:
|
||||||
spawn("%s %s", launcher.command, buf);
|
spawn("%s %s", launcher->command, buf);
|
||||||
|
/* Histo */
|
||||||
|
if(launcher->nhisto + 1 > HISTOLEN)
|
||||||
|
{
|
||||||
|
for(i = launcher->nhisto - 1; i > 1; --i)
|
||||||
|
strncpy(launcher->histo[i], launcher->histo[i - 1], sizeof(launcher->histo[i]));
|
||||||
|
|
||||||
|
launcher->nhisto = 0;
|
||||||
|
}
|
||||||
|
/* Store in histo array */
|
||||||
|
strncpy(launcher->histo[launcher->nhisto++], buf, sizeof(buf));
|
||||||
|
|
||||||
my_guitar_gently_wheeps = 0;
|
my_guitar_gently_wheeps = 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case XK_Escape:
|
case XK_Escape:
|
||||||
my_guitar_gently_wheeps = 0;
|
my_guitar_gently_wheeps = 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case XK_Tab:
|
case XK_Tab:
|
||||||
/*
|
/*
|
||||||
* completion
|
* completion
|
||||||
@@ -156,9 +196,10 @@ launcher_execute(Launcher launcher)
|
|||||||
if(pos)
|
if(pos)
|
||||||
buf[--pos] = 0;
|
buf[--pos] = 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
lastwastab = False;
|
lastwastab = False;
|
||||||
strncat(buf, tmp, sizeof(buf));
|
strncat(buf, tmp, sizeof(tmp));
|
||||||
++pos;
|
++pos;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -168,11 +209,11 @@ launcher_execute(Launcher launcher)
|
|||||||
/* Update cursor position */
|
/* Update cursor position */
|
||||||
XSetForeground(dpy, gc, getcolor(infobar[selscreen].bar->fg));
|
XSetForeground(dpy, gc, getcolor(infobar[selscreen].bar->fg));
|
||||||
XDrawLine(dpy, bw->dr, gc,
|
XDrawLine(dpy, bw->dr, gc,
|
||||||
1 + textw(launcher.prompt) + textw(" ") + textw(buf), 2,
|
1 + textw(launcher->prompt) + textw(" ") + textw(buf), 2,
|
||||||
1 + textw(launcher.prompt) + textw(" ") + textw(buf), INFOBARH - 4);
|
1 + textw(launcher->prompt) + textw(" ") + textw(buf), INFOBARH - 4);
|
||||||
|
|
||||||
barwin_draw_text(bw, 1, FHINFOBAR - 1, launcher.prompt);
|
barwin_draw_text(bw, 1, FHINFOBAR - 1, launcher->prompt);
|
||||||
barwin_draw_text(bw, 1 + textw(launcher.prompt) + textw(" "), FHINFOBAR - 1, buf);
|
barwin_draw_text(bw, 1 + textw(launcher->prompt) + textw(" "), FHINFOBAR - 1, buf);
|
||||||
barwin_refresh(bw);
|
barwin_refresh(bw);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -197,7 +238,7 @@ uicb_launcher(uicb_t cmd)
|
|||||||
|
|
||||||
for(i = 0; i < conf.nlauncher; ++i)
|
for(i = 0; i < conf.nlauncher; ++i)
|
||||||
if(!strcmp(cmd, conf.launcher[i].name))
|
if(!strcmp(cmd, conf.launcher[i].name))
|
||||||
launcher_execute(conf.launcher[i]);
|
launcher_execute(&conf.launcher[i]);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
49
src/layout.c
49
src/layout.c
@@ -331,7 +331,7 @@ multi_tile(int screen, Position type)
|
|||||||
XRectangle sg = sgeo[screen];
|
XRectangle sg = sgeo[screen];
|
||||||
XRectangle mastergeo = {sg.x, sg.y, 0, 0};
|
XRectangle mastergeo = {sg.x, sg.y, 0, 0};
|
||||||
XRectangle cgeo = {sg.x, sg.y, 0, 0};
|
XRectangle cgeo = {sg.x, sg.y, 0, 0};
|
||||||
uint i, n, tilesize, mwfact, nmaster = tags[screen][seltag[screen]].nmaster;
|
uint i, n, tilesize = 0, mwfact, nmaster = tags[screen][seltag[screen]].nmaster;
|
||||||
|
|
||||||
for(n = 0, c = tiled_client(screen, clients); c; c = tiled_client(screen, c->next), ++n);
|
for(n = 0, c = tiled_client(screen, clients); c; c = tiled_client(screen, c->next), ++n);
|
||||||
CHECK(n);
|
CHECK(n);
|
||||||
@@ -462,7 +462,7 @@ mirror(int screen, Bool horizontal)
|
|||||||
XRectangle mastergeo = {sg.x, sg.y, sg.width, sg.height};
|
XRectangle mastergeo = {sg.x, sg.y, sg.width, sg.height};
|
||||||
XRectangle cgeo = {sg.x, sg.y , sg.width, sg.height};
|
XRectangle cgeo = {sg.x, sg.y , sg.width, sg.height};
|
||||||
XRectangle nextg[2] = { {0} };
|
XRectangle nextg[2] = { {0} };
|
||||||
uint i, n, tilesize, mwfact;
|
uint i, n, tilesize = 0, mwfact;
|
||||||
uint nmaster = tags[screen][seltag[screen]].nmaster;
|
uint nmaster = tags[screen][seltag[screen]].nmaster;
|
||||||
int pa, imp;
|
int pa, imp;
|
||||||
Bool isp = 0;
|
Bool isp = 0;
|
||||||
@@ -916,3 +916,48 @@ layout_set_client_master(Client *c)
|
|||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Check the selected client is max
|
||||||
|
* \param cmd uicb_t type unused
|
||||||
|
*/
|
||||||
|
Bool
|
||||||
|
uicb_checkmax(uicb_t cmd)
|
||||||
|
{
|
||||||
|
if(!sel)
|
||||||
|
return False;
|
||||||
|
|
||||||
|
if(sel->flags & MaxFlag)
|
||||||
|
return True;
|
||||||
|
|
||||||
|
return False;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Check the selected client is free
|
||||||
|
* \param cmd uicb_t type unused
|
||||||
|
*/
|
||||||
|
Bool
|
||||||
|
uicb_checkfree(uicb_t cmd)
|
||||||
|
{
|
||||||
|
if(!sel)
|
||||||
|
return False;
|
||||||
|
|
||||||
|
if(sel->flags & FreeFlag)
|
||||||
|
return True;
|
||||||
|
|
||||||
|
return False;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Check layout type
|
||||||
|
* \param cmd uicb_t type layout type
|
||||||
|
*/
|
||||||
|
Bool
|
||||||
|
uicb_checklayout(uicb_t cmd)
|
||||||
|
{
|
||||||
|
screen_get_sel();
|
||||||
|
|
||||||
|
if(!strcmp(cmd, tags[selscreen][seltag[selscreen]].layout.type))
|
||||||
|
return True;
|
||||||
|
|
||||||
|
return False;
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
105
src/menu.c
105
src/menu.c
@@ -35,7 +35,6 @@
|
|||||||
void
|
void
|
||||||
menu_init(Menu *menu, char *name, int nitem, uint bg_f, char *fg_f, uint bg_n, char *fg_n)
|
menu_init(Menu *menu, char *name, int nitem, uint bg_f, char *fg_f, uint bg_n, char *fg_n)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Item */
|
/* Item */
|
||||||
menu->nitem = nitem;
|
menu->nitem = nitem;
|
||||||
menu->item = emalloc(sizeof(MenuItem), nitem);
|
menu->item = emalloc(sizeof(MenuItem), nitem);
|
||||||
@@ -63,15 +62,23 @@ menu_new_item(MenuItem *mi, char *name, void *func, char *cmd)
|
|||||||
void
|
void
|
||||||
menu_draw(Menu menu, int x, int y)
|
menu_draw(Menu menu, int x, int y)
|
||||||
{
|
{
|
||||||
int i, width;
|
int i, width, height, out;
|
||||||
XEvent ev;
|
XEvent ev;
|
||||||
BarWindow *item[menu.nitem];
|
BarWindow *item[menu.nitem];
|
||||||
BarWindow *frame;
|
BarWindow *frame;
|
||||||
|
|
||||||
width = menu_get_longer_string(menu.item, menu.nitem);
|
width = menu_get_longer_string(menu.item, menu.nitem) + PAD * 3;
|
||||||
|
height = menu.nitem * (INFOBARH - SHADH);
|
||||||
|
|
||||||
/* Frame barwin */
|
/* Frame barwin */
|
||||||
frame = barwin_create(ROOT, x, y, width + SHADH, menu.nitem * (INFOBARH - SHADH) + SHADH * 2,
|
screen_get_sel();
|
||||||
|
|
||||||
|
if((out = x + width - MAXW) > 0)
|
||||||
|
x -= out;
|
||||||
|
if((out = y + height - MAXH) > 0)
|
||||||
|
y -= out;
|
||||||
|
|
||||||
|
frame = barwin_create(ROOT, x, y, width + SHADH, height + SHADH * 2,
|
||||||
menu.colors.normal.bg, menu.colors.normal.fg, False, False, True);
|
menu.colors.normal.bg, menu.colors.normal.fg, False, False, True);
|
||||||
|
|
||||||
barwin_map(frame);
|
barwin_map(frame);
|
||||||
@@ -84,7 +91,7 @@ menu_draw(Menu menu, int x, int y)
|
|||||||
SHADH,
|
SHADH,
|
||||||
(i * (INFOBARH - SHADH) + SHADH),
|
(i * (INFOBARH - SHADH) + SHADH),
|
||||||
width - SHADH,
|
width - SHADH,
|
||||||
INFOBARH,
|
INFOBARH - SHADH,
|
||||||
menu.colors.normal.bg,
|
menu.colors.normal.bg,
|
||||||
menu.colors.normal.fg,
|
menu.colors.normal.fg,
|
||||||
True, False, False);
|
True, False, False);
|
||||||
@@ -127,12 +134,7 @@ menu_manage_event(XEvent *ev, Menu *menu, BarWindow *winitem[])
|
|||||||
{
|
{
|
||||||
if(ev->xbutton.window == winitem[i]->win
|
if(ev->xbutton.window == winitem[i]->win
|
||||||
&& (ev->xbutton.button == Button1 || ev->xbutton.button == Button2))
|
&& (ev->xbutton.button == Button1 || ev->xbutton.button == Button2))
|
||||||
{
|
quit = menu_activate_item(menu, i);
|
||||||
if(menu->item[i].func)
|
|
||||||
menu->item[i].func(menu->item[i].cmd);
|
|
||||||
|
|
||||||
quit = True;
|
|
||||||
}
|
|
||||||
else if(ev->xbutton.window != winitem[i]->win)
|
else if(ev->xbutton.window != winitem[i]->win)
|
||||||
++c;
|
++c;
|
||||||
else if(ev->xbutton.button == Button4)
|
else if(ev->xbutton.button == Button4)
|
||||||
@@ -161,9 +163,7 @@ menu_manage_event(XEvent *ev, Menu *menu, BarWindow *winitem[])
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case XK_Return:
|
case XK_Return:
|
||||||
if(menu->item[menu->focus_item].func)
|
quit = menu_activate_item(menu, menu->focus_item);
|
||||||
menu->item[menu->focus_item].func(menu->item[menu->focus_item].cmd);
|
|
||||||
quit = True;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case XK_Escape:
|
case XK_Escape:
|
||||||
@@ -190,6 +190,33 @@ menu_manage_event(XEvent *ev, Menu *menu, BarWindow *winitem[])
|
|||||||
return quit;
|
return quit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Bool
|
||||||
|
menu_activate_item(Menu *menu, int i)
|
||||||
|
{
|
||||||
|
int j, x, y;
|
||||||
|
|
||||||
|
if(menu->item[i].submenu)
|
||||||
|
{
|
||||||
|
for(j = 0; j < conf.nmenu; ++j)
|
||||||
|
if(!strcmp(menu->item[i].submenu, conf.menu[j].name))
|
||||||
|
{
|
||||||
|
y = menu->y + ((i - 1) * INFOBARH + PAD) - SHADH * 2;
|
||||||
|
x = menu->x + menu_get_longer_string(menu->item, menu->nitem) + PAD * 3;
|
||||||
|
|
||||||
|
menu_draw(conf.menu[j], x, y);
|
||||||
|
|
||||||
|
return True;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(menu->item[i].func)
|
||||||
|
{
|
||||||
|
menu->item[i].func(menu->item[i].cmd);
|
||||||
|
|
||||||
|
return True;
|
||||||
|
}
|
||||||
|
|
||||||
|
return False;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
menu_focus_item(Menu *menu, int item, BarWindow *winitem[])
|
menu_focus_item(Menu *menu, int item, BarWindow *winitem[])
|
||||||
@@ -219,26 +246,44 @@ menu_focus_item(Menu *menu, int item, BarWindow *winitem[])
|
|||||||
void
|
void
|
||||||
menu_draw_item_name(Menu *menu, int item, BarWindow *winitem[])
|
menu_draw_item_name(Menu *menu, int item, BarWindow *winitem[])
|
||||||
{
|
{
|
||||||
|
int x;
|
||||||
int width = menu_get_longer_string(menu->item, menu->nitem);
|
int width = menu_get_longer_string(menu->item, menu->nitem);
|
||||||
|
|
||||||
barwin_draw_text(winitem[item],
|
switch(menu->align)
|
||||||
((width / 2) - (textw(menu->item[item].name) / 2)),
|
{
|
||||||
FHINFOBAR,
|
case MA_Left:
|
||||||
menu->item[item].name);
|
x = PAD * 3 / 2;
|
||||||
|
break;
|
||||||
|
case MA_Right:
|
||||||
|
x = width - textw(menu->item[item].name) + PAD * 3 / 2;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
case MA_Center:
|
||||||
|
x = width / 2 - textw(menu->item[item].name) / 2 + PAD * 3 / 2;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
barwin_draw_text(winitem[item], x, FHINFOBAR, menu->item[item].name);
|
||||||
|
|
||||||
|
if(menu->item[item].check)
|
||||||
|
if(menu->item[item].check(menu->item[item].cmd))
|
||||||
|
barwin_draw_text(winitem[item], PAD / 3, FHINFOBAR, "*");
|
||||||
|
|
||||||
|
if(menu->item[item].submenu)
|
||||||
|
barwin_draw_text(winitem[item], width + PAD * 2, FHINFOBAR, ">");
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
menu_get_longer_string(MenuItem *mt, int nitem)
|
menu_get_longer_string(MenuItem *mi, int nitem)
|
||||||
{
|
{
|
||||||
int i, l = 0;
|
int i, w, l = 0;
|
||||||
|
|
||||||
for(i = 0; i < nitem; ++i)
|
for(i = 0; i < nitem; ++i)
|
||||||
if(textw(mt[i].name) > l)
|
if((w = textw(mi[i].name)) > l)
|
||||||
l = textw(mt[i].name);
|
l = w;
|
||||||
|
|
||||||
return l + PAD;
|
return l;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -254,7 +299,11 @@ uicb_menu(uicb_t cmd)
|
|||||||
if(!strcmp(cmd, conf.menu[i].name))
|
if(!strcmp(cmd, conf.menu[i].name))
|
||||||
{
|
{
|
||||||
if(conf.menu[i].place_at_mouse)
|
if(conf.menu[i].place_at_mouse)
|
||||||
|
{
|
||||||
XQueryPointer(dpy, ROOT, &w, &w, &x, &y, &d, &d, (uint *)&u);
|
XQueryPointer(dpy, ROOT, &w, &w, &x, &y, &d, &d, (uint *)&u);
|
||||||
|
conf.menu[i].x = x;
|
||||||
|
conf.menu[i].y = y;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
screen_get_sel();
|
screen_get_sel();
|
||||||
@@ -266,3 +315,13 @@ uicb_menu(uicb_t cmd)
|
|||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
menu_clear(Menu *menu)
|
||||||
|
{
|
||||||
|
IFREE(menu->item);
|
||||||
|
menu->nitem = 0;
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
605
src/parse/parse.c
Normal file
605
src/parse/parse.c
Normal file
@@ -0,0 +1,605 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2010 Philippe Pepiot <phil@philpep.org>
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, and distribute this software for any
|
||||||
|
* purpose with or without fee is hereby granted, provided that the above
|
||||||
|
* copyright notice and this permission notice appear in all copies.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define _BSD_SOURCE
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <sys/mman.h>
|
||||||
|
#include <err.h>
|
||||||
|
|
||||||
|
#include "../wmfs.h"
|
||||||
|
|
||||||
|
|
||||||
|
#define TOKEN(t) \
|
||||||
|
do { \
|
||||||
|
kw->type = (t); \
|
||||||
|
TAILQ_INSERT_TAIL(&keywords, kw, entry); \
|
||||||
|
kw = malloc(sizeof(*kw)); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define NEW_WORD() \
|
||||||
|
do { \
|
||||||
|
if (j > 0) { \
|
||||||
|
e->name[j] = '\0'; \
|
||||||
|
e->line = file.line; \
|
||||||
|
TAILQ_INSERT_TAIL(&stack, e, entry); \
|
||||||
|
e = malloc(sizeof(*e)); \
|
||||||
|
j = 0; \
|
||||||
|
TOKEN(WORD); \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
enum conf_type { SEC_START, SEC_END, WORD, EQUAL, LIST_START, LIST_END, NONE };
|
||||||
|
|
||||||
|
struct conf_keyword {
|
||||||
|
enum conf_type type;
|
||||||
|
TAILQ_ENTRY(conf_keyword) entry;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct conf_stack {
|
||||||
|
char name[BUFSIZ];
|
||||||
|
int line;
|
||||||
|
TAILQ_ENTRY(conf_stack) entry;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct conf_state {
|
||||||
|
Bool quote;
|
||||||
|
Bool comment;
|
||||||
|
char quote_char;
|
||||||
|
};
|
||||||
|
|
||||||
|
static void get_keyword(const char *buf, size_t n);
|
||||||
|
static void pop_keyword(void);
|
||||||
|
static void pop_stack(void);
|
||||||
|
static struct conf_sec *get_section(void);
|
||||||
|
static struct conf_opt *get_option(void);
|
||||||
|
static struct opt_type string_to_opt(char *);
|
||||||
|
#ifdef DEBUG
|
||||||
|
static void print_kw_tree(void);
|
||||||
|
static char * get_kw_name(enum conf_type);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static TAILQ_HEAD(, conf_keyword) keywords;
|
||||||
|
static TAILQ_HEAD(, conf_stack) stack;
|
||||||
|
static TAILQ_HEAD(, conf_sec) config;
|
||||||
|
static struct conf_keyword *curk; /* current keyword */
|
||||||
|
static struct conf_stack *curw; /* current word */
|
||||||
|
static const struct opt_type opt_type_null = { 0, 0, False, NULL };
|
||||||
|
|
||||||
|
static struct {
|
||||||
|
const char *name;
|
||||||
|
int line;
|
||||||
|
} file = { NULL, 1 };
|
||||||
|
|
||||||
|
static void
|
||||||
|
get_keyword(const char *buf, size_t n)
|
||||||
|
{
|
||||||
|
struct conf_keyword *kw;
|
||||||
|
size_t j, i;
|
||||||
|
struct conf_state s = { False, False, '\0' };
|
||||||
|
struct conf_stack *e;
|
||||||
|
|
||||||
|
TAILQ_INIT(&stack);
|
||||||
|
TAILQ_INIT(&keywords);
|
||||||
|
kw = emalloc(1, sizeof(*kw));
|
||||||
|
e = emalloc(1, sizeof(*e));
|
||||||
|
|
||||||
|
for(i = 0, j = 0; i < n; i++)
|
||||||
|
{
|
||||||
|
if (buf[i] == '\n' && s.comment == True) {
|
||||||
|
file.line++;
|
||||||
|
s.comment = False;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (buf[i] == '#' && s.quote == False) {
|
||||||
|
s.comment = True;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (s.comment == True)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (buf[i] == s.quote_char && s.quote == True) {
|
||||||
|
NEW_WORD();
|
||||||
|
s.quote = False;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((buf[i] == '"' || buf[i] == '\'') &&
|
||||||
|
s.quote == False)
|
||||||
|
{
|
||||||
|
s.quote_char = buf[i];
|
||||||
|
s.quote = True;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (buf[i] == '[' && s.quote == False) {
|
||||||
|
NEW_WORD();
|
||||||
|
TOKEN((buf[i+1] == '/') ? SEC_END : SEC_START);
|
||||||
|
if (buf[i+1] == '/')
|
||||||
|
i++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (buf[i] == ']' && s.quote == False) {
|
||||||
|
NEW_WORD();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (buf[i] == '{' && s.quote == False) {
|
||||||
|
NEW_WORD();
|
||||||
|
TOKEN(LIST_START);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (buf[i] == '}' && s.quote == False) {
|
||||||
|
NEW_WORD();
|
||||||
|
TOKEN(LIST_END);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (buf[i] == ',' && s.quote == False) {
|
||||||
|
NEW_WORD();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (buf[i] == '=' && s.quote == False) {
|
||||||
|
NEW_WORD();
|
||||||
|
TOKEN(EQUAL);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strchr("\t\n ", buf[i]) && s.quote == False) {
|
||||||
|
NEW_WORD();
|
||||||
|
if (buf[i] == '\n')
|
||||||
|
file.line++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
e->name[j++] = buf[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
static void
|
||||||
|
print_kw_tree(void)
|
||||||
|
{
|
||||||
|
struct conf_keyword *k;
|
||||||
|
struct conf_stack *s;
|
||||||
|
|
||||||
|
s = TAILQ_FIRST(&stack);
|
||||||
|
|
||||||
|
TAILQ_FOREACH(k, &keywords, entry)
|
||||||
|
printf("%s ", get_kw_name(k->type));
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
static char *
|
||||||
|
get_kw_name(enum conf_type type)
|
||||||
|
{
|
||||||
|
switch (type) {
|
||||||
|
case SEC_START:
|
||||||
|
return ("SEC_START");
|
||||||
|
break;
|
||||||
|
case SEC_END:
|
||||||
|
return ("SEC_END");
|
||||||
|
break;
|
||||||
|
case WORD:
|
||||||
|
return ("WORD");
|
||||||
|
break;
|
||||||
|
case LIST_START:
|
||||||
|
return ("LIST_START ");
|
||||||
|
break;
|
||||||
|
case LIST_END:
|
||||||
|
return ("LIST_END ");
|
||||||
|
break;
|
||||||
|
case EQUAL:
|
||||||
|
return ("EQUAL ");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return ("NONE ");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int
|
||||||
|
get_conf(const char *name)
|
||||||
|
{
|
||||||
|
int fd;
|
||||||
|
struct stat st;
|
||||||
|
char *buf;
|
||||||
|
struct conf_sec *s;
|
||||||
|
|
||||||
|
if (!name)
|
||||||
|
return (-1);
|
||||||
|
|
||||||
|
if ((fd = open(name, O_RDONLY)) == -1 ||
|
||||||
|
stat(name, &st) == -1)
|
||||||
|
{
|
||||||
|
warn("%s", name);
|
||||||
|
return (-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
buf = (char*)mmap(0, st.st_size, PROT_READ, MAP_PRIVATE, fd, SEEK_SET);
|
||||||
|
|
||||||
|
if (buf == (char*) MAP_FAILED)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
get_keyword(buf, st.st_size);
|
||||||
|
|
||||||
|
munmap(buf, st.st_size);
|
||||||
|
close(fd);
|
||||||
|
warnx("%s read", name);
|
||||||
|
|
||||||
|
file.name = name;
|
||||||
|
|
||||||
|
curk = TAILQ_FIRST(&keywords);
|
||||||
|
curw = TAILQ_FIRST(&stack);
|
||||||
|
|
||||||
|
TAILQ_INIT(&config);
|
||||||
|
|
||||||
|
while (!TAILQ_EMPTY(&keywords)) {
|
||||||
|
switch (curk->type) {
|
||||||
|
case SEC_START:
|
||||||
|
s = get_section();
|
||||||
|
TAILQ_INSERT_TAIL(&config, s, entry);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
errx(1, "%s:%d: near '%s', config out of any section",
|
||||||
|
file.name, curw->line, curw->name);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct conf_sec *
|
||||||
|
get_section(void)
|
||||||
|
{
|
||||||
|
struct conf_sec *s;
|
||||||
|
struct conf_opt *o;
|
||||||
|
struct conf_sec *sub;
|
||||||
|
|
||||||
|
s = emalloc(1, sizeof(*s));
|
||||||
|
s->name = strdup(curw->name);
|
||||||
|
TAILQ_INIT(&s->sub);
|
||||||
|
SLIST_INIT(&s->optlist);
|
||||||
|
|
||||||
|
pop_stack();
|
||||||
|
pop_keyword();
|
||||||
|
|
||||||
|
if (curk->type != WORD)
|
||||||
|
errx(1, "%s:%d: near '%s', missing section name",
|
||||||
|
file.name, curw->line, curw->name);
|
||||||
|
pop_keyword();
|
||||||
|
|
||||||
|
while (curk->type != SEC_END) {
|
||||||
|
switch (curk->type) {
|
||||||
|
case WORD:
|
||||||
|
o = get_option();
|
||||||
|
SLIST_INSERT_HEAD(&s->optlist, o, entry);
|
||||||
|
s->nopt++;
|
||||||
|
break;
|
||||||
|
case SEC_START:
|
||||||
|
sub = get_section();
|
||||||
|
TAILQ_INSERT_TAIL(&s->sub, sub, entry);
|
||||||
|
s->nsub++;
|
||||||
|
case SEC_END:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
errx(1, "%s:%d: near '%s', syntax error",
|
||||||
|
file.name, curw->line, curw->name);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pop_keyword();
|
||||||
|
|
||||||
|
if (curk->type != WORD)
|
||||||
|
errx(1, "%s:%d: near '%s', missing end-section name",
|
||||||
|
file.name, curw->line, curw->name);
|
||||||
|
|
||||||
|
if (strcmp(curw->name, s->name))
|
||||||
|
errx(1, "%s:%d: near '%s', non-closed section '%s'",
|
||||||
|
file.name, curw->line, curw->name, s->name);
|
||||||
|
|
||||||
|
pop_stack();
|
||||||
|
pop_keyword();
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static struct conf_opt *
|
||||||
|
get_option(void)
|
||||||
|
{
|
||||||
|
struct conf_opt *o;
|
||||||
|
size_t j = 0;
|
||||||
|
|
||||||
|
o = emalloc(1, sizeof(*o));
|
||||||
|
o->name = strdup(curw->name);
|
||||||
|
o->used = False;
|
||||||
|
o->line = curw->line;
|
||||||
|
pop_stack();
|
||||||
|
pop_keyword();
|
||||||
|
|
||||||
|
if (curk->type != EQUAL)
|
||||||
|
errx(1, "%s:%d: near '%s', missing '=' here",
|
||||||
|
file.name, curw->line, curw->name);
|
||||||
|
|
||||||
|
pop_keyword();
|
||||||
|
|
||||||
|
switch (curk->type) {
|
||||||
|
case WORD:
|
||||||
|
o->val[0] = strdup(curw->name);
|
||||||
|
o->val[1] = NULL;
|
||||||
|
pop_stack();
|
||||||
|
break;
|
||||||
|
case LIST_START:
|
||||||
|
pop_keyword();
|
||||||
|
while (curk->type != LIST_END) {
|
||||||
|
if (curk->type != WORD)
|
||||||
|
errx(1, "%s:%d: near '%s', declaration into a list",
|
||||||
|
file.name, curw->line, curw->name);
|
||||||
|
o->val[j++] = strdup(curw->name);
|
||||||
|
pop_stack();
|
||||||
|
pop_keyword();
|
||||||
|
}
|
||||||
|
o->val[j] = NULL;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
errx(1, "%s:%d: near '%s', syntax error",
|
||||||
|
file.name, curw->line, curw->name);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
pop_keyword();
|
||||||
|
return o;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
pop_keyword(void)
|
||||||
|
{
|
||||||
|
TAILQ_REMOVE(&keywords, curk, entry);
|
||||||
|
#ifdef DEBUG
|
||||||
|
warnx("%s", get_kw_name(curk->type));
|
||||||
|
#endif
|
||||||
|
free(curk);
|
||||||
|
|
||||||
|
curk = TAILQ_FIRST(&keywords);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
pop_stack(void)
|
||||||
|
{
|
||||||
|
TAILQ_REMOVE(&stack, curw, entry);
|
||||||
|
#ifdef DEBUG
|
||||||
|
warnx("%s", curw->name);
|
||||||
|
#endif
|
||||||
|
free(curw);
|
||||||
|
|
||||||
|
curw = TAILQ_FIRST(&stack);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
print_unused(struct conf_sec *sec)
|
||||||
|
{
|
||||||
|
struct conf_sec *s;
|
||||||
|
struct conf_opt *o;
|
||||||
|
|
||||||
|
if (!sec)
|
||||||
|
{
|
||||||
|
TAILQ_FOREACH(s, &config, entry)
|
||||||
|
print_unused(s);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
SLIST_FOREACH(o, &sec->optlist, entry)
|
||||||
|
if (o->used == False)
|
||||||
|
warnx("%s:%d, unused param %s",
|
||||||
|
file.name, o->line, o->name);
|
||||||
|
|
||||||
|
TAILQ_FOREACH(s, &sec->sub, entry)
|
||||||
|
if (!TAILQ_EMPTY(&s->sub))
|
||||||
|
print_unused(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
free_conf(struct conf_sec *sec)
|
||||||
|
{
|
||||||
|
struct conf_sec *s;
|
||||||
|
struct conf_opt *o;
|
||||||
|
size_t n;
|
||||||
|
|
||||||
|
if (!sec)
|
||||||
|
{
|
||||||
|
TAILQ_FOREACH(s, &config, entry)
|
||||||
|
{
|
||||||
|
free(s->name);
|
||||||
|
free_conf(s);
|
||||||
|
free(s);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (!SLIST_EMPTY(&sec->optlist))
|
||||||
|
{
|
||||||
|
o = SLIST_FIRST(&sec->optlist);
|
||||||
|
SLIST_REMOVE_HEAD(&sec->optlist, entry);
|
||||||
|
free(o->name);
|
||||||
|
|
||||||
|
for (n = 0; o->val[n]; n++)
|
||||||
|
free(o->val[n]);
|
||||||
|
|
||||||
|
free(o);
|
||||||
|
}
|
||||||
|
|
||||||
|
while (!TAILQ_EMPTY(&sec->sub))
|
||||||
|
{
|
||||||
|
s = TAILQ_FIRST(&sec->sub);
|
||||||
|
TAILQ_REMOVE(&sec->sub, s, entry);
|
||||||
|
free_conf(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
struct conf_sec **
|
||||||
|
fetch_section(struct conf_sec *s, char *name)
|
||||||
|
{
|
||||||
|
struct conf_sec **ret;
|
||||||
|
struct conf_sec *sec;
|
||||||
|
size_t i = 0;
|
||||||
|
|
||||||
|
if (!name)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if (!s) {
|
||||||
|
ret = emalloc(2, sizeof(struct conf_sec *));
|
||||||
|
TAILQ_FOREACH(sec, &config, entry)
|
||||||
|
if (!strcmp(sec->name, name)) {
|
||||||
|
ret[0] = sec;
|
||||||
|
ret[1] = NULL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ret = emalloc(s->nsub+1, sizeof(struct conf_sec *));
|
||||||
|
TAILQ_FOREACH(sec, &s->sub, entry) {
|
||||||
|
if (!strcmp(sec->name, name) && i < s->nsub)
|
||||||
|
ret[i++] = sec;
|
||||||
|
}
|
||||||
|
ret[i] = NULL;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct conf_sec *
|
||||||
|
fetch_section_first(struct conf_sec *s, char *name)
|
||||||
|
{
|
||||||
|
struct conf_sec *sec, *ret = NULL;
|
||||||
|
|
||||||
|
if (!name)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if (!s)
|
||||||
|
{
|
||||||
|
TAILQ_FOREACH(sec, &config, entry)
|
||||||
|
if (!strcmp(sec->name, name)) {
|
||||||
|
ret = sec;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
TAILQ_FOREACH(sec, &s->sub, entry)
|
||||||
|
if (!strcmp(sec->name, name)) {
|
||||||
|
ret = sec;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t
|
||||||
|
fetch_section_count(struct conf_sec **s)
|
||||||
|
{
|
||||||
|
size_t ret;
|
||||||
|
for (ret = 0; s[ret]; ret++);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct opt_type *
|
||||||
|
fetch_opt(struct conf_sec *s, char *dfl, char *name)
|
||||||
|
{
|
||||||
|
struct conf_opt *o;
|
||||||
|
struct opt_type *ret;
|
||||||
|
size_t i = 0;
|
||||||
|
|
||||||
|
if (!name)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
ret = emalloc(10, sizeof(struct opt_type));
|
||||||
|
|
||||||
|
if (s) {
|
||||||
|
SLIST_FOREACH(o, &s->optlist, entry)
|
||||||
|
if (!strcmp(o->name, name)) {
|
||||||
|
while (o->val[i]) {
|
||||||
|
o->used = True;
|
||||||
|
ret[i] = string_to_opt(o->val[i]);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
ret[i] = opt_type_null;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ret[0] = string_to_opt(dfl);
|
||||||
|
ret[1] = opt_type_null;
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct opt_type
|
||||||
|
fetch_opt_first(struct conf_sec *s, char *dfl, char *name)
|
||||||
|
{
|
||||||
|
struct conf_opt *o;
|
||||||
|
|
||||||
|
if (!name)
|
||||||
|
return opt_type_null;
|
||||||
|
else if (s)
|
||||||
|
SLIST_FOREACH(o, &s->optlist, entry)
|
||||||
|
if (!strcmp(o->name, name)) {
|
||||||
|
o->used = True;
|
||||||
|
return string_to_opt(o->val[0]);
|
||||||
|
}
|
||||||
|
return string_to_opt(dfl);
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t
|
||||||
|
fetch_opt_count(struct opt_type *o)
|
||||||
|
{
|
||||||
|
size_t ret;
|
||||||
|
for(ret = 0; o[ret].str; ret++);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct opt_type
|
||||||
|
string_to_opt(char *s)
|
||||||
|
{
|
||||||
|
struct opt_type ret = opt_type_null;
|
||||||
|
|
||||||
|
if (!s || !strlen(s))
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
ret.num = strtol(s, (char**)NULL, 10);
|
||||||
|
ret.fnum = strtod(s, NULL);
|
||||||
|
|
||||||
|
if (!strcmp(s, "true") || !strcmp(s, "True") ||
|
||||||
|
!strcmp(s, "TRUE") || !strcmp(s, "1"))
|
||||||
|
ret.bool = True;
|
||||||
|
else
|
||||||
|
ret.bool = False;
|
||||||
|
|
||||||
|
ret.str = s;
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
110
src/parse/parse.h
Normal file
110
src/parse/parse.h
Normal file
@@ -0,0 +1,110 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2010 Philippe Pepiot <phil@philpep.org>
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, and distribute this software for any
|
||||||
|
* purpose with or without fee is hereby granted, provided that the above
|
||||||
|
* copyright notice and this permission notice appear in all copies.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef PARSE_H
|
||||||
|
#define PARSE_H
|
||||||
|
|
||||||
|
#include <sys/queue.h>
|
||||||
|
|
||||||
|
struct conf_opt {
|
||||||
|
char *name;
|
||||||
|
char *val[10];
|
||||||
|
size_t nval;
|
||||||
|
Bool used;
|
||||||
|
int line;
|
||||||
|
SLIST_ENTRY(conf_opt) entry;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct conf_sec {
|
||||||
|
char *name;
|
||||||
|
SLIST_HEAD(, conf_opt) optlist;
|
||||||
|
TAILQ_HEAD(, conf_sec) sub;
|
||||||
|
size_t nopt;
|
||||||
|
size_t nsub;
|
||||||
|
TAILQ_ENTRY(conf_sec) entry;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct opt_type {
|
||||||
|
long int num;
|
||||||
|
float fnum;
|
||||||
|
Bool bool;
|
||||||
|
char *str;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Create config from file
|
||||||
|
* return -1 on failure
|
||||||
|
*/
|
||||||
|
int get_conf(const char *);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Print unused option name from section s (and subsections).
|
||||||
|
* If s == NULL print unused option name for all config struct.
|
||||||
|
*/
|
||||||
|
void print_unused(struct conf_sec *s);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Free the config struct.
|
||||||
|
* WARNING: This make all string
|
||||||
|
* returned by fetch_(opt|section)(_first) unusable.
|
||||||
|
*/
|
||||||
|
void free_conf(struct conf_sec *s);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Get all subsection matching the given name on the given
|
||||||
|
* section.
|
||||||
|
* If section == NULL, return subsections from root section.
|
||||||
|
* Return a NULL terminated array.
|
||||||
|
* Subsections are returned in order as they are in config file
|
||||||
|
* WARNING : This MUST be free() after use.
|
||||||
|
*/
|
||||||
|
struct conf_sec **fetch_section(struct conf_sec *, char *);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Get first subsection matching the given name
|
||||||
|
* on the given section. (first found on the file)
|
||||||
|
*/
|
||||||
|
struct conf_sec *fetch_section_first(struct conf_sec *, char *);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Count member of a conf_sec **
|
||||||
|
*/
|
||||||
|
size_t fetch_section_count(struct conf_sec **);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Return all options matching the given name on the given subsection.
|
||||||
|
* If none match or section == NULL return opt_type build with the
|
||||||
|
* given default param.
|
||||||
|
* WARNING: This MUST be free() after use.
|
||||||
|
* WARNING: The string member is directly taken from the config struct.
|
||||||
|
* WARNING: Returned in reverse order as they are in config file.
|
||||||
|
* (I think the last option MUST overwrite all others)
|
||||||
|
*/
|
||||||
|
struct opt_type fetch_opt_first(struct conf_sec *, char *, char *);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Get first (last in config file) option matching the given name
|
||||||
|
* on the given section.
|
||||||
|
* WARNING: The string member is directly taken from the config struct.
|
||||||
|
*/
|
||||||
|
struct opt_type *fetch_opt(struct conf_sec *, char *, char *);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Count member of a opt_type *
|
||||||
|
*/
|
||||||
|
size_t fetch_opt_count(struct opt_type *);
|
||||||
|
|
||||||
|
#endif /* PARSE_H */
|
||||||
84
src/status.c
84
src/status.c
@@ -56,6 +56,56 @@ statustext_rectangle(StatusRec *r, char *str)
|
|||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Check graphs blocks in str and return properties
|
||||||
|
* --> \g[x;y;width;height;#color;data]\
|
||||||
|
*\param g StatusGraph pointer, graphs properties
|
||||||
|
*\param str String
|
||||||
|
*\return n Length of g
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
statustext_graph(StatusGraph *g, char *str)
|
||||||
|
{
|
||||||
|
char as, c, *p;
|
||||||
|
int n, i, j, k, m, w;
|
||||||
|
|
||||||
|
for(i = j = n = 0; i < strlen(str); ++i, ++j)
|
||||||
|
if(sscanf(&str[i], "\\g[%d;%d;%d;%d;#%x;%512[^]]]%c",
|
||||||
|
&g[n].x, &g[n].y, &g[n].w, &g[n].h, &g[n].color, g[n].data, &as) == 7
|
||||||
|
&& as == '\\')
|
||||||
|
{
|
||||||
|
/* data is a list of numbers separated by ';' */
|
||||||
|
w = g[n].w;
|
||||||
|
p = strtok(g[n].data, ";");
|
||||||
|
m = 0;
|
||||||
|
|
||||||
|
while(p && m < w)
|
||||||
|
{
|
||||||
|
c = atoi(p);
|
||||||
|
/* height limits */
|
||||||
|
if(c < 0)
|
||||||
|
c = 0;
|
||||||
|
if(c > g[n].h)
|
||||||
|
c = g[n].h;
|
||||||
|
g[n].data[m] = c;
|
||||||
|
p = strtok(NULL, ";");
|
||||||
|
++m;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* width limits */
|
||||||
|
for(; m < w; ++m)
|
||||||
|
g[n].data[m] = 0;
|
||||||
|
/* data is a array[w] of bytes now */
|
||||||
|
|
||||||
|
for(++n, ++i, --j; str[i] != as || str[i - 1] != ']'; ++i);
|
||||||
|
}
|
||||||
|
else if(j != i)
|
||||||
|
str[j] = str[i];
|
||||||
|
|
||||||
|
for(k = j; k < i; str[k++] = 0);
|
||||||
|
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
/** Check text blocks in str and return properties
|
/** Check text blocks in str and return properties
|
||||||
* --> \s[x;y;#color;text]\
|
* --> \s[x;y;#color;text]\
|
||||||
*\param s StatusText pointer, text properties
|
*\param s StatusText pointer, text properties
|
||||||
@@ -80,32 +130,6 @@ statustext_text(StatusText *s, char *str)
|
|||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_IMLIB
|
|
||||||
/** Check images blocks in str and return properties
|
|
||||||
* --> \i[x;y;w;h;name]\
|
|
||||||
*\param im ImageAttr pointer, image properties
|
|
||||||
*\param str String
|
|
||||||
*\return n Lenght of i
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
statustext_image(ImageAttr *im, char *str)
|
|
||||||
{
|
|
||||||
char as;
|
|
||||||
int n, i, j, k;
|
|
||||||
|
|
||||||
for(i = j = n = 0; i < strlen(str); ++i, ++j)
|
|
||||||
if(sscanf(&str[i], "\\i[%d;%d;%d;%d;%512[^]]]%c", &im[n].x, &im[n].y, &im[n].w, &im[n].h, im[n].name, &as) == 6
|
|
||||||
&& as == '\\')
|
|
||||||
for(++n, ++i, --j; str[i] != as || str[i - 1] != ']'; ++i);
|
|
||||||
else if(j != i)
|
|
||||||
str[j] = str[i];
|
|
||||||
|
|
||||||
for(k = j; k < i; str[k++] = 0);
|
|
||||||
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
#endif /* HAVE_IMLIB */
|
|
||||||
|
|
||||||
/** Draw normal text and colored normal text
|
/** Draw normal text and colored normal text
|
||||||
* --> \#color\ text in color
|
* --> \#color\ text in color
|
||||||
*\param sc Screen
|
*\param sc Screen
|
||||||
@@ -168,8 +192,9 @@ void
|
|||||||
statustext_handle(int sc, char *str)
|
statustext_handle(int sc, char *str)
|
||||||
{
|
{
|
||||||
char *lastst;
|
char *lastst;
|
||||||
int i, nr, ns, len;
|
int i, nr, ng, ns, len;
|
||||||
StatusRec r[128];
|
StatusRec r[128];
|
||||||
|
StatusGraph g[128];
|
||||||
StatusText s[128];
|
StatusText s[128];
|
||||||
|
|
||||||
/* If the str == the current statustext, return (not needed) */
|
/* If the str == the current statustext, return (not needed) */
|
||||||
@@ -186,6 +211,7 @@ statustext_handle(int sc, char *str)
|
|||||||
|
|
||||||
/* Store rectangles, located text & images properties. */
|
/* Store rectangles, located text & images properties. */
|
||||||
nr = statustext_rectangle(r, str);
|
nr = statustext_rectangle(r, str);
|
||||||
|
ng = statustext_graph(g, str);
|
||||||
ns = statustext_text(s, str);
|
ns = statustext_text(s, str);
|
||||||
|
|
||||||
/* Draw normal text (and possibly colored with \#color\ blocks) */
|
/* Draw normal text (and possibly colored with \#color\ blocks) */
|
||||||
@@ -195,6 +221,10 @@ statustext_handle(int sc, char *str)
|
|||||||
for(i = 0; i < nr; ++i)
|
for(i = 0; i < nr; ++i)
|
||||||
draw_rectangle(infobar[sc].bar->dr, r[i].x, r[i].y, r[i].w, r[i].h, r[i].color);
|
draw_rectangle(infobar[sc].bar->dr, r[i].x, r[i].y, r[i].w, r[i].h, r[i].color);
|
||||||
|
|
||||||
|
/* Draw graphs with stored properties. */
|
||||||
|
for(i = 0; i < ng; ++i)
|
||||||
|
draw_graph(infobar[sc].bar->dr, g[i].x, g[i].y, g[i].w, g[i].h, g[i].color, g[i].data);
|
||||||
|
|
||||||
/* Draw located text with stored properties. */
|
/* Draw located text with stored properties. */
|
||||||
for(i = 0; i < ns; ++i)
|
for(i = 0; i < ns; ++i)
|
||||||
draw_text(infobar[sc].bar->dr, s[i].x, s[i].y, s[i].color, 0, s[i].text);
|
draw_text(infobar[sc].bar->dr, s[i].x, s[i].y, s[i].color, 0, s[i].text);
|
||||||
|
|||||||
@@ -38,17 +38,21 @@
|
|||||||
#define NBUTTON 8
|
#define NBUTTON 8
|
||||||
#define MAXTAG 36
|
#define MAXTAG 36
|
||||||
#define NUM_OF_LAYOUT 10
|
#define NUM_OF_LAYOUT 10
|
||||||
|
#define HISTOLEN 128
|
||||||
|
|
||||||
/* Clients flags definition */
|
/* Clients flags definition */
|
||||||
#define FreeFlag (1 << 1)
|
#define FreeFlag (1 << 1)
|
||||||
#define MaxFlag (1 << 2)
|
#define MaxFlag (1 << 2)
|
||||||
#define TileFlag (1 << 3)
|
#define TileFlag (1 << 3)
|
||||||
#define HideFlag (1 << 4)
|
#define HideFlag (1 << 4)
|
||||||
#define LMaxFlag (1 << 5)
|
#define LMaxFlag (1 << 5)
|
||||||
#define UnmapFlag (1 << 6)
|
#define UnmapFlag (1 << 6)
|
||||||
#define HintFlag (1 << 7)
|
#define HintFlag (1 << 7)
|
||||||
#define FSSFlag (1 << 8)
|
#define FSSFlag (1 << 8)
|
||||||
#define AboveFlag (1 << 9)
|
#define AboveFlag (1 << 9)
|
||||||
|
#define UrgentFlag (1 << 10)
|
||||||
|
|
||||||
|
#define TagFlag(t) (1 << (t))
|
||||||
|
|
||||||
/* XEMBED messages */
|
/* XEMBED messages */
|
||||||
#define XEMBED_MAPPED (1 << 0)
|
#define XEMBED_MAPPED (1 << 0)
|
||||||
@@ -81,13 +85,16 @@ typedef unsigned char uchar;
|
|||||||
|
|
||||||
/* Enum */
|
/* Enum */
|
||||||
enum { CurNormal, CurResize, CurRightResize, CurLeftResize, CurMove, CurLast };
|
enum { CurNormal, CurResize, CurRightResize, CurLeftResize, CurMove, CurLast };
|
||||||
|
enum { TagSel, TagTransfert, TagAdd, TagNext, TagPrev, TagActionLast };
|
||||||
|
|
||||||
|
/* Menu align */
|
||||||
|
enum { MA_Center = 0, MA_Left = 1, MA_Right = 2 };
|
||||||
|
|
||||||
/* Infobar position */
|
/* Infobar position */
|
||||||
enum { IB_Hide = 0, IB_Bottom = 1, IB_Top = 2 };
|
enum { IB_Hide = 0, IB_Bottom = 1, IB_Top = 2 };
|
||||||
|
|
||||||
typedef enum { Right, Left, Top, Bottom, Center, PositionLast } Position;
|
typedef enum { Right, Left, Top, Bottom, Center, PositionLast } Position;
|
||||||
|
|
||||||
|
|
||||||
/* Ewmh hints list */
|
/* Ewmh hints list */
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
@@ -232,12 +239,14 @@ typedef struct
|
|||||||
XRectangle geo;
|
XRectangle geo;
|
||||||
int position;
|
int position;
|
||||||
char *statustext;
|
char *statustext;
|
||||||
|
Bool need_update;
|
||||||
} InfoBar;
|
} InfoBar;
|
||||||
|
|
||||||
/* Layout Structure */
|
/* Layout Structure */
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
char *symbol;
|
char *symbol;
|
||||||
|
char *type;
|
||||||
void (*func)(int screen);
|
void (*func)(int screen);
|
||||||
} Layout;
|
} Layout;
|
||||||
|
|
||||||
@@ -250,11 +259,15 @@ typedef struct
|
|||||||
int layers;
|
int layers;
|
||||||
float mwfact;
|
float mwfact;
|
||||||
int nmaster;
|
int nmaster;
|
||||||
|
Bool urgent;
|
||||||
Bool resizehint;
|
Bool resizehint;
|
||||||
Bool request_update;
|
Bool request_update;
|
||||||
Bool abovefc;
|
Bool abovefc;
|
||||||
int barpos;
|
int barpos;
|
||||||
Layout layout;
|
Layout layout;
|
||||||
|
uint tagad;
|
||||||
|
MouseBinding *mouse;
|
||||||
|
int nmouse;
|
||||||
} Tag;
|
} Tag;
|
||||||
|
|
||||||
/* Menu Item Struct */
|
/* Menu Item Struct */
|
||||||
@@ -263,6 +276,8 @@ typedef struct
|
|||||||
char *name;
|
char *name;
|
||||||
void (*func)(uicb_t);
|
void (*func)(uicb_t);
|
||||||
uicb_t cmd;
|
uicb_t cmd;
|
||||||
|
Bool (*check)(uicb_t);
|
||||||
|
char *submenu;
|
||||||
} MenuItem;
|
} MenuItem;
|
||||||
|
|
||||||
/* Menu Struct */
|
/* Menu Struct */
|
||||||
@@ -275,6 +290,7 @@ typedef struct
|
|||||||
char *name;
|
char *name;
|
||||||
/* Placement */
|
/* Placement */
|
||||||
Bool place_at_mouse;
|
Bool place_at_mouse;
|
||||||
|
int align;
|
||||||
int x, y;
|
int x, y;
|
||||||
/* Color */
|
/* Color */
|
||||||
struct
|
struct
|
||||||
@@ -294,6 +310,8 @@ typedef struct
|
|||||||
char *name;
|
char *name;
|
||||||
char *prompt;
|
char *prompt;
|
||||||
char *command;
|
char *command;
|
||||||
|
char histo[HISTOLEN][512];
|
||||||
|
uint nhisto;
|
||||||
} Launcher;
|
} Launcher;
|
||||||
|
|
||||||
/* Button struct */
|
/* Button struct */
|
||||||
@@ -324,10 +342,15 @@ typedef struct
|
|||||||
Bool raisefocus;
|
Bool raisefocus;
|
||||||
Bool raiseswitch;
|
Bool raiseswitch;
|
||||||
Bool focus_fmouse;
|
Bool focus_fmouse;
|
||||||
|
Bool focus_pclick;
|
||||||
Bool ignore_next_client_rules;
|
Bool ignore_next_client_rules;
|
||||||
|
Bool tagautohide;
|
||||||
uint pad;
|
uint pad;
|
||||||
int status_timing;
|
int status_timing;
|
||||||
char *status_path;
|
char *status_path;
|
||||||
|
pid_t status_pid;
|
||||||
|
char *autostart_path;
|
||||||
|
char *autostart_command;
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
@@ -337,6 +360,8 @@ typedef struct
|
|||||||
uint bar;
|
uint bar;
|
||||||
char *text;
|
char *text;
|
||||||
char *tagselfg;
|
char *tagselfg;
|
||||||
|
char *tagurfg;
|
||||||
|
uint tagurbg;
|
||||||
uint tagselbg;
|
uint tagselbg;
|
||||||
uint tag_occupied_bg;
|
uint tag_occupied_bg;
|
||||||
uint tagbord;
|
uint tagbord;
|
||||||
@@ -351,6 +376,14 @@ typedef struct
|
|||||||
Bool selbar;
|
Bool selbar;
|
||||||
} bars;
|
} bars;
|
||||||
struct
|
struct
|
||||||
|
{
|
||||||
|
char *fg;
|
||||||
|
uint bg;
|
||||||
|
int maxlenght;
|
||||||
|
MouseBinding *mouse;
|
||||||
|
int nmouse;
|
||||||
|
} selbar;
|
||||||
|
struct
|
||||||
{
|
{
|
||||||
char *background_command;
|
char *background_command;
|
||||||
MouseBinding *mouse;
|
MouseBinding *mouse;
|
||||||
@@ -392,11 +425,13 @@ typedef struct
|
|||||||
Bool layout;
|
Bool layout;
|
||||||
} border;
|
} border;
|
||||||
Alias alias[256];
|
Alias alias[256];
|
||||||
|
uint mouse_tag_action[TagActionLast];
|
||||||
Layout layout[NUM_OF_LAYOUT];
|
Layout layout[NUM_OF_LAYOUT];
|
||||||
Menu *menu;
|
Menu *menu;
|
||||||
Launcher *launcher;
|
Launcher *launcher;
|
||||||
int *ntag;
|
int *ntag;
|
||||||
Bool tag_round;
|
Bool tag_round;
|
||||||
|
Bool client_round;
|
||||||
Bool layout_system; /* Switch: False, Menu: True. */
|
Bool layout_system; /* Switch: False, Menu: True. */
|
||||||
Bool layout_placement; /* Right (normal): False, Left: True. */
|
Bool layout_placement; /* Right (normal): False, Left: True. */
|
||||||
/* Number of... */
|
/* Number of... */
|
||||||
@@ -412,6 +447,13 @@ typedef struct
|
|||||||
uint color;
|
uint color;
|
||||||
} StatusRec;
|
} StatusRec;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint x, y, w, h;
|
||||||
|
uint color;
|
||||||
|
char data[512];
|
||||||
|
} StatusGraph;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
uint x, y;
|
uint x, y;
|
||||||
|
|||||||
353
src/tag.c
353
src/tag.c
@@ -39,6 +39,8 @@ void
|
|||||||
tag_set(int tag)
|
tag_set(int tag)
|
||||||
{
|
{
|
||||||
Client *c;
|
Client *c;
|
||||||
|
Bool al = False;
|
||||||
|
int i;
|
||||||
|
|
||||||
screen_get_sel();
|
screen_get_sel();
|
||||||
|
|
||||||
@@ -68,7 +70,26 @@ tag_set(int tag)
|
|||||||
if(tags[selscreen][prevseltag[selscreen]].barpos != tags[selscreen][seltag[selscreen]].barpos)
|
if(tags[selscreen][prevseltag[selscreen]].barpos != tags[selscreen][seltag[selscreen]].barpos)
|
||||||
infobar_set_position(tags[selscreen][seltag[selscreen]].barpos);
|
infobar_set_position(tags[selscreen][seltag[selscreen]].barpos);
|
||||||
|
|
||||||
arrange(selscreen, False);
|
/* Check if a layout update is needed with additional tags */
|
||||||
|
if(tags[selscreen][seltag[selscreen]].tagad)
|
||||||
|
al = True;
|
||||||
|
|
||||||
|
for(i = 1; i < conf.ntag[selscreen] + 1; ++i)
|
||||||
|
if(tags[selscreen][i].tagad & TagFlag(seltag[selscreen]))
|
||||||
|
{
|
||||||
|
al = True;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check for ignore_tag clients */
|
||||||
|
for(c = clients; c; c = c->next)
|
||||||
|
if(c->tag == MAXTAG + 1 && c->screen == selscreen)
|
||||||
|
{
|
||||||
|
al = True;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
arrange(selscreen, al);
|
||||||
|
|
||||||
if(tags[selscreen][tag].request_update)
|
if(tags[selscreen][tag].request_update)
|
||||||
{
|
{
|
||||||
@@ -100,6 +121,9 @@ tag_transfert(Client *c, int tag)
|
|||||||
if(!tag)
|
if(!tag)
|
||||||
tag = 1;
|
tag = 1;
|
||||||
|
|
||||||
|
if(tag > conf.ntag[selscreen])
|
||||||
|
return;
|
||||||
|
|
||||||
c->tag = tag;
|
c->tag = tag;
|
||||||
c->screen = selscreen;
|
c->screen = selscreen;
|
||||||
|
|
||||||
@@ -157,6 +181,92 @@ uicb_tag_prev(uicb_t cmd)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Set the next visible tag
|
||||||
|
* \param cmd uicb_t type unused
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
uicb_tag_next_visible(uicb_t cmd)
|
||||||
|
{
|
||||||
|
int i, tag;
|
||||||
|
Client *c;
|
||||||
|
Bool is_occupied[MAXTAG];
|
||||||
|
|
||||||
|
screen_get_sel();
|
||||||
|
|
||||||
|
if(!conf.tagautohide)
|
||||||
|
{
|
||||||
|
tag_set(seltag[selscreen] + 1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(i = 0; i < MAXTAG; i++)
|
||||||
|
is_occupied[i] = False;
|
||||||
|
|
||||||
|
for(c = clients; c; c = c->next)
|
||||||
|
if(c->screen == selscreen)
|
||||||
|
is_occupied[c->tag] = True;
|
||||||
|
|
||||||
|
for(tag = seltag[selscreen] + 1; tag < conf.ntag[selscreen] + 1; ++tag)
|
||||||
|
if(is_occupied[tag])
|
||||||
|
{
|
||||||
|
tag_set(tag);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(conf.tag_round)
|
||||||
|
for(tag = 0; tag < seltag[selscreen]; ++tag)
|
||||||
|
if(is_occupied[tag])
|
||||||
|
{
|
||||||
|
tag_set(tag);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Set the prev visible tag
|
||||||
|
* \param cmd uicb_t type unused
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
uicb_tag_prev_visible(uicb_t cmd)
|
||||||
|
{
|
||||||
|
int i, tag;
|
||||||
|
Client *c;
|
||||||
|
Bool is_occupied[MAXTAG];
|
||||||
|
|
||||||
|
screen_get_sel();
|
||||||
|
|
||||||
|
if(!conf.tagautohide)
|
||||||
|
{
|
||||||
|
tag_set(seltag[selscreen] - 1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(i = 0; i < MAXTAG; i++)
|
||||||
|
is_occupied[i] = False;
|
||||||
|
|
||||||
|
for(c = clients; c; c = c->next)
|
||||||
|
if(c->screen == selscreen)
|
||||||
|
is_occupied[c->tag] = True;
|
||||||
|
|
||||||
|
for(tag = seltag[selscreen] - 1; tag >= 0; --tag)
|
||||||
|
if(is_occupied[tag])
|
||||||
|
{
|
||||||
|
tag_set(tag);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(conf.tag_round)
|
||||||
|
for(tag = conf.ntag[selscreen]; tag > seltag[selscreen]; --tag)
|
||||||
|
if(is_occupied[tag])
|
||||||
|
{
|
||||||
|
tag_set(tag);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/** Transfert the selected client to
|
/** Transfert the selected client to
|
||||||
* the wanted tag
|
* the wanted tag
|
||||||
* \param cmd Wanted tag, uicb_t type
|
* \param cmd Wanted tag, uicb_t type
|
||||||
@@ -223,3 +333,244 @@ uicb_tagtransfert_prev(uicb_t cmd)
|
|||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Go to the current urgent tag
|
||||||
|
*\param cmd uicb_t type unused
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
uicb_tag_urgent(uicb_t cmd)
|
||||||
|
{
|
||||||
|
Client *c;
|
||||||
|
Bool b = False;
|
||||||
|
|
||||||
|
/* Check if there is a urgent client */
|
||||||
|
for(c = clients; c; c = c->next)
|
||||||
|
if(c->flags & UrgentFlag)
|
||||||
|
{
|
||||||
|
b = True;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!b)
|
||||||
|
return;
|
||||||
|
|
||||||
|
screen_set_sel(c->screen);
|
||||||
|
tag_set(c->tag);
|
||||||
|
client_focus(c);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Add an additional tag to the current tag
|
||||||
|
*\param sc Screen
|
||||||
|
*\param tag Tag where apply additional tag
|
||||||
|
*\param adtag Additional tag to apply in tag
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
tag_additional(int sc, int tag, int adtag)
|
||||||
|
{
|
||||||
|
if(tag < 0 || tag > conf.ntag[sc]
|
||||||
|
|| adtag < 1 || adtag > conf.ntag[sc] || adtag == seltag[sc])
|
||||||
|
return;
|
||||||
|
|
||||||
|
tags[sc][tag].tagad ^= TagFlag(adtag);
|
||||||
|
tags[sc][adtag].request_update = True;
|
||||||
|
arrange(sc, True);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Add an additional tag to the current tag
|
||||||
|
*\param cmd uicb_t
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
uicb_tag_toggle_additional(uicb_t cmd)
|
||||||
|
{
|
||||||
|
screen_get_sel();
|
||||||
|
|
||||||
|
tag_additional(selscreen, seltag[selscreen], atoi(cmd));
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Swap 2 tags
|
||||||
|
*\param s Screen
|
||||||
|
*\param t1 Tag 1
|
||||||
|
*\param t2 Tag 2
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
tag_swap(int s, int t1, int t2)
|
||||||
|
{
|
||||||
|
Client *c;
|
||||||
|
Tag t;
|
||||||
|
|
||||||
|
if(t1 > conf.ntag[s] || t1 < 1
|
||||||
|
|| t2 > conf.ntag[s] || t2 < 1 || t1 == t2)
|
||||||
|
return;
|
||||||
|
|
||||||
|
t = tags[s][t1];
|
||||||
|
tags[s][t1] = tags[s][t2];
|
||||||
|
tags[s][t2] = t;
|
||||||
|
|
||||||
|
for(c = clients; c; c = c->next)
|
||||||
|
{
|
||||||
|
if(c->screen == s && c->tag == t1)
|
||||||
|
c->tag = t2;
|
||||||
|
else if(c->screen == s && c->tag == t2)
|
||||||
|
c->tag = t1;
|
||||||
|
}
|
||||||
|
|
||||||
|
infobar_update_taglist(s);
|
||||||
|
tag_set(t2);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Swap current tag with a specified tag
|
||||||
|
*\param cmd uicb_t type
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
uicb_tag_swap(uicb_t cmd)
|
||||||
|
{
|
||||||
|
screen_get_sel();
|
||||||
|
|
||||||
|
tag_swap(selscreen, seltag[selscreen], atoi(cmd));
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Swap current tag with next tag
|
||||||
|
*\param cmd uicb_t type
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
uicb_tag_swap_next(uicb_t cmd)
|
||||||
|
{
|
||||||
|
screen_get_sel();
|
||||||
|
|
||||||
|
tag_swap(selscreen, seltag[selscreen], seltag[selscreen] + 1);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Swap current tag with previous tag
|
||||||
|
*\param cmd uicb_t type
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
uicb_tag_swap_previous(uicb_t cmd)
|
||||||
|
{
|
||||||
|
screen_get_sel();
|
||||||
|
|
||||||
|
tag_swap(selscreen, seltag[selscreen], seltag[selscreen] - 1);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Adding a tag
|
||||||
|
*\param s Screen number
|
||||||
|
*\param name New tag name
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
tag_new(int s, char *name)
|
||||||
|
{
|
||||||
|
Tag t = { NULL, NULL, 0, 0, 0.65, 1, False, False, False, False, IB_Top,
|
||||||
|
layout_name_to_struct(conf.layout, "tile_right", conf.nlayout, layout_list), 0, NULL, 0 };
|
||||||
|
|
||||||
|
if(conf.ntag[s] + 1 > MAXTAG)
|
||||||
|
{
|
||||||
|
warnx("Too many tag: Can't create new tag");
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
++conf.ntag[s];
|
||||||
|
|
||||||
|
tags[s][conf.ntag[s]] = t;
|
||||||
|
|
||||||
|
tags[s][conf.ntag[s]].name = _strdup((name ? name : "new tag"));
|
||||||
|
|
||||||
|
infobar_update_taglist(s);
|
||||||
|
infobar_draw(s);
|
||||||
|
tag_set(conf.ntag[s]);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Adding a tag
|
||||||
|
*\param cmd uicb_t type
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
uicb_tag_new(uicb_t cmd)
|
||||||
|
{
|
||||||
|
screen_get_sel();
|
||||||
|
|
||||||
|
tag_new(selscreen, (char*)cmd);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Delete a tag
|
||||||
|
*\param s Screen number
|
||||||
|
*\param tag Tag number
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
tag_delete(int s, int tag)
|
||||||
|
{
|
||||||
|
Tag t = { 0 };
|
||||||
|
Client *c;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if(tag < 0 || tag > conf.ntag[s] || conf.ntag[s] == 1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for(c = clients; c; c = c->next)
|
||||||
|
if(c->screen == s && c->tag == tag)
|
||||||
|
{
|
||||||
|
warnx("Client(s) present in this tag, can't delete it");
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
--conf.ntag[s];
|
||||||
|
|
||||||
|
tags[s][tag] = t;
|
||||||
|
infobar[s].tags[tag] = NULL;
|
||||||
|
|
||||||
|
for(i = tag; i < conf.ntag[s] + 1; ++i)
|
||||||
|
{
|
||||||
|
/* Set clients tag because of shift */
|
||||||
|
for(c = clients; c; c = c->next)
|
||||||
|
if(c->screen == s && c->tag == i + 1)
|
||||||
|
c->tag = i;
|
||||||
|
|
||||||
|
/* shift */
|
||||||
|
tags[s][i] = tags[s][i + 1];
|
||||||
|
}
|
||||||
|
|
||||||
|
infobar[s].need_update = True;
|
||||||
|
infobar_update_taglist(s);
|
||||||
|
infobar_draw(s);
|
||||||
|
|
||||||
|
if(tag == seltag[s])
|
||||||
|
tag_set(tag <= conf.ntag[s] ? tag : conf.ntag[s]);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Delete a tag
|
||||||
|
*\param cmd uicb_t type
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
uicb_tag_del(uicb_t cmd)
|
||||||
|
{
|
||||||
|
int n;
|
||||||
|
|
||||||
|
screen_get_sel();
|
||||||
|
|
||||||
|
if(cmd == NULL || !(n = atoi(cmd)))
|
||||||
|
n = seltag[selscreen];
|
||||||
|
|
||||||
|
tag_delete(selscreen, n);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
78
src/util.c
78
src/util.c
@@ -200,44 +200,69 @@ get_mouse_pos(void)
|
|||||||
|
|
||||||
/** Execute a sh command
|
/** Execute a sh command
|
||||||
* \param cmd Command
|
* \param cmd Command
|
||||||
|
* \return child pid
|
||||||
*/
|
*/
|
||||||
void
|
int
|
||||||
spawn(const char *format, ...)
|
spawn(const char *format, ...)
|
||||||
{
|
{
|
||||||
char *sh = NULL;
|
char *sh = NULL;
|
||||||
char cmd[512];
|
char cmd[512];
|
||||||
va_list ap;
|
va_list ap;
|
||||||
|
pid_t pid, ret;
|
||||||
if(strlen(format) > 511)
|
int p[2], len;
|
||||||
{
|
|
||||||
warnx("spawn(): Error, command too long.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
va_start(ap, format);
|
va_start(ap, format);
|
||||||
vsprintf(cmd, format, ap);
|
len = vsnprintf(cmd, sizeof(cmd), format, ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
|
|
||||||
if(!strlen(cmd))
|
if (len >= sizeof(cmd))
|
||||||
return;
|
{
|
||||||
|
warnx("command too long (> 512 bytes)");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
if(!(sh = getenv("SHELL")))
|
if(!(sh = getenv("SHELL")))
|
||||||
sh = "/bin/sh";
|
sh = "/bin/sh";
|
||||||
|
|
||||||
if(fork() == 0)
|
if (pipe(p) == -1)
|
||||||
{
|
{
|
||||||
if(fork() == 0)
|
warn("pipe");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if((pid = fork()) == 0)
|
||||||
|
{
|
||||||
|
close(p[0]);
|
||||||
|
if((pid = fork()) == 0)
|
||||||
{
|
{
|
||||||
if(dpy)
|
if(dpy)
|
||||||
close(ConnectionNumber(dpy));
|
close(ConnectionNumber(dpy));
|
||||||
setsid();
|
setsid();
|
||||||
execl(sh, sh, "-c", cmd, (char*)NULL);
|
execl(sh, sh, "-c", cmd, (char*)NULL);
|
||||||
exit(EXIT_SUCCESS);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
write(p[1], &pid, sizeof(pid_t));
|
||||||
|
close(p[1]);
|
||||||
exit(EXIT_SUCCESS);
|
exit(EXIT_SUCCESS);
|
||||||
}
|
}
|
||||||
|
else if (pid != -1)
|
||||||
|
{
|
||||||
|
close(p[1]);
|
||||||
|
if (sizeof(pid_t) != read(p[0], &ret, sizeof(pid_t)))
|
||||||
|
{
|
||||||
|
warn("read");
|
||||||
|
ret = -1;
|
||||||
|
}
|
||||||
|
close(p[0]);
|
||||||
|
waitpid(pid, NULL, 0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
warn("fork");
|
||||||
|
ret = -1;
|
||||||
|
}
|
||||||
|
|
||||||
return;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Swap two pointer.
|
/** Swap two pointer.
|
||||||
@@ -262,6 +287,8 @@ void
|
|||||||
uicb_spawn(uicb_t cmd)
|
uicb_spawn(uicb_t cmd)
|
||||||
{
|
{
|
||||||
spawn("%s", cmd);
|
spawn("%s", cmd);
|
||||||
|
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_IMLIB
|
#ifdef HAVE_IMLIB
|
||||||
@@ -290,3 +317,26 @@ parse_image_block(ImageAttr *im, char *str)
|
|||||||
}
|
}
|
||||||
#endif /* HAVE_IMLIB */
|
#endif /* HAVE_IMLIB */
|
||||||
|
|
||||||
|
char*
|
||||||
|
clean_value(char *str)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
char c, *p;
|
||||||
|
|
||||||
|
if(!str || !(p = _strdup(str)))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
/* Remove useless spaces */
|
||||||
|
for(; *p == ' '; ++p);
|
||||||
|
for(; *(p + strlen(p) - 1) == ' '; *(p + strlen(p) - 1) = '\0');
|
||||||
|
|
||||||
|
/* For string delimiter (" or ') */
|
||||||
|
if(((c = *p) == '"' || (c = *p) == '\'') && strchr(p + 1, c))
|
||||||
|
{
|
||||||
|
for(++p, i = 0; p[i] && p[i] != c; ++i);
|
||||||
|
p[i] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
34
src/wmfs.c
34
src/wmfs.c
@@ -116,22 +116,22 @@ quit(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
IFREE(conf.launcher);
|
IFREE(conf.launcher);
|
||||||
IFREE(conf.ntag);
|
|
||||||
IFREE(conf.titlebar.mouse);
|
|
||||||
for(i = 0; i < conf.titlebar.nbutton; ++i)
|
|
||||||
{
|
|
||||||
IFREE(conf.titlebar.button[i].mouse);
|
|
||||||
IFREE(conf.titlebar.button[i].linecoord);
|
|
||||||
}
|
|
||||||
|
|
||||||
IFREE(conf.bars.mouse);
|
IFREE(conf.bars.mouse);
|
||||||
|
IFREE(conf.selbar.mouse);
|
||||||
IFREE(conf.titlebar.button);
|
IFREE(conf.titlebar.button);
|
||||||
IFREE(conf.client.mouse);
|
IFREE(conf.client.mouse);
|
||||||
IFREE(conf.root.mouse);
|
IFREE(conf.root.mouse);
|
||||||
|
|
||||||
|
free_conf(NULL);
|
||||||
|
|
||||||
XSync(dpy, False);
|
XSync(dpy, False);
|
||||||
XCloseDisplay(dpy);
|
XCloseDisplay(dpy);
|
||||||
|
|
||||||
|
/* kill status script */
|
||||||
|
if (conf.status_pid != (pid_t)-1)
|
||||||
|
kill(conf.status_pid, SIGQUIT);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -141,25 +141,22 @@ thread_process(void *arg)
|
|||||||
XEvent ev;
|
XEvent ev;
|
||||||
|
|
||||||
/* X event loop */
|
/* X event loop */
|
||||||
if(!(int*)arg)
|
if(arg)
|
||||||
{
|
{
|
||||||
while(!exiting && !XNextEvent(dpy, &ev))
|
while(!exiting && !XNextEvent(dpy, &ev))
|
||||||
getevent(ev);
|
getevent(ev);
|
||||||
|
|
||||||
pthread_exit(0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Status checking loop with timing */
|
/* Status checking loop with timing */
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
while(!exiting)
|
pthread_detach(pthread_self());
|
||||||
|
do
|
||||||
{
|
{
|
||||||
spawn(conf.status_path);
|
conf.status_pid = spawn(conf.status_path);
|
||||||
sleep(conf.status_timing);
|
sleep(conf.status_timing);
|
||||||
}
|
} while (!exiting && conf.status_timing != 0);
|
||||||
|
|
||||||
pthread_exit(0);
|
|
||||||
}
|
}
|
||||||
|
pthread_exit(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** WMFS main loop.
|
/** WMFS main loop.
|
||||||
@@ -180,7 +177,6 @@ mainloop(void)
|
|||||||
pthread_create(&evstatus, NULL, thread_process, NULL);
|
pthread_create(&evstatus, NULL, thread_process, NULL);
|
||||||
|
|
||||||
(void)pthread_join(evloop, &ret);
|
(void)pthread_join(evloop, &ret);
|
||||||
(void)pthread_join(evstatus, &ret);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
@@ -245,7 +241,7 @@ scan(void)
|
|||||||
|
|
||||||
c = client_manage(w[i], &wa, False);
|
c = client_manage(w[i], &wa, False);
|
||||||
|
|
||||||
if(tag != -1)
|
if(tag != -1 && tag != MAXTAG + 1)
|
||||||
c->tag = tag;
|
c->tag = tag;
|
||||||
if(screen != -1 && screen <= s - 1)
|
if(screen != -1 && screen <= s - 1)
|
||||||
c->screen = screen;
|
c->screen = screen;
|
||||||
@@ -478,7 +474,7 @@ main(int argc, char **argv)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 'c':
|
case 'c':
|
||||||
exec_uicb_function(argv[2], ((argv[3]) ? argv[3] : NULL));
|
exec_uicb_function(optarg, argv[optind]);
|
||||||
XCloseDisplay(dpy);
|
XCloseDisplay(dpy);
|
||||||
exit(EXIT_SUCCESS);
|
exit(EXIT_SUCCESS);
|
||||||
break;
|
break;
|
||||||
|
|||||||
53
src/wmfs.h
53
src/wmfs.h
@@ -33,6 +33,8 @@
|
|||||||
#ifndef WMFS_H
|
#ifndef WMFS_H
|
||||||
#define WMFS_H
|
#define WMFS_H
|
||||||
|
|
||||||
|
#define _BSD_SOURCE /* vsnprintf */
|
||||||
|
#define _POSIX_SOURCE /* kill */
|
||||||
/* Lib headers */
|
/* Lib headers */
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@@ -40,6 +42,8 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <fcntl.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
@@ -55,7 +59,7 @@
|
|||||||
#include <X11/Xft/Xft.h>
|
#include <X11/Xft/Xft.h>
|
||||||
|
|
||||||
/* Local headers */
|
/* Local headers */
|
||||||
#include "confparse/confparse.h"
|
#include "parse/parse.h"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "structs.h"
|
#include "structs.h"
|
||||||
|
|
||||||
@@ -86,12 +90,12 @@
|
|||||||
#define SHADC (0x000000) /* 'Cause i don't know how darken a color yet */
|
#define SHADC (0x000000) /* 'Cause i don't know how darken a color yet */
|
||||||
#define BORDH conf.client.borderheight
|
#define BORDH conf.client.borderheight
|
||||||
#define TBARH ((conf.titlebar.height < BORDH) ? BORDH : conf.titlebar.height)
|
#define TBARH ((conf.titlebar.height < BORDH) ? BORDH : conf.titlebar.height)
|
||||||
#define RESHW (6 * BORDH)
|
#define RESHW (6 * (BORDH))
|
||||||
#define BUTTONWH (TBARH / 2)
|
#define BUTTONWH (TBARH / 2)
|
||||||
#define DEF_CONF ".config/wmfs/wmfsrc"
|
#define DEF_CONF ".config/wmfs/wmfsrc"
|
||||||
#define DEF_STATUS ".config/wmfs/status.sh"
|
#define DEF_STATUS ".config/wmfs/status.sh"
|
||||||
#define PAD conf.pad
|
#define PAD conf.pad
|
||||||
#define MAXSTATUS 4096
|
#define MAXSTATUS (4096)
|
||||||
|
|
||||||
#define CWIN(win, parent, x, y, w, h, b, mask, col, at) \
|
#define CWIN(win, parent, x, y, w, h, b, mask, col, at) \
|
||||||
do { \
|
do { \
|
||||||
@@ -107,6 +111,7 @@
|
|||||||
#define CHECK(x) if(!(x)) return
|
#define CHECK(x) if(!(x)) return
|
||||||
#define IFREE(x) if(x) free(x)
|
#define IFREE(x) if(x) free(x)
|
||||||
#define LEN(x) (sizeof(x) / sizeof((x)[0]))
|
#define LEN(x) (sizeof(x) / sizeof((x)[0]))
|
||||||
|
#define MAXCLIST (64)
|
||||||
|
|
||||||
/* barwin.c */
|
/* barwin.c */
|
||||||
BarWindow *barwin_create(Window parent,
|
BarWindow *barwin_create(Window parent,
|
||||||
@@ -131,6 +136,7 @@ void barwin_refresh(BarWindow *bw);
|
|||||||
/* draw.c */
|
/* draw.c */
|
||||||
void draw_text(Drawable d, int x, int y, char* fg, int pad, char *str);
|
void draw_text(Drawable d, int x, int y, char* fg, int pad, char *str);
|
||||||
void draw_rectangle(Drawable dr, int x, int y, uint w, uint h, uint color);
|
void draw_rectangle(Drawable dr, int x, int y, uint w, uint h, uint color);
|
||||||
|
void draw_graph(Drawable dr, int x, int y, uint w, uint h, uint color, char *data);
|
||||||
|
|
||||||
#ifdef HAVE_IMLIB
|
#ifdef HAVE_IMLIB
|
||||||
void draw_image(Drawable dr, int x, int y, int w, int h, char *name);
|
void draw_image(Drawable dr, int x, int y, int w, int h, char *name);
|
||||||
@@ -144,9 +150,11 @@ void infobar_draw(int sc);
|
|||||||
void infobar_draw_layout(int sc);
|
void infobar_draw_layout(int sc);
|
||||||
void infobar_draw_selbar(int sc);
|
void infobar_draw_selbar(int sc);
|
||||||
void infobar_draw_taglist(int sc);
|
void infobar_draw_taglist(int sc);
|
||||||
|
void infobar_update_taglist(int sc);
|
||||||
void infobar_destroy(void);
|
void infobar_destroy(void);
|
||||||
void infobar_set_position(int pos);
|
void infobar_set_position(int pos);
|
||||||
void uicb_infobar_togglepos(uicb_t);
|
void uicb_infobar_togglepos(uicb_t);
|
||||||
|
void uicb_toggle_tagautohide(uicb_t);
|
||||||
|
|
||||||
/* client.c */
|
/* client.c */
|
||||||
void client_attach(Client *c);
|
void client_attach(Client *c);
|
||||||
@@ -191,7 +199,10 @@ void uicb_client_screen_prev(uicb_t);
|
|||||||
void uicb_client_move(uicb_t cmd);
|
void uicb_client_move(uicb_t cmd);
|
||||||
void uicb_client_resize(uicb_t cmd);
|
void uicb_client_resize(uicb_t cmd);
|
||||||
void uicb_ignore_next_client_rules(uicb_t cmd);
|
void uicb_ignore_next_client_rules(uicb_t cmd);
|
||||||
|
void uicb_clientlist(uicb_t cmd);
|
||||||
|
void uicb_client_select(uicb_t cmd);
|
||||||
|
Bool uicb_checkclist(uicb_t);
|
||||||
|
void uicb_client_ignore_tag(uicb_t);
|
||||||
|
|
||||||
/* ewmh.c */
|
/* ewmh.c */
|
||||||
void ewmh_init_hints(void);
|
void ewmh_init_hints(void);
|
||||||
@@ -235,13 +246,15 @@ void menu_init(Menu *menu, char *name, int nitem, uint bg_f, char *fg_f, uint bg
|
|||||||
void menu_new_item(MenuItem *mi, char *name, void *func, char *cmd);
|
void menu_new_item(MenuItem *mi, char *name, void *func, char *cmd);
|
||||||
void menu_draw(Menu menu, int x, int y);
|
void menu_draw(Menu menu, int x, int y);
|
||||||
Bool menu_manage_event(XEvent *ev, Menu *menu, BarWindow *winitem[]);
|
Bool menu_manage_event(XEvent *ev, Menu *menu, BarWindow *winitem[]);
|
||||||
|
Bool menu_activate_item(Menu *menu, int i);
|
||||||
void menu_focus_item(Menu *menu, int item, BarWindow *winitem[]);
|
void menu_focus_item(Menu *menu, int item, BarWindow *winitem[]);
|
||||||
void menu_draw_item_name(Menu *menu, int item, BarWindow *winitem[]);
|
void menu_draw_item_name(Menu *menu, int item, BarWindow *winitem[]);
|
||||||
int menu_get_longer_string(MenuItem *mt, int nitem);
|
int menu_get_longer_string(MenuItem *mi, int nitem);
|
||||||
void uicb_menu(uicb_t cmd);
|
void uicb_menu(uicb_t cmd);
|
||||||
|
void menu_clear(Menu *menu);
|
||||||
|
|
||||||
/* launcher.c */
|
/* launcher.c */
|
||||||
void launcher_execute(Launcher launcher);
|
void launcher_execute(Launcher *launcher);
|
||||||
void uicb_launcher(uicb_t);
|
void uicb_launcher(uicb_t);
|
||||||
|
|
||||||
/* mouse.c */
|
/* mouse.c */
|
||||||
@@ -269,25 +282,38 @@ char* alias_to_str(char *conf_choice);
|
|||||||
/* }}} */
|
/* }}} */
|
||||||
XRectangle get_mouse_pos(void);
|
XRectangle get_mouse_pos(void);
|
||||||
char *char_to_str(const char c);
|
char *char_to_str(const char c);
|
||||||
void spawn(const char *str, ...);
|
int spawn(const char *str, ...);
|
||||||
void swap_ptr(void **x, void **y);
|
void swap_ptr(void **x, void **y);
|
||||||
void uicb_spawn(uicb_t);
|
void uicb_spawn(uicb_t);
|
||||||
|
char *clean_value(char *str);
|
||||||
|
|
||||||
#ifdef HAVE_IMLIB
|
#ifdef HAVE_IMLIB
|
||||||
int parse_image_block(ImageAttr *im, char *str);
|
int parse_image_block(ImageAttr *im, char *str);
|
||||||
#endif /* HAVE_IMLIB */
|
#endif /* HAVE_IMLIB */
|
||||||
|
|
||||||
|
|
||||||
/* tag.c */
|
/* tag.c */
|
||||||
void tag_set(int tag);
|
void tag_set(int tag);
|
||||||
void tag_transfert(Client *c, int tag);
|
void tag_transfert(Client *c, int tag);
|
||||||
void uicb_tag(uicb_t);
|
void uicb_tag(uicb_t);
|
||||||
void uicb_tag_next(uicb_t);
|
void uicb_tag_next(uicb_t);
|
||||||
void uicb_tag_prev(uicb_t);
|
void uicb_tag_prev(uicb_t);
|
||||||
|
void uicb_tag_next_visible(uicb_t);
|
||||||
|
void uicb_tag_prev_visible(uicb_t);
|
||||||
void uicb_tagtransfert(uicb_t);
|
void uicb_tagtransfert(uicb_t);
|
||||||
void uicb_tag_prev_sel(uicb_t);
|
void uicb_tag_prev_sel(uicb_t);
|
||||||
void uicb_tagtransfert_next(uicb_t);
|
void uicb_tagtransfert_next(uicb_t);
|
||||||
void uicb_tagtransfert_prev(uicb_t);
|
void uicb_tagtransfert_prev(uicb_t);
|
||||||
|
void uicb_tag_urgent(uicb_t cmd);
|
||||||
|
void tag_additional(int sc, int tag, int adtag);
|
||||||
|
void uicb_tag_toggle_additional(uicb_t);
|
||||||
|
void tag_swap(int s, int t1, int t2);
|
||||||
|
void uicb_tag_swap(uicb_t);
|
||||||
|
void uicb_tag_swap_next(uicb_t);
|
||||||
|
void uicb_tag_swap_previous(uicb_t);
|
||||||
|
void tag_new(int s, char *name);
|
||||||
|
void uicb_tag_new(uicb_t);
|
||||||
|
void tag_delete(int s, int tag);
|
||||||
|
void uicb_tag_del(uicb_t);
|
||||||
|
|
||||||
/* screen.c */
|
/* screen.c */
|
||||||
int screen_count(void);
|
int screen_count(void);
|
||||||
@@ -303,6 +329,7 @@ void uicb_screen_prev_sel(uicb_t);
|
|||||||
|
|
||||||
/* status.c */
|
/* status.c */
|
||||||
int statustext_rectangle(StatusRec *r, char *str);
|
int statustext_rectangle(StatusRec *r, char *str);
|
||||||
|
int statustext_graph(StatusGraph *g, char *str);
|
||||||
int statustext_text(StatusText *s, char *str);
|
int statustext_text(StatusText *s, char *str);
|
||||||
void statustext_normal(int sc, char *str);
|
void statustext_normal(int sc, char *str);
|
||||||
void statustext_handle(int sc, char *str);
|
void statustext_handle(int sc, char *str);
|
||||||
@@ -335,6 +362,9 @@ void uicb_toggle_abovefc(uicb_t cmd);
|
|||||||
void uicb_set_layer(uicb_t cmd);
|
void uicb_set_layer(uicb_t cmd);
|
||||||
void uicb_set_client_layer(uicb_t cmd);
|
void uicb_set_client_layer(uicb_t cmd);
|
||||||
void layout_set_client_master(Client *c);
|
void layout_set_client_master(Client *c);
|
||||||
|
Bool uicb_checkmax(uicb_t);
|
||||||
|
Bool uicb_checkfree(uicb_t);
|
||||||
|
Bool uicb_checklayout(uicb_t);
|
||||||
|
|
||||||
/* init.c */
|
/* init.c */
|
||||||
void init(void);
|
void init(void);
|
||||||
@@ -402,6 +432,13 @@ int *seltag;
|
|||||||
int *prevseltag;
|
int *prevseltag;
|
||||||
Menu menulayout;
|
Menu menulayout;
|
||||||
|
|
||||||
|
/* ClientList */
|
||||||
|
Menu clientlist;
|
||||||
|
struct clndx {
|
||||||
|
char key[4];
|
||||||
|
Client *client;
|
||||||
|
} clist_index[MAXCLIST];
|
||||||
|
|
||||||
/* Important Client */
|
/* Important Client */
|
||||||
Client *clients;
|
Client *clients;
|
||||||
Client *sel;
|
Client *sel;
|
||||||
|
|||||||
78
wmfsrc.in
78
wmfsrc.in
@@ -7,6 +7,10 @@
|
|||||||
font = "dejavu-10"
|
font = "dejavu-10"
|
||||||
raisefocus = false
|
raisefocus = false
|
||||||
focus_follow_mouse = true
|
focus_follow_mouse = true
|
||||||
|
# focus_pointer_click: click on unfocused client area:
|
||||||
|
# true -- default, set focus
|
||||||
|
# false -- click go to client; including dockapps
|
||||||
|
focus_pointer_click = true
|
||||||
status_timing = 1 #seconds
|
status_timing = 1 #seconds
|
||||||
[/misc]
|
[/misc]
|
||||||
|
|
||||||
@@ -14,7 +18,21 @@
|
|||||||
bg = "#191919"
|
bg = "#191919"
|
||||||
fg = "#D4D4D4"
|
fg = "#D4D4D4"
|
||||||
border = true
|
border = true
|
||||||
selbar = false
|
# selbar = false #not worked now, see section [selbar]
|
||||||
|
|
||||||
|
# Remove this section to disable the selbar.
|
||||||
|
[selbar]
|
||||||
|
bg = "#191919"
|
||||||
|
fg = "#D4D4ff"
|
||||||
|
|
||||||
|
# Cut title lenght
|
||||||
|
# max_lenght = 25
|
||||||
|
|
||||||
|
[mouse] button = "3" func = "clientlist" [/mouse]
|
||||||
|
[mouse] button = "4" func = "client_next" [/mouse]
|
||||||
|
[mouse] button = "5" func = "client_prev" [/mouse]
|
||||||
|
[/selbar]
|
||||||
|
|
||||||
[/bar]
|
[/bar]
|
||||||
|
|
||||||
[layouts]
|
[layouts]
|
||||||
@@ -50,10 +68,22 @@
|
|||||||
occupied_bg = "#003366"
|
occupied_bg = "#003366"
|
||||||
sel_fg = "#191919"
|
sel_fg = "#191919"
|
||||||
sel_bg = "#7E89A2"
|
sel_bg = "#7E89A2"
|
||||||
|
urgent_bg = "#DD1111"
|
||||||
|
urgent_fg = "#000000"
|
||||||
|
|
||||||
# Border around the tag buttons.
|
# Border around the tag buttons.
|
||||||
border = true
|
border = true
|
||||||
|
|
||||||
|
# Hide empty tags in tag list
|
||||||
|
autohide = false
|
||||||
|
|
||||||
|
# Mouse buttons action on tag.
|
||||||
|
mouse_button_tag_sel = "1"
|
||||||
|
mouse_button_tag_transfert = "2"
|
||||||
|
mouse_button_tag_add = "3"
|
||||||
|
mouse_button_tag_next = "4"
|
||||||
|
mouse_button_tag_prev = "5"
|
||||||
|
|
||||||
[tag]
|
[tag]
|
||||||
name = "one"
|
name = "one"
|
||||||
screen = 0
|
screen = 0
|
||||||
@@ -62,6 +92,8 @@
|
|||||||
layout = "tile_right"
|
layout = "tile_right"
|
||||||
resizehint = false
|
resizehint = false
|
||||||
infobar_position = "top"
|
infobar_position = "top"
|
||||||
|
|
||||||
|
#[mouse] [/mouse] Possible multi mouse section
|
||||||
[/tag]
|
[/tag]
|
||||||
|
|
||||||
[tag] name = "two" clients = {"Browser"} [/tag]
|
[tag] name = "two" clients = {"Browser"} [/tag]
|
||||||
@@ -84,6 +116,7 @@
|
|||||||
[/root]
|
[/root]
|
||||||
|
|
||||||
[client]
|
[client]
|
||||||
|
client_round = true
|
||||||
border_height = 3
|
border_height = 3
|
||||||
border_shadow = true
|
border_shadow = true
|
||||||
border_normal = "#191919"
|
border_normal = "#191919"
|
||||||
@@ -131,10 +164,14 @@
|
|||||||
# place_at_mouse = false
|
# place_at_mouse = false
|
||||||
# x = 40 y = 50
|
# x = 40 y = 50
|
||||||
|
|
||||||
|
# Available "center", "left", "right" menu align. Default: "center".
|
||||||
|
align = "left"
|
||||||
|
|
||||||
fg_focus = "#191919" bg_focus = "#7E89A2"
|
fg_focus = "#191919" bg_focus = "#7E89A2"
|
||||||
fg_normal = "#9F9AB3" bg_normal = "#191919"
|
fg_normal = "#9F9AB3" bg_normal = "#191919"
|
||||||
|
|
||||||
[item] name = "Terminal" func = "spawn" cmd = "@WMFS_TERM@" [/item]
|
[item] name = "Terminal" func = "spawn" cmd = "@WMFS_TERM@" [/item]
|
||||||
|
[item] name = "Applications" submenu = "appmenu" [/item]
|
||||||
[item] name = "Next tag" func = "tag_next" [/item]
|
[item] name = "Next tag" func = "tag_next" [/item]
|
||||||
[item] name = "Previous tag" func = "tag_prev" [/item]
|
[item] name = "Previous tag" func = "tag_prev" [/item]
|
||||||
[item] name = "Next layout" func = "layout_next" [/item]
|
[item] name = "Next layout" func = "layout_next" [/item]
|
||||||
@@ -143,15 +180,27 @@
|
|||||||
[item] name = "Quit WMFS" func = "quit" [/item]
|
[item] name = "Quit WMFS" func = "quit" [/item]
|
||||||
[/set_menu]
|
[/set_menu]
|
||||||
|
|
||||||
|
[set_menu]
|
||||||
|
name = "appmenu"
|
||||||
|
align = "left"
|
||||||
|
|
||||||
|
fg_focus = "#191919" bg_focus = "#7E89A2"
|
||||||
|
fg_normal = "#9F9AB3" bg_normal = "#191919"
|
||||||
|
|
||||||
|
[item] name = "Browser" func = "spawn" cmd = "firefox" [/item]
|
||||||
|
[item] name = "Calculator" func = "spawn" cmd = "xcalc" [/item]
|
||||||
|
[/set_menu]
|
||||||
|
|
||||||
[set_menu]
|
[set_menu]
|
||||||
name = "clientmenu"
|
name = "clientmenu"
|
||||||
|
|
||||||
fg_focus = "#D4D4D4" bg_focus = "#003366"
|
fg_focus = "#D4D4D4" bg_focus = "#003366"
|
||||||
fg_normal = "#D4D4D4" bg_normal = "#191919"
|
fg_normal = "#D4D4D4" bg_normal = "#191919"
|
||||||
|
|
||||||
[item] name = "Close" func = "client_kill" [/item]
|
# Check items: possible 'check_max' or 'check_free'.
|
||||||
[item] name = "Maximize" func = "toggle_max" [/item]
|
[item] name = "Close" func = "client_kill" [/item]
|
||||||
[item] name = "Free" func = "toggle_free" [/item]
|
[item] name = "Maximize" func = "toggle_max" check = "check_max" [/item]
|
||||||
|
[item] name = "Free" func = "toggle_free" check = "check_free" [/item]
|
||||||
[/set_menu]
|
[/set_menu]
|
||||||
[/menu]
|
[/menu]
|
||||||
|
|
||||||
@@ -201,6 +250,9 @@
|
|||||||
# Toggle the resizehint of the current tag/screen
|
# Toggle the resizehint of the current tag/screen
|
||||||
[key] mod = {"Shift", "Control"} key = "r" func = "toggle_resizehint" [/key]
|
[key] mod = {"Shift", "Control"} key = "r" func = "toggle_resizehint" [/key]
|
||||||
|
|
||||||
|
# Toggle the tag_autohide mode
|
||||||
|
[key] mod = {"Shift", "Control"} key = "t" func = "toggle_tagautohide" [/key]
|
||||||
|
|
||||||
# Select the next client.
|
# Select the next client.
|
||||||
[key] mod = {"Alt"} key = "Tab" func = "client_next" [/key]
|
[key] mod = {"Alt"} key = "Tab" func = "client_next" [/key]
|
||||||
|
|
||||||
@@ -213,6 +265,12 @@
|
|||||||
# Select the previous tag.
|
# Select the previous tag.
|
||||||
[key] mod = {"Control"} key = "Left" func = "tag_prev" [/key]
|
[key] mod = {"Control"} key = "Left" func = "tag_prev" [/key]
|
||||||
|
|
||||||
|
# Select the next visible tag.
|
||||||
|
[key] mod = {"Control","Alt"} key = "Right" func = "tag_next_visible" [/key]
|
||||||
|
|
||||||
|
# Select the previous visible tag.
|
||||||
|
[key] mod = {"Control","Alt"} key = "Left" func = "tag_prev_visible" [/key]
|
||||||
|
|
||||||
# Set the next layout.
|
# Set the next layout.
|
||||||
[key] mod = {"Alt"} key = "space" func = "layout_next" [/key]
|
[key] mod = {"Alt"} key = "space" func = "layout_next" [/key]
|
||||||
|
|
||||||
@@ -258,6 +316,18 @@
|
|||||||
[key] mod = {"Alt", "Shift"} key = "F7" func = "tag_transfert" cmd ="7" [/key]
|
[key] mod = {"Alt", "Shift"} key = "F7" func = "tag_transfert" cmd ="7" [/key]
|
||||||
[key] mod = {"Alt", "Shift"} key = "F8" func = "tag_transfert" cmd ="8" [/key]
|
[key] mod = {"Alt", "Shift"} key = "F8" func = "tag_transfert" cmd ="8" [/key]
|
||||||
[key] mod = {"Alt", "Shift"} key = "F9" func = "tag_transfert" cmd ="9" [/key]
|
[key] mod = {"Alt", "Shift"} key = "F9" func = "tag_transfert" cmd ="9" [/key]
|
||||||
|
|
||||||
|
# Toggle additional tags (x) on the current tag
|
||||||
|
[key] mod = {"Alt", "Super"} key = "F1" func = "tag_toggle_additional" cmd ="1" [/key]
|
||||||
|
[key] mod = {"Alt", "Super"} key = "F2" func = "tag_toggle_additional" cmd ="2" [/key]
|
||||||
|
[key] mod = {"Alt", "Super"} key = "F3" func = "tag_toggle_additional" cmd ="3" [/key]
|
||||||
|
[key] mod = {"Alt", "Super"} key = "F4" func = "tag_toggle_additional" cmd ="4" [/key]
|
||||||
|
[key] mod = {"Alt", "Super"} key = "F5" func = "tag_toggle_additional" cmd ="5" [/key]
|
||||||
|
[key] mod = {"Alt", "Super"} key = "F6" func = "tag_toggle_additional" cmd ="6" [/key]
|
||||||
|
[key] mod = {"Alt", "Super"} key = "F7" func = "tag_toggle_additional" cmd ="7" [/key]
|
||||||
|
[key] mod = {"Alt", "Super"} key = "F8" func = "tag_toggle_additional" cmd ="8" [/key]
|
||||||
|
[key] mod = {"Alt", "Super"} key = "F9" func = "tag_toggle_additional" cmd ="9" [/key]
|
||||||
|
|
||||||
[/keys]
|
[/keys]
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user