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

📄 gntbox.c

📁 Linux下的多协议即时通讯程序源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
				}				else				{					if (!gnt_widget_confirm_size(i->data, tw, th - hchange)) {						if (hchange > 0 && th >= widget->priv.height)							return FALSE;						return FALSE;					}				}			}#if 0			gnt_widget_set_size(wid, w - wchange, h - hchange);			if (box->vertical)				hchange = 0;			else				wchange = 0;			for (i = box->list; i; i = i->next)			{				int tw, th;				if (i == iter) continue;				gnt_widget_get_size(GNT_WIDGET(i->data), &tw, &th);				gnt_widget_set_size(i->data, tw - wchange, th - hchange);			}#endif			g_object_set_data(G_OBJECT(box), "size-queued", wid);			return TRUE;		}	}	return FALSE;}static voidgnt_box_size_changed(GntWidget *widget, int oldw, int oldh){	int wchange, hchange;	GList *i;	GntBox *box = GNT_BOX(widget);	GntWidget *wid;	int tw, th;			wchange = widget->priv.width - oldw;	hchange = widget->priv.height - oldh;		wid = g_object_get_data(G_OBJECT(box), "size-queued");	if (wid)	{		gnt_widget_get_size(wid, &tw, &th);		gnt_widget_set_size(wid, tw + wchange, th + hchange);		g_object_set_data(G_OBJECT(box), "size-queued", NULL);	}	if (box->vertical)		hchange = 0;	else		wchange = 0;	for (i = box->list; i; i = i->next)	{		if (wid != i->data)		{			gnt_widget_get_size(GNT_WIDGET(i->data), &tw, &th);			gnt_widget_set_size(i->data, tw + wchange, th + hchange);		}	}	reposition_children(widget);}static gbooleangnt_box_clicked(GntWidget *widget, GntMouseEvent event, int cx, int cy){	GList *iter;	for (iter = GNT_BOX(widget)->list; iter; iter = iter->next) {		int x, y, w, h;		GntWidget *wid = iter->data;		gnt_widget_get_position(wid, &x, &y);		gnt_widget_get_size(wid, &w, &h);		if (cx >= x && cx < x + w && cy >= y && cy < y + h) {			if (event <= GNT_MIDDLE_MOUSE_DOWN &&				GNT_WIDGET_IS_FLAG_SET(wid, GNT_WIDGET_CAN_TAKE_FOCUS)) {				while (widget->parent)					widget = widget->parent;				gnt_box_give_focus_to_child(GNT_BOX(widget), wid);			}			return gnt_widget_clicked(wid, event, cx, cy);		}	}	return FALSE;}static voidgnt_box_class_init(GntBoxClass *klass){	parent_class = GNT_WIDGET_CLASS(klass);	parent_class->destroy = gnt_box_destroy;	parent_class->draw = gnt_box_draw;	parent_class->expose = gnt_box_expose;	parent_class->map = gnt_box_map;	parent_class->size_request = gnt_box_size_request;	parent_class->set_position = gnt_box_set_position;	parent_class->key_pressed = gnt_box_key_pressed;	parent_class->clicked = gnt_box_clicked;	parent_class->lost_focus = gnt_box_lost_focus;	parent_class->gained_focus = gnt_box_gained_focus;	parent_class->confirm_size = gnt_box_confirm_size;	parent_class->size_changed = gnt_box_size_changed;	GNTDEBUG;}static voidgnt_box_init(GTypeInstance *instance, gpointer class){	GntWidget *widget = GNT_WIDGET(instance);	GntBox *box = GNT_BOX(widget);	/* Initially make both the height and width resizable.	 * Update the flags as necessary when widgets are added to it. */	GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_GROW_X | GNT_WIDGET_GROW_Y);	GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_CAN_TAKE_FOCUS);	GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_NO_BORDER | GNT_WIDGET_NO_SHADOW);	box->pad = 1;	box->fill = TRUE;	GNTDEBUG;}/****************************************************************************** * GntBox API *****************************************************************************/GTypegnt_box_get_gtype(void){	static GType type = 0;	if(type == 0)	{		static const GTypeInfo info = {			sizeof(GntBoxClass),			NULL,					/* base_init		*/			NULL,					/* base_finalize	*/			(GClassInitFunc)gnt_box_class_init,			NULL,					/* class_finalize	*/			NULL,					/* class_data		*/			sizeof(GntBox),			0,						/* n_preallocs		*/			gnt_box_init,			/* instance_init	*/			NULL					/* value_table		*/		};		type = g_type_register_static(GNT_TYPE_WIDGET,									  "GntBox",									  &info, 0);	}	return type;}GntWidget *gnt_box_new(gboolean homo, gboolean vert){	GntWidget *widget = g_object_new(GNT_TYPE_BOX, NULL);	GntBox *box = GNT_BOX(widget);	box->homogeneous = homo;	box->vertical = vert;	box->alignment = vert ? GNT_ALIGN_LEFT : GNT_ALIGN_MID;	return widget;}void gnt_box_add_widget(GntBox *b, GntWidget *widget){	b->list = g_list_append(b->list, widget);	widget->parent = GNT_WIDGET(b);}void gnt_box_set_title(GntBox *b, const char *title){	char *prev = b->title;	GntWidget *w = GNT_WIDGET(b);	b->title = g_strdup(title);	if (w->window && !GNT_WIDGET_IS_FLAG_SET(w, GNT_WIDGET_NO_BORDER)) {		/* Erase the old title */		int pos, right;		get_title_thingies(b, prev, &pos, &right);		mvwhline(w->window, 0, pos - 1, ACS_HLINE | COLOR_PAIR(GNT_COLOR_NORMAL),				right - pos + 2);		g_free(prev);	}}void gnt_box_set_pad(GntBox *box, int pad){	box->pad = pad;	/* XXX: Perhaps redraw if already showing? */}void gnt_box_set_toplevel(GntBox *box, gboolean set){	GntWidget *widget = GNT_WIDGET(box);	if (set)	{		GNT_WIDGET_UNSET_FLAGS(widget, GNT_WIDGET_NO_BORDER | GNT_WIDGET_NO_SHADOW);		GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_CAN_TAKE_FOCUS);	}	else	{		GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_NO_BORDER | GNT_WIDGET_NO_SHADOW);		GNT_WIDGET_UNSET_FLAGS(widget, GNT_WIDGET_CAN_TAKE_FOCUS);	}}void gnt_box_sync_children(GntBox *box){	GList *iter;	GntWidget *widget = GNT_WIDGET(box);	int pos = 1;	if (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_NO_BORDER))		pos = 0;	for (iter = box->list; iter; iter = iter->next)	{		GntWidget *w = GNT_WIDGET(iter->data);		int height, width;		int x, y;		if (GNT_WIDGET_IS_FLAG_SET(w, GNT_WIDGET_INVISIBLE))			continue;		if (GNT_IS_BOX(w))			gnt_box_sync_children(GNT_BOX(w));		gnt_widget_get_size(w, &width, &height);		x = w->priv.x - widget->priv.x;		y = w->priv.y - widget->priv.y;		if (box->vertical)		{			x = pos;			if (box->alignment == GNT_ALIGN_RIGHT)				x += widget->priv.width - width;			else if (box->alignment == GNT_ALIGN_MID)				x += (widget->priv.width - width)/2;			if (x + width > widget->priv.width - pos)				x -= x + width - (widget->priv.width - pos);		}		else		{			y = pos;			if (box->alignment == GNT_ALIGN_BOTTOM)				y += widget->priv.height - height;			else if (box->alignment == GNT_ALIGN_MID)				y += (widget->priv.height - height)/2;			if (y + height >= widget->priv.height - pos)				y = widget->priv.height - height - pos;		}		copywin(w->window, widget->window, 0, 0,				y, x, y + height - 1, x + width - 1, FALSE);		gnt_widget_set_position(w, x + widget->priv.x, y + widget->priv.y);	}}void gnt_box_set_alignment(GntBox *box, GntAlignment alignment){	box->alignment = alignment;}void gnt_box_remove(GntBox *box, GntWidget *widget){	box->list = g_list_remove(box->list, widget);	if (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_CAN_TAKE_FOCUS)			&& GNT_WIDGET(box)->parent == NULL && box->focus)	{		if (widget == box->active)		{			find_next_focus(box);			if (box->active == widget) /* There's only one widget */				box->active = NULL;		}		box->focus = g_list_remove(box->focus, widget);	}	if (GNT_WIDGET_IS_FLAG_SET(GNT_WIDGET(box), GNT_WIDGET_MAPPED))		gnt_widget_draw(GNT_WIDGET(box));}void gnt_box_remove_all(GntBox *box){	g_list_foreach(box->list, (GFunc)gnt_widget_destroy, NULL);	g_list_free(box->list);	g_list_free(box->focus);	box->list = NULL;	box->focus = NULL;	GNT_WIDGET(box)->priv.width = 0;	GNT_WIDGET(box)->priv.height = 0;}void gnt_box_readjust(GntBox *box){	GList *iter;	GntWidget *wid;	int width, height;	if (GNT_WIDGET(box)->parent != NULL)		return;	for (iter = box->list; iter; iter = iter->next)	{		GntWidget *w = iter->data;		if (GNT_IS_BOX(w))			gnt_box_readjust(GNT_BOX(w));		else		{			GNT_WIDGET_UNSET_FLAGS(w, GNT_WIDGET_MAPPED);			w->priv.width = 0;			w->priv.height = 0;		}	}	wid = GNT_WIDGET(box);	GNT_WIDGET_UNSET_FLAGS(wid, GNT_WIDGET_MAPPED);	wid->priv.width = 0;	wid->priv.height = 0;	if (wid->parent == NULL)	{		g_list_free(box->focus);		box->focus = NULL;		box->active = NULL;		gnt_widget_size_request(wid);		gnt_widget_get_size(wid, &width, &height);		gnt_screen_resize_widget(wid, width, height);		find_focusable_widget(box);	}}void gnt_box_set_fill(GntBox *box, gboolean fill){	box->fill = fill;}void gnt_box_move_focus(GntBox *box, int dir){	GntWidget *now;	if (box->active == NULL)	{		find_focusable_widget(box);		return;	}	now = box->active;	if (dir == 1)		find_next_focus(box);	else if (dir == -1)		find_prev_focus(box);	if (now && now != box->active)	{		gnt_widget_set_focus(now, FALSE);		gnt_widget_set_focus(box->active, TRUE);	}	if (GNT_WIDGET(box)->window)		gnt_widget_draw(GNT_WIDGET(box));}void gnt_box_give_focus_to_child(GntBox *box, GntWidget *widget){	GList *find = g_list_find(box->focus, widget);	gpointer now = box->active;	if (find)		box->active = widget;	if (now && now != box->active)	{		gnt_widget_set_focus(now, FALSE);		gnt_widget_set_focus(box->active, TRUE);	}	if (GNT_WIDGET(box)->window)		gnt_widget_draw(GNT_WIDGET(box));}

⌨️ 快捷键说明

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