dwm patch

作者: mi78108 | 来源:发表于2021-07-26 13:57 被阅读0次
    • DWM 官网 http://dwm.suckless.org/
    • 官网提供了很多增强补丁,个人用的比较顺手的有: 图片.png
    • http://dwm.suckless.org/patches/systray/ 系统状态了 几乎是必须。 图片.png
    • http://dwm.suckless.org/patches/hide_vacant_tags/ 隐藏没有应用的空Tag 图片.png
    • http://dwm.suckless.org/patches/pertag/ 用来保持 tag 切换后的窗口布局。
    • http://dwm.suckless.org/patches/tab/ 当使用全屏布局时,会显示当前tag的其他应用,类似windows的任务栏, 点击可切换。 图片.png
    • 问题
      但有点不舒服就是 文字是左对齐的,和色块没有居中。
    • 解决
      修改drawtab 方法中, 调用 drw_text 写窗口名字的部分, 改为 drw_text(drw, x, 0, w, th, lrpad / 2, c->name, 0);,把lrpad边距传下去即可居中。
    for (c = m->clients; c; c = c->next) {
            if (!ISVISIBLE(c)) continue;
            if (i >= m->ntabs) break;
            if (m->tab_widths[i] > maxsize) m->tab_widths[i] = maxsize;
            w = m->tab_widths[i];
            drw_setscheme(drw, scheme[(c == m->sel) ? SchemeSel : SchemeNorm]);
            drw_text(drw, x, 0, w, th, lrpad / 2, c->name, 0);
            x += w;
            ++i;
        }
    
    • http://dwm.suckless.org/patches/status2d/ 用于彩色标题栏信息, 甚至可以绘制图形, 源码扩展也比较简单。 图片.png
    • 问题
      和 systray 有点点问题,会造成占位,显示不全等问题。
    • 解决
      解决也比较简单, 根本原因是drawstatusbar方法没有计算systray的宽度偏移引起的, 修改源码即可
    void
    drawbar(Monitor *m) {
        int x, w, sw = 0, stw = 0;
        int boxs = drw->fonts->h / 9;
        int boxw = drw->fonts->h / 6 + 2;
        unsigned int i, occ = 0, urg = 0;
        Client *c;
    
        if (showsystray && m == systraytomon(m) && !systrayonleft)
            stw = getsystraywidth();  //取得systray 造成的偏移
    
        /* draw status first so it can be overdrawn by tags later */
        if (m == selmon) { /* status is only drawn on selected monitor */
            //drw_setscheme(drw, scheme[SchemeNorm]);
            //int _sw = TEXTW(stext) - lrpad / 2 + 2; /* 2px extra right padding */
            //drw_text(drw, m->ww - sw - stw, 0, sw, bh, lrpad / 2 - 2, stext, 0);
            //printf(">>>>old sw %d\n", _sw);
            //printf(">>>>old stw %d\n", stw);
    
            sw = m->ww - drawstatusbar(m, bh, stw, stext); //传递过去
            //printf(">>>>now sw %d\n\n", sw);
        }
    
    int
    drawstatusbar(Monitor *m, int bh, int xoffset, char *stext) {  //把偏移传过来
        int ret, i, w, x, len;
        short isCode = 0;
        char *text;
        char *p;
    
        len = strlen(stext) + 1;
        if (!(text = (char *) malloc(sizeof(char) * len)))
            die("malloc");
        p = text;
        memcpy(text, stext, len);
    
        /* compute width of the status text */
        w = 0;
        i = -1;
        while (text[++i]) {
            if (text[i] == '^') {
                if (!isCode) {
                    isCode = 1;
                    text[i] = '\0';
                    w += TEXTW(text) - lrpad;
                    text[i] = '^';
                    if (text[++i] == 'f')
                        w += atoi(text + ++i);
                } else {
                    isCode = 0;
                    text = text + i + 1;
                    i = -1;
                }
            }
        }
        if (!isCode)
            w += TEXTW(text) - lrpad;
        else
            isCode = 0;
        text = p;
    
        w += 2; /* 1px padding on both sides */
        ret = x = m->ww - w;
        x -= xoffset; // 把偏移算进去
        ...
    

    相关文章

      网友评论

        本文标题:dwm patch

        本文链接:https://www.haomeiwen.com/subject/tlhpmltx.html