红联Linux门户
Linux帮助

[分享] DWM 实现鼠标划过时不切换窗口,仅用“鼠标点击/热键”切换

发布时间:2015-12-17 22:11:28来源:红联作者:zplinux
[font=sans-serif]我用的是Arch,其他发行版可根据情况稍作修改。[/font][font=sans-serif]鼠标经过时不激活窗口,在很多WM中的配置文件中都有设定。
而 DWM 需采用源码编译安装,
源码编译的方法步骤在Wiki里面讲解的很清楚,大家可以查看:
https://wiki.archlinux.org/index.php/Dwm
在这里我仅仅是抛砖引玉与大家分享一下修改源码实现鼠标经过不切换窗口,采用“鼠标点击/热键”切换的步骤:
起作用的函数片段
[/font]
[font=sans-serif]voidenternotify(XEvent *e){ Client *c; Monitor *m; XCrossingEvent *ev = &e->xcrossing; if ( (ev->mode != NotifyNormal || ev->detail == NotifyInferior) && ev->window != root) return; c = wintoclient(ev->window); m = c ? c->mon : wintomon(ev->window); if (m != selmon) { unfocus(selmon->sel, 1); selmon = m; } else if (!c || c == selmon->sel) return; focus(c);}[/font]
[font=sans-serif]让它失效就可以了,为了更通用一些我们可以定义一个变量 focusoncross ,根据它的值来决定是否启用“鼠标划过时切换窗口”的功能。
编辑 ./dwm/src/dwm-6.1/config.h,增加静态变量:
static const int focusoncross = 0;
编辑 ./dwm/src/dwm-6.1/dwm.c 修改:
if ( (ev->mode != NotifyNormal || ev->detail == NotifyInferior) && ev->window != root)
为:
if ( focusoncross != 1 || ((ev->mode != NotifyNormal || ev->detail == NotifyInferior) && ev->window != root) )
保存后,采用:makepkg -efi 编译即可得到安装包。
diff文件如下:
[/font]
[font=sans-serif]diff -ru ./1/config.h ./2/config.h--- ./1/config.h 2015-12-12 16:00:31.000000000 +0000+++ ./2/config.h 2015-12-17 16:28:07.000000000 +0000@@ -15,6 +15,8 @@ static const unsigned int snap = 32; /* snap pixel */ static const int showbar = 1; /* 0 means no bar */ static const int topbar = 1; /* 0 means bottom bar */+static const int focusoncross = 0; /* tagging */ static const char *tags[] = { "1", "2", "3", "4" };diff -ru /home/zp/1/dwm/src/dwm-6.1/dwm.c ./dwm.c--- ./1/dwm.c 2015-11-08 22:39:37.000000000 +0000+++ ./2/dwm.c 2015-12-17 17:40:37.713370637 +0000@@ -769,7 +770,7 @@ Monitor *m; XCrossingEvent *ev = &e->xcrossing; - if ((ev->mode != NotifyNormal || ev->detail == NotifyInferior) && ev->window != root)+ if ( focusoncross != 1 || ((ev->mode != NotifyNormal || ev->detail == NotifyInferior) && ev->window != root) ) return; c = wintoclient(ev->window); m = c ? c->mon : wintomon(ev->window);[/font]
[font=sans-serif]可以看出,鼠标移动到上面的窗口,但下面的窗口依然保持激活状态。
[/font]
文章评论

共有 0 条评论