Como customizar atalhos de teclado no ST, ou seja, terminal simples / suckless?

2

Aqui está a parte correspondente do meu config.h :

/* Internal keyboard shortcuts. */
#define MODKEY Mod1Mask
#define TERMMOD (ControlMask|ShiftMask)

static Shortcut shortcuts[] = {
    /* mask                 keysym          function        argument */
    { XK_ANY_MOD,           XK_Break,       sendbreak,      {.i =  0} },
    { ControlMask,          XK_Print,       toggleprinter,  {.i =  0} },
    { ShiftMask,            XK_Print,       printscreen,    {.i =  0} },
    { XK_ANY_MOD,           XK_Print,       printsel,       {.i =  0} },
    { TERMMOD,              XK_Prior,       zoom,           {.f = +1} },
    { TERMMOD,              XK_Next,        zoom,           {.f = -1} },
    { TERMMOD,              XK_Home,        zoomreset,      {.f =  0} },
    { TERMMOD,              XK_C,           clipcopy,       {.i =  0} },
    { TERMMOD,              XK_V,           clippaste,      {.i =  0} },
    { TERMMOD,              XK_Y,           selpaste,       {.i =  0} },
    { TERMMOD,              XK_Num_Lock,    numlock,        {.i =  0} },
};

Agora, qual é o objetivo da coluna argument ?

    
por Enan Ajmain 04.11.2018 / 04:44

1 resposta

1

O endereço do argumento na quarta coluna é passado para a função listada na terceira coluna. Por exemplo, observe como a função zoom() é listada duas vezes em argumentos diferentes para atalhos diferentes.

O tipo de dados Shortcut que compõe a matriz shortcuts[] em sua pergunta é definido em x.c como uma estrutura de quatro membros:

typedef struct {
    uint mod;
    KeySym keysym;
    void (*func)(const Arg *);
    const Arg arg;
} Shortcut;

O último membro de Shortcut , Arg , é definido em st.h como uma união de quatro:

typedef union {
    int i;
    uint ui;
    float f;
    const void *v;
} Arg;

Um exemplo de func de um Shortcut sendo chamado com o endereço do membro da união da estrutura ocorre em keypress() de x.c , onde bp aponta para um Shortcut :

if (ksym == bp->keysym && match(bp->mod, e->state)) {
    bp->func(&(bp->arg));
    ...

Um exemplo concreto de aproveitamento dessa configuração pode ser visto em zoom() , onde o float na Arg union é usado. A partir da configuração da sua pergunta, arg->f nesta função pode ser +1 ou -1 para aumentar ou diminuir o tamanho da fonte:

void
zoom(const Arg *arg)
{
    Arg larg;

    larg.f = usedfontsize + arg->f;
    zoomabs(&larg);
}
    
por 04.11.2018 / 05:34