bar_tagpreview.c (2856B)
1 #include <Imlib2.h> 2 3 void 4 createpreview(Monitor *m) 5 { 6 if (m->tagwin) { 7 XMoveResizeWindow( 8 dpy, m->tagwin, 9 m->mx, 10 m->bar->by + bh, 11 m->mw / scalepreview, 12 m->mh / scalepreview 13 ); 14 return; 15 } 16 17 XSetWindowAttributes wa = { 18 .override_redirect = True, 19 #if BAR_ALPHA_PATCH 20 .background_pixel = 0, 21 .border_pixel = 0, 22 .colormap = cmap, 23 #else 24 .background_pixmap = ParentRelative, 25 #endif // BAR_ALPHA_PATCH 26 .event_mask = ButtonPressMask|ExposureMask 27 }; 28 29 m->tagwin = XCreateWindow(dpy, root, m->wx, m->bar->by + bh, m->mw / scalepreview, m->mh / scalepreview, 0, 30 #if BAR_ALPHA_PATCH 31 depth, CopyFromParent, visual, 32 CWOverrideRedirect|CWBackPixel|CWBorderPixel|CWColormap|CWEventMask, &wa 33 #else 34 DefaultDepth(dpy, screen), CopyFromParent, DefaultVisual(dpy, screen), 35 CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa 36 #endif // BAR_ALPHA_PATCH 37 ); 38 XDefineCursor(dpy, m->tagwin, cursor[CurNormal]->cursor); 39 XMapRaised(dpy, m->tagwin); 40 XUnmapWindow(dpy, m->tagwin); 41 } 42 43 void 44 hidetagpreview(Monitor *m) 45 { 46 m->previewshow = 0; 47 XUnmapWindow(dpy, m->tagwin); 48 } 49 50 void 51 showtagpreview(int tag, int x, int y) 52 { 53 Monitor *m = selmon; 54 55 if (!m->tagwin) 56 return; 57 58 if (m->tagmap[tag]) { 59 XSetWindowBackgroundPixmap(dpy, m->tagwin, m->tagmap[tag]); 60 XCopyArea(dpy, m->tagmap[tag], m->tagwin, drw->gc, 0, 0, m->mw / scalepreview, m->mh / scalepreview, 0, 0); 61 XMoveWindow(dpy, m->tagwin, x, y); 62 XSync(dpy, False); 63 XMapWindow(dpy, m->tagwin); 64 } else 65 XUnmapWindow(dpy, m->tagwin); 66 } 67 68 void 69 tagpreviewswitchtag(void) 70 { 71 int i; 72 unsigned int occ = 0; 73 Client *c; 74 Imlib_Image image; 75 Monitor *m = selmon; 76 77 if (!m->tagwin) 78 createpreview(m); 79 80 for (c = m->clients; c; c = c->next) 81 occ |= c->tags; 82 for (i = 0; i < NUMTAGS; i++) { 83 if (m->tagset[m->seltags] & 1 << i) { 84 if (m->tagmap[i] != 0) { 85 XFreePixmap(dpy, m->tagmap[i]); 86 m->tagmap[i] = 0; 87 } 88 if (occ & 1 << i) { 89 image = imlib_create_image(sw, sh); 90 imlib_context_set_image(image); 91 imlib_context_set_display(dpy); 92 #if BAR_ALPHA_PATCH 93 imlib_image_set_has_alpha(1); 94 imlib_context_set_blend(0); 95 imlib_context_set_visual(visual); 96 #else 97 imlib_context_set_visual(DefaultVisual(dpy, screen)); 98 #endif // BAR_ALPHA_PATCH 99 imlib_context_set_drawable(root); 100 imlib_copy_drawable_to_image(0, m->mx, m->my, m->mw ,m->mh, 0, 0, 1); 101 #if BAR_ALPHA_PATCH 102 m->tagmap[i] = XCreatePixmap(dpy, m->tagwin, m->mw / scalepreview, m->mh / scalepreview, depth); 103 #else 104 m->tagmap[i] = XCreatePixmap(dpy, m->tagwin, m->mw / scalepreview, m->mh / scalepreview, DefaultDepth(dpy, screen)); 105 #endif // BAR_ALPHA_PATCH 106 imlib_context_set_drawable(m->tagmap[i]); 107 imlib_render_image_part_on_drawable_at_size(0, 0, m->mw, m->mh, 0, 0, m->mw / scalepreview, m->mh / scalepreview); 108 imlib_free_image(); 109 } 110 } 111 } 112 }