summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorProsperousPotato <ProsperousPotato@users.noreply.github.com>2025-08-18 20:03:05 +0100
committerProsperousPotato <ProsperousPotato@users.noreply.github.com>2025-08-18 20:03:05 +0100
commitce9e4453d2ed41c27c72c0a51948995f3f122fcd (patch)
tree19bc4a616cf4f143260bf8d31fbe6574024b8373
parent2faa0fa7bfd3379dc7fe6e337688adf08c32c7b7 (diff)
move functions from search.c and togglemouse.c into dwm.c
-rw-r--r--config.h4
-rw-r--r--config.mk6
-rw-r--r--dwm.c176
-rw-r--r--search.c127
-rw-r--r--togglemouse.c48
5 files changed, 180 insertions, 181 deletions
diff --git a/config.h b/config.h
index 3683ca1..db062b6 100644
--- a/config.h
+++ b/config.h
@@ -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 */
diff --git a/config.mk b/config.mk
index e6c8e1a..3fa2d73 100644
--- a/config.mk
+++ b/config.mk
@@ -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}
diff --git a/dwm.c b/dwm.c
index af7aca0..292deb6 100644
--- a/dwm.c
+++ b/dwm.c
@@ -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;
-}