亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? menubar.c

?? Mrxvt是一個小巧
?? C
?? 第 1 頁 / 共 5 頁
字號:
/*--------------------------------*-C-*---------------------------------* * File:	menubar.c *----------------------------------------------------------------------* * * All portions of code are copyright by their respective author/s. * Copyright (c) 1997,1998   mj olesen <olesen@me.QueensU.CA> * Copyright (c) 2004        Jingmin Zhou <jimmyzhou@users.sourceforge.net> * Copyright (c) 2005-6      Gautam Iyer <gi1242@users.sourceforge.net> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *----------------------------------------------------------------------*/#include "../config.h"#include "rxvt.h"#define NEWARGLIM 500#ifdef DEBUG_VERBOSE#define DEBUG_LEVEL 1#else #define DEBUG_LEVEL 0#endif#if DEBUG_LEVEL#define DBG_MSG(d,x) if(d <= DEBUG_LEVEL) fprintf x#else#define DBG_MSG(d,x)#endif#ifdef HAVE_MENUBAR#define CHOOSE_GC_FG(R, PIXCOL)	\	XSetForeground ((R)->Xdisplay, (R)->menuBar.gc, (PIXCOL))#define TRIANGLE_WIDTH	(HEIGHT_TEXT * 3 / 5 - 2 * SHADOW)/*--------------------------------------------------------------------* *         BEGIN `INTERNAL' ROUTINE PROTOTYPES                        * *--------------------------------------------------------------------*/menuitem_t*   rxvt_menuitem_find          (const menu_t*, const unsigned char*);void          rxvt_menuitem_free          (rxvt_t*, menu_t*, menuitem_t*);/* int           rxvt_action_type            (action_t*, unsigned char*); *//* int           rxvt_action_dispatch        (rxvt_t*, action_t*); */int           rxvt_menuarrow_find         (char);void          rxvt_menuarrow_free         (rxvt_t*, unsigned char);void          rxvt_menuarrow_add          (rxvt_t*, unsigned char*);menuitem_t*   rxvt_menuitem_add           (rxvt_t*, menu_t*, const unsigned char*, const unsigned char*, const unsigned char*);unsigned char* rxvt_menu_find_base         (rxvt_t*, menu_t**, unsigned char*);menu_t*       rxvt_menu_delete            (rxvt_t*, menu_t*);menu_t*       rxvt_menu_add               (rxvt_t*, menu_t*, unsigned char*);void          rxvt_drawbox_menubar        (rxvt_t*, int, int, int);void          rxvt_menubar_draw_triangle  (rxvt_t*, int, int, int);void          rxvt_drawbox_menuitem       (rxvt_t*, int, int);void		  rxvt_build_tablist		  (rxvt_t*, menu_t *);void          rxvt_menu_display           (rxvt_t*, void (*update)(rxvt_t*));void          rxvt_menu_hide_all          (rxvt_t*);void          rxvt_menu_hide              (rxvt_t*);void          rxvt_menu_clear             (rxvt_t*, menu_t*);void          rxvt_menubar_clear          (rxvt_t*);void          rxvt_draw_arrows            (rxvt_t*, int, int);void          rxvt_menubar_select         (rxvt_t*, XButtonEvent*);void		  rxvt_menubar_draw_labels	  (rxvt_t*);void		  resizeSubMenus			  (rxvt_t*, menu_t*);#ifdef DEBUG_MENU_LAYOUTvoid          rxvt_print_menu_ancestors   (menu_t*);void          rxvt_print_menu_descendants (menu_t*);#endif/*--------------------------------------------------------------------* *         END   `INTERNAL' ROUTINE PROTOTYPES                        * *--------------------------------------------------------------------*/static const struct {	const char	  name;	/* (l)eft, (u)p, (d)own, (r)ight */	const unsigned char str[5];	/* str[0] = STRLEN (str+1) */} Arrows[NARROWS] = {	{ 'l', "\003\033[D" },	{ 'u', "\003\033[A" },	{ 'd', "\003\033[B" },	{ 'r', "\003\033[C" }};#ifdef XFT_SUPPORT#define PTEXTWIDTH( r, s, len)								\	(( ((r)->Options & Opt_xft) && r->TermWin.xftpfont ) ?	\		( xftPfontTextWidth( (r), (s), (len)) )	:			\		Width2Pixel(len))intxftPfontTextWidth( rxvt_t *r, const unsigned char *s, int len){	if( s && len )	{		XGlyphInfo ginfo;		XftTextExtents8( r->Xdisplay, r->TermWin.xftpfont, s, len, &ginfo);		return ginfo.width;	}	else		return 0;}# else# define PTEXTWIDTH( r, s, len) (Width2Pixel((len)))#endif#define MENUWIDTH( menu )							\	( MENU_ITEM_WIDTH( (menu)->lwidth, (menu)->rwidth ) )#define MENU_ITEM_WIDTH( item_lwidth, item_rwidth )					\	((item_lwidth) + (item_rwidth) + 2*SHADOW + 3*HSPACE_PIXEL)/* * find an item called NAME in MENU *//* INTPROTO */menuitem_t*rxvt_menuitem_find(const menu_t *menu, const unsigned char *name){	menuitem_t	 *item;#ifdef DEBUG	assert(name != NULL);	assert(menu != NULL);#endif	DBG_MSG( 2, (stderr, "rxvt_menuitem_find(%s) ... ", name));	/* find the last item in the menu, this is good for separators */	for (item = menu->tail; item != NULL; item = item->prev)	{		DBG_MSG(4, ( stderr, "%d", item->entry.itemType));		if (item->entry.itemType == MenuSubMenu)		{			if (!STRCMP(name, (item->entry.submenu.menu)->name))				break;		}		else if ((isSeparator(name) && isSeparator(item->name))			   || !STRCMP(name, item->name))			break;		DBG_MSG( 4, ( stderr, ","));	}	DBG_MSG( 2, (stderr, "Returning %p\n", item));	return item;}/* * unlink ITEM from its MENU and free its memory *//* INTPROTO */voidrxvt_menuitem_free(rxvt_t *r, menu_t *menu, menuitem_t *item){	/* disconnect */	menuitem_t	 *prev, *next;#ifdef DEBUG	assert(menu != NULL);#endif	DBG_MSG( 2, (stderr, "rxvt_menuitem_free()\n"));	prev = item->prev;	next = item->next;	if (prev != NULL) prev->next = next;	if (next != NULL) next->prev = prev;	/* new head, tail */	if (menu->tail == item) menu->tail = prev;	if (menu->head == item) menu->head = next;	switch (item->entry.itemType)	{		case MenuSubMenu:			rxvt_menu_delete(r, item->entry.submenu.menu);			item->entry.submenu.menu = NULL;			break;		case MenuItem:			free(item->entry.action.str);			item->entry.action.str = NULL;			break;	}	if (item->name != NULL) free(item->name);	if (item->name2 != NULL) free(item->name2);	free(item);}#if 0 /* {{{ Obsolete: macro action dispatch / set are much better. *//* * sort command vs. terminal actions and * remove the first character of STR if it's '\0' * * return value < 0 means caller can safely free str. >=0 0 means was assigned * to action, and should only be freed when action is destroyed. *//* INTPROTO */intrxvt_action_type(action_t *action, unsigned char *str){	unsigned short	len;	DBG_MSG( 2, (stderr, "rxvt_action_type(action, %s)\n", str));	switch( *str)	{			/*			 * Old behaviour: Use ^@^@ for leading null strings, and ^@ for			 * terminal strings.			 */#if 0		case '>':	/* Write string to child process */#if defined (DEBUG_MENU) || defined (DEBUG_MENUARROWS)			len = STRLEN(str+1);			fprintf(stderr, "(len %d) = %s\n", len, str);#else			len = rxvt_str_escaped( ((char*) str) + 1); /* Skip leading '>' */#endif			if (!len) return -1;			/* sort command vs. terminal actions */			action->type = MenuItem;			if (str[1] == '\0')			{				/* the functional equivalent: memmove (str, str+2, len); */				unsigned char  *dst = (str);				unsigned char  *src = (str + 2);				unsigned char  *end = (str + len);				while (src <= end)					*dst++ = *src++;				len--;			/* decrement length */				if (str[0] != '\0')					action->type = MenuTerminalAction;			}			else				/* Skip leading '>' */				memmove( str, str + 1, len);			action->str = str;			action->len = len;			break;#endif		case '>':	/* Write string to child process */		case ']':	/* Write string to rxvt */			action->type = ((*str == '>') ? MenuAction : MenuTerminalAction);			len = rxvt_str_escaped( ((char*) str) + 1); /* Skip leading ] or > */			memmove( str, str + 1, len);			action->str = str;			action->len = len;			break;		case '\0':	/* Empty action */			return -1;		default:#if 0			/*			 * Looks like there is no need to implement a new set of functions			 * to be called from the menu. Escape sequences work wonderfully.			 */			for( i=0; i < NUM_HKFUNCS; i++)			{				if( !STRCMP( hk_handlers[i].res+7, str))				{					fprintf( stderr, "Matched handler %d, %s\n", i, str);					action->type = MenuCallFuncAction;					action->handler = hk_handlers[i].handler;					return -1;				}			}			fprintf( stderr, "Unknown function %s\n", str);#endif			rxvt_print_error( "Badly formed menu action %s", str);			return -1;	}	return 0;}/* INTPROTO */intrxvt_action_dispatch(rxvt_t *r, action_t *action){	DBG_MSG( 2, (stderr, "rxvt_action_dispatch()\n"));	switch (action->type)	{		case MenuTerminalAction:			rxvt_cmd_write(r, ATAB(r), action->str, action->len);			break;		case MenuAction:			rxvt_tt_write(r, ATAB(r), action->str, action->len);			break;#if 0	/* Better to implement with escape sequences */		case MenuCallFuncAction:			fprintf( stderr, "Calls not implemnted yet\n");			break;#endif		default:			return -1;			break;	}	return 0;}#endif /* }}} *//* return the arrow index corresponding to NAME *//* INTPROTO */intrxvt_menuarrow_find(char name){	int			 i;	DBG_MSG( 2, (stderr, "rxvt_menuarrow_find()\n"));	for (i = 0; i < NARROWS; i++)	if (name == Arrows[i].name)		return i;	return -1;}/* free the memory associated with arrow NAME of the current menubar *//* INTPROTO */voidrxvt_menuarrow_free(rxvt_t *r, unsigned char name){	int			 i;	DBG_MSG( 2, (stderr, "rxvt_menuarrow_free()\n"));	if (name)	{		i = rxvt_menuarrow_find(name);		if (i >= 0)		{			action_t	   *act = &(r->h->MenuBar.arrows[i]);			free(act->str);			act->str = NULL;			act->len = 0;			act->type = MenuLabel;		}	}	else	{		/* Free all arrows */		/*		 * 2006-02-22 gi1242 XXX: If Arrows[i].name is NULL this will lead to an		 * infinite loop. WTF.		 */		for (i = 0; i < NARROWS; i++)			rxvt_menuarrow_free(r, Arrows[i].name);	}}/* INTPROTO */voidrxvt_menuarrow_add(rxvt_t *r, unsigned char *string){	int			 		i;	unsigned short		xtra_len;	unsigned char		*p;	struct	{		unsigned char	*str;		unsigned short	len;	}			beg = { NULL, 0 },			end = { NULL, 0 },			*cur,			parse[NARROWS];	DBG_MSG( 2, (stderr, "rxvt_menuarrow_add()\n"));	MEMSET(parse, 0, sizeof(parse));/* fprintf(stderr, "add arrows = `%s'\n", string); */	for (p = string; p != NULL && *p; string = p)	{	p = (string + 3);	/* fprintf(stderr, "parsing at %s\n", string); */	switch (string[1])	{		case 'b':			cur = &beg;			break;		case 'e':			cur = &end;			break;		default:			i = rxvt_menuarrow_find(string[1]);			if (i >= 0)			cur = &(parse[i]);			else			continue;	/* not found */			break;	}	string = p;	cur->str = string;	cur->len = 0;	if (cur == &end)	{		p = (unsigned char*) STRCHR(string, '\0');	}	else	{		unsigned char	*next = string;		while (1)		{			p = (unsigned char*) STRCHR(next, '<');			if (p != NULL)			{				if (p[1] && p[2] == '>')				break;				/* parsed */			}			else			{				if (beg.str == NULL)	/* no end needed */				p = (unsigned char*) STRCHR(next, '\0');				break;			}			next = (p + 1);		}	}	if (p == NULL)		return;	cur->len = (p - string);	}#ifdef DEBUG_MENUARROWS	cur = &beg;	fprintf(stderr, "<b>(len %d) = %.*s\n",		cur->len, cur->len, (cur->str ? cur->str : ""));	for (i = 0; i < NARROWS; i++)	{		cur = &(parse[i]);		fprintf(stderr, "<%c>(len %d) = %.*s\n",			Arrows[i].name,			cur->len, cur->len, (cur->str ? cur->str : ""));	}	cur = &end;	fprintf(stderr, "<e>(len %d) = %.*s\n",		cur->len, cur->len, (cur->str ? cur->str : ""));#endif	xtra_len = (beg.len + end.len);	for (i = 0; i < NARROWS; i++)	{		if (xtra_len || parse[i].len)			rxvt_menuarrow_free(r, Arrows[i].name);	}	for (i = 0; i < NARROWS; i++)	{		char  			str[NEWARGLIM];		unsigned short	len;		if (!parse[i].len)			continue;		/* possible integer overflow? */		assert (parse[i].len >= 0 && xtra_len >= 0);		assert (parse[i].len + xtra_len + 1 > 0);		/* str = rxvt_malloc(parse[i].len + xtra_len + 1); */		len = 0;		if (beg.len)		{			STRNCPY(str + len, beg.str, beg.len);			len += beg.len;		}		STRNCPY(str + len, parse[i].str, parse[i].len);		len += parse[i].len;		if (end.len)		{			STRNCPY(str + len, end.str, end.len);			len += end.len;		}		str[len] = '\0';#ifdef DEBUG_MENUARROWS		fprintf(stderr, "<%c>(len %d) = %s\n", Arrows[i].name, len, str);#endif		rxvt_set_action( &(r->h->MenuBar.arrows[i]), str);	}}/* INTPROTO */menuitem_t	 *rxvt_menuitem_add(rxvt_t *r, menu_t *menu,		const unsigned char *name, const unsigned char *name2,		const unsigned char *action){	menuitem_t	 *item;	unsigned int	len;	DBG_MSG( 2, (stderr, "rxvt_menuitem_add()\n"));#ifdef DEBUG	assert(name != NULL);	assert(action != NULL);#endif	if (menu == NULL) return NULL;	if (isSeparator(name))	{		/* add separator, no action */		name	= (unsigned char *) "";		action	= (unsigned char *) "";	}	else	{		/*		 * add/replace existing menu item		 */		item = rxvt_menuitem_find(menu, name);		if (item != NULL)		{			if (item->name2 != NULL && name2 != NULL)			{				free(item->name2);				item->len2 = 0;				item->name2 = NULL;			}			switch (item->entry.itemType)			{				case MenuSubMenu:					rxvt_menu_delete(r, item->entry.submenu.menu);					item->entry.submenu.menu = NULL;					break;									case MenuItem:					free(item->entry.action.str);					item->entry.action.str = NULL;				break;			}			goto Item_Found;		}	}	/* allocate a new itemect */	item = (menuitem_t *) rxvt_malloc( sizeof( menuitem_t) );

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲国产wwwccc36天堂| 波多野结衣一区二区三区 | 无码av中文一区二区三区桃花岛| 老司机午夜精品| 久久九九全国免费| 国产精品中文有码| 国产精品女人毛片| 91蜜桃在线观看| 亚洲黄色片在线观看| 欧美日韩中字一区| 天天操天天色综合| 色综合久久六月婷婷中文字幕| 亚洲三级在线观看| 日韩欧美国产一二三区| 国产91色综合久久免费分享| 成人欧美一区二区三区小说| 色综合天天综合色综合av| 午夜精品国产更新| 国产精品毛片高清在线完整版| 99久久精品免费精品国产| 日韩精品亚洲专区| 亚洲欧洲日产国产综合网| 在线欧美日韩精品| 国产91精品一区二区麻豆网站 | 国精产品一区一区三区mba桃花| 国产亚洲欧美色| 日韩亚洲欧美在线观看| 99九九99九九九视频精品| 日日摸夜夜添夜夜添亚洲女人| 欧美性极品少妇| 顶级嫩模精品视频在线看| 亚洲三级在线免费观看| 久久久久久**毛片大全| 日韩欧美电影在线| 欧美成人在线直播| 6080国产精品一区二区| 欧美日韩中字一区| 欧美喷水一区二区| 色拍拍在线精品视频8848| 99久久亚洲一区二区三区青草| 国产一本一道久久香蕉| 国产精品1区二区.| 国产精品综合在线视频| 国产91精品一区二区麻豆网站| 国产永久精品大片wwwapp| 国产精品1024久久| 黄一区二区三区| 麻豆91免费看| 成人黄页在线观看| 国产一区二区三区在线观看免费视频 | 波多野结衣欧美| 91国在线观看| 26uuu亚洲| 亚洲精品v日韩精品| 爽好久久久欧美精品| 美女视频第一区二区三区免费观看网站 | 亚洲一区自拍偷拍| 国产毛片精品一区| 91国在线观看| 国产精品久久久久婷婷二区次| 26uuu亚洲婷婷狠狠天堂| 久久先锋资源网| 亚洲一区二区四区蜜桃| 日欧美一区二区| 91麻豆精品秘密| 久久久av毛片精品| 日韩高清不卡一区| 欧美日韩一区二区三区免费看| 久久久精品综合| 日本成人超碰在线观看| 99精品桃花视频在线观看| 精品999在线播放| 麻豆精品一区二区av白丝在线| 日日夜夜一区二区| 粉嫩蜜臀av国产精品网站| 91精品国产综合久久久久久漫画| 色欧美88888久久久久久影院| 国产欧美日韩在线看| 91精品福利在线一区二区三区| 成人看片黄a免费看在线| 精品一区二区三区免费视频| 亚洲国产精品视频| 亚洲激情校园春色| 亚洲视频中文字幕| 亚洲国产精品精华液2区45| 91麻豆精品国产91久久久久久| 91高清在线观看| 在线看不卡av| 99久久伊人精品| 日本高清不卡视频| 91黄色免费版| 88在线观看91蜜桃国自产| 欧美日韩国产中文| 日韩欧美中文一区二区| 精品99久久久久久| 国产精品色呦呦| 中文字幕一区视频| 天天综合色天天综合| 亚洲精品日产精品乱码不卡| 精品久久久久久综合日本欧美| 精品蜜桃在线看| 亚洲视频在线一区观看| 艳妇臀荡乳欲伦亚洲一区| 日韩精品欧美精品| 国产精品白丝jk白祙喷水网站| 春色校园综合激情亚洲| 欧美日韩亚洲国产综合| 日韩一级大片在线观看| 最新欧美精品一区二区三区| 香蕉加勒比综合久久| 国产精品 欧美精品| 4438成人网| 亚洲视频中文字幕| 国产麻豆精品久久一二三| 在线精品亚洲一区二区不卡| 精品日韩在线观看| 亚洲一区二区3| fc2成人免费人成在线观看播放| 欧美午夜精品一区二区蜜桃| 久久你懂得1024| 亚洲激情成人在线| av影院午夜一区| 欧美精品一区男女天堂| 亚洲va韩国va欧美va精品| 成人免费看片app下载| 欧美变态tickling挠脚心| 亚洲成人先锋电影| 欧美人xxxx| 丝袜美腿高跟呻吟高潮一区| 91尤物视频在线观看| 国产精品视频yy9299一区| 国产高清精品网站| 久久久美女艺术照精彩视频福利播放| 亚洲一区在线观看免费观看电影高清| 成人国产亚洲欧美成人综合网 | 亚洲精品免费在线观看| 99久久er热在这里只有精品15| 国产精品美女久久久久久久网站| 国产中文字幕一区| 久久一区二区三区国产精品| 国产精品成人一区二区三区夜夜夜| 一区二区视频免费在线观看| 99九九99九九九视频精品| 亚洲女女做受ⅹxx高潮| 欧美性感一类影片在线播放| 亚洲免费在线看| 91精品欧美久久久久久动漫| 久久av中文字幕片| 国产精品女人毛片| 欧美日韩一区二区三区免费看| 卡一卡二国产精品 | 久久99精品久久久久久动态图| 26uuu精品一区二区| 99免费精品视频| 青青草国产成人99久久| 国产日韩欧美精品一区| 日本韩国欧美在线| 国产精品一区二区不卡| 香蕉成人啪国产精品视频综合网| 欧美精品一区二区三区蜜臀| 在线观看欧美精品| 国产成人综合在线观看| 一区二区三区四区精品在线视频 | 免费观看在线综合| 最新久久zyz资源站| 久久久久久综合| 日韩午夜小视频| 欧美午夜影院一区| 色婷婷久久综合| 国产成人精品综合在线观看| 日韩va亚洲va欧美va久久| 亚洲老司机在线| 亚洲天堂网中文字| 国产精品久久久久一区| 国产性色一区二区| 久久久久久久久久久久久久久99| 日韩一区二区中文字幕| 欧美图片一区二区三区| jiyouzz国产精品久久| 91美女视频网站| 91久久精品午夜一区二区| 色婷婷av一区二区三区软件| 99热这里都是精品| 国产精品一级在线| 免费观看成人鲁鲁鲁鲁鲁视频| 日韩激情一二三区| 日本美女一区二区| 久久国产精品99久久久久久老狼| 亚洲大片免费看| 欧美aaaaa成人免费观看视频| 日韩av网站在线观看| 久草在线在线精品观看| 成人免费视频视频在线观看免费| av在线综合网| 欧美一区三区二区| 欧美国产日韩a欧美在线观看| 亚洲麻豆国产自偷在线| 日韩av一区二| 日本高清视频一区二区| 欧美xxxxxxxxx|