diff options
| -rw-r--r-- | config.h | 4 | ||||
| -rw-r--r-- | config.mk | 6 | ||||
| -rw-r--r-- | dwm.c | 176 | ||||
| -rw-r--r-- | search.c | 127 | ||||
| -rw-r--r-- | togglemouse.c | 48 |
5 files changed, 180 insertions, 181 deletions
@@ -2,7 +2,7 @@ /* Constants */ #define TERMINAL "st" -#define BROWSER "firefox" +#define BROWSER "chromium" /* appearance */ static const unsigned int borderpx = 3; /* border pixel of windows */ @@ -74,8 +74,6 @@ static const Layout layouts[] = { /* commands */ static const char *termcmd[] = { TERMINAL, NULL }; -#include "search.c" -#include "togglemouse.c" #include <X11/XF86keysym.h> static const Key keys[] = { /* modifier key function argument */ @@ -18,9 +18,9 @@ XINERAMAFLAGS = -DXINERAMA FREETYPELIBS = -lfontconfig -lXft FREETYPEINC = /usr/include/freetype2 # OpenBSD -FREETYPEINC = ${X11INC}/freetype2 -MANPREFIX = ${PREFIX}/man -KVMLIB = -lkvm +# FREETYPEINC = ${X11INC}/freetype2 +# MANPREFIX = ${PREFIX}/man +# KVMLIB = -lkvm # includes and libs INCS = -I${X11INC} -I${FREETYPEINC} @@ -281,6 +281,9 @@ static xcb_connection_t *xcon; static pid_t *autostart_pids; static size_t autostart_len; +static Window fw = 0; +static int ml = 0; + /* configuration, allows nested code to access above variables */ #include "config.h" @@ -2250,6 +2253,179 @@ zoom(const Arg *arg) XWarpPointer(dpy, None, selmon->sel->win, 0, 0, 0, 0, selmon->sel->w/2, selmon->sel->h/2); } +void +search(const Arg *arg) { + Client *c; + Monitor *m; + char *names = NULL; + size_t namesize = 0; + size_t nameslen = 0; + int clientnum = 0; + Client **clients = NULL; + size_t clientsize = 0; + int mode = arg->i; + + for (m = mons; m; m = m->next) { + for (c = m->clients; c; c = c->next) { + if (!ISVISIBLE(c)) { + clientnum++; + + char ts[64] = "["; + int tl = 1; + int first = 1; + for (int i = 0; i < LENGTH(tags); i++) { + if (c->tags & (1 << i)) { + if (!first) tl += snprintf(ts + tl, sizeof(ts) - tl, ","); + tl += snprintf(ts + tl, sizeof(ts) - tl, "%d", i + 1); + first = 0; + } + } + tl += snprintf(ts + tl, sizeof(ts) - tl, "] "); + + size_t namelen = strlen(c->name); + size_t needed = nameslen + tl + namelen + 1; + + if (needed > namesize) { + namesize = needed * 2; + names = realloc(names, namesize); + if (!names) + die("search: realloc failed"); + } + + if (clientnum > clientsize) { + clientsize = clientnum * 2; + clients = realloc(clients, clientsize * sizeof(Client *)); + if (!clients) + die("search: realloc failed"); + } + + strlcpy(names + nameslen, ts, namesize - nameslen); + nameslen += tl; + strlcpy(names + nameslen, c->name, namesize - nameslen); + + nameslen += namelen; + names[nameslen] = '\n'; + nameslen++; + + clients[clientnum - 1] = c; + } + } + } + + if (clientnum == 0) + return; + + names[nameslen - 1] = '\0'; + + char dmenucmd[256]; + snprintf(dmenucmd, sizeof(dmenucmd), "echo '%s' | dmenu -l 10 -i -p 'Find client:'", names); + + FILE *fp = popen(dmenucmd, "r"); + if (!fp) { + free(names); + free(clients); + return; + } + + char selname[256]; + if (fgets(selname, sizeof(selname), fp) != NULL) { + size_t len = strlen(selname); + if (len > 0 && selname[len - 1] == '\n') + selname[len - 1] = '\0'; + + char *clientname = strchr(selname, ']'); + if (clientname) { + clientname += 2; + + for (int i = 0; i < clientnum; i++) { + if (strcmp(clients[i]->name, clientname) == 0) { + Client *selclient = clients[i]; + + if (mode == 1) { + selclient->tags = selmon->tagset[selmon->seltags]; + + if (selclient->mon != selmon) { + detach(selclient); + detachstack(selclient); + selclient->mon = selmon; + attach(selclient); + attachstack(selclient); + } + + focus(selclient); + arrange(selmon); + } else { + if (selclient->mon != selmon) + selmon = selclient->mon; + + Arg view_arg; + view_arg.ui = selclient->tags; + view(&view_arg); + + focus(selclient); + } + + if (selclient != nexttiled(selmon->clients)) { + zoom(0); + } + + break; + } + } + } + } + + pclose(fp); + free(names); + free(clients); +} + +void +togglemouse(const Arg *arg) { + if (ml) { + XUngrabPointer(dpy, CurrentTime); + XWarpPointer(dpy, None, selmon->sel->win, 0, 0, 0, 0, selmon->sel->w/2, selmon->sel->h/2); + if (fw) { + XDestroyWindow(dpy, fw); + fw = 0; + } + ml = 0; + return; + } + + Window root = RootWindow(dpy, screen); + + XSetWindowAttributes attrs; + attrs.override_redirect = True; + attrs.event_mask = 0; + + fw = XCreateWindow( + dpy, root, 0, sh - 1, 1, 1, 0, + DefaultDepth(dpy, screen), + InputOutput, DefaultVisual(dpy, screen), + CWOverrideRedirect | CWEventMask, &attrs + ); + + XMapRaised(dpy, fw); + XSync(dpy, False); + + XWarpPointer(dpy, None, root, 0, 0, 0, 0, 0, sh - 1); + + if (XGrabPointer(dpy, fw, True, + 0, + GrabModeAsync, + GrabModeAsync, + fw, + None, + CurrentTime) != GrabSuccess) { + XDestroyWindow(dpy, fw); + fw = 0; + return; + } + + ml = 1; +} + static void autostart_exec() { const char *const *p; diff --git a/search.c b/search.c deleted file mode 100644 index 7027fff..0000000 --- a/search.c +++ /dev/null @@ -1,127 +0,0 @@ -void -search(const Arg *arg) -{ - Client *c; - Monitor *m; - char *names = NULL; - size_t names_size = 0; - size_t names_len = 0; - int client_count = 0; - Client **clients = NULL; - size_t clients_size = 0; - int mode = arg->i; - - for (m = mons; m; m = m->next) { - for (c = m->clients; c; c = c->next) { - if (!ISVISIBLE(c)) { - client_count++; - - char tag_str[64] = "["; - int tag_len = 1; - int first = 1; - for (int i = 0; i < LENGTH(tags); i++) { - if (c->tags & (1 << i)) { - if (!first) tag_len += snprintf(tag_str + tag_len, sizeof(tag_str) - tag_len, ","); - tag_len += snprintf(tag_str + tag_len, sizeof(tag_str) - tag_len, "%d", i + 1); - first = 0; - } - } - tag_len += snprintf(tag_str + tag_len, sizeof(tag_str) - tag_len, "] "); - - size_t name_len = strlen(c->name); - size_t needed = names_len + tag_len + name_len + 1; - - if (needed > names_size) { - names_size = needed * 2; - names = realloc(names, names_size); - if (!names) - die("search: realloc failed"); - } - - if (client_count > clients_size) { - clients_size = client_count * 2; - clients = realloc(clients, clients_size * sizeof(Client *)); - if (!clients) - die("search: realloc failed"); - } - - strlcpy(names + names_len, tag_str, names_size - names_len); - names_len += tag_len; - strlcpy(names + names_len, c->name, names_size - names_len); - - names_len += name_len; - names[names_len] = '\n'; - names_len++; - - clients[client_count - 1] = c; - } - } - } - - if (client_count == 0) - return; - - names[names_len - 1] = '\0'; - - char dmenu_cmd[256]; - snprintf(dmenu_cmd, sizeof(dmenu_cmd), "echo '%s' | dmenu -l 10 -i -p 'Find client:'", names); - - FILE *fp = popen(dmenu_cmd, "r"); - if (!fp) { - free(names); - free(clients); - return; - } - - char selected_name[256]; - if (fgets(selected_name, sizeof(selected_name), fp) != NULL) { - size_t len = strlen(selected_name); - if (len > 0 && selected_name[len - 1] == '\n') - selected_name[len - 1] = '\0'; - - char *client_name = strchr(selected_name, ']'); - if (client_name) { - client_name += 2; - - for (int i = 0; i < client_count; i++) { - if (strcmp(clients[i]->name, client_name) == 0) { - Client *selected_client = clients[i]; - - if (mode == 1) { - selected_client->tags = selmon->tagset[selmon->seltags]; - - if (selected_client->mon != selmon) { - detach(selected_client); - detachstack(selected_client); - selected_client->mon = selmon; - attach(selected_client); - attachstack(selected_client); - } - - focus(selected_client); - arrange(selmon); - } else { - if (selected_client->mon != selmon) - selmon = selected_client->mon; - - Arg view_arg; - view_arg.ui = selected_client->tags; - view(&view_arg); - - focus(selected_client); - } - - if (selected_client != nexttiled(selmon->clients)) { - zoom(0); - } - - break; - } - } - } - } - - pclose(fp); - free(names); - free(clients); -} diff --git a/togglemouse.c b/togglemouse.c deleted file mode 100644 index 9c46189..0000000 --- a/togglemouse.c +++ /dev/null @@ -1,48 +0,0 @@ -static Window fw = 0; -static int locked = 0; - -void -togglemouse(const Arg *arg) { - if (locked) { - XUngrabPointer(dpy, CurrentTime); - XWarpPointer(dpy, None, selmon->sel->win, 0, 0, 0, 0, selmon->sel->w/2, selmon->sel->h/2); - if (fw) { - XDestroyWindow(dpy, fw); - fw = 0; - } - locked = 0; - return; - } - - Window root = RootWindow(dpy, screen); - - XSetWindowAttributes attrs; - attrs.override_redirect = True; - attrs.event_mask = 0; - - fw = XCreateWindow( - dpy, root, 0, sh - 1, 1, 1, 0, - DefaultDepth(dpy, screen), - InputOutput, DefaultVisual(dpy, screen), - CWOverrideRedirect | CWEventMask, &attrs - ); - - XMapRaised(dpy, fw); - XSync(dpy, False); - - XWarpPointer(dpy, None, root, 0, 0, 0, 0, 0, sh - 1); - - if (XGrabPointer(dpy, fw, True, - 0, - GrabModeAsync, - GrabModeAsync, - fw, - None, - CurrentTime) != GrabSuccess) { - XDestroyWindow(dpy, fw); - fw = 0; - return; - } - - locked = 1; -} |
