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

📄 os2.c

📁 elinks下lynx是最重要的二个文本浏览器, 在linux下非常实用, elinks也是gentoo安装过程中默认使用的浏览器, 这是elinks源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
		if (hSw != NULLHANDLE && hab != NULLHANDLE && hmq != NULLHANDLE) {			safe_strncpy(swData.szSwtitle, org_switch_title, MAXNAMEL);			WinChangeSwitchEntry(hSw, &swData);			if (swData.hwnd)				WinSetWindowText(swData.hwnd, org_win_title);			WinDestroyMsgQueue(hmq);			WinTerminate(hab);		}		pib->pib_ultype = oldType;		mem_free(org_switch_title);		mem_free(org_win_title);		break;	case 0:		if (url && *url) {			safe_strncpy(new_title, url, MAXNAMEL - 10);			strcat(new_title, " - Links");			pib->pib_ultype = 3;			hab = WinInitialize(0);			hmq = WinCreateMsgQueue(hab, 0);			if (hSw != NULLHANDLE && hab != NULLHANDLE && hmq != NULLHANDLE) {				safe_strncpy(swData.szSwtitle, new_title, MAXNAMEL);				WinChangeSwitchEntry(hSw, &swData);				if (swData.hwnd)					WinSetWindowText(swData.hwnd, new_title);				WinDestroyMsgQueue(hmq);				WinTerminate(hab);			}			pib->pib_ultype = oldType;		}		break;	}}#endifintresize_window(int x, int y, int old_width, int old_height){	A_DECL(VIOMODEINFO, vmi);	resize_count++;	if (is_xterm()) return -1;	vmi->cb = sizeof(*vmi);	if (VioGetMode(vmi, 0)) return -1;	vmi->col = x;	vmi->row = y;	if (VioSetMode(vmi, 0)) return -1;#if 0	unsigned char cmdline[16];	sprintf(cmdline, "mode ");	snprint(cmdline + 5, 5, x);	strcat(cmdline, ",");	snprint(cmdline + strlen(cmdline), 5, y);#endif	return 0;}#if OS2_MOUSE#ifdef HAVE_SYS_FMUTEX_H_fmutex mouse_mutex;int mouse_mutex_init = 0;#endifint mouse_h = -1;struct os2_mouse_spec {	int p[2];	void (*fn)(void *, unsigned char *, int);	void *data;	unsigned char buffer[sizeof(struct term_event)];	int bufptr;	int terminate;};voidmouse_thread(void *p){	int status;	struct os2_mouse_spec *oms = p;	A_DECL(HMOU, mh);	A_DECL(MOUEVENTINFO, ms);	A_DECL(USHORT, rd);	A_DECL(USHORT, mask);	signal(SIGPIPE, SIG_IGN);	if (MouOpen(NULL, mh)) goto ret;	mouse_h = *mh;	*mask = MOUSE_MOTION_WITH_BN1_DOWN | MOUSE_BN1_DOWN |		MOUSE_MOTION_WITH_BN2_DOWN | MOUSE_BN2_DOWN |		MOUSE_MOTION_WITH_BN3_DOWN | MOUSE_BN3_DOWN |		MOUSE_MOTION;	MouSetEventMask(mask, *mh);	*rd = MOU_WAIT;	status = -1;	while (1) {		struct term_event ev;		struct term_event_mouse mouse;		int w, ww;		if (MouReadEventQue(ms, rd, *mh)) break;#ifdef HAVE_SYS_FMUTEX_H		_fmutex_request(&mouse_mutex, _FMR_IGNINT);#endif		if (!oms->terminate) MouDrawPtr(*mh);#ifdef HAVE_SYS_FMUTEX_H		_fmutex_release(&mouse_mutex);#endif		mouse.x = ms->col;		mouse.y = ms->row;		/*DBG("status: %d %d %d", ms->col, ms->row, ms->fs);*/		if (ms->fs & (MOUSE_BN1_DOWN | MOUSE_BN2_DOWN | MOUSE_BN3_DOWN))			mouse.button = status = B_DOWN | (ms->fs & MOUSE_BN1_DOWN ? B_LEFT : ms->fs & MOUSE_BN2_DOWN ? B_MIDDLE : B_RIGHT);		else if (ms->fs & (MOUSE_MOTION_WITH_BN1_DOWN | MOUSE_MOTION_WITH_BN2_DOWN | MOUSE_MOTION_WITH_BN3_DOWN)) {			int b = ms->fs & MOUSE_MOTION_WITH_BN1_DOWN ? B_LEFT : ms->fs & MOUSE_MOTION_WITH_BN2_DOWN ? B_MIDDLE : B_RIGHT;			if (status == -1)				b |= B_DOWN;			else				b |= B_DRAG;			mouse.button = status = b;		} else {			if (status == -1) continue;			mouse.button = (status & BM_BUTT) | B_UP;			status = -1;		}		set_mouse_term_event(&ev, mouse.x, mouse.y, mouse.button);		if (hard_write(oms->p[1], (unsigned char *) &ev, sizeof(ev)) != sizeof(ev)) break;	}#ifdef HAVE_SYS_FMUTEX_H	_fmutex_request(&mouse_mutex, _FMR_IGNINT);#endif	mouse_h = -1;	MouClose(*mh);#ifdef HAVE_SYS_FMUTEX_H	_fmutex_release(&mouse_mutex);#endifret:	close(oms->p[1]);	/*free(oms);*/}voidmouse_handle(struct os2_mouse_spec *oms){	ssize_t r = safe_read(oms->p[0], oms->buffer + oms->bufptr,		          sizeof(struct term_event) - oms->bufptr);	if (r <= 0) {		unhandle_mouse(oms);		return;	}	oms->bufptr += r;	if (oms->bufptr == sizeof(struct term_event)) {		oms->bufptr = 0;		oms->fn(oms->data, oms->buffer, sizeof(struct term_event));	}}void *handle_mouse(int cons, void (*fn)(void *, unsigned char *, int),	     void *data){	struct os2_mouse_spec *oms;	if (is_xterm()) return NULL;#ifdef HAVE_SYS_FMUTEX_H	if (!mouse_mutex_init) {		if (_fmutex_create(&mouse_mutex, 0)) return NULL;		mouse_mutex_init = 1;	}#endif		/* This is never freed but it's allocated only once */	oms = malloc(sizeof(*oms));	if (!oms) return NULL;	oms->fn = fn;	oms->data = data;	oms->bufptr = 0;	oms->terminate = 0;	if (c_pipe(oms->p)) {		free(oms);		return NULL;	}	_beginthread(mouse_thread, NULL, 0x10000, (void *) oms);	set_handlers(oms->p[0], (select_handler_T) mouse_handle, NULL, NULL, oms);	return oms;}voidunhandle_mouse(void *om){	struct os2_mouse_spec *oms = om;	want_draw();	oms->terminate = 1;	clear_handlers(oms->p[0]);	close(oms->p[0]);	done_draw();}voidsuspend_mouse(void *om){}voidresume_mouse(void *om){}voidwant_draw(void){	A_DECL(NOPTRRECT, pa);#ifdef HAVE_SYS_FMUTEX_H	if (mouse_mutex_init) _fmutex_request(&mouse_mutex, _FMR_IGNINT);#endif	if (mouse_h != -1) {		static int x = -1, y = -1;		static int c = -1;		if (x == -1 || y == -1 || (c != resize_count)) {			get_terminal_size(1, &x, &y);			c = resize_count;		}		pa->row = 0;		pa->col = 0;		pa->cRow = y - 1;		pa->cCol = x - 1;		MouRemovePtr(pa, mouse_h);	}}voiddone_draw(void){#ifdef HAVE_SYS_FMUTEX_H	if (mouse_mutex_init) _fmutex_release(&mouse_mutex);#endif}#endif /* OS2_MOUSE */intget_ctl_handle(void){	return get_input_handle();}intget_system_env(void){	int env = get_common_env();	/* !!! FIXME: telnet */	if (!is_xterm()) env |= ENV_OS2VIO;	return env;}voidset_highpri(void){	DosSetPriority(PRTYS_PROCESS, PRTYC_FOREGROUNDSERVER, 0, 0);}intcan_open_os_shell(int environment){	if (environment & ENV_XWIN) return 0;	return 1;}#if defined(HAVE_BEGINTHREAD)intstart_thread(void (*fn)(void *, int), void *ptr, int l){	int p[2];	struct tdata *t;	if (c_pipe(p) < 0) return -1;	if (set_nonblocking_fd(p[0]) < 0) return -1;	if (set_nonblocking_fd(p[1]) < 0) return -1;	t = malloc(sizeof(*t) + l);	if (!t) return -1;	t->fn = fn;	t->h = p[1];	memcpy(t->data, ptr, l);	if (_beginthread((void (*)(void *)) bgt, NULL, 65536, t) == -1) {		close(p[0]);		close(p[1]);		mem_free(t);		return -1;	}	return p[0];}#if defined(HAVE_READ_KBD)int tp = -1;int ti = -1;voidinput_thread(void *p){	unsigned char c[2];	int h = (int) p;	signal(SIGPIPE, SIG_IGN);	while (1) {#if 0		c[0] = _read_kbd(0, 1, 1);		if (c[0]) if (safe_write(h, c, 1) <= 0) break;		else {			int w;			printf("1");fflush(stdout);			c[1] = _read_kbd(0, 1, 1);			printf("2");fflush(stdout);			w = safe_write(h, c, 2);			printf("3");fflush(stdout);			if (w <= 0) break;			if (w == 1) if (safe_write(h, c+1, 1) <= 0) break;			printf("4");fflush(stdout);		}#endif		/* for the records:		 * _read_kbd(0, 1, 1) will		 * read a char, don't echo it, wait for one available and		 * accept CTRL-C.		 * Knowing that, I suggest we replace this call completly!		 */		*c = _read_kbd(0, 1, 1);		write(h, c, 1);	}	close(h);}intget_input_handle(void){	int fd[2];	if (ti != -1) return ti;	if (is_xterm()) return 0;	if (c_pipe(fd) < 0) return 0;	ti = fd[0];	tp = fd[1];	_beginthread(input_thread, NULL, 0x10000, (void *) tp);	return fd[0];}#endif#endif#ifdef USE_OPEN_PREALLOCintopen_prealloc(unsigned char *name, int flags, int mode, off_t siz){	/* This is good for OS/2, where this will prevent file fragmentation,	 * preallocating the desired file size upon open(). */	return open(name, flags | O_SIZE, mode, (unsigned long) siz);}voidprealloc_truncate(int h, off_t siz){	ftruncate(h, siz);}#endif

⌨️ 快捷键说明

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