私の対応する部分は次のとおりです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} },
};
さて、このコラムの目的は何ですかargument
?
ベストアンサー1
4番目の列のパラメータアドレスは、3番目の列にリストされている関数に渡されます。たとえば、zoom()
さまざまなホットキーのさまざまなパラメータを使用して、関数がどのように2回一覧表示されるかを確認します。
Shortcut
質問で配列を構成するデータ型は、次の4つのメンバーで構成される構造shortcuts[]
として定義されます。x.c
typedef struct {
uint mod;
KeySym keysym;
void (*func)(const Arg *);
const Arg arg;
} Shortcut;
Shortcut
、の最後のメンバーは4つの和集合としてArg
定義されます。st.h
typedef union {
int i;
uint ui;
float f;
const void *v;
} Arg;
func
たとえば、fromから次を指す構造体の共用体メンバーアドレスを使用して呼び出すとします。Shortcut
keypress()
x.c
bp
Shortcut
if (ksym == bp->keysym && match(bp->mod, e->state)) {
bp->func(&(bp->arg));
...
この設定を利用する具体的な例は、共用体でzoom()
浮動小数点が使用されているところで見ることができます。Arg
質問の設定によっては、arg->f
この機能でフォントサイズを増減+1
できます-1
。
void
zoom(const Arg *arg)
{
Arg larg;
larg.f = usedfontsize + arg->f;
zoomabs(&larg);
}