您尚未登录。

#1 2015-12-17 21:39:33

zplinux
会员
所在地: 江西省
注册时间: 2014-10-12
帖子: 187

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

鼠标经过时不激活窗口,在很多WM中的配置文件中都有设定。
而 DWM 需采用源码编译安装,
源码编译的方法步骤在Wiki里面讲解的很清楚,大家可以查看:
https://wiki.archlinux.org/index.php/Dwm
在这里我仅仅是抛砖引玉与大家分享一下修改源码实现鼠标经过不切换窗口,采用“鼠标点击/热键”切换的步骤:
起作用的函数片段

void
enternotify(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);
}

让它失效就可以了,为了更通用一些我们可以定义一个变量 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文件如下:

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

可以看出,鼠标移动到上面的窗口,但下面的窗口依然保持激活状态。
ddc55756b3eee10e7b519fbef6c539bbc71338.png

最近编辑记录 zplinux (2015-12-17 22:06:06)


Archlinux + DWM,喜欢 K.I.S.S 理念!

离线

#2 2015-12-18 08:03:34

wxg4net
会员
注册时间: 2012-01-07
帖子: 274

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

厉害 修改个窗口行为都得自己修改源码


Arch Linux User

离线

#3 2015-12-18 09:41:24

vickycq
等待验证会员
所在地: 山东省寿光县
注册时间: 2015-11-09
帖子: 111
个人网站

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

感谢楼主分享,这里还有几个功能类似的 patch
http://dwm.suckless.org/patches/dwm-6.0 … click.diff
http://dwm.suckless.org/patches/histori … click.diff
http://dwm.suckless.org/patches/histori … click.diff

最近编辑记录 vickycq (2015-12-18 09:42:10)


老师你说我能考上什么,我说你只要学前途无量,他说:我也是这么想的
你已经掉到一半了,你大喊一声:“老师,我写跑题了。”
你不能说我的幸福就是苏轼如何如何

离线

#4 2015-12-18 11:55:45

zplinux
会员
所在地: 江西省
注册时间: 2014-10-12
帖子: 187

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


Archlinux + DWM,喜欢 K.I.S.S 理念!

离线

页脚