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

📄 win_enum.c

📁 操作系统SunOS 4.1.3版本的源码
💻 C
字号:
#ifndef lint#ifdef sccsstatic  char sccsid[] = "@(#)win_enum.c 1.1 92/07/30";#endif#endif/* * (C) Copyright 1986 Sun Microsystems, Inc. */#include <errno.h>#include <sys/file.h>#include <sys/ioctl.h>#include <sunwindow/window_hs.h>#include <sunwindow/win_ioctl.h>#include <sunwindow/win_enum.h>static int	 win_open_number();static enum win_enumerator_result		 stash_node();static int cmpscreen();/* * Returns -1 if error enumerating, 0 if went smoothly and * 1 if func terminated enumeration. */intwin_enumall(func)    int             (*func) ();{    int             winnumber, windowfd;    struct screen   screen;    extern int      errno;    for (winnumber = 0;; winnumber++) {	/*	 * Open window. 	 */	if ((windowfd = win_open_number(winnumber)) < 0) {	    if (errno == ENXIO || errno == ENOENT)		/*		 * Last window passed. 		 */		break;	    return (-1);	}	/*	 * Try to get window's screen. 	 */	if (ioctl(windowfd, WINSCREENGET, &screen) && errno == ESPIPE) {	    (void)close(windowfd);	    continue;	}	/*	 * Call function.  If returns non-zero value then return 1. 	 */	if ((*func) (windowfd)) {	    (void)close(windowfd);	    return (1);	}	(void)close(windowfd);    }    return (0);}/* * win_enumscreen accesses all windows on a specified device and applies a * specified function to each one. * Return codes like win_enumall. */static	int (*callfunc)();static	struct	screen *matchscreen;win_enumscreen(screen, func)    struct screen  *screen;    int             (*func) ();{    callfunc = func;    matchscreen = screen;    (void)win_enumall(cmpscreen);}static intcmpscreen(windowfd)	int     windowfd; {	struct  screen screen;	(void)win_screenget(windowfd, &screen); /*	 * Is this window on the same screen */ if	(strncmp(screen.scr_fbname, matchscreen->scr_fbname,		SCR_NAMESIZE) == 0) { return((*callfunc)(windowfd,		&screen)); } return(0); }enum win_enumerator_resultwin_enumerate_children(window, proc, args)    Window_handle   window;    Enumerator      proc;    caddr_t         args;{    int             fd, link;    enum win_enumerator_result result;    link = win_getlink(window, WL_OLDESTCHILD);    while (link != WIN_NULLLINK) {	if ((fd = win_open_number(link)) < 0) {	    perror("win_enumerate: window tree malformed");	    abort();	}	result = (*proc) (fd, args);	if (result != Enum_Normal) {	    (void)close(fd);	    return result;	}	link = win_getlink(fd, WL_YOUNGERSIB);	(void)close(fd);    }    return Enum_Normal;}enum win_enumerator_resultwin_enumerate_subtree(window, proc, args)    Window_handle   window;    Enumerator      proc;    caddr_t         args;{    int             fd, link;    enum win_enumerator_result result;    link = win_getlink(window, WL_OLDESTCHILD);    while (link != WIN_NULLLINK) {	if ((fd = win_open_number(link)) < 0) {	    perror("win_enumerate: window tree malformed:");	    abort();	}	result = (*win_enumerate_subtree) (fd, proc, args);	if (result != Enum_Normal) {	    (void)close(fd);	    return result;	}	link = win_getlink(fd, WL_YOUNGERSIB);	(void)close(fd);    }    return (*proc) (window, args);}intwin_get_tree_layer(parent, size, buffer)    Window_handle   parent;    u_int           size;    char           *buffer;{    int             result;    Win_tree_layer  layer;    layer.bytecount = size;    layer.buffer = (Win_enum_node *) buffer;    result = ioctl(parent, WINGETTREELAYER, &layer);    if (result == ENOTTY)	goto old_style;    if (result == 0)	return layer.bytecount;    else	return -result;old_style:{	enum win_enumerator_result	                e_result;	int             sz;	sz = layer.bytecount;	e_result = win_enumerate_children(parent, stash_node, (caddr_t) &layer);	switch (e_result) {	  case Enum_Fail:	    return -ENOTTY;	  default:	    return sz - layer.bytecount;	}    }}static intwin_open_number(number)    int             number;{    char            name[WIN_NAMESIZE];    (void)win_numbertoname(number, name);    return open(name, O_RDONLY, 0);}static enum win_enumerator_resultstash_node(win, layer)    Window_handle   win;    Win_tree_layer *layer;{    register        Win_enum_node    *               nodep;    nodep = layer->buffer++;    if (layer->bytecount < sizeof(Win_enum_node))  {    	return Enum_Fail;    }   else   {    	layer->bytecount -= sizeof(Win_enum_node);    }    nodep->me = win_fdtonumber(win);    nodep->parent = win_getlink(win, WL_PARENT);    nodep->upper_sib = win_getlink(win, WL_YOUNGERSIB);    nodep->lowest_kid = win_getlink(win, WL_BOTTOMCHILD);    nodep->flags = win_getuserflags(win);    if (nodep->flags & WUF_WMGR1) {	(void)win_getsavedrect(win, &nodep->open_rect);	(void)win_getrect(win, &nodep->icon_rect);    } else {	(void)win_getsavedrect(win, &nodep->open_rect);	(void)win_getrect(win, &nodep->icon_rect);    }    if (nodep->upper_sib == (unsigned char)WIN_NULLLINK)	return Enum_Succeed;    else	return Enum_Normal;}

⌨️ 快捷键说明

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