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);
}