업데이트된 질문
우수한 리뷰를 바탕으로@모스비실제로 일어나는 일은 창 관리자가 창의 전파된 크기 힌트를 존중하거나 무시한다는 것입니다. 하지만 안타깝게도 사이즈 힌트를 보내지 않거나 urxvt
보낸 사이즈 힌트를 무시하는 방법을 찾을 수 없습니다 OpenBox
.
그래서 내 질문은 다음과 같습니다. urxvt
특정 수준에서 크기 힌트 전송을 중지할 수 있는 방법이 있습니까? 아니면 OpenBox
특정 응용 프로그램에서 보낸 크기 힌트를 무시하도록 구성하는 방법이 있습니까 ?
원래 질문: "urxvt gapless 창 크기"
저는 OpenBox를 창 관리자로 사용하고 있으며 창을 지정된 창 크기로 화면의 특정 영역으로 이동하기 위한 몇 가지 단축키를 구성했습니다. 모든 창은 urxvt
표시되는 문자의 글꼴 크기를 기준으로 크기가 계산된다는 점을 제외하면 이를 준수합니다. 그러나 urxvt
전체 화면 모드 † 에서는 공백 없이 화면을 채웁니다. (구성된 X 배경을 사용하고 창 주변의 나머지 공간을 채운다고 가정합니다. 그러나 이에 대해 틀릴 수도 있습니다.)
그래서 내 질문은: 내장된 구성 옵션이 있거나 urxvt
전체 화면 모드가 아닐 때 창 관리자가 제공하는 모든 공간을 공백 없이 채울 수 있는 Perl 확장이 있습니까?
† 아마도 내가 사용하고 있다는 점을 언급할 가치가 있을 것입니다.펄 확장적절한 전체 화면 경험이 달성되었습니다.
답변1
이 문제를 해결하는 가장 쉬운 방법은 소스를 수정 rxvt
하고 openbox
다시 컴파일하는 것입니다. 두 가지 모두에 대해 이 답변의 하단을 참조하세요.매우 간단하다반점.
LD_PRELOAD
또 다른 방법은 창 속성을 가져올 때 플래그를 끄고 속성을 설정할 때 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
or 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 +++ 오픈박스/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(자체->size_inc, size.width_inc, size.height_inc); - ob_debug("일반 프롬프트: 최소 크기(%d %d) 최대 크기(%d %d)", 자체->최소 크기.너비, 자체->최소 크기.높이, 자체->최대_크기.폭, 자체->최대_크기.높이);
그리고 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 | P 기본 크기 | PWin 중력; + szHint.flags = PMinSize | P 기본 크기 | PWin 중력; szHint.win_gravity = 북서 중력; /* 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 사전 크기 조정 회사; + szHint.flags |= PBaseSize; } 만약(!무시)
둘 다 데비안 9.5 릴리스에만 적용됩니다. patch -l
태그를 보존하기 위해 빌어먹을 방법을 모르겠습니다.