Como configurar o OpenBox para ignorar a dica de tamanho da janela de um aplicativo específico?

0

Pergunta atualizada

Com base no excelente comentário de @mosvy , na verdade, é a janela gerente que está respeitando ou ignorando a dica de tamanho propagado de uma janela. Infelizmente, porém, não consegui encontrar uma maneira de não enviar a dica de tamanho de urxvt ou ignorar a enviada por OpenBox .

Então, acho que minha pergunta realmente é: existe uma maneira no nível urxvt de parar de enviar dicas de tamanho? Ou existe uma maneira de configurar OpenBox para ignorar a dica de tamanho enviado para uma aplicação específica?

Pergunta original: 'urxvt gapless window size'

Estou usando o OpenBox como gerenciador de janelas e tenho algumas teclas de atalho configuradas para mover janelas para determinadas áreas da tela com um tamanho de janela especificado. Todas as janelas estão respeitando isso, exceto urxvt , que está calculando seu tamanho com base no tamanho da fonte dos caracteres que está sendo exibido. No entanto, se urxvt estiver no modo de tela cheia , ele poderá preencher a tela sem lacunas. (Eu suponho que é apenas usando o fundo X configurado e preenchendo o espaço restante ao redor da janela - mas posso estar errado sobre isso.)

Então, minha pergunta é: existe uma opção de configuração incorporada ou talvez uma extensão perl que faz com que urxvt preencha todo o espaço que o gerenciador de janelas está fornecendo sem intervalos quando não está no modo de tela cheia?

Provavelmente vale a pena mencionar que estou usando uma extensão perl para uma experiência de tela inteira adequada.

    
por Peter Varo 04.10.2018 / 11:55

1 resposta

1

A maneira mais fácil de corrigir isso é modificar a origem de rxvt ou a origem de openbox e recompilar. Consulte a parte inferior desta resposta para duas correções muito simples .

Outra maneira é usar um LD_PRELOAD hack que desativará o sinal PResizeInc ao obter a propriedade da janela WM_NORMAL_HINTS e impedirá que ele seja ativado ao definir essa propriedade. Isso afetará apenas as propriedades width_inc e height_inc - programas que definem o tamanho mínimo da janela ou a taxa de proporção continuarão funcionando bem.

$ 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

Em seguida, urxvt ou openbox terão que ser executados com o

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

variável em seu ambiente. Exemplo:

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

Existem dois problemas com isso:

1) urxvt é geralmente instalado como um binário utg setgid, e a variável LD_PRELOAD é limpa ao executar um binário set [gu] id. Procure na página man por que a permissão utmp é (não) necessária. Então você terá que copiar o executável urxvt em outro lugar (o que irá desativar o bit setgid). Exemplo:

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

2) O gerenciador de janelas geralmente é chamado por ssh-agent dos scripts /etc/X11/Xsession.d em muitos sistemas e ssh-agent também limpará a variável LD_PRELOAD do ambiente. Então, algo assim pode ser necessário:

# 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

Possível patch para 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("Normal hints: min size (%d %d) max size (%d %d)",
                  self->min_size.width, self->min_size.height,
                  self->max_size.width, self->max_size.height);

e para 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
   unsigned int w, h;
   unsigned int max_width, max_height;

-  szHint.flags = PMinSize | PResizeInc | PBaseSize | PWinGravity;
+  szHint.flags = PMinSize | PBaseSize | PWinGravity;
   szHint.win_gravity = NorthWestGravity;
   /* szHint.min_aspect.x = szHint.min_aspect.y = 1; */

@@ -1073,7 +1073,7 @@ rxvt_term::resize_all_windows (unsigned
     {
       szHint.flags &= ~(PBaseSize | PResizeInc);
       XSetWMNormalHints (dpy, parent, &szHint);
-      szHint.flags |= PBaseSize | PResizeInc;
+      szHint.flags |= PBaseSize;
     }

   if (!ignoreparent)

Ambos são contra as versões do debian 9.5; eles só se aplicam com patch -l - eu não sei como conseguir essa maldita coisa para preservar as abas.

    
por 06.10.2018 / 08:16