tagpreview: make sure that tagwin is created following configure notify requests ref. #308

This commit is contained in:
bakkeby 2022-11-15 10:31:15 +01:00
parent b4ae62d21a
commit dc4e535b25
3 changed files with 73 additions and 56 deletions

6
dwm.c
View File

@ -1483,6 +1483,9 @@ configurenotify(XEvent *e)
#endif // !FAKEFULLSCREEN_PATCH #endif // !FAKEFULLSCREEN_PATCH
for (bar = m->bar; bar; bar = bar->next) for (bar = m->bar; bar; bar = bar->next)
XMoveResizeWindow(dpy, bar->win, bar->bx, bar->by, bar->bw, bar->bh); XMoveResizeWindow(dpy, bar->win, bar->bx, bar->by, bar->bw, bar->bh);
#if BAR_TAGPREVIEW_PATCH
createpreview(m);
#endif // BAR_TAGPREVIEW_PATCH
} }
focus(NULL); focus(NULL);
arrange(NULL); arrange(NULL);
@ -3770,9 +3773,6 @@ setup(void)
updatebars(); updatebars();
updatestatus(); updatestatus();
#if BAR_TAGPREVIEW_PATCH
updatepreview();
#endif // BAR_TAGPREVIEW_PATCH
/* supporting window for NetWMCheck */ /* supporting window for NetWMCheck */
wmcheckwin = XCreateSimpleWindow(dpy, root, 0, 0, 1, 1, 0, 0, 0); wmcheckwin = XCreateSimpleWindow(dpy, root, 0, 0, 1, 1, 0, 0, 0);

View File

@ -1,16 +1,43 @@
#include <Imlib2.h> #include <Imlib2.h>
void void
showtagpreview(int tag, int x, int y) createpreview(Monitor *m)
{ {
if (selmon->tagmap[tag]) { if (m->tagwin) {
XSetWindowBackgroundPixmap(dpy, selmon->tagwin, selmon->tagmap[tag]); XMoveResizeWindow(
XCopyArea(dpy, selmon->tagmap[tag], selmon->tagwin, drw->gc, 0, 0, selmon->mw / scalepreview, selmon->mh / scalepreview, 0, 0); dpy, m->tagwin,
XMoveWindow(dpy, selmon->tagwin, x, y); m->mx,
XSync(dpy, False); m->bar->by + bh,
XMapWindow(dpy, selmon->tagwin); m->mw / scalepreview,
} else m->mh / scalepreview
XUnmapWindow(dpy, selmon->tagwin); );
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 void
@ -20,6 +47,24 @@ hidetagpreview(Monitor *m)
XUnmapWindow(dpy, m->tagwin); 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 void
tagpreviewswitchtag(void) tagpreviewswitchtag(void)
{ {
@ -27,14 +72,18 @@ tagpreviewswitchtag(void)
unsigned int occ = 0; unsigned int occ = 0;
Client *c; Client *c;
Imlib_Image image; Imlib_Image image;
Monitor *m = selmon;
for (c = selmon->clients; c; c = c->next) if (!m->tagwin)
createpreview(m);
for (c = m->clients; c; c = c->next)
occ |= c->tags; occ |= c->tags;
for (i = 0; i < NUMTAGS; i++) { for (i = 0; i < NUMTAGS; i++) {
if (selmon->tagset[selmon->seltags] & 1 << i) { if (m->tagset[m->seltags] & 1 << i) {
if (selmon->tagmap[i] != 0) { if (m->tagmap[i] != 0) {
XFreePixmap(dpy, selmon->tagmap[i]); XFreePixmap(dpy, m->tagmap[i]);
selmon->tagmap[i] = 0; m->tagmap[i] = 0;
} }
if (occ & 1 << i) { if (occ & 1 << i) {
image = imlib_create_image(sw, sh); image = imlib_create_image(sw, sh);
@ -48,48 +97,16 @@ tagpreviewswitchtag(void)
imlib_context_set_visual(DefaultVisual(dpy, screen)); imlib_context_set_visual(DefaultVisual(dpy, screen));
#endif // BAR_ALPHA_PATCH #endif // BAR_ALPHA_PATCH
imlib_context_set_drawable(root); imlib_context_set_drawable(root);
imlib_copy_drawable_to_image(0, selmon->mx, selmon->my, selmon->mw ,selmon->mh, 0, 0, 1); imlib_copy_drawable_to_image(0, m->mx, m->my, m->mw ,m->mh, 0, 0, 1);
#if BAR_ALPHA_PATCH #if BAR_ALPHA_PATCH
selmon->tagmap[i] = XCreatePixmap(dpy, selmon->tagwin, selmon->mw / scalepreview, selmon->mh / scalepreview, depth); m->tagmap[i] = XCreatePixmap(dpy, m->tagwin, m->mw / scalepreview, m->mh / scalepreview, depth);
#else #else
selmon->tagmap[i] = XCreatePixmap(dpy, selmon->tagwin, selmon->mw / scalepreview, selmon->mh / scalepreview, DefaultDepth(dpy, screen)); m->tagmap[i] = XCreatePixmap(dpy, m->tagwin, m->mw / scalepreview, m->mh / scalepreview, DefaultDepth(dpy, screen));
#endif // BAR_ALPHA_PATCH #endif // BAR_ALPHA_PATCH
imlib_context_set_drawable(selmon->tagmap[i]); imlib_context_set_drawable(m->tagmap[i]);
imlib_render_image_part_on_drawable_at_size(0, 0, selmon->mw, selmon->mh, 0, 0, selmon->mw / scalepreview, selmon->mh / scalepreview); 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(); imlib_free_image();
} }
} }
} }
} }
void
updatepreview(void)
{
Monitor *m;
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
};
for (m = mons; m; m = m->next) {
m->tagwin = XCreateWindow(dpy, root, m->wx, m->bar->by + bh, m->mw / 4, m->mh / 4, 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);
}
}

View File

@ -1,4 +1,4 @@
static void showtagpreview(int tag, int x, int y); static void createpreview(Monitor *m);
static void hidetagpreview(Monitor *m); static void hidetagpreview(Monitor *m);
static void showtagpreview(int tag, int x, int y);
static void tagpreviewswitchtag(void); static void tagpreviewswitchtag(void);
static void updatepreview(void);