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

📄 gntwidget.c

📁 Linux下的多协议即时通讯程序源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
	/* Draw the widget */	if (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_DRAWING))		return;	GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_DRAWING);	if (!(GNT_WIDGET_FLAGS(widget) & GNT_WIDGET_MAPPED)) {		gnt_widget_map(widget);	}	if (widget->window == NULL)	{#if 0		int x, y, maxx, maxy, w, h;		int oldw, oldh;		gboolean shadow = TRUE;		if (!gnt_widget_has_shadow(widget))			shadow = FALSE;		x = widget->priv.x;		y = widget->priv.y;		w = oldw = widget->priv.width + shadow;		h = oldh = widget->priv.height + shadow;		getmaxyx(stdscr, maxy, maxx);		maxy -= 1;		/* room for the taskbar */		x = MAX(0, x);		y = MAX(0, y);		if (x + w >= maxx)			x = MAX(0, maxx - w);		if (y + h >= maxy)			y = MAX(0, maxy - h);		w = MIN(w, maxx);		h = MIN(h, maxy);		widget->priv.x = x;		widget->priv.y = y;		if (w != oldw || h != oldh) {			widget->priv.width = w - shadow;			widget->priv.height = h - shadow;			g_signal_emit(widget, signals[SIG_SIZE_CHANGED], 0, oldw, oldh);		}#else		widget->window = newpad(widget->priv.height + 20, widget->priv.width + 20);  /* XXX: */#endif		init_widget(widget);	}	g_signal_emit(widget, signals[SIG_DRAW], 0);	gnt_widget_queue_update(widget);	GNT_WIDGET_UNSET_FLAGS(widget, GNT_WIDGET_DRAWING);}gbooleangnt_widget_key_pressed(GntWidget *widget, const char *keys){	gboolean ret;	if (!GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_CAN_TAKE_FOCUS))		return FALSE;	if (gnt_bindable_perform_action_key(GNT_BINDABLE(widget), keys))		return TRUE;	keys = gnt_bindable_remap_keys(GNT_BINDABLE(widget), keys);	g_signal_emit(widget, signals[SIG_KEY_PRESSED], 0, keys, &ret);	return ret;}gbooleangnt_widget_clicked(GntWidget *widget, GntMouseEvent event, int x, int y){	gboolean ret;	g_signal_emit(widget, signals[SIG_CLICKED], 0, event, x, y, &ret);	return ret;}voidgnt_widget_expose(GntWidget *widget, int x, int y, int width, int height){	g_signal_emit(widget, signals[SIG_EXPOSE], 0, x, y, width, height);}voidgnt_widget_hide(GntWidget *widget){	g_signal_emit(widget, signals[SIG_HIDE], 0);	wbkgdset(widget->window, '\0' | COLOR_PAIR(GNT_COLOR_NORMAL));#if 0	/* XXX: I have no clue why, but this seemed to be necessary. */	if (gnt_widget_has_shadow(widget))		mvwvline(widget->window, 1, widget->priv.width, ' ', widget->priv.height);#endif	gnt_screen_release(widget);	GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_INVISIBLE);	GNT_WIDGET_UNSET_FLAGS(widget, GNT_WIDGET_MAPPED);}voidgnt_widget_set_position(GntWidget *wid, int x, int y){	g_signal_emit(wid, signals[SIG_POSITION], 0, x, y);	/* XXX: Need to install properties for these and g_object_notify */	wid->priv.x = x;	wid->priv.y = y;}voidgnt_widget_get_position(GntWidget *wid, int *x, int *y){	if (x)		*x = wid->priv.x;	if (y)		*y = wid->priv.y;}voidgnt_widget_size_request(GntWidget *widget){	g_signal_emit(widget, signals[SIG_SIZE_REQUEST], 0);}voidgnt_widget_get_size(GntWidget *wid, int *width, int *height){	gboolean shadow = TRUE;	if (!gnt_widget_has_shadow(wid))		shadow = FALSE;	if (width)		*width = wid->priv.width + shadow;	if (height)		*height = wid->priv.height + shadow;	}static voidinit_widget(GntWidget *widget){	gboolean shadow = TRUE;	if (!gnt_widget_has_shadow(widget))		shadow = FALSE;	wbkgd(widget->window, COLOR_PAIR(GNT_COLOR_NORMAL));	werase(widget->window);	if (!(GNT_WIDGET_FLAGS(widget) & GNT_WIDGET_NO_BORDER))	{		/* - This is ugly. */		/* - What's your point? */		mvwvline(widget->window, 0, 0, ACS_VLINE | COLOR_PAIR(GNT_COLOR_NORMAL), widget->priv.height);		mvwvline(widget->window, 0, widget->priv.width - 1,				ACS_VLINE | COLOR_PAIR(GNT_COLOR_NORMAL), widget->priv.height);		mvwhline(widget->window, widget->priv.height - 1, 0,				ACS_HLINE | COLOR_PAIR(GNT_COLOR_NORMAL), widget->priv.width);		mvwhline(widget->window, 0, 0, ACS_HLINE | COLOR_PAIR(GNT_COLOR_NORMAL), widget->priv.width);		mvwaddch(widget->window, 0, 0, ACS_ULCORNER | COLOR_PAIR(GNT_COLOR_NORMAL));		mvwaddch(widget->window, 0, widget->priv.width - 1,				ACS_URCORNER | COLOR_PAIR(GNT_COLOR_NORMAL));		mvwaddch(widget->window, widget->priv.height - 1, 0,				ACS_LLCORNER | COLOR_PAIR(GNT_COLOR_NORMAL));		mvwaddch(widget->window, widget->priv.height - 1, widget->priv.width - 1,				ACS_LRCORNER | COLOR_PAIR(GNT_COLOR_NORMAL));	}	if (shadow)	{		wbkgdset(widget->window, '\0' | COLOR_PAIR(GNT_COLOR_SHADOW));		mvwvline(widget->window, 1, widget->priv.width, ' ', widget->priv.height);		mvwhline(widget->window, widget->priv.height, 1, ' ', widget->priv.width);	}}gbooleangnt_widget_set_size(GntWidget *widget, int width, int height){	gboolean ret = TRUE;	if (gnt_widget_has_shadow(widget))	{		width--;		height--;	}	if (width <= 0)		width = widget->priv.width;	if (height <= 0)		height = widget->priv.height;	if (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_MAPPED))	{		ret = gnt_widget_confirm_size(widget, width, height);	}	if (ret)	{		gboolean shadow = TRUE;		int oldw, oldh;		if (!gnt_widget_has_shadow(widget))			shadow = FALSE;		oldw = widget->priv.width;		oldh = widget->priv.height;		widget->priv.width = width;		widget->priv.height = height;		if (width + shadow >= getmaxx(widget->window) || height + shadow >= getmaxy(widget->window)) {			delwin(widget->window);			widget->window = newpad(height + 20, width + 20);		}		g_signal_emit(widget, signals[SIG_SIZE_CHANGED], 0, oldw, oldh);		if (widget->window)		{			init_widget(widget);		}		if (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_MAPPED))			init_widget(widget);		else			GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_MAPPED);	}	return ret;}gbooleangnt_widget_set_focus(GntWidget *widget, gboolean set){	if (!(GNT_WIDGET_FLAGS(widget) & GNT_WIDGET_CAN_TAKE_FOCUS))		return FALSE;	if (set && !GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_HAS_FOCUS))	{		GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_HAS_FOCUS);		g_signal_emit(widget, signals[SIG_GIVE_FOCUS], 0);	}	else if (!set)	{		GNT_WIDGET_UNSET_FLAGS(widget, GNT_WIDGET_HAS_FOCUS);		g_signal_emit(widget, signals[SIG_LOST_FOCUS], 0);	}	else		return FALSE;	return TRUE;}void gnt_widget_set_name(GntWidget *widget, const char *name){	g_free(widget->priv.name);	widget->priv.name = g_strdup(name);}const char *gnt_widget_get_name(GntWidget *widget){	return widget->priv.name;}void gnt_widget_activate(GntWidget *widget){	g_signal_emit(widget, signals[SIG_ACTIVATE], 0);}static gbooleanupdate_queue_callback(gpointer data){	GntWidget *widget = GNT_WIDGET(data);	if (!g_object_get_data(G_OBJECT(widget), "gnt:queue_update"))		return FALSE;	if (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_MAPPED))		gnt_screen_update(widget);	g_object_set_data(G_OBJECT(widget), "gnt:queue_update", NULL);	return FALSE;}void gnt_widget_queue_update(GntWidget *widget){	if (widget->window == NULL)		return;	while (widget->parent)		widget = widget->parent;		if (!g_object_get_data(G_OBJECT(widget), "gnt:queue_update"))	{		int id = g_timeout_add(0, update_queue_callback, widget);		g_object_set_data_full(G_OBJECT(widget), "gnt:queue_update", GINT_TO_POINTER(id),				(GDestroyNotify)g_source_remove);	}}gboolean gnt_widget_confirm_size(GntWidget *widget, int width, int height){	gboolean ret = FALSE;	g_signal_emit(widget, signals[SIG_CONFIRM_SIZE], 0, width, height, &ret);	return ret;}void gnt_widget_set_visible(GntWidget *widget, gboolean set){	if (set)		GNT_WIDGET_UNSET_FLAGS(widget, GNT_WIDGET_INVISIBLE);	else		GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_INVISIBLE);}gboolean gnt_widget_has_shadow(GntWidget *widget){	return (!GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_NO_SHADOW) &&			gnt_style_get_bool(GNT_STYLE_SHADOW, FALSE));}

⌨️ 快捷键说明

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