AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 473183
Accepted
Peter Varo
Peter Varo
Asked: 2018-10-05 01:55:44 +0800 CST2018-10-05 01:55:44 +0800 CST 2018-10-05 01:55:44 +0800 CST

如何配置 OpenBox 以忽略特定应用程序窗口的大小提示?

  • 772

更新的问题

根据@mosvy的出色评论,实际上是窗口管理器尊重或忽略了窗口的传播大小提示。不幸的是,我找不到不发送大小提示urxvt或忽略发送的方法的方法OpenBox。

所以我想我的问题真的是:有没有办法urxvt停止发送大小提示?或者有没有办法配置OpenBox为忽略特定应用程序的发送大小提示?


原始问题:'urxvt 无缝窗口大小'

我使用 OpenBox 作为我的窗口管理器,并且我配置了一些热键以将窗口移动到具有指定窗口大小的屏幕的某些区域。所有窗口都尊重这一点,除了urxvt根据它显示的字符的字体大小来计算它的大小。但是,如果urxvt处于全屏模式†,它能够无间隙地填充屏幕。 (我假设它只是使用配置的 X 背景并填充窗口周围的剩余空间——但我可能错了。)

所以我的问题是:是否有一个内置的配置选项或者可能是一个 perl 扩展,urxvt当它不处于全屏模式时,它可以填充窗口管理器给它的所有空间而没有间隙?


†可能值得一提的是,我已经在使用perl 扩展以获得适当的全屏体验。

window-manager size
  • 1 1 个回答
  • 850 Views

1 个回答

  • Voted
  1. Best Answer
    mosvy
    2018-10-06T22:16:53+08:002018-10-06T22:16:53+08:00

    修复它的最简单方法是修改源代码rxvt或源代码openbox并重新编译——在这个答案的底部查看两个非常简单的补丁。

    另一种方法是使用LD_PRELOADhack,在获取窗口属性时关闭PResizeInc标志WM_NORMAL_HINTS,并在设置该属性时阻止它被打开。这只会影响width_inc和height_inc属性——设置最小窗口大小或其纵横比的程序将继续正常工作。

    $ cat no_inc_size_hints.c
    #define _GNU_SOURCE
    #include <dlfcn.h>
    #include <X11/Xlib.h>
    #include <X11/Xutil.h>
    
    Status XGetWMNormalHints(Display *dpy, Window w, XSizeHints *hp, long *rp){
        static typeof (XGetWMNormalHints) *orig;
        Status r;
        if(!orig) orig = dlsym(RTLD_NEXT, "XGetWMNormalHints");
        if((r = orig(dpy, w, hp, rp)))
            hp->flags &= ~PResizeInc;
        return r;
    }
    void XSetWMNormalHints(Display *dpy, Window w, XSizeHints *hp){
        static typeof (XSetWMNormalHints) *orig;
        if(!orig) orig = dlsym(RTLD_NEXT, "XSetWMNormalHints");
        hp->flags &= ~PResizeInc;
        orig(dpy, w, hp);
    }
    $ cc -shared -fPIC -Wall no_inc_size_hints.c -ldl -o no_inc_size_hints.so
    

    然后urxvt或openbox将必须与

    LD_PRELOAD="$LD_PRELOAD /absolute/path/to/no_inc_size_hints.so"
    

    在他们的环境中变化。例子:

    $ LD_PRELOAD=`pwd`/no_inc_size_hints.so openbox --replace   
    

    这有两个问题:

    1)urxvt通常安装为 utmp setgid 二进制文件,并且在LD_PRELOAD执行 set[gu]id 二进制文件时会清除该变量。查看手册页了解为什么(不需要)需要 utmp 权限。因此,您必须将urxvt可执行文件复制到其他地方(这将关闭 setgid 位)。例子:

    $ cp `which urxvt` .; LD_PRELOAD=`pwd`/no_inc_size_hints.so ./urxvt
    

    2) 窗口管理器通常在许多系统上通过脚本调用ssh-agent,/etc/X11/Xsession.d并且ssh-agent 还会LD_PRELOAD从环境中擦除变量。所以可能需要这样的东西:

    # cat <<'EOT' >/etc/X11/Xsession.d/98-no_inc_size_hints
    export LD_PRELOAD="$LD_PRELOAD /path/to/no_inc_size_hints.so"
    case $STARTUP in
    /usr/bin/ssh-agent*)
            STARTUP="/usr/bin/ssh-agent env LD_PRELOAD=$LD_PRELOAD ${STARTUP#* }";;
    esac
    EOT
    

    可能的补丁openbox-3.6.1:

    --- openbox/client.c~ 2018-10-06 08:34:25.615967414 +0300
    +++ openbox/client.c 2018-10-06 08:34:28.916133702 +0300
    @@ -1757,9 +1757,6 @@ void client_update_normal_hints(ObClient
             if (size.flags & PBaseSize)
                 SIZE_SET(self->base_size, size.base_width, size.base_height);
    
    - if (size.flags & PResizeInc && size.width_inc && size.height_inc)
    - SIZE_SET(self->size_inc, size.width_inc, size.height_inc);
    -
             ob_debug("正常提示:最小尺寸 (%d %d) 最大尺寸 (%d %d)",
                      自->min_size.width,自->min_size.height,
                      self->max_size.width, self->max_size.height);
    
    

    和rxvt-unicode-9.22:

    --- src/main.C~ 2018-10-06 08:33:08.580085731 +0300
    +++ src/main.C 2018-10-06 08:33:37.549545455 +0300
    @@ -657,7 +657,7 @@ rxvt_term::window_calc (unsigned int new
       无符号整数 w, h;
       无符号整数最大宽度,最大高度;
    
    - szHint.flags = PMinSize | PResize 公司 | PBaseSize | PWin重力;
    + szHint.flags = PMinSize | PBaseSize | PWin重力;
       szHint.win_gravity = NorthWestGravity;
       /* szHint.min_aspect.x = szHint.min_aspect.y = 1; */
    
    @@ -1073,7 +1073,7 @@ rxvt_term::resize_all_windows (无符号
         {
           szHint.flags &= ~(PBaseSize | PResizeInc);
           XSetWMNormalHints (dpy, parent, &szHint);
    - szHint.flags |= PBaseSize | PResize公司;
    + szHint.flags |= PBaseSize;
         }
    
       if (!ignoreparent)
    

    两者都反对 debian 9.5 的版本;它们只适用于patch -l——我不知道如何让这该死的东西保留标签。

    • 2

相关问题

  • gnome-shell 错误日志

  • 在 NixOS 中配置 XFCE 启动命令

  • Xmonad 上的系统托盘图标 - Xmobar 或任何其他最小状态栏

  • 'find -size 100k' 使用千字节还是千字节?

  • 如何在 Linux 上增加 /tmp 目录

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve