gpt4 book ai didi

c - X-DWM -- 帮我修复C源代码中的一个bug

转载 作者:行者123 更新时间:2023-12-05 06:18:51 25 4
gpt4 key购买 nike

我正在使用 dwm (6.2) 窗口管理器,我发现了一个我很想解决的错误。

窗口管理器使用放置窗口的“主区域”“堆栈区域”:

enter image description here

可以使用 ALT 将位于“堆栈区域” 顶部的窗口移动到“主区域” 底部+ 。也可以使用 ALT + < kbd>d.

现在在这种情况下,如果我使用 ALT + i,布局会发生变化,在组合键之后,“主区域”:

enter image description here

我再重复一遍,现在“主控区”出现了三个窗口:

enter image description here

我再重复一遍,现在 “主区域” 中有三个窗口,宽度为 100%:

enter image description here

如果此时我决定将窗口从“主区域”返回到“堆栈区域”,我将开始按ALT + d 并且窗口会立即返回到“堆栈区域”。这没问题。

但我故意犯了一个错误,而是再次按 ALT + i 例如 次。好像什么都没发生一样……

但现在如果我尝试将窗口从“主区域”返回到“堆栈区域”,我首先需要按ALT + d 次,什么都不会发生!最后,当我第四次按 ALT + d 时,窗口管理器将返回 “主区域” “堆栈区域” 的顶部。

所以这不是经过深思熟虑的,应该被认为是一个错误......


源代码中一定有某种计数器,通过按 ALT + i 可以再增加 3 次,但在所有窗口都已经打开后它不应该增加在“主区域”


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

哪里arg是指向 Arg 的指针( Arg* ) 这是一个 union (我不太明白如何处理参数 .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);
}

我不认为我需要进一步挖掘...


现在我想我需要实现某种 if C代码中的语句防止selmon->nmaster增加太多,但我有点困惑。谁能帮忙?

最佳答案

当它是链表时,为什么要持有客户数量?您无法按需获得客户数量。类似代码可见monocle count patch .如果您真的必须自己保留该计数(出于性能原因),我会查看 dwm 修改客户端列表的任何地方,并将该修改转换到计数器。

Structure Client 包含指向“下一个”Client 的指针,实现可能取决于您何时想要使用多头支持,但使用类似于 Client* c = nexttiled(c->next) 的代码,其中第一个引用可以从通过调用 Client* c = nexttiled(monitor->clients) 进行监控。如果你在循环中计算这些就足够了。

如果您仍然想自己计数,我会在 dwm.c 中找到与客户端一起工作的函数(分离、附加等),并找到哪些正在修改列表,您可以在其中根据执行的操作递增/递减计数器。

关于c - X-DWM -- 帮我修复C源代码中的一个bug,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61101757/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com