亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
国产伦精品一区二区三区免费迷| 日韩一区二区免费高清| 美日韩一区二区| 国产精品久久久久久久久久久免费看| av不卡在线播放| 久久电影网站中文字幕| 国产精品乱子久久久久| 国产精品一区二区不卡| 亚洲午夜精品在线| 国产肉丝袜一区二区| 欧美精品色一区二区三区| 风间由美性色一区二区三区| 亚洲成人自拍一区| 欧美午夜精品久久久久久孕妇| 亚洲欧美一区二区不卡| 国产视频一区在线观看| 日韩综合在线视频| 国产精品视频你懂的| 欧美一激情一区二区三区| 一本大道综合伊人精品热热| 韩国毛片一区二区三区| 婷婷成人激情在线网| 亚洲欧洲av一区二区三区久久| ww久久中文字幕| 欧美精品在线一区二区三区| 91日韩一区二区三区| 99久久99久久精品免费看蜜桃| 欧美精品色综合| 麻豆精品新av中文字幕| 风间由美性色一区二区三区| 99久久免费视频.com| 欧美日韩精品一区二区天天拍小说| 91精品视频网| 国产无人区一区二区三区| 一区二区三区日韩| 麻豆精品一区二区三区| 国产91丝袜在线播放九色| 国产精品毛片久久久久久| 国产xxx精品视频大全| 波多野结衣欧美| 在线观看成人免费视频| 日韩精品一区二区三区视频播放| 久久久久久久久一| 亚洲永久免费视频| 国产在线一区二区综合免费视频| 99精品视频在线免费观看| 欧美一级在线视频| 亚洲欧洲综合另类| 激情欧美一区二区| 在线一区二区三区四区五区| 欧美白人最猛性xxxxx69交| 亚洲视频免费在线观看| 美女一区二区三区| 91福利在线播放| 久久久久久免费网| 日本在线播放一区二区三区| av电影一区二区| 欧美成人欧美edvon| 亚洲免费观看高清完整版在线观看| 麻豆专区一区二区三区四区五区| 97精品超碰一区二区三区| 日韩免费视频线观看| 亚洲一区二区三区中文字幕| 国产风韵犹存在线视精品| 678五月天丁香亚洲综合网| 中文字幕亚洲视频| 国产一区二区免费在线| 91麻豆精品国产自产在线| 1024成人网| 国产露脸91国语对白| 91精品国产色综合久久不卡蜜臀| 亚洲丝袜制服诱惑| 国产成人啪免费观看软件| 欧美一级精品在线| 一区二区三区不卡视频| 不卡一区二区中文字幕| 欧美不卡一区二区三区| 五月婷婷激情综合| 91久久人澡人人添人人爽欧美| 国产欧美日韩麻豆91| 韩国视频一区二区| 日韩视频一区二区| 日韩精品欧美成人高清一区二区| 在线观看欧美日本| 综合电影一区二区三区 | 制服丝袜成人动漫| 亚洲一二三区在线观看| 91首页免费视频| 中文字幕第一区二区| 狠狠色综合日日| 精品久久人人做人人爽| 麻豆免费看一区二区三区| 国产精品久久久久久久久免费桃花| 性久久久久久久久| 成人免费高清视频在线观看| 久久影音资源网| 国产综合色产在线精品| 精品福利一区二区三区免费视频| 奇米在线7777在线精品| 欧美一区二区三区四区五区 | 99天天综合性| 国产精品久久久久影院老司 | 日韩欧美在线网站| 日韩高清一级片| 日韩视频在线观看一区二区| 裸体一区二区三区| 精品国产乱码久久久久久图片| 麻豆成人久久精品二区三区红 | 免费观看一级特黄欧美大片| 欧美一区二区三区免费在线看 | 91免费在线播放| 亚洲男同性恋视频| 欧美无砖专区一中文字| 亚洲综合无码一区二区| 欧美日本在线观看| 日韩中文字幕麻豆| 亚洲精品在线免费观看视频| 国产精品1区2区3区| 国产精品美女久久久久久久久久久| 成人av电影免费在线播放| 亚洲欧美国产77777| 欧美剧情电影在线观看完整版免费励志电影| 国产在线一区二区| 久久免费的精品国产v∧| 久久精品国产**网站演员| 久久婷婷成人综合色| 成人a级免费电影| 一区二区三区四区国产精品| 欧美日韩成人激情| 国产精品主播直播| 日韩理论片中文av| 制服丝袜一区二区三区| 国产v综合v亚洲欧| 亚洲国产精品久久人人爱蜜臀 | 久久亚洲精华国产精华液| 成+人+亚洲+综合天堂| 亚洲午夜av在线| 精品粉嫩超白一线天av| 99re视频这里只有精品| 婷婷开心激情综合| 国产精品三级视频| 欧美狂野另类xxxxoooo| 国产精品资源在线| 亚洲一卡二卡三卡四卡无卡久久| 欧美成人vps| 一本大道久久a久久综合婷婷| 蜜臀av性久久久久蜜臀aⅴ四虎| 国产精品三级电影| 欧美一区二区三区免费观看视频| 丁香婷婷综合网| 奇米色777欧美一区二区| 国产丝袜美腿一区二区三区| 欧美丝袜丝nylons| 成人性视频网站| 午夜影院在线观看欧美| 久久九九99视频| 欧美三级视频在线| 国产mv日韩mv欧美| 日韩中文字幕不卡| 中文字幕一区二区三区av| 欧美一级日韩免费不卡| 91免费视频大全| 日本免费在线视频不卡一不卡二| 国产情人综合久久777777| 91精品国产91久久久久久一区二区 | 成人动漫av在线| 成人午夜激情片| 天堂va蜜桃一区二区三区漫画版| 欧美国产日产图区| 欧美不卡一二三| 欧美三区免费完整视频在线观看| 国产成人在线网站| 免费成人你懂的| 一区二区三区四区激情| 国产清纯白嫩初高生在线观看91| 欧美二区在线观看| 在线观看视频91| 99久久精品国产精品久久| 国产一区二区不卡| 久久99精品久久久久久动态图| 亚洲国产精品久久人人爱| 1024成人网色www| 国产欧美日韩综合| 日韩欧美一级特黄在线播放| 欧美中文字幕久久| 91污在线观看| k8久久久一区二区三区| 国产一区二区在线看| 婷婷六月综合亚洲| 亚洲国产欧美另类丝袜| 亚洲免费av观看| 国产精品久久二区二区| 久久久精品黄色| 久久日韩粉嫩一区二区三区| 日韩免费视频一区二区| 日韩午夜中文字幕| 欧美一二三在线| 日韩免费观看2025年上映的电影| 欧美日本视频在线| 欧美精品三级日韩久久|