summaryrefslogtreecommitdiff
path: root/dwm/patch/bar_tagpreview.c
diff options
context:
space:
mode:
authorcoasteen <coasteen@proton.me>2026-07-09 10:42:28 +0330
committercoasteen <coasteen@proton.me>2026-07-09 10:42:28 +0330
commit8cbadb61604667b407b53ee1258433994fa4765a (patch)
tree97765fb29418fd6278fcb4cbb9760893afaf7a58 /dwm/patch/bar_tagpreview.c
Diffstat (limited to 'dwm/patch/bar_tagpreview.c')
-rwxr-xr-xdwm/patch/bar_tagpreview.c112
1 files changed, 112 insertions, 0 deletions
diff --git a/dwm/patch/bar_tagpreview.c b/dwm/patch/bar_tagpreview.c
new file mode 100755
index 0000000..27731b0
--- /dev/null
+++ b/dwm/patch/bar_tagpreview.c
@@ -0,0 +1,112 @@
+#include <Imlib2.h>
+
+void
+createpreview(Monitor *m)
+{
+ if (m->tagwin) {
+ XMoveResizeWindow(
+ dpy, m->tagwin,
+ m->mx,
+ m->bar->by + bh,
+ m->mw / scalepreview,
+ m->mh / scalepreview
+ );
+ return;
+ }
+
+ XSetWindowAttributes wa = {
+ .override_redirect = True,
+ #if BAR_ALPHA_PATCH
+ .background_pixel = 0,
+ .border_pixel = 0,
+ .colormap = cmap,
+ #else
+ .background_pixmap = ParentRelative,
+ #endif // BAR_ALPHA_PATCH
+ .event_mask = ButtonPressMask|ExposureMask
+ };
+
+ m->tagwin = XCreateWindow(dpy, root, m->wx, m->bar->by + bh, m->mw / scalepreview, m->mh / scalepreview, 0,
+ #if BAR_ALPHA_PATCH
+ depth, CopyFromParent, visual,
+ CWOverrideRedirect|CWBackPixel|CWBorderPixel|CWColormap|CWEventMask, &wa
+ #else
+ DefaultDepth(dpy, screen), CopyFromParent, DefaultVisual(dpy, screen),
+ CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa
+ #endif // BAR_ALPHA_PATCH
+ );
+ XDefineCursor(dpy, m->tagwin, cursor[CurNormal]->cursor);
+ XMapRaised(dpy, m->tagwin);
+ XUnmapWindow(dpy, m->tagwin);
+}
+
+void
+hidetagpreview(Monitor *m)
+{
+ m->previewshow = 0;
+ XUnmapWindow(dpy, m->tagwin);
+}
+
+void
+showtagpreview(int tag, int x, int y)
+{
+ Monitor *m = selmon;
+
+ if (!m->tagwin)
+ return;
+
+ if (m->tagmap[tag]) {
+ XSetWindowBackgroundPixmap(dpy, m->tagwin, m->tagmap[tag]);
+ XCopyArea(dpy, m->tagmap[tag], m->tagwin, drw->gc, 0, 0, m->mw / scalepreview, m->mh / scalepreview, 0, 0);
+ XMoveWindow(dpy, m->tagwin, x, y);
+ XSync(dpy, False);
+ XMapWindow(dpy, m->tagwin);
+ } else
+ XUnmapWindow(dpy, m->tagwin);
+}
+
+void
+tagpreviewswitchtag(void)
+{
+ int i;
+ unsigned int occ = 0;
+ Client *c;
+ Imlib_Image image;
+ Monitor *m = selmon;
+
+ if (!m->tagwin)
+ createpreview(m);
+
+ for (c = m->clients; c; c = c->next)
+ occ |= c->tags;
+ for (i = 0; i < NUMTAGS; i++) {
+ if (m->tagset[m->seltags] & 1 << i) {
+ if (m->tagmap[i] != 0) {
+ XFreePixmap(dpy, m->tagmap[i]);
+ m->tagmap[i] = 0;
+ }
+ if (occ & 1 << i) {
+ image = imlib_create_image(sw, sh);
+ imlib_context_set_image(image);
+ imlib_context_set_display(dpy);
+ #if BAR_ALPHA_PATCH
+ imlib_image_set_has_alpha(1);
+ imlib_context_set_blend(0);
+ imlib_context_set_visual(visual);
+ #else
+ imlib_context_set_visual(DefaultVisual(dpy, screen));
+ #endif // BAR_ALPHA_PATCH
+ imlib_context_set_drawable(root);
+ imlib_copy_drawable_to_image(0, m->mx, m->my, m->mw ,m->mh, 0, 0, 1);
+ #if BAR_ALPHA_PATCH
+ m->tagmap[i] = XCreatePixmap(dpy, m->tagwin, m->mw / scalepreview, m->mh / scalepreview, depth);
+ #else
+ m->tagmap[i] = XCreatePixmap(dpy, m->tagwin, m->mw / scalepreview, m->mh / scalepreview, DefaultDepth(dpy, screen));
+ #endif // BAR_ALPHA_PATCH
+ imlib_context_set_drawable(m->tagmap[i]);
+ imlib_render_image_part_on_drawable_at_size(0, 0, m->mw, m->mh, 0, 0, m->mw / scalepreview, m->mh / scalepreview);
+ imlib_free_image();
+ }
+ }
+ }
+}