Я использую dwm (6.2) оконный менеджер, и я нашел ошибку, которую хотел бы решить.
Диспетчер окон использует «мастер область» и «область стека» , куда помещено windows:
Можно переместить окно вверху «области стека» в нижнюю часть «мастер-области» , используя ALT + i . Также можно переместить windows из нижней части «мастер-области» обратно в «стек-область» , используя ALT + d .
Теперь в этом случае, если я использую ALT + i , изменится раскладка, и после комбинации клавиш будет два windows в «мастер зона» :
Я повторяю это снова, и теперь в есть три windows "master area" :
Я повторяю это еще раз, и теперь в основной области есть три windows « с шириной 100%:
Если бы в этот момент я решил вернуть windows от мастера " область " в " область стека " Я бы начал нажимать ALT + d и windows немедленно вернул бы обратно к " область стека ". Это работает нормально.
Но я намеренно ошибаюсь и вместо этого нажимаю ALT + i снова, например три больше раз. Похоже, ничего не происходит ...
Но теперь, если я попытаюсь вернуть windows из "мастер области" в "область стека" I сначала нужно нажать ALT + d три больше раз и ничего не произойдет ! И наконец, когда я нажимаю ALT + d в четвертый раз, оконный менеджер вернет первое окно из нижней части «мастер-области» в верхняя часть «области стека» .
Так что это не очень хорошо продумано и должно рассматриваться как ошибка ...
Должно быть какое-то сортировка счетчика в исходном коде, который был увеличен еще три раза при нажатии ALT + i , но он не должен увеличиваться после того, как все windows уже находятся в мастере " area ".
В config.def.h
исходном файле (www*1125*) есть часть кода, которой назначены клавиши. И здесь я вижу, что когда пользователь нажимает 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*1141*):
typedef struct {
unsigned int mod;
KeySym keysym;
void (*func)(const Arg *);
const Arg arg;
} Key;
Функция incnmaster()
определена в dwm.c
исходном файле (www*1149*):
void
incnmaster(const Arg *arg)
{
selmon->nmaster = MAX(selmon->nmaster + arg->i, 0);
arrange(selmon);
}
, где arg
- указатель на Arg
(Arg*
), который является объединением (I не совсем понимаю, как обращаться с аргументом .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*1171*) как:
#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);
}
I не думайте, что мне нужно копать дальше ...
Теперь я думаю, что мне нужно реализовать своего рода if
sentantce в коде C, чтобы предотвратить увеличение selmon->nmaster
слишком много, но я немного смущен. Кто-нибудь может помочь?