⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bsd.c

📁 elinks下lynx是最重要的二个文本浏览器, 在linux下非常实用, elinks也是gentoo安装过程中默认使用的浏览器, 这是elinks源代码
💻 C
字号:
/* BSD mouse system-specific routines. */#ifdef HAVE_CONFIG_H#include "config.h"#endif#include "osdep/system.h"#ifdef CONFIG_SYSMOUSE#ifdef HAVE_SYS_CONSIO_H#include <sys/consio.h>#include <sys/fbio.h>#else#include <machine/console.h>#endif	/* HAVE_SYS_CONSIO_H */#endif	/* CONFIG_SYSMOUSE */#include "elinks.h"#include "main/select.h"#include "osdep/osdep.h"#include "osdep/signals.h"#include "terminal/event.h"#include "terminal/mouse.h"#if defined(CONFIG_SYSMOUSE) && defined(CONFIG_MOUSE)struct sysmouse_spec {	void *itrm;	int cheight;	int cwidth;	void (*fn)(void *, unsigned char *, int);};static voidsysmouse_handler(void *data){	static struct term_event_mouse prev_mouse;	static int prev_buttons;	struct sysmouse_spec *sp = data;	void *itrm = sp->itrm;	int fd = get_output_handle();	int buttons, change;	mouse_info_t mi;	struct term_event_mouse mouse;	struct term_event ev;	mi.operation = MOUSE_GETINFO;	if (ioctl(fd, CONS_MOUSECTL, &mi) == -1) return;	mouse.x = int_max(mi.u.data.x / sp->cwidth, 0);	mouse.y = int_max(mi.u.data.y / sp->cheight, 0);	/* for cosmetic bug in syscons.c on FreeBSD 3.3/3.4 */#ifdef HAVE_MACHINE_CONSOLE_H	mi.operation = MOUSE_HIDE;	ioctl(fd, CONS_MOUSECTL, &mi);	mi.operation = MOUSE_SHOW;	ioctl(fd, CONS_MOUSECTL, &mi);#endif	buttons = mi.u.data.buttons & 7;	change = (mouse.x != prev_mouse.x || mouse.y != prev_mouse.y);	prev_mouse = mouse;	/* It's horrible. */	switch (buttons) {		case 0:			switch (prev_buttons) {				case 0:					return;					break;				case 1:				case 3:				case 5:				case 7:					mouse.button = B_LEFT | B_UP;					break;				case 2:				case 6:					mouse.button = B_MIDDLE | B_UP;					break;				case 4:					mouse.button = B_RIGHT | B_UP;					break;			}			break;		case 1:		case 3:		case 5:		case 7:			switch (prev_buttons) {				case 0:				case 2:				case 4:				case 6:					mouse.button = B_LEFT | B_DOWN;					break;				case 1:				case 3:				case 5:				case 7:					if (change)						mouse.button = B_LEFT | B_DRAG;					else mouse.button = B_LEFT | B_DOWN;					break;			}			break;		case 2:		case 6:			switch (prev_buttons) {				case 1:				case 3:				case 5:				case 7:					mouse.button = B_LEFT | B_UP;		    			break;				case 0:				case 4:					mouse.button = B_MIDDLE | B_DOWN;					break;				case 2:				case 6:					if (change)					mouse.button = B_MIDDLE | B_DRAG;					else mouse.button = B_MIDDLE | B_DOWN;					break;			}			break;		case 4:			switch (prev_buttons) {				case 1:				case 3:				case 5:				case 7:					mouse.button = B_LEFT | B_UP;					break;				case 2:				case 6:					mouse.button = B_MIDDLE | B_UP;					break;				case 0:					mouse.button = B_RIGHT | B_DOWN;					break;				case 4:					if (change)						mouse.button = B_RIGHT | B_DRAG;					else mouse.button = B_RIGHT | B_DOWN;					break;			}			break;	}	prev_buttons = buttons;	set_mouse_term_event(&ev, mouse.x, mouse.y, mouse.button);	sp->fn(itrm, (unsigned char *)&ev, sizeof(ev));}static voidsysmouse_signal_handler(void *data){	register_bottom_half(sysmouse_handler, data);}void *handle_mouse(int cons, void (*fn)(void *, unsigned char *, int),	     void *data){	static struct sysmouse_spec mouse_spec;	video_info_t vi;	mouse_info_t mi;	int fd = get_output_handle();	if (is_xterm()) return NULL;	mouse_spec.itrm = data;	mouse_spec.fn = fn;	if (ioctl(fd, FBIO_GETMODE, &vi.vi_mode) != -1 &&		ioctl(fd, FBIO_MODEINFO, &vi) != -1) {		mouse_spec.cwidth = vi.vi_cwidth;		mouse_spec.cheight = vi.vi_cheight;	} else {		return NULL;	}	install_signal_handler(SIGUSR2, NULL, NULL, 0);	mi.operation = MOUSE_MODE;	mi.u.mode.mode = 0;	mi.u.mode.signal = SIGUSR2;	if (ioctl(fd, CONS_MOUSECTL, &mi) != -1) {		install_signal_handler(SIGUSR2,		(void (*)(void *))sysmouse_signal_handler, &mouse_spec, 0);		mi.operation = MOUSE_SHOW;		ioctl(fd, CONS_MOUSECTL, &mi);		return &mouse_spec;	} else {		return NULL;	}}voidunhandle_mouse(void *data){	if (data) install_signal_handler(SIGUSR2, NULL, NULL, 0);}voidsuspend_mouse(void *data){	if (data) install_signal_handler(SIGUSR2, NULL, NULL, 0);}voidresume_mouse(void *data){	if (data) install_signal_handler(SIGUSR2,		(void (*)(void *))sysmouse_signal_handler, data, 0);}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -