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

📄 win_alarm.c

📁 操作系统SunOS 4.1.3版本的源码
💻 C
字号:
#ifndef lint#ifdef sccsstatic  char sccsid[] = "@(#)win_alarm.c 1.1 92/07/30";#endif#endif/* * Copyright (c) 1985 by Sun Microsystems, Inc. *//* * win_alarm.c */#include <sys/types.h>#include <sys/time.h>#include <sys/file.h>#include <sundev/kbd.h>#include <sundev/kbio.h>#include <pixrect/pixrect.h>#include <sunwindow/defaults.h>#include <sunwindow/rect.h>#include <sunwindow/rectlist.h>#include <sunwindow/pixwin.h>#include <sunwindow/win_screen.h>#include <sunwindow/notify.h>#include <suntool/window.h>extern void pw_batch();/* Bell cached defaults */static	Bool	win_do_audible_bell;static	Bool	win_do_visible_bell;static	int	win_bell_done_init;static  struct  win_alarm_data {		Win_alarm  data_alarm;		struct  pixwin	  *pw;		int	windowfd;		Rect	r;		struct  screen    screen;		int	kbdfd;} wa_data;static  Notify_client	win_alarm_handle = (Notify_client) &wa_data;static	Notify_value	win_alarm_start();static  Notify_value    win_alarm_stop();static  struct  	itimerval null_itv;/* * Beep and flash multiple times. */win_alarm(in_alarm, windowfd, pw)	Win_alarm	*in_alarm;	int 		windowfd;	register struct	pixwin *pw;{	struct	itimerval	wa_itv;	struct	screen		wa_screen;	Rect 			wa_r;	int 			wa_kbdfd, wa_cmd, wa_beeps, wa_flashes;	Win_alarm		wa_alarm;	if (!in_alarm) {		win_get_alarm(&wa_alarm);	}	else	wa_alarm = *in_alarm; 	null_itv.it_value.tv_sec = 0; 	null_itv.it_value.tv_usec = 0;         null_itv.it_interval.tv_sec = 0;        null_itv.it_interval.tv_usec = 0;		wa_beeps = wa_alarm.beep_num;	wa_flashes = wa_alarm.flash_num;	wa_itv.it_value = wa_alarm.beep_duration;	wa_itv.it_interval.tv_sec = 0;	wa_itv.it_interval.tv_usec = 0;		wa_data.data_alarm = wa_alarm;	wa_data.pw    = pw;	wa_data.windowfd = windowfd;	if (wa_beeps<=0 && wa_flashes<=0)		return;	/* Get defaults for bell if first time */	if (!win_bell_done_init) {		win_do_audible_bell = defaults_get_boolean(		    "/SunView/Audible_Bell", (Bool)TRUE, (int *)NULL);		win_do_visible_bell = defaults_get_boolean(		    "/SunView/Visible_Bell", (Bool)TRUE, (int *)NULL);		win_bell_done_init = 1;	}	if (windowfd >= 0 && win_do_audible_bell) {		/* Get screen keyboard name */		win_screenget(windowfd, &wa_screen);		wa_data.screen = wa_screen;	}	if (pw && windowfd >= 0 && win_do_visible_bell) {		/* Get pw size */		(void)win_getsize(windowfd, &wa_r);		wa_data.r = wa_r;	}	if (wa_beeps>0 || wa_flashes>0) {		if (wa_flashes>0) {			/* Flash pw */			if (pw && windowfd >= 0 && win_do_visible_bell) {				(void)pw_writebackground(pw, 0, 0,		    		wa_r.r_width, wa_r.r_height, PIX_NOT(PIX_DST));				pw_show(pw);			}		}		if (wa_beeps>0) {			if (windowfd >= 0 && win_do_audible_bell) {				/* Open keyboard */				if ((wa_kbdfd = open(wa_screen.scr_kbdname, O_RDWR, 0)) < 0)					return;				wa_data.kbdfd = wa_kbdfd;				/* Start bell */				wa_cmd = KBD_CMD_BELL;				(void) ioctl(wa_kbdfd, KIOCCMD, &wa_cmd);			}		}		/* Wait */		notify_set_itimer_func(win_alarm_handle, win_alarm_stop,				       ITIMER_REAL, &wa_itv, &null_itv);	}}static Notify_valuewin_alarm_stop(win_alarm_handle)	Notify_client win_alarm_handle;{	int	cmd;	struct	itimerval	itv;	itv.it_value = wa_data.data_alarm.beep_duration;        itv.it_interval.tv_sec = 0;        itv.it_interval.tv_usec = 0;	if (wa_data.data_alarm.beep_num>0) {			wa_data.data_alarm.beep_num--;			if (wa_data.windowfd >= 0 && win_do_audible_bell) {				/* Stop bell */				cmd = KBD_CMD_NOBELL;				(void) ioctl(wa_data.kbdfd, KIOCCMD, &cmd);				/* Close keyboard */				close(wa_data.kbdfd);			}		}		/* Turn off flash */		if (wa_data.data_alarm.flash_num>0) {			wa_data.data_alarm.flash_num--;			if (wa_data.pw && wa_data.windowfd >= 0 && win_do_visible_bell) {				(void)pw_writebackground(wa_data.pw, 0, 0,		    		wa_data.r.r_width, wa_data.r.r_height, PIX_NOT(PIX_DST));				pw_show(wa_data.pw);			}		}		if (wa_data.data_alarm.beep_num>0 || wa_data.data_alarm.flash_num>0)			notify_set_itimer_func(win_alarm_handle,win_alarm_start,				       ITIMER_REAL, &itv, &null_itv);}static Notify_valuewin_alarm_start(win_alarm_handle)	Notify_client	win_alarm_handle;{	int kbdfd, cmd;	struct	itimerval	itv;	itv.it_value = wa_data.data_alarm.beep_duration;        itv.it_interval.tv_sec = 0;        itv.it_interval.tv_usec = 0;	if (wa_data.data_alarm.flash_num >0) {		/* Flash pw */		if (wa_data.pw && wa_data.windowfd >= 0 && win_do_visible_bell) {			(void)pw_writebackground(wa_data.pw, 0, 0,		    	wa_data.r.r_width, wa_data.r.r_height, PIX_NOT(PIX_DST));			pw_show(wa_data.pw);		}	}	if (wa_data.data_alarm.beep_num >0) {		if (wa_data.windowfd >= 0 && win_do_audible_bell) {			/* Open keyboard */			if ((kbdfd = open(wa_data.screen.scr_kbdname, O_RDWR, 0)) < 0)				return;			wa_data.kbdfd = kbdfd;			/* Start bell */			cmd = KBD_CMD_BELL;			(void) ioctl(wa_data.kbdfd, KIOCCMD, &cmd);		}	}	/* Wait */	notify_set_itimer_func(win_alarm_handle, win_alarm_stop,			   ITIMER_REAL, &itv, &null_itv);}

⌨️ 快捷键说明

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