我正在使用dwm (6.2)窗口管理器,我发现了一个我很想解决的错误。
窗口管理器使用放置窗口的“主区域”和“堆栈区域” :
可以使用+将“堆栈区域”顶部的窗口移动到“主区域”的底部。也可以使用+将窗口从“主区域”的底部移回“堆栈区域”的顶部。ALTiALTd
现在在这种情况下,如果我使用ALT+ ,布局会发生变化,并且在组合键之后, “主区域”i中有两个窗口:
我再重复一遍,现在“主区域”中有三个窗口:
我再重复一遍,现在“主区域”中有三个窗口,宽度为 100%:
如果此时我决定将窗口从“主区域”返回到“堆栈区域”,我将开始按ALT+d并且窗口将立即返回到“堆栈区域”。这工作正常。
但是我故意犯了一个错误,而是再次按ALT+ i,例如再按三下。好像什么都没发生...
但是现在如果我尝试将窗口从“主区域”返回到“堆栈区域”,我首先需要再按三ALT下+并且不会发生任何事情!最后,当我第四次按+时,窗口管理器会将第一个窗口从“主区域”底部返回到“堆栈区域”顶部。d ALTd
所以这没有经过深思熟虑,应该被认为是一个错误......
ALT源代码中必须有某种计数器,通过按+再增加三倍,但在所有窗口都已经在“主区域”i中之后它不应该增加。
在config.def.h
源文件 ( www ) 中有一部分代码分配了键。在这里我可以看到,当用户按下ALT+时,i函数incnmaster()
被调用并传递了一个参数.i = +1
(我不明白这个参数)。
static Key keys[] = {
/* modifier key function argument */
...
{ MODKEY, XK_i, incnmaster, {.i = +1 } },
{ MODKEY, XK_d, incnmaster, {.i = -1 } },
...
};
Key
是dwm.c
源文件(www)内的结构:
typedef struct {
unsigned int mod;
KeySym keysym;
void (*func)(const Arg *);
const Arg arg;
} Key;
函数incnmaster()
在dwm.c
源文件 ( www ) 中定义:
void
incnmaster(const Arg *arg)
{
selmon->nmaster = MAX(selmon->nmaster + arg->i, 0);
arrange(selmon);
}
wherearg
是指向Arg
( Arg*
) 的指针,它是一个联合(我不太明白如何处理参数.i = +1
):
typedef union {
int i;
unsigned int ui;
float f;
const void *v;
} Arg;
selmon
是一个结构Monitor
:
struct Monitor {
char ltsymbol[16];
float mfact;
int nmaster;
int num;
int by; /* bar geometry */
int mx, my, mw, mh; /* screen size */
int wx, wy, ww, wh; /* window area */
unsigned int seltags;
unsigned int sellt;
unsigned int tagset[2];
int showbar;
int topbar;
Client *clients;
Client *sel;
Client *stack;
Monitor *next;
Window barwin;
const Layout *lt[2];
};
MAX
在单独的源文件util.h
( www ) 中定义为:
#define MAX(A, B) ((A) > (B) ? (A) : (B))
和函数arrange()
定义如下:
void
arrange(Monitor *m)
{
if (m)
showhide(m->stack);
else for (m = mons; m; m = m->next)
showhide(m->stack);
if (m) {
arrangemon(m);
restack(m);
} else for (m = mons; m; m = m->next)
arrangemon(m);
}
我觉得我不用再挖了...
现在我想我需要在 C 代码中实现某种if
语句以防止selmon->nmaster
增加太多,但我有点困惑。任何人都可以帮忙吗?