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

📄 gntwidget.c

📁 Linux下的多协议即时通讯程序源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/* Stuff brutally ripped from Gflib */#include "gntwidget.h"#include "gntstyle.h"#include "gntmarshal.h"#include "gntutils.h"#include "gnt.h"enum{	SIG_DESTROY,	SIG_DRAW,	SIG_HIDE,	SIG_GIVE_FOCUS,	SIG_LOST_FOCUS,	SIG_KEY_PRESSED,	SIG_MAP,	SIG_ACTIVATE,	SIG_EXPOSE,	SIG_SIZE_REQUEST,	SIG_CONFIRM_SIZE,	SIG_SIZE_CHANGED,	SIG_POSITION,	SIG_CLICKED,	SIG_CONTEXT_MENU,	SIGS};static GObjectClass *parent_class = NULL;static guint signals[SIGS] = { 0 };static void init_widget(GntWidget *widget);static voidgnt_widget_init(GTypeInstance *instance, gpointer class){	GntWidget *widget = GNT_WIDGET(instance);	widget->priv.name = NULL;	GNTDEBUG;}static voidgnt_widget_map(GntWidget *widget){	/* Get some default size for the widget */	GNTDEBUG;	g_signal_emit(widget, signals[SIG_MAP], 0);	GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_MAPPED);}static voidgnt_widget_dispose(GObject *obj){	GntWidget *self = GNT_WIDGET(obj);	if(!(GNT_WIDGET_FLAGS(self) & GNT_WIDGET_DESTROYING)) {		GNT_WIDGET_SET_FLAGS(self, GNT_WIDGET_DESTROYING);		g_signal_emit(self, signals[SIG_DESTROY], 0);		GNT_WIDGET_UNSET_FLAGS(self, GNT_WIDGET_DESTROYING);	}	parent_class->dispose(obj);	GNTDEBUG;}static voidgnt_widget_focus_change(GntWidget *widget){	if (GNT_WIDGET_FLAGS(widget) & GNT_WIDGET_MAPPED)		gnt_widget_draw(widget);}static gbooleangnt_widget_dummy_confirm_size(GntWidget *widget, int width, int height){	gboolean shadow;	if (width < widget->priv.minw || height < widget->priv.minh)		return FALSE;	shadow = gnt_widget_has_shadow(widget);	if (widget->priv.width + shadow != width && !GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_GROW_X))		return FALSE;	if (widget->priv.height + shadow != height && !GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_GROW_Y))		return FALSE;	return TRUE;}static gbooleancontext_menu(GntBindable *bind, GList *null){	gboolean ret = FALSE;	g_signal_emit(bind, signals[SIG_CONTEXT_MENU], 0, &ret);	return ret;}static voidgnt_widget_class_init(GntWidgetClass *klass){	GObjectClass *obj_class = G_OBJECT_CLASS(klass);	parent_class = g_type_class_peek_parent(klass);	obj_class->dispose = gnt_widget_dispose;	klass->destroy = gnt_widget_destroy;	klass->show = gnt_widget_show;	klass->draw = gnt_widget_draw;	klass->expose = gnt_widget_expose;	klass->map = gnt_widget_map;	klass->lost_focus = gnt_widget_focus_change;	klass->gained_focus = gnt_widget_focus_change;	klass->confirm_size = gnt_widget_dummy_confirm_size;		klass->key_pressed = NULL;	klass->activate = NULL;	klass->clicked = NULL;		signals[SIG_DESTROY] = 		g_signal_new("destroy",					 G_TYPE_FROM_CLASS(klass),					 G_SIGNAL_RUN_LAST,					 G_STRUCT_OFFSET(GntWidgetClass, destroy),					 NULL, NULL,					 g_cclosure_marshal_VOID__VOID,					 G_TYPE_NONE, 0);	signals[SIG_GIVE_FOCUS] = 		g_signal_new("gained-focus",					 G_TYPE_FROM_CLASS(klass),					 G_SIGNAL_RUN_LAST,					 G_STRUCT_OFFSET(GntWidgetClass, gained_focus),					 NULL, NULL,					 g_cclosure_marshal_VOID__VOID,					 G_TYPE_NONE, 0);	signals[SIG_LOST_FOCUS] = 		g_signal_new("lost-focus",					 G_TYPE_FROM_CLASS(klass),					 G_SIGNAL_RUN_LAST,					 G_STRUCT_OFFSET(GntWidgetClass, lost_focus),					 NULL, NULL,					 g_cclosure_marshal_VOID__VOID,					 G_TYPE_NONE, 0);	signals[SIG_ACTIVATE] = 		g_signal_new("activate",					 G_TYPE_FROM_CLASS(klass),					 G_SIGNAL_RUN_LAST,					 G_STRUCT_OFFSET(GntWidgetClass, activate),					 NULL, NULL,					 g_cclosure_marshal_VOID__VOID,					 G_TYPE_NONE, 0);	signals[SIG_MAP] = 		g_signal_new("map",					 G_TYPE_FROM_CLASS(klass),					 G_SIGNAL_RUN_LAST,					 G_STRUCT_OFFSET(GntWidgetClass, map),					 NULL, NULL,					 g_cclosure_marshal_VOID__VOID,					 G_TYPE_NONE, 0);	signals[SIG_DRAW] = 		g_signal_new("draw",					 G_TYPE_FROM_CLASS(klass),					 G_SIGNAL_RUN_LAST,					 G_STRUCT_OFFSET(GntWidgetClass, draw),					 NULL, NULL,					 g_cclosure_marshal_VOID__VOID,					 G_TYPE_NONE, 0);	signals[SIG_HIDE] = 		g_signal_new("hide",					 G_TYPE_FROM_CLASS(klass),					 G_SIGNAL_RUN_LAST,					 G_STRUCT_OFFSET(GntWidgetClass, hide),					 NULL, NULL,					 g_cclosure_marshal_VOID__VOID,					 G_TYPE_NONE, 0);	signals[SIG_EXPOSE] = 		g_signal_new("expose",					 G_TYPE_FROM_CLASS(klass),					 G_SIGNAL_RUN_LAST,					 G_STRUCT_OFFSET(GntWidgetClass, expose),					 NULL, NULL,					 gnt_closure_marshal_VOID__INT_INT_INT_INT,					 G_TYPE_NONE, 4, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT);	signals[SIG_POSITION] = 		g_signal_new("position-set",					 G_TYPE_FROM_CLASS(klass),					 G_SIGNAL_RUN_LAST,					 G_STRUCT_OFFSET(GntWidgetClass, set_position),					 NULL, NULL,					 gnt_closure_marshal_VOID__INT_INT,					 G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_INT);	signals[SIG_SIZE_REQUEST] = 		g_signal_new("size_request",					 G_TYPE_FROM_CLASS(klass),					 G_SIGNAL_RUN_LAST,					 G_STRUCT_OFFSET(GntWidgetClass, size_request),					 NULL, NULL,					 g_cclosure_marshal_VOID__VOID,					 G_TYPE_NONE, 0);	signals[SIG_SIZE_CHANGED] = 		g_signal_new("size_changed",					 G_TYPE_FROM_CLASS(klass),					 G_SIGNAL_RUN_LAST,					 G_STRUCT_OFFSET(GntWidgetClass, size_changed),					 NULL, NULL,					 gnt_closure_marshal_VOID__INT_INT,					 G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_INT);	signals[SIG_CONFIRM_SIZE] = 		g_signal_new("confirm_size",					 G_TYPE_FROM_CLASS(klass),					 G_SIGNAL_RUN_LAST,					 G_STRUCT_OFFSET(GntWidgetClass, confirm_size),					 NULL, NULL,					 gnt_closure_marshal_BOOLEAN__INT_INT,					 G_TYPE_BOOLEAN, 2, G_TYPE_INT, G_TYPE_INT);	signals[SIG_KEY_PRESSED] = 		g_signal_new("key_pressed",					 G_TYPE_FROM_CLASS(klass),					 G_SIGNAL_RUN_LAST,					 G_STRUCT_OFFSET(GntWidgetClass, key_pressed),					 gnt_boolean_handled_accumulator, NULL,					 gnt_closure_marshal_BOOLEAN__STRING,					 G_TYPE_BOOLEAN, 1, G_TYPE_STRING);	signals[SIG_CLICKED] = 		g_signal_new("clicked",					 G_TYPE_FROM_CLASS(klass),					 G_SIGNAL_RUN_LAST,					 G_STRUCT_OFFSET(GntWidgetClass, clicked),					 gnt_boolean_handled_accumulator, NULL,					 gnt_closure_marshal_BOOLEAN__INT_INT_INT,					 G_TYPE_BOOLEAN, 3, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT);	signals[SIG_CONTEXT_MENU] = 		g_signal_new("context-menu",					 G_TYPE_FROM_CLASS(klass),					 G_SIGNAL_RUN_LAST,					 0,					 gnt_boolean_handled_accumulator, NULL,					 gnt_closure_marshal_BOOLEAN__VOID,					 G_TYPE_BOOLEAN, 0);	/* This is relevant for all widgets */	gnt_bindable_class_register_action(GNT_BINDABLE_CLASS(klass), "context-menu", context_menu,				GNT_KEY_POPUP, NULL);	gnt_bindable_register_binding(GNT_BINDABLE_CLASS(klass), "context-menu", GNT_KEY_F11, NULL);	gnt_style_read_actions(G_OBJECT_CLASS_TYPE(klass), GNT_BINDABLE_CLASS(klass));	GNTDEBUG;}/****************************************************************************** * GntWidget API *****************************************************************************/GTypegnt_widget_get_gtype(void){	static GType type = 0;	if(type == 0) {		static const GTypeInfo info = {			sizeof(GntWidgetClass),			NULL,					/* base_init		*/			NULL,					/* base_finalize	*/			(GClassInitFunc)gnt_widget_class_init,			NULL,			NULL,					/* class_data		*/			sizeof(GntWidget),			0,						/* n_preallocs		*/			gnt_widget_init,					/* instance_init	*/			NULL					/* value_table		*/		};		type = g_type_register_static(GNT_TYPE_BINDABLE,									  "GntWidget",									  &info, G_TYPE_FLAG_ABSTRACT);	}	return type;}void gnt_widget_set_take_focus(GntWidget *widget, gboolean can){	if (can)		GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_CAN_TAKE_FOCUS);	else		GNT_WIDGET_UNSET_FLAGS(widget, GNT_WIDGET_CAN_TAKE_FOCUS);}/** * gnt_widget_destroy: * @obj: The #GntWidget instance. * * Emits the "destroy" signal notifying all reference holders that they * should release @obj. */voidgnt_widget_destroy(GntWidget *obj){	g_return_if_fail(GNT_IS_WIDGET(obj));	gnt_widget_hide(obj);	delwin(obj->window);	if(!(GNT_WIDGET_FLAGS(obj) & GNT_WIDGET_DESTROYING))		g_object_run_dispose(G_OBJECT(obj));	GNTDEBUG;}voidgnt_widget_show(GntWidget *widget){	gnt_widget_draw(widget);	gnt_screen_occupy(widget);}voidgnt_widget_draw(GntWidget *widget){

⌨️ 快捷键说明

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