static void gnt_box_draw(GntWidget *widget) { GntBox *box = GNT_BOX(widget); if (box->focus == NULL && widget->parent == NULL) g_list_foreach(box->list, add_to_focus, box); g_list_foreach(box->list, (GFunc)gnt_widget_draw, NULL); if (box->title && !GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_NO_BORDER)) { int pos, right; char *title = g_strdup(box->title); get_title_thingies(box, title, &pos, &right); if (gnt_widget_has_focus(widget)) wbkgdset(widget->window, '\0' | gnt_color_pair(GNT_COLOR_TITLE)); else wbkgdset(widget->window, '\0' | gnt_color_pair(GNT_COLOR_TITLE_D)); mvwaddch(widget->window, 0, pos-1, ACS_RTEE | gnt_color_pair(GNT_COLOR_NORMAL)); mvwaddstr(widget->window, 0, pos, title); mvwaddch(widget->window, 0, right, ACS_LTEE | gnt_color_pair(GNT_COLOR_NORMAL)); g_free(title); } gnt_box_sync_children(box); }
static void gnt_menu_draw(GntWidget *widget) { GntMenu *menu = GNT_MENU(widget); GList *iter; chtype type; guint i; if (menu->type == GNT_MENU_TOPLEVEL) { wbkgdset(widget->window, '\0' | gnt_color_pair(GNT_COLOR_HIGHLIGHT)); werase(widget->window); for (i = 0, iter = menu->list; iter; iter = iter->next, i++) { GntMenuItem *item = GNT_MENU_ITEM(iter->data); if (!gnt_menuitem_is_visible(item)) continue; type = ' '; if (item->callback || item->submenu) type |= gnt_color_pair(GNT_COLOR_HIGHLIGHT); else type |= gnt_color_pair(GNT_COLOR_DISABLED); if (i == menu->selected) type |= A_REVERSE; item->priv.x = getcurx(widget->window) + widget->priv.x; item->priv.y = getcury(widget->window) + widget->priv.y + 1; wbkgdset(widget->window, type); wprintw(widget->window, " %s ", C_(item->text)); } } else { org_draw(widget); } GNTDEBUG; }
static void gnt_combo_box_draw(GntWidget *widget) { GntComboBox *box = GNT_COMBO_BOX(widget); char *text = NULL, *s; GntColorType type; int len; if (box->dropdown && box->selected) text = gnt_tree_get_selection_text(GNT_TREE(box->dropdown)); if (text == NULL) text = g_strdup(""); if (gnt_widget_has_focus(widget)) type = GNT_COLOR_HIGHLIGHT; else type = GNT_COLOR_NORMAL; wbkgdset(widget->window, '\0' | gnt_color_pair(type)); s = (char*)gnt_util_onscreen_width_to_pointer(text, widget->priv.width - 4, &len); *s = '\0'; mvwaddstr(widget->window, 1, 1, C_(text)); whline(widget->window, ' ' | gnt_color_pair(type), widget->priv.width - 4 - len); mvwaddch(widget->window, 1, widget->priv.width - 3, ACS_VLINE | gnt_color_pair(GNT_COLOR_NORMAL)); mvwaddch(widget->window, 1, widget->priv.width - 2, ACS_DARROW | gnt_color_pair(GNT_COLOR_NORMAL)); wmove(widget->window, 1, 1); g_free(text); GNTDEBUG; }
static void gnt_entry_draw(GntWidget *widget) { GntEntry *entry = GNT_ENTRY(widget); int stop; gboolean focus; int curpos; if ((focus = gnt_widget_has_focus(widget))) wbkgdset(widget->window, '\0' | gnt_color_pair(GNT_COLOR_TEXT_NORMAL)); else wbkgdset(widget->window, '\0' | gnt_color_pair(GNT_COLOR_HIGHLIGHT_D)); if (entry->masked) { mvwhline(widget->window, 0, 0, gnt_ascii_only() ? '*' : ACS_BULLET, g_utf8_pointer_to_offset(entry->scroll, entry->end)); } else mvwprintw(widget->window, 0, 0, "%s", C_(entry->scroll)); stop = gnt_util_onscreen_width(entry->scroll, entry->end); if (stop < widget->priv.width) mvwhline(widget->window, 0, stop, ENTRY_CHAR, widget->priv.width - stop); curpos = gnt_util_onscreen_width(entry->scroll, entry->cursor); if (focus) mvwchgat(widget->window, 0, curpos, 1, A_REVERSE, GNT_COLOR_TEXT_NORMAL, NULL); wmove(widget->window, 0, curpos); GNTDEBUG; }
void gnt_init() { char *filename; const char *locale; if (channel) return; locale = setlocale(LC_ALL, ""); setup_io(); #ifdef NO_WIDECHAR ascii_only = TRUE; #else if (locale && (strstr(locale, "UTF") || strstr(locale, "utf"))) ascii_only = FALSE; else ascii_only = TRUE; #endif initscr(); typeahead(-1); noecho(); curs_set(0); gnt_init_keys(); gnt_init_styles(); filename = g_build_filename(g_get_home_dir(), ".gntrc", NULL); gnt_style_read_configure_file(filename); g_free(filename); gnt_init_colors(); wbkgdset(stdscr, '\0' | gnt_color_pair(GNT_COLOR_NORMAL)); refresh(); #ifdef ALL_MOUSE_EVENTS if ((mouse_enabled = gnt_style_get_bool(GNT_STYLE_MOUSE, FALSE))) mousemask(ALL_MOUSE_EVENTS | REPORT_MOUSE_POSITION, NULL); #endif wbkgdset(stdscr, '\0' | gnt_color_pair(GNT_COLOR_NORMAL)); werase(stdscr); wrefresh(stdscr); #ifdef SIGWINCH org_winch_handler = signal(SIGWINCH, sighandler); #endif signal(SIGCHLD, sighandler); signal(SIGINT, sighandler); signal(SIGPIPE, SIG_IGN); g_type_init(); init_wm(); clipboard = g_object_new(GNT_TYPE_CLIPBOARD, NULL); }
static void gnt_slider_draw(GntWidget *widget) { GntSlider *slider = GNT_SLIDER(widget); int attr = 0; int position, size = 0; if (slider->vertical) size = widget->priv.height; else size = widget->priv.width; if (gnt_widget_has_focus(widget)) attr |= GNT_COLOR_HIGHLIGHT; else attr |= GNT_COLOR_HIGHLIGHT_D; if (slider->max != slider->min) position = ((size - 1) * (slider->current - slider->min)) / (slider->max - slider->min); else position = 0; if (slider->vertical) { mvwvline(widget->window, size-position, 0, ACS_VLINE | gnt_color_pair(GNT_COLOR_NORMAL) | A_BOLD, position); mvwvline(widget->window, 0, 0, ACS_VLINE | gnt_color_pair(GNT_COLOR_NORMAL), size-position); } else { mvwhline(widget->window, 0, 0, ACS_HLINE | gnt_color_pair(GNT_COLOR_NORMAL) | A_BOLD, position); mvwhline(widget->window, 0, position, ACS_HLINE | gnt_color_pair(GNT_COLOR_NORMAL), size - position); } mvwaddch(widget->window, slider->vertical ? (size - position - 1) : 0, slider->vertical ? 0 : position, ACS_CKBOARD | gnt_color_pair(attr)); }
static void gnt_check_box_draw(GntWidget *widget) { GntCheckBox *cb = GNT_CHECK_BOX(widget); GntColorType type; gboolean focus = gnt_widget_has_focus(widget); if (focus) type = GNT_COLOR_HIGHLIGHT; else type = GNT_COLOR_NORMAL; wbkgdset(widget->window, '\0' | gnt_color_pair(type)); mvwaddch(widget->window, 0, 0, '['); mvwaddch(widget->window, 0, 1, (cb->checked ? 'X' : ' ') | (focus ? A_UNDERLINE : A_NORMAL)); mvwaddch(widget->window, 0, 2, ']'); wbkgdset(widget->window, '\0' | gnt_color_pair(GNT_COLOR_NORMAL)); mvwaddstr(widget->window, 0, 4, C_(GNT_BUTTON(cb)->priv->text)); (void)wmove(widget->window, 0, 1); GNTDEBUG; }
static void gnt_button_draw(GntWidget *widget) { GntButton *button = GNT_BUTTON(widget); GntColorType type; gboolean focus; if ((focus = gnt_widget_has_focus(widget))) type = GNT_COLOR_HIGHLIGHT; else type = GNT_COLOR_NORMAL; wbkgdset(widget->window, '\0' | gnt_color_pair(type)); mvwaddstr(widget->window, (small_button) ? 0 : 1, 2, button->priv->text); if (small_button) { type = GNT_COLOR_HIGHLIGHT; mvwchgat(widget->window, 0, 0, widget->priv.width, focus ? A_BOLD : A_REVERSE, type, NULL); } GNTDEBUG; }
static void gnt_text_view_draw(GntWidget *widget) { GntTextView *view = GNT_TEXT_VIEW(widget); int n; int i = 0; GList *lines; int rows, scrcol; int comp = 0; /* Used for top-aligned text */ gboolean has_scroll = !(view->flags & GNT_TEXT_VIEW_NO_SCROLL); wbkgd(widget->window, gnt_color_pair(GNT_COLOR_NORMAL)); werase(widget->window); n = g_list_length(view->list); if ((view->flags & GNT_TEXT_VIEW_TOP_ALIGN) && n < widget->priv.height) { GList *now = view->list; comp = widget->priv.height - n; view->list = g_list_nth_prev(view->list, comp); if (!view->list) { view->list = g_list_first(now); comp = widget->priv.height - g_list_length(view->list); } else { comp = 0; } } for (i = 0, lines = view->list; i < widget->priv.height && lines; i++, lines = lines->next) { GList *iter; GntTextLine *line = lines->data; wmove(widget->window, widget->priv.height - 1 - i - comp, 0); for (iter = line->segments; iter; iter = iter->next) { GntTextSegment *seg = iter->data; char *end = view->string->str + seg->end; char back = *end; chtype fl = seg->flags; *end = '\0'; if (select_start && select_start < view->string->str + seg->start && select_end > view->string->str + seg->end) { fl |= A_REVERSE; wattrset(widget->window, fl); wprintw(widget->window, "%s", C_(view->string->str + seg->start)); } else if (select_start && select_end && ((select_start >= view->string->str + seg->start && select_start <= view->string->str + seg->end) || (select_end <= view->string->str + seg->end && select_start <= view->string->str + seg->start))) { char *cur = view->string->str + seg->start; while (*cur != '\0') { gchar *last = g_utf8_next_char(cur); gchar *str; if (cur >= select_start && cur <= select_end) fl |= A_REVERSE; else fl = seg->flags; str = g_strndup(cur, last - cur); wattrset(widget->window, fl); waddstr(widget->window, C_(str)); g_free(str); cur = g_utf8_next_char(cur); } } else { wattrset(widget->window, fl); wprintw(widget->window, "%s", C_(view->string->str + seg->start)); } *end = back; } wattroff(widget->window, A_UNDERLINE | A_BLINK | A_REVERSE); whline(widget->window, ' ', widget->priv.width - line->length - has_scroll); } scrcol = widget->priv.width - 1; rows = widget->priv.height - 2; if (has_scroll && rows > 0) { int total = g_list_length(g_list_first(view->list)); int showing, position, up, down; showing = rows * rows / total + 1; showing = MIN(rows, showing); total -= rows; up = g_list_length(lines); down = total - up; position = (rows - showing) * up / MAX(1, up + down); position = MAX((lines != NULL), position); if (showing + position > rows) position = rows - showing; if (showing + position == rows && view->list && view->list->prev) position = MAX(1, rows - 1 - showing); else if (showing + position < rows && view->list && !view->list->prev) position = rows - showing; mvwvline(widget->window, position + 1, scrcol, ACS_CKBOARD | gnt_color_pair(GNT_COLOR_HIGHLIGHT_D), showing); } if (has_scroll) { mvwaddch(widget->window, 0, scrcol, (lines ? ACS_UARROW : ' ') | gnt_color_pair(GNT_COLOR_HIGHLIGHT_D)); mvwaddch(widget->window, widget->priv.height - 1, scrcol, ((view->list && view->list->prev) ? ACS_DARROW : ' ') | gnt_color_pair(GNT_COLOR_HIGHLIGHT_D)); } wmove(widget->window, 0, 0); }
static void gnt_progress_bar_draw (GntWidget *widget) { GntProgressBarPrivate *priv = GNT_PROGRESS_BAR_GET_PRIVATE (GNT_PROGRESS_BAR (widget)); gchar progress[8]; gint start, end, i, pos; int color; g_snprintf (progress, sizeof (progress), "%.1f%%", priv->fraction * 100); color = gnt_color_pair(GNT_COLOR_NORMAL); switch (priv->orientation) { case GNT_PROGRESS_LEFT_TO_RIGHT: case GNT_PROGRESS_RIGHT_TO_LEFT: start = (priv->orientation == GNT_PROGRESS_LEFT_TO_RIGHT ? 0 : (1.0 - priv->fraction) * widget->priv.width); end = (priv->orientation == GNT_PROGRESS_LEFT_TO_RIGHT ? widget->priv.width * priv->fraction : widget->priv.width); /* background */ for (i = 0; i < widget->priv.height; i++) mvwhline (widget->window, i, 0, ' ' | color, widget->priv.width); /* foreground */ for (i = 0; i < widget->priv.height; i++) mvwhline (widget->window, i, start, ACS_CKBOARD | color | A_REVERSE, end); /* text */ if (priv->show_value) { pos = widget->priv.width / 2 - strlen (progress) / 2; for (i = 0; i < progress[i]; i++, pos++) { wattrset (widget->window, color | ((pos < start || pos > end) ? A_NORMAL : A_REVERSE)); mvwprintw (widget->window, widget->priv.height / 2, pos, "%c", progress[i]); } wattrset (widget->window, color); } break; case GNT_PROGRESS_TOP_TO_BOTTOM: case GNT_PROGRESS_BOTTOM_TO_TOP: start = (priv->orientation == GNT_PROGRESS_TOP_TO_BOTTOM ? 0 : (1.0 - priv->fraction) * widget->priv.height); end = (priv->orientation == GNT_PROGRESS_TOP_TO_BOTTOM ? widget->priv.height * priv->fraction : widget->priv.height); /* background */ for (i = 0; i < widget->priv.width; i++) mvwvline (widget->window, 0, i, ' ' | color, widget->priv.height); /* foreground */ for (i = 0; i < widget->priv.width; i++) mvwvline (widget->window, start, i, ACS_CKBOARD | color | A_REVERSE, end); /* text */ if (priv->show_value) { pos = widget->priv.height / 2 - strlen (progress) / 2; for (i = 0; i < progress[i]; i++, pos++) { wattrset (widget->window, color | ((pos < start || pos > end) ? A_NORMAL : A_REVERSE)); mvwprintw (widget->window, pos, widget->priv.width / 2, "%c\n", progress[i]); } wattrset (widget->window, color); } break; default: g_assert_not_reached (); } }