progman.exe^H^H^H^H
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

recalc_frame: For utility windows, draw a small title-less titlebar

This looks like the utility windows seen in Visual Basic 3.

+104 -42
+57 -42
client.c
··· 512 512 int borw = 0; 513 513 int buts = font->ascent + font->descent + (2 * opt_pad) + 2; 514 514 515 + if (buts < close_pm_attrs.width) 516 + buts = close_pm_attrs.width; 517 + 515 518 if (c->win_type == net_wm_type_dock || 516 519 c->win_type == net_wm_type_menu || 517 520 c->win_type == net_wm_type_splash || 518 521 c->win_type == net_wm_type_desk) 519 522 c->frame_style = FRAME_NONE; 520 523 else if (c->win_type == net_wm_type_utility) 521 - c->frame_style = (FRAME_BORDER | FRAME_RESIZABLE); 524 + c->frame_style = (FRAME_BORDER | FRAME_RESIZABLE | 525 + FRAME_CLOSE | FRAME_TITLEBAR); 522 526 else if (c->state & (STATE_DOCK | STATE_FULLSCREEN)) 523 527 c->frame_style = FRAME_NONE; 524 528 else if (c->state & STATE_ZOOMED) 525 529 c->frame_style = FRAME_ALL & ~(FRAME_BORDER | FRAME_RESIZABLE); 526 - else { 530 + else 527 531 c->frame_style = FRAME_ALL; 528 532 529 - if ((c->size.flags & PMinSize) && (c->size.flags & PMaxSize) && 530 - c->size.min_width == c->size.max_width && 531 - c->size.min_height == c->size.max_height) 532 - c->frame_style &= ~(FRAME_RESIZABLE | FRAME_ZOOM); 533 - } 533 + if ((c->size.flags & PMinSize) && (c->size.flags & PMaxSize) && 534 + c->size.min_width == c->size.max_width && 535 + c->size.min_height == c->size.max_height) 536 + c->frame_style &= ~(FRAME_RESIZABLE | FRAME_ZOOM); 534 537 535 538 if (c->frame_style & FRAME_RESIZABLE) 536 539 borw = opt_bw + 2; 537 540 else if (c->frame_style & FRAME_BORDER) 538 541 borw = 1; 542 + 543 + if (c->win_type == net_wm_type_utility) { 544 + buts = (2 * opt_pad) + 2; 545 + if (buts < utility_close_pm_attrs.width) 546 + buts = utility_close_pm_attrs.width; 547 + if (c->frame_style & FRAME_RESIZABLE) 548 + borw = (opt_bw / 2) + 2; 549 + } 539 550 540 551 if (c->frame_style & FRAME_RESIZABLE) { 541 552 c->resize_nw_geom.x = 0; ··· 749 760 { 750 761 XftColor *txft; 751 762 XGlyphInfo extents; 763 + Pixmap *pm, *pm_mask; 764 + XpmAttributes *pm_attrs; 752 765 int x, y, tw; 753 766 754 767 if (!c || (c->frame_style & FRAME_NONE) || !c->frame) ··· 836 849 c->close_geom.x, c->close_geom.y, c->close_geom.w, 837 850 c->close_geom.h); 838 851 XMapWindow(dpy, c->close); 839 - x = (c->close_geom.w / 2) - (close_pm_attrs.width / 2); 840 - y = (c->close_geom.h / 2) - (close_pm_attrs.height / 2); 841 - XSetClipMask(dpy, pixmap_gc, close_pm_mask); 852 + 853 + if (c->win_type == net_wm_type_utility) { 854 + pm = &utility_close_pm; 855 + pm_mask = &utility_close_pm_mask; 856 + pm_attrs = &utility_close_pm_attrs; 857 + } else { 858 + pm = &close_pm; 859 + pm_mask = &close_pm_mask; 860 + pm_attrs = &close_pm_attrs; 861 + } 862 + 863 + x = (c->close_geom.w / 2) - (pm_attrs->width / 2); 864 + y = (c->close_geom.h / 2) - (pm_attrs->height / 2); 865 + XSetClipMask(dpy, pixmap_gc, *pm_mask); 842 866 XSetClipOrigin(dpy, pixmap_gc, x, y); 843 - XCopyArea(dpy, close_pm, c->close, pixmap_gc, 0, 0, 844 - close_pm_attrs.width, close_pm_attrs.height, x, y); 867 + XCopyArea(dpy, *pm, c->close, pixmap_gc, 0, 0, 868 + pm_attrs->width, pm_attrs->height, x, y); 845 869 if (c->close_pressed) 846 870 XCopyArea(dpy, c->close, c->close, invert_gc, 847 871 0, 0, c->close_geom.w, c->close_geom.h, 0, ··· 875 899 XMapWindow(dpy, c->titlebar); 876 900 XClearWindow(dpy, c->titlebar); 877 901 878 - if (c->name) { 902 + if (c->name && (c->win_type != net_wm_type_utility)) { 879 903 XftTextExtentsUtf8(dpy, font, 880 904 (FcChar8 *)c->name, strlen(c->name), 881 905 &extents); ··· 943 967 XSetWindowBackground(dpy, c->zoom, button_bg.pixel); 944 968 XClearWindow(dpy, c->zoom); 945 969 XMapWindow(dpy, c->zoom); 970 + 946 971 if (c->state & STATE_ZOOMED) { 947 - x = (c->zoom_geom.w / 2) - 948 - (unzoom_pm_attrs.width / 2) - 949 - (opt_bevel / 2); 950 - y = (c->zoom_geom.h / 2) - 951 - (unzoom_pm_attrs.height / 2) - 952 - (opt_bevel / 2); 953 - if (c->zoom_pressed) { 954 - x += 2; 955 - y += 2; 956 - } 957 - XSetClipMask(dpy, pixmap_gc, unzoom_pm_mask); 958 - XSetClipOrigin(dpy, pixmap_gc, x, y); 959 - XCopyArea(dpy, unzoom_pm, c->zoom, pixmap_gc, 960 - 0, 0, unzoom_pm_attrs.width, 961 - unzoom_pm_attrs.height, x, y); 972 + pm = &unzoom_pm; 973 + pm_mask = &unzoom_pm_mask; 974 + pm_attrs = &unzoom_pm_attrs; 962 975 } else { 963 - x = (c->zoom_geom.w / 2) - 964 - (zoom_pm_attrs.width / 2) - (opt_bevel / 2); 965 - y = (c->zoom_geom.h / 2) - 966 - (zoom_pm_attrs.height / 2) - 967 - (opt_bevel / 2); 968 - if (c->zoom_pressed) { 969 - x += 2; 970 - y += 2; 971 - } 972 - XSetClipMask(dpy, pixmap_gc, zoom_pm_mask); 973 - XSetClipOrigin(dpy, pixmap_gc, x, y); 974 - XCopyArea(dpy, zoom_pm, c->zoom, pixmap_gc, 0, 975 - 0, zoom_pm_attrs.width, 976 - zoom_pm_attrs.height, x, y); 976 + pm = &zoom_pm; 977 + pm_mask = &zoom_pm_mask; 978 + pm_attrs = &zoom_pm_attrs; 979 + } 980 + 981 + x = (c->zoom_geom.w / 2) - (pm_attrs->width / 2) - 982 + (opt_bevel / 2); 983 + y = (c->zoom_geom.h / 2) - (pm_attrs->height / 2) - 984 + (opt_bevel / 2); 985 + if (c->zoom_pressed) { 986 + x += 2; 987 + y += 2; 977 988 } 989 + XSetClipMask(dpy, pixmap_gc, *pm_mask); 990 + XSetClipOrigin(dpy, pixmap_gc, x, y); 991 + XCopyArea(dpy, *pm, c->zoom, pixmap_gc, 0, 0, 992 + pm_attrs->width, pm_attrs->height, x, y); 978 993 bevel(c->zoom, c->zoom_geom, c->zoom_pressed); 979 994 XSetForeground(dpy, DefaultGC(dpy, screen), 980 995 border_fg.pixel);
+14
icons/utility_close.xpm
··· 1 + /* XPM */ 2 + static char * utility_close_xpm[] = { 3 + "7 7 4 1", 4 + " c None", 5 + ". c #000000", 6 + "+ c #FFFFFF", 7 + "@ c #87888F", 8 + " ", 9 + " ", 10 + "...... ", 11 + ".++++.@", 12 + "......@", 13 + " @@@@@@", 14 + " "};
+21
icons/utility_close_hidpi.xpm
··· 1 + /* XPM */ 2 + static char * utility_close_xpm[] = { 3 + "14 14 4 1", 4 + " c None", 5 + ". c #000000", 6 + "+ c #FFFFFF", 7 + "@ c #87888F", 8 + " ", 9 + " ", 10 + " ", 11 + " ", 12 + " ", 13 + " .......... ", 14 + " .++++++++.@@", 15 + " .++++++++.@@", 16 + " ..........@@", 17 + " @@@@@@@@@@", 18 + " @@@@@@@@@@", 19 + " ", 20 + " ", 21 + " "};
+9
progman.c
··· 46 46 47 47 #ifdef HIDPI 48 48 #include "icons/close_hidpi.xpm" 49 + #include "icons/utility_close_hidpi.xpm" 49 50 #include "icons/iconify_hidpi.xpm" 50 51 #include "icons/zoom_hidpi.xpm" 51 52 #include "icons/unzoom_hidpi.xpm" 52 53 #include "icons/default_icon_hidpi.xpm" 53 54 #else 54 55 #include "icons/close.xpm" 56 + #include "icons/utility_close.xpm" 55 57 #include "icons/iconify.xpm" 56 58 #include "icons/zoom.xpm" 57 59 #include "icons/unzoom.xpm" ··· 91 93 Pixmap close_pm; 92 94 Pixmap close_pm_mask; 93 95 XpmAttributes close_pm_attrs; 96 + Pixmap utility_close_pm; 97 + Pixmap utility_close_pm_mask; 98 + XpmAttributes utility_close_pm_attrs; 94 99 Pixmap iconify_pm; 95 100 Pixmap iconify_pm_mask; 96 101 XpmAttributes iconify_pm_attrs; ··· 322 327 323 328 XpmCreatePixmapFromData(dpy, root, close_xpm, &close_pm, &close_pm_mask, 324 329 &close_pm_attrs); 330 + XpmCreatePixmapFromData(dpy, root, utility_close_xpm, &utility_close_pm, 331 + &utility_close_pm_mask, &utility_close_pm_attrs); 325 332 XpmCreatePixmapFromData(dpy, root, iconify_xpm, &iconify_pm, 326 333 &iconify_pm_mask, &iconify_pm_attrs); 327 334 XpmCreatePixmapFromData(dpy, root, zoom_xpm, &zoom_pm, &zoom_pm_mask, ··· 464 471 XFreeGC(dpy, invert_gc); 465 472 XFreePixmap(dpy, close_pm); 466 473 XFreePixmap(dpy, close_pm_mask); 474 + XFreePixmap(dpy, utility_close_pm); 475 + XFreePixmap(dpy, utility_close_pm_mask); 467 476 XFreePixmap(dpy, iconify_pm); 468 477 XFreePixmap(dpy, iconify_pm_mask); 469 478 XFreePixmap(dpy, zoom_pm);
+3
progman.h
··· 254 254 extern Pixmap close_pm; 255 255 extern Pixmap close_pm_mask; 256 256 extern XpmAttributes close_pm_attrs; 257 + extern Pixmap utility_close_pm; 258 + extern Pixmap utility_close_pm_mask; 259 + extern XpmAttributes utility_close_pm_attrs; 257 260 extern Pixmap iconify_pm; 258 261 extern Pixmap iconify_pm_mask; 259 262 extern XpmAttributes iconify_pm_attrs;