📄 gntbox.c
字号:
} 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 + -