📄 gntwidget.c
字号:
/* 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 + -