static int sel_skin_button (WButton * button, int action) { int result; WListbox *skin_list; WDialog *skin_dlg; const gchar *skin_name; int lxx, lyy; unsigned int i; unsigned int pos = 1; (void) action; lxx = COLS / 2; lyy = (LINES - 13) / 2; skin_dlg = dlg_create (TRUE, lyy, lxx, 13, 24, dialog_colors, NULL, NULL, "[Appearance]", _("Skins"), DLG_COMPACT); skin_list = listbox_new (1, 1, 11, 22, FALSE, NULL); skin_name = "default"; listbox_add_item (skin_list, LISTBOX_APPEND_AT_END, 0, skin_name_to_label (skin_name), (void *) skin_name); if (strcmp (skin_name, current_skin_name) == 0) listbox_select_entry (skin_list, 0); for (i = 0; i < skin_names->len; i++) { skin_name = g_ptr_array_index (skin_names, i); if (strcmp (skin_name, "default") != 0) { listbox_add_item (skin_list, LISTBOX_APPEND_AT_END, 0, skin_name_to_label (skin_name), (void *) skin_name); if (strcmp (skin_name, current_skin_name) == 0) listbox_select_entry (skin_list, pos); pos++; } } add_widget (skin_dlg, skin_list); result = dlg_run (skin_dlg); if (result == B_ENTER) { Widget *w; gchar *skin_label; listbox_get_current (skin_list, &skin_label, (void **) &skin_name); g_free (current_skin_name); current_skin_name = g_strdup (skin_name); skin_apply (skin_name); w = dlg_find_by_id (WIDGET (button)->owner, skin_name_id); button_set_text (BUTTON (w), str_fit_to_term (skin_label, 20, J_LEFT_FIT)); } dlg_destroy (skin_dlg); return 0; }
static Dlg_head * init_chown (void) { int i; struct passwd *l_pass; struct group *l_grp; Dlg_head *ch_dlg; do_refresh (); end_chown = need_update = current_file = 0; single_set = (current_panel->marked < 2) ? 3 : 0; ch_dlg = create_dlg (0, 0, 18, 74, dialog_colors, chown_callback, "[Chown]", _(" Chown command "), DLG_CENTER | DLG_REVERSE); for (i = 0; i < BUTTONS - single_set; i++) add_widget (ch_dlg, button_new (BY + chown_but[i].y, BX + chown_but[i].x, chown_but[i].ret_cmd, chown_but[i].flags, _(chown_but[i].text), 0)); /* Add the widgets for the file information */ for (i = 0; i < LABELS; i++) { chown_label[i].l = label_new (chown_label[i].y, chown_label[i].x, ""); add_widget (ch_dlg, chown_label[i].l); } /* get new listboxes */ l_user = listbox_new (UY + 1, UX + 1, 19, 10, NULL); l_group = listbox_new (GY + 1, GX + 1, 19, 10, NULL); /* add fields for unknown names (numbers) */ listbox_add_item (l_user, 0, 0, _("<Unknown user>"), NULL); listbox_add_item (l_group, 0, 0, _("<Unknown group>"), NULL); /* get and put user names in the listbox */ setpwent (); while ((l_pass = getpwent ())) { listbox_add_item (l_user, LISTBOX_APPEND_SORTED, 0, l_pass->pw_name, NULL); } endpwent (); /* get and put group names in the listbox */ setgrent (); while ((l_grp = getgrent ())) { listbox_add_item (l_group, LISTBOX_APPEND_SORTED, 0, l_grp->gr_name, NULL); } endgrent (); /* add listboxes to the dialogs */ add_widget (ch_dlg, l_group); add_widget (ch_dlg, l_user); return ch_dlg; }
static void init_chown (void) { int i; struct passwd *l_pass; struct group *l_grp; do_refresh (); end_chown = need_update = current_file = 0; single_set = (cpanel->marked < 2) ? 3 : 0; ch_dlg = create_dlg (0, 0, 18, 74, dialog_colors, chown_callback, "[Chown]", "chown", DLG_CENTER); #define XTRACT(i) BY+chown_but[i].y, BX+chown_but[i].x, chown_but[i].ret_cmd, chown_but[i].flags, _(chown_but[i].text), 0, 0, NULL for (i = 0; i < BUTTONS-single_set; i++) add_widget (ch_dlg, button_new (XTRACT (i))); /* Add the widgets for the file information */ #define LX(i) chown_label [i].y, chown_label [i].x, "", NULL for (i = 0; i < LABELS; i++){ chown_label [i].l = label_new (LX (i)); add_widget (ch_dlg, chown_label [i].l); } /* get new listboxes */ l_user = listbox_new (UY + 1, UX + 1, 19, 10, 0, l_call, NULL); l_group = listbox_new (GY + 1, GX + 1, 19, 10, 0, l_call, NULL); listbox_add_item (l_user, 0, 0, _("<Unknown user>"), NULL); /* add fields for unknown names (numbers) */ listbox_add_item (l_group, 0, 0, _("<Unknown group>"), NULL); setpwent (); /* get and put user names in the listbox */ while ((l_pass = getpwent ())) { listbox_add_item (l_user, 0, 0, l_pass->pw_name, NULL); } endpwent (); setgrent (); /* get and put group names in the listbox */ while ((l_grp = getgrent ())) { listbox_add_item (l_group, 0, 0, l_grp->gr_name, NULL); } endgrent (); add_widget (ch_dlg, l_group); add_widget (ch_dlg, l_user); /* add listboxes to the dialogs */ }
static char * select_new_item (void) { /* NOTE: The following array of possible items must match the formats array in screen.c. Better approach might be to make the formats array global */ char *possible_items[] = { "name", "size", "type", "mtime", "perm", "mode", "|", "nlink", "owner", "group", "atime", "ctime", "space", "mark", "inode", NULL }; int i; Listbox *mylistbox; mylistbox = create_listbox_window (12, 20, " Add listing format item ", listmode_section); for (i = 0; possible_items[i]; i++) { listbox_add_item (mylistbox->list, 0, 0, possible_items[i], NULL); } i = run_listbox (mylistbox); if (i >= 0) return possible_items[i]; else return NULL; }
static int badd_cback (int action) { char *s = select_new_item (); if (s) { listbox_add_item (l_listmode, 0, 0, s, NULL); } return 0; }
static int badd_cback (int action) { char *s = select_new_item (); if (s) { listbox_add_item (l_listmode, LISTBOX_APPEND_AT_END, 0, s, NULL, FALSE); g_free (s); } return 0; }
static void edit_window_list (const Dlg_head * h) { const size_t offset = 2; /* skip menu and buttonbar */ const size_t dlg_num = g_list_length (h->widgets) - offset; int lines, cols; Listbox *listbox; GList *w; int i = 0; int rv; lines = min ((size_t) (LINES * 2 / 3), dlg_num); cols = COLS * 2 / 3; listbox = create_listbox_window (lines, cols, _("Open files"), "[Open files]"); for (w = h->widgets; w != NULL; w = g_list_next (w)) if (edit_widget_is_editor ((Widget *) w->data)) { WEdit *e = (WEdit *) w->data; char *fname; if (e->filename_vpath == NULL) fname = g_strdup_printf ("%c [%s]", e->modified ? '*' : ' ', _("NoName")); else { char *fname2; fname2 = vfs_path_to_str (e->filename_vpath); fname = g_strdup_printf ("%c%s", e->modified ? '*' : ' ', fname2); g_free (fname2); } listbox_add_item (listbox->list, LISTBOX_APPEND_AT_END, get_hotkey (i++), str_term_trim (fname, listbox->list->widget.cols - 2), NULL); g_free (fname); } rv = g_list_position (h->widgets, h->current) - offset; listbox_select_entry (listbox->list, rv); rv = run_listbox (listbox); if (rv >= 0) { w = g_list_nth (h->widgets, rv + offset); dlg_set_top_widget (w->data); } }
void dialog_switch_list (void) { const size_t dlg_num = g_list_length (mc_dialogs); int lines, cols; Listbox *listbox; GList *h; int i = 0; int rv; if (mc_global.widget.midnight_shutdown || mc_current == NULL) return; lines = min ((size_t) (LINES * 2 / 3), dlg_num); cols = COLS * 2 / 3; listbox = create_listbox_window (lines, cols, _("Screens"), "[Screen selector]"); for (h = mc_dialogs; h != NULL; h = g_list_next (h)) { Dlg_head *dlg; char *title; dlg = (Dlg_head *) h->data; if ((dlg != NULL) && (dlg->get_title != NULL)) title = dlg->get_title (dlg, listbox->list->widget.cols - 2); /* FIXME! */ else title = g_strdup (""); listbox_add_item (listbox->list, LISTBOX_APPEND_BEFORE, get_hotkey (i++), title, NULL); g_free (title); } listbox_select_entry (listbox->list, dlg_num - 1 - g_list_position (mc_dialogs, mc_current)); rv = run_listbox (listbox); if (rv >= 0) { h = g_list_nth (mc_dialogs, dlg_num - 1 - rv); dialog_switch_goto (h); } }
static void jobs_fill_listbox (WListbox * list) { static const char *state_str[2] = { "", "" }; TaskList *tl; if (state_str[0] == '\0') { state_str[0] = _("Running"); state_str[1] = _("Stopped"); } for (tl = task_list; tl != NULL; tl = tl->next) { char *s; s = g_strconcat (state_str[tl->state], " ", tl->info, (char *) NULL); listbox_add_item (list, LISTBOX_APPEND_AT_END, 0, s, (void *) tl); g_free (s); } }
char *listmode_edit (char *oldlistformat) { char *newformat = NULL; char *s; s = strdup (oldlistformat); init_listmode (s); free (s); while (newformat == NULL) { /* display file info */ attrset (SELECTED_COLOR); run_dlg (listmode_dlg); switch (listmode_dlg->ret_value) { case B_CANCEL: newformat = strdup (oldlistformat); break; case B_ADD: s = select_new_item (); if (s) listbox_add_item (l_listmode, 0, 0, s, NULL); break; case B_REMOVE: listbox_remove_current (l_listmode, 0); break; case B_ENTER: newformat = collect_new_format (); break; } } listmode_done (); return newformat; }
static void jobs_fill_listbox (void) { static const char *state_str[2]; TaskList *tl = task_list; if (!state_str[0]) { state_str[0] = _("Running"); state_str[1] = _("Stopped"); } while (tl) { char *s; s = g_strconcat (state_str[tl->state], " ", tl->info, (char *) NULL); listbox_add_item (bg_list, LISTBOX_APPEND_AT_END, 0, s, (void *) tl); g_free (s); tl = tl->next; } }
static char * select_new_item (void) { char **possible_items; char *ret = NULL; int i; Listbox *mylistbox; possible_items = panel_get_user_possible_fields (NULL); mylistbox = create_listbox_window (20, 12, "Add listing format item", listmode_section); for (i = 0; possible_items[i]; i++) { listbox_add_item (mylistbox->list, LISTBOX_APPEND_AT_END, 0, possible_items[i], NULL); } i = run_listbox (mylistbox); if (i >= 0) ret = g_strdup (possible_items[i]); g_strfreev (possible_items); return ret; }
static void edit_window_list (const WDialog * h) { const size_t dlg_num = g_list_length (h->widgets) - 2; /* 2 = skip menu and buttonbar */ int lines, cols; Listbox *listbox; GList *w; WEdit *selected; int i = 0; lines = MIN ((size_t) (LINES * 2 / 3), dlg_num); cols = COLS * 2 / 3; listbox = create_listbox_window (lines, cols, _("Open files"), "[Open files]"); for (w = h->widgets; w != NULL; w = g_list_next (w)) if (edit_widget_is_editor (CONST_WIDGET (w->data))) { WEdit *e = (WEdit *) w->data; char *fname; if (e->filename_vpath == NULL) fname = g_strdup_printf ("%c [%s]", e->modified ? '*' : ' ', _("NoName")); else fname = g_strdup_printf ("%c%s", e->modified ? '*' : ' ', vfs_path_as_str (e->filename_vpath)); listbox_add_item (listbox->list, LISTBOX_APPEND_AT_END, get_hotkey (i++), str_term_trim (fname, WIDGET (listbox->list)->cols - 2), e, FALSE); g_free (fname); } selected = run_listbox_with_data (listbox, h->current->data); if (selected != NULL) widget_select (WIDGET (selected)); }
static int complete_engine (WInput * in, int what_to_do) { if (in->completions != NULL && str_offset_to_pos (in->buffer, in->point) != end) input_free_completions (in); if (in->completions == NULL) { char *s; end = str_offset_to_pos (in->buffer, in->point); s = in->buffer; if (in->point != 0) { /* get symbol before in->point */ size_t i; for (i = in->point - 1; i > 0; i--) str_next_char (&s); } for (; s >= in->buffer; str_prev_char (&s)) { start = s - in->buffer; if (strchr (" \t;|<>", *s) != NULL) break; } if (start < end) { str_next_char (&s); start = s - in->buffer; } in->completions = try_complete (in->buffer, &start, &end, in->completion_flags); } if (in->completions != NULL) { if (what_to_do & DO_INSERTION || ((what_to_do & DO_QUERY) && !in->completions[1])) { char *lc_complete = in->completions[0]; if (insert_text (in, lc_complete, strlen (lc_complete))) { if (in->completions[1]) tty_beep (); else input_free_completions (in); } else tty_beep (); } if ((what_to_do & DO_QUERY) && in->completions && in->completions[1]) { int maxlen = 0, i, count = 0; int x, y, w, h; int start_x, start_y; char **p, *q; Dlg_head *query_dlg; WListbox *query_list; for (p = in->completions + 1; *p != NULL; count++, p++) { i = str_term_width1 (*p); if (i > maxlen) maxlen = i; } start_x = in->widget.x; start_y = in->widget.y; if (start_y - 2 >= count) { y = start_y - 2 - count; h = 2 + count; } else { if (start_y >= LINES - start_y - 1) { y = 0; h = start_y; } else { y = start_y + 1; h = LINES - start_y - 1; } } x = start - in->term_first_shown - 2 + start_x; w = maxlen + 4; if (x + w > COLS) x = COLS - w; if (x < 0) x = 0; if (x + w > COLS) w = COLS; input = in; min_end = end; query_height = h; query_width = w; query_dlg = create_dlg (TRUE, y, x, query_height, query_width, dialog_colors, query_callback, NULL, "[Completion]", NULL, DLG_COMPACT); query_list = listbox_new (1, 1, h - 2, w - 2, FALSE, NULL); add_widget (query_dlg, query_list); for (p = in->completions + 1; *p; p++) listbox_add_item (query_list, LISTBOX_APPEND_AT_END, 0, *p, NULL); run_dlg (query_dlg); q = NULL; if (query_dlg->ret_value == B_ENTER) { listbox_get_current (query_list, &q, NULL); if (q) insert_text (in, q, strlen (q)); } if (q || end != min_end) input_free_completions (in); i = query_dlg->ret_value; /* B_USER if user wants to start over again */ destroy_dlg (query_dlg); if (i == B_USER) return 1; } } else tty_beep (); return 0; }
/* Returns 1 if the user would like to see us again */ static int complete_engine (WInput *in, int what_to_do) { if (in->completions && in->point != end) free_completions (in); if (!in->completions){ end = in->point; for (start = end ? end - 1 : 0; start > -1; start--) if (strchr (" \t;|<>", in->buffer [start])) break; if (start < end) start++; in->completions = try_complete (in->buffer, &start, &end, in->completion_flags); } if (in->completions){ if (what_to_do & DO_INSERTION || ((what_to_do & DO_QUERY) && !in->completions[1])) { if (insert_text (in, in->completions [0], strlen (in->completions [0]))){ if (in->completions [1]) beep (); else free_completions (in); } else beep (); } if ((what_to_do & DO_QUERY) && in->completions && in->completions [1]) { int maxlen = 0, i, count = 0; int x, y, w, h; int start_x, start_y; char **p, *q; Dlg_head *query_dlg; WListbox *query_list; for (p=in->completions + 1; *p; count++, p++) if ((i = strlen (*p)) > maxlen) maxlen = i; start_x = in->widget.x; start_y = in->widget.y; if (start_y - 2 >= count) { y = start_y - 2 - count; h = 2 + count; } else { if (start_y >= LINES - start_y - 1) { y = 0; h = start_y; } else { y = start_y + 1; h = LINES - start_y - 1; } } x = start - in->first_shown - 2 + start_x; w = maxlen + 4; if (x + w > COLS) x = COLS - w; if (x < 0) x = 0; if (x + w > COLS) w = COLS; input = in; min_end = end; query_height = h; query_width = w; query_dlg = create_dlg (y, x, query_height, query_width, dialog_colors, query_callback, "[Completion]", NULL, DLG_COMPACT); query_list = listbox_new (1, 1, w - 2, h - 2, NULL); add_widget (query_dlg, query_list); for (p = in->completions + 1; *p; p++) listbox_add_item (query_list, 0, 0, *p, NULL); run_dlg (query_dlg); q = NULL; if (query_dlg->ret_value == B_ENTER){ listbox_get_current (query_list, &q, NULL); if (q) insert_text (in, q, strlen (q)); } if (q || end != min_end) free_completions (in); i = query_dlg->ret_value; /* B_USER if user wants to start over again */ destroy_dlg (query_dlg); if (i == B_USER) return 1; } } else beep (); return 0; }
void editcmd_dialog_select_definition_show (WEdit * edit, char *match_expr, int max_len, int word_len, etags_hash_t * def_hash, int num_lines) { int start_x, start_y, offset, i; char *curr = NULL; etags_hash_t *curr_def = NULL; WDialog *def_dlg; WListbox *def_list; int def_dlg_h; /* dialog height */ int def_dlg_w; /* dialog width */ (void) word_len; /* calculate the dialog metrics */ def_dlg_h = num_lines + 2; def_dlg_w = max_len + 4; start_x = edit->curs_col + edit->start_col - (def_dlg_w / 2) + EDIT_TEXT_HORIZONTAL_OFFSET + (edit->fullscreen ? 0 : 1) + option_line_state_width; start_y = edit->curs_row + EDIT_TEXT_VERTICAL_OFFSET + (edit->fullscreen ? 0 : 1) + 1; if (start_x < 0) start_x = 0; if (def_dlg_w > COLS) def_dlg_w = COLS; if (def_dlg_h > LINES - 2) def_dlg_h = LINES - 2; offset = start_x + def_dlg_w - COLS; if (offset > 0) start_x -= offset; offset = start_y + def_dlg_h - LINES; if (offset > 0) start_y -= (offset + 1); /* create the dialog */ def_dlg = dlg_create (TRUE, start_y, start_x, def_dlg_h, def_dlg_w, WPOS_KEEP_DEFAULT, TRUE, dialog_colors, NULL, NULL, "[Definitions]", match_expr); /* create the listbox */ def_list = listbox_new (1, 1, def_dlg_h - 2, def_dlg_w - 2, FALSE, NULL); /* add the dialog */ add_widget (def_dlg, def_list); /* fill the listbox with the completions */ for (i = 0; i < num_lines; i++) { char *label_def; label_def = g_strdup_printf ("%s -> %s:%ld", def_hash[i].short_define, def_hash[i].filename, def_hash[i].line); listbox_add_item (def_list, LISTBOX_APPEND_AT_END, 0, label_def, &def_hash[i], FALSE); g_free (label_def); } /* pop up the dialog and apply the chosen completion */ if (dlg_run (def_dlg) == B_ENTER) { char *tmp_curr_def = (char *) curr_def; int do_moveto = 0; listbox_get_current (def_list, &curr, (void **) &tmp_curr_def); curr_def = (etags_hash_t *) tmp_curr_def; if (edit->modified) { if (!edit_query_dialog2 (_("Warning"), _("Current text was modified without a file save.\n" "Continue discards these changes."), _("C&ontinue"), _("&Cancel"))) { edit->force |= REDRAW_COMPLETELY; do_moveto = 1; } } else { do_moveto = 1; } if (curr && do_moveto) { if (edit_stack_iterator + 1 < MAX_HISTORY_MOVETO) { vfs_path_free (edit_history_moveto[edit_stack_iterator].filename_vpath); if (edit->dir_vpath != NULL) { edit_history_moveto[edit_stack_iterator].filename_vpath = vfs_path_append_vpath_new (edit->dir_vpath, edit->filename_vpath, NULL); } else { edit_history_moveto[edit_stack_iterator].filename_vpath = vfs_path_clone (edit->filename_vpath); } edit_history_moveto[edit_stack_iterator].line = edit->start_line + edit->curs_row + 1; edit_stack_iterator++; vfs_path_free (edit_history_moveto[edit_stack_iterator].filename_vpath); edit_history_moveto[edit_stack_iterator].filename_vpath = vfs_path_from_str ((char *) curr_def->fullpath); edit_history_moveto[edit_stack_iterator].line = curr_def->line; edit_reload_line (edit, edit_history_moveto[edit_stack_iterator].filename_vpath, edit_history_moveto[edit_stack_iterator].line); } } } /* clear definition hash */ for (i = 0; i < MAX_DEFINITIONS; i++) { g_free (def_hash[i].filename); } /* destroy dialog before return */ dlg_destroy (def_dlg); }
char * editcmd_dialog_completion_show (const WEdit * edit, int max_len, GString ** compl, int num_compl) { const Widget *we = CONST_WIDGET (edit); int start_x, start_y, offset, i; char *curr = NULL; WDialog *compl_dlg; WListbox *compl_list; int compl_dlg_h; /* completion dialog height */ int compl_dlg_w; /* completion dialog width */ /* calculate the dialog metrics */ compl_dlg_h = num_compl + 2; compl_dlg_w = max_len + 4; start_x = we->x + edit->curs_col + edit->start_col + EDIT_TEXT_HORIZONTAL_OFFSET + (edit->fullscreen ? 0 : 1) + option_line_state_width; start_y = we->y + edit->curs_row + EDIT_TEXT_VERTICAL_OFFSET + (edit->fullscreen ? 0 : 1) + 1; if (start_x < 0) start_x = 0; if (start_x < we->x + 1) start_x = we->x + 1 + option_line_state_width; if (compl_dlg_w > COLS) compl_dlg_w = COLS; if (compl_dlg_h > LINES - 2) compl_dlg_h = LINES - 2; offset = start_x + compl_dlg_w - COLS; if (offset > 0) start_x -= offset; offset = start_y + compl_dlg_h - LINES; if (offset > 0) start_y -= offset; /* create the dialog */ compl_dlg = dlg_create (TRUE, start_y, start_x, compl_dlg_h, compl_dlg_w, WPOS_KEEP_DEFAULT, TRUE, dialog_colors, NULL, NULL, "[Completion]", NULL); /* create the listbox */ compl_list = listbox_new (1, 1, compl_dlg_h - 2, compl_dlg_w - 2, FALSE, NULL); /* add the dialog */ add_widget (compl_dlg, compl_list); /* fill the listbox with the completions */ for (i = num_compl - 1; i >= 0; i--) /* reverse order */ listbox_add_item (compl_list, LISTBOX_APPEND_AT_END, 0, (char *) compl[i]->str, NULL, FALSE); /* pop up the dialog and apply the chosen completion */ if (dlg_run (compl_dlg) == B_ENTER) { listbox_get_current (compl_list, &curr, NULL); curr = g_strdup (curr); } /* destroy dialog before return */ dlg_destroy (compl_dlg); return curr; }
static void do_enter_key (WDialog * h, int f_pos) { WListbox *chl_list; struct passwd *chl_pass; struct group *chl_grp; int fe; gboolean chl_end, is_owner; do { int result; WDialog *chl_dlg; const char *title; int lxx, lyy, b_pos; is_owner = (f_pos == 3); title = is_owner ? _("owner") : _("group"); lxx = (COLS - 74) / 2 + (is_owner ? 35 : 53); lyy = (LINES - 13) / 2; chl_end = FALSE; chl_dlg = dlg_create (TRUE, lyy, lxx, 13, 17, WPOS_KEEP_DEFAULT, TRUE, dialog_colors, chl_callback, NULL, "[Advanced Chown]", title); /* get new listboxes */ chl_list = listbox_new (1, 1, 11, 15, FALSE, NULL); listbox_add_item (chl_list, LISTBOX_APPEND_AT_END, 0, "<Unknown>", NULL, FALSE); if (is_owner) { /* get and put user names in the listbox */ setpwent (); while ((chl_pass = getpwent ()) != NULL) listbox_add_item (chl_list, LISTBOX_APPEND_SORTED, 0, chl_pass->pw_name, NULL, FALSE); endpwent (); fe = listbox_search_text (chl_list, get_owner (sf_stat->st_uid)); } else { /* get and put group names in the listbox */ setgrent (); while ((chl_grp = getgrent ()) != NULL) listbox_add_item (chl_list, LISTBOX_APPEND_SORTED, 0, chl_grp->gr_name, NULL, FALSE); endgrent (); fe = listbox_search_text (chl_list, get_group (sf_stat->st_gid)); } listbox_select_entry (chl_list, fe); b_pos = chl_list->pos; add_widget (chl_dlg, chl_list); result = dlg_run (chl_dlg); if (result != B_CANCEL) { if (b_pos != chl_list->pos) { gboolean ok = FALSE; char *text; listbox_get_current (chl_list, &text, NULL); if (is_owner) { chl_pass = getpwnam (text); if (chl_pass != NULL) { ok = TRUE; sf_stat->st_uid = chl_pass->pw_uid; } } else { chl_grp = getgrnam (text); if (chl_grp != NULL) { sf_stat->st_gid = chl_grp->gr_gid; ok = TRUE; } } if (ok) { ch_flags[f_pos + 6] = '+'; update_ownership (); } dlg_focus (h); if (ok) print_flags (); } if (result == KEY_LEFT) { if (!is_owner) chl_end = TRUE; dlg_one_up (ch_dlg); f_pos--; } else if (result == KEY_RIGHT) { if (is_owner) chl_end = TRUE; dlg_one_down (ch_dlg); f_pos++; } } /* Here we used to redraw the window */ dlg_destroy (chl_dlg); } while (chl_end); }
/* let the user select its preferred completion */ void editcmd_dialog_completion_show (WEdit * edit, int max_len, int word_len, struct selection *compl, int num_compl) { int start_x, start_y, offset, i; char *curr = NULL; Dlg_head *compl_dlg; WListbox *compl_list; int compl_dlg_h; /* completion dialog height */ int compl_dlg_w; /* completion dialog width */ /* calculate the dialog metrics */ compl_dlg_h = num_compl + 2; compl_dlg_w = max_len + 4; start_x = edit->curs_col + edit->start_col - (compl_dlg_w / 2) + EDIT_TEXT_HORIZONTAL_OFFSET + option_line_state_width; start_y = edit->curs_row + EDIT_TEXT_VERTICAL_OFFSET + 1; if (start_x < 0) start_x = 0; if (compl_dlg_w > COLS) compl_dlg_w = COLS; if (compl_dlg_h > LINES - 2) compl_dlg_h = LINES - 2; offset = start_x + compl_dlg_w - COLS; if (offset > 0) start_x -= offset; offset = start_y + compl_dlg_h - LINES; if (offset > 0) start_y -= (offset + 1); /* create the dialog */ compl_dlg = create_dlg (start_y, start_x, compl_dlg_h, compl_dlg_w, dialog_colors, NULL, "[Completion]", NULL, DLG_COMPACT); /* create the listbox */ compl_list = listbox_new (1, 1, compl_dlg_h - 2, compl_dlg_w - 2, NULL); /* add the dialog */ add_widget (compl_dlg, compl_list); /* fill the listbox with the completions */ for (i = num_compl - 1; i >= 0; i--) /* reverse order */ listbox_add_item (compl_list, LISTBOX_APPEND_AT_END, 0, (char *) compl[i].text, NULL); /* pop up the dialog and apply the choosen completion */ if (run_dlg (compl_dlg) == B_ENTER) { listbox_get_current (compl_list, &curr, NULL); if (curr) { #ifdef HAVE_CHARSET GString *temp, *temp2; temp = g_string_new(""); for (curr += word_len; *curr; curr++) g_string_append_c(temp, *curr); temp2 = str_convert_to_input (temp->str); if (temp2 && temp2->len){ g_string_free(temp, TRUE); temp = temp2; } else g_string_free(temp2, TRUE); for (curr = temp->str; *curr; curr++) edit_insert (edit, *curr); g_string_free(temp, TRUE); #else for (curr += word_len; *curr; curr++) edit_insert (edit, *curr); #endif } } /* destroy dialog before return */ destroy_dlg (compl_dlg); }
static void init_panelize (void) { struct { int ret_cmd; button_flags_t flags; const char *text; } panelize_but[] = { /* *INDENT-OFF* */ { B_ENTER, DEFPUSH_BUTTON, N_("Pane&lize") }, { B_REMOVE, NORMAL_BUTTON, N_("&Remove") }, { B_ADD, NORMAL_BUTTON, N_("&Add new") }, { B_CANCEL, NORMAL_BUTTON, N_("&Cancel") } /* *INDENT-ON* */ }; size_t i; int blen; int panelize_cols; struct panelize *current; int x, y; last_listitem = 0; do_refresh (); i = G_N_ELEMENTS (panelize_but); blen = i - 1; /* gaps between buttons */ while (i-- != 0) { #ifdef ENABLE_NLS panelize_but[i].text = _(panelize_but[i].text); #endif blen += str_term_width1 (panelize_but[i].text) + 3 + 1; if (panelize_but[i].flags == DEFPUSH_BUTTON) blen += 2; } panelize_cols = COLS - 6; panelize_cols = max (panelize_cols, blen + 4); panelize_dlg = dlg_create (TRUE, 0, 0, 20, panelize_cols, dialog_colors, panelize_callback, NULL, "[External panelize]", _("External panelize"), DLG_CENTER); /* add listbox to the dialogs */ y = UY; add_widget (panelize_dlg, groupbox_new (y++, UX, 12, panelize_cols - UX * 2, "")); l_panelize = listbox_new (y, UX + 1, 10, panelize_cols - UX * 2 - 2, FALSE, NULL); for (current = panelize; current != NULL; current = current->next) listbox_add_item (l_panelize, LISTBOX_APPEND_AT_END, 0, current->label, current); listbox_select_entry (l_panelize, listbox_search_text (l_panelize, _("Other command"))); add_widget (panelize_dlg, l_panelize); y += WIDGET (l_panelize)->lines + 1; add_widget (panelize_dlg, label_new (y++, UX, _("Command"))); pname = input_new (y++, UX, input_colors, panelize_cols - UX * 2, "", "in", INPUT_COMPLETE_FILENAMES | INPUT_COMPLETE_HOSTNAMES | INPUT_COMPLETE_COMMANDS | INPUT_COMPLETE_VARIABLES | INPUT_COMPLETE_USERNAMES | INPUT_COMPLETE_CD | INPUT_COMPLETE_SHELL_ESC); add_widget (panelize_dlg, pname); add_widget (panelize_dlg, hline_new (y++, -1, -1)); x = (panelize_cols - blen) / 2; for (i = 0; i < G_N_ELEMENTS (panelize_but); i++) { WButton *b; b = button_new (y, x, panelize_but[i].ret_cmd, panelize_but[i].flags, panelize_but[i].text, NULL); add_widget (panelize_dlg, b); x += button_get_len (b) + 1; } dlg_select_widget (l_panelize); }
static void init_listmode (char *oldlistformat) { int i; char *s; int format_width = 0; int format_columns = 0; do_refresh (); listmode_dlg = create_dlg (0, 0, 22, 74, dialog_colors, listmode_callback, listmode_section, "listmode", DLG_CENTER); x_set_dialog_title (listmode_dlg, "Listing format edit"); #define XTRACT(i) BY+listmode_but[i].y, BX+listmode_but[i].x, listmode_but[i].ret_cmd, listmode_but[i].flags, listmode_but[i].text, 0, 0, NULL for (i = 0; i < BUTTONS; i++) add_widgetl (listmode_dlg, button_new (XTRACT (i)), (i == BUTTONS - 1) ? XV_WLAY_CENTERROW : XV_WLAY_RIGHTOF); /* We add the labels. */ for (i = 0; i < LABELS; i++){ pname = label_new (listmode_text [i].y, listmode_text [i].x, listmode_text [i].text, NULL); add_widget (listmode_dlg, pname); } add_widget (listmode_dlg, button_new (UY+13, UX+37, B_MINUS, NORMAL_BUTTON, "&-", bminus_cback, 0, NULL)); add_widget (listmode_dlg, button_new (UY+13, UX+34, B_PLUS, NORMAL_BUTTON, "&+", bplus_cback, 0, NULL)); radio_itemwidth = radio_new (UY+9, UX+22, 3, s_itemwidth, 1, NULL); add_widget (listmode_dlg, radio_itemwidth); radio_itemwidth = 0; radio_justify = radio_new (UY+5, UX+22, 3, s_justify, 1, NULL); add_widget (listmode_dlg, radio_justify); radio_justify->sel = 1; /* get new listbox */ l_listmode = listbox_new (UY + 5, UX + 1, 16, 9, 0, l_call, NULL); if (strncmp (oldlistformat, "full ", 5) == 0){ format_width = 1; oldlistformat += 5; } if (strncmp (oldlistformat, "half ", 5) == 0){ oldlistformat += 5; } if (strncmp (oldlistformat, "2 ", 2) == 0){ format_columns = 1; oldlistformat += 2; } if (strncmp (oldlistformat, "1 ", 2) == 0){ oldlistformat += 2; } s = strtok (oldlistformat, ","); while (s){ listbox_add_item (l_listmode, 0, 0, s, NULL); s = strtok (NULL, ","); } /* add listbox to the dialogs */ add_widgetl (listmode_dlg, l_listmode, XV_WLAY_EXTENDWIDTH); radio_columns = radio_new (UY+1, UX+32, 2, s_columns, 1, NULL); add_widget (listmode_dlg, radio_columns); radio_columns->sel = format_columns; radio_genwidth = radio_new (UY+1, UX+2, 2, s_genwidth, 1, NULL); add_widget (listmode_dlg, radio_genwidth); radio_genwidth->sel = format_width; }
static WDialog * init_listmode (char *oldlistformat) { int i; char *s; int format_width = 0; int format_columns = 0; WDialog *listmode_dlg; static struct listmode_label listmode_labels[] = { {UY + 13, UX + 22, "Item width:"} }; static struct listmode_button listmode_but[] = { {B_CANCEL, NORMAL_BUTTON, BY, BX + 53, "&Cancel", NULL}, {B_ADD, NORMAL_BUTTON, BY, BX + 22, "&Add item", badd_cback}, {B_REMOVE, NORMAL_BUTTON, BY, BX + 10, "&Remove", bremove_cback}, {B_ENTER, DEFPUSH_BUTTON, BY, BX, "&OK", NULL}, {B_PLUS, NARROW_BUTTON, UY + 13, UX + 37, "&+", bplus_cback}, {B_MINUS, NARROW_BUTTON, UY + 13, UX + 34, "&-", bminus_cback}, }; do_refresh (); listmode_dlg = dlg_create (TRUE, 0, 0, 22, 74, dialog_colors, NULL, NULL, listmode_section, "Listing format edit", DLG_CENTER | DLG_REVERSE); add_widget (listmode_dlg, groupbox_new (UY, UX, 4, 63, "General options")); add_widget (listmode_dlg, groupbox_new (UY + 4, UX, 11, 18, "Items")); add_widget (listmode_dlg, groupbox_new (UY + 4, UX + 20, 11, 43, "Item options")); for (i = 0; i < sizeof (listmode_but) / sizeof (struct listmode_button); i++) add_widget (listmode_dlg, button_new (listmode_but[i].y, listmode_but[i].x, listmode_but[i].ret_cmd, listmode_but[i].flags, listmode_but[i].text, listmode_but[i].callback)); /* We add the labels. */ for (i = 0; i < sizeof (listmode_labels) / sizeof (struct listmode_label); i++) { pname = label_new (listmode_labels[i].y, listmode_labels[i].x, listmode_labels[i].text); add_widget (listmode_dlg, pname); } radio_itemwidth = radio_new (UY + 9, UX + 22, 3, s_itemwidth); add_widget (listmode_dlg, radio_itemwidth); radio_itemwidth = 0; radio_justify = radio_new (UY + 5, UX + 22, 3, s_justify); add_widget (listmode_dlg, radio_justify); radio_justify->sel = 1; /* get new listbox */ l_listmode = listbox_new (UY + 5, UX + 1, 9, 16, FALSE, NULL); if (strncmp (oldlistformat, "full ", 5) == 0) { format_width = 1; oldlistformat += 5; } if (strncmp (oldlistformat, "half ", 5) == 0) { oldlistformat += 5; } if (strncmp (oldlistformat, "2 ", 2) == 0) { format_columns = 1; oldlistformat += 2; } if (strncmp (oldlistformat, "1 ", 2) == 0) { oldlistformat += 2; } s = strtok (oldlistformat, ","); while (s) { listbox_add_item (l_listmode, LISTBOX_APPEND_AT_END, 0, s, NULL, FALSE); s = strtok (NULL, ","); } /* add listbox to the dialogs */ add_widget (listmode_dlg, l_listmode); radio_columns = radio_new (UY + 1, UX + 32, 2, s_columns); add_widget (listmode_dlg, radio_columns); radio_columns->sel = format_columns; radio_genwidth = radio_new (UY + 1, UX + 2, 2, s_genwidth); add_widget (listmode_dlg, radio_genwidth); radio_genwidth->sel = format_width; return listmode_dlg; }
static void init_panelize (void) { int i, panelize_cols = COLS - 6; struct panelize *current = panelize; #ifdef ENABLE_NLS static int i18n_flag = 0; static int maxlen = 0; if (!i18n_flag) { i = sizeof (panelize_but) / sizeof (panelize_but[0]); while (i--) { panelize_but[i].text = _(panelize_but[i].text); maxlen += str_term_width1 (panelize_but[i].text) + 5; } maxlen += 10; i18n_flag = 1; } panelize_cols = max (panelize_cols, maxlen); panelize_but[2].x = panelize_but[3].x + str_term_width1 (panelize_but[3].text) + 7; panelize_but[1].x = panelize_but[2].x + str_term_width1 (panelize_but[2].text) + 5; panelize_but[0].x = panelize_cols - str_term_width1 (panelize_but[0].text) - 8 - BX; #endif /* ENABLE_NLS */ last_listitem = 0; do_refresh (); panelize_dlg = create_dlg (TRUE, 0, 0, 22, panelize_cols, dialog_colors, panelize_callback, "[External panelize]", _("External panelize"), DLG_CENTER | DLG_REVERSE); for (i = 0; i < BUTTONS; i++) add_widget (panelize_dlg, button_new (BY + panelize_but[i].y, BX + panelize_but[i].x, panelize_but[i].ret_cmd, panelize_but[i].flags, panelize_but[i].text, 0)); pname = input_new (UY + 14, UX, input_get_default_colors (), panelize_dlg->cols - 10, "", "in", INPUT_COMPLETE_DEFAULT); add_widget (panelize_dlg, pname); add_widget (panelize_dlg, label_new (UY + 13, UX, _("Command"))); /* get new listbox */ l_panelize = listbox_new (UY + 1, UX + 1, 10, panelize_dlg->cols - 12, FALSE, NULL); while (current) { listbox_add_item (l_panelize, LISTBOX_APPEND_AT_END, 0, current->label, current); current = current->next; } /* add listbox to the dialogs */ add_widget (panelize_dlg, l_panelize); listbox_select_entry (l_panelize, listbox_search_text (l_panelize, _("Other command"))); }
static inline char * add_to_list (const char *text, void *data) { return listbox_add_item (find_list, 0, 0, text, data); }
static WDialog * init_chown (void) { int lines, cols; int i; int y; struct passwd *l_pass; struct group *l_grp; WDialog *ch_dlg; do_refresh (); end_chown = need_update = current_file = 0; single_set = (current_panel->marked < 2) ? 3 : 0; cols = GW * 3 + 2 + 6; lines = GH + 4 + (single_set ? 2 : 4); ch_dlg = dlg_create (TRUE, 0, 0, lines, cols, dialog_colors, chown_callback, NULL, "[Chown]", _("Chown command"), DLG_CENTER); add_widget (ch_dlg, groupbox_new (2, 3, GH, GW, _("User name"))); l_user = listbox_new (3, 4, GH - 2, GW - 2, FALSE, NULL); add_widget (ch_dlg, l_user); /* add field for unknown names (numbers) */ listbox_add_item (l_user, LISTBOX_APPEND_AT_END, 0, _("<Unknown user>"), NULL); /* get and put user names in the listbox */ setpwent (); while ((l_pass = getpwent ()) != NULL) listbox_add_item (l_user, LISTBOX_APPEND_SORTED, 0, l_pass->pw_name, NULL); endpwent (); add_widget (ch_dlg, groupbox_new (2, 4 + GW, GH, GW, _("Group name"))); l_group = listbox_new (3, 5 + GW, GH - 2, GW - 2, FALSE, NULL); add_widget (ch_dlg, l_group); /* add field for unknown names (numbers) */ listbox_add_item (l_group, LISTBOX_APPEND_AT_END, 0, _("<Unknown group>"), NULL); /* get and put group names in the listbox */ setgrent (); while ((l_grp = getgrent ()) != NULL) listbox_add_item (l_group, LISTBOX_APPEND_SORTED, 0, l_grp->gr_name, NULL); endgrent (); add_widget (ch_dlg, groupbox_new (2, 5 + GW * 2, GH, GW, _("File"))); /* add widgets for the file information */ for (i = 0; i < LABELS; i++) { chown_label[i].l = label_new (chown_label[i].y, 7 + GW * 2, ""); add_widget (ch_dlg, chown_label[i].l); } if (!single_set) { int x; add_widget (ch_dlg, hline_new (lines - chown_but[0].y - 1, -1, -1)); y = lines - chown_but[0].y; x = (cols - blen) / 2; for (i = 0; i < BUTTONS - 2; i++) { add_widget (ch_dlg, button_new (y, x, chown_but[i].ret_cmd, chown_but[i].flags, chown_but[i].text, NULL)); x += chown_but[i].len + 1; } } i = BUTTONS - 2; y = lines - chown_but[i].y; add_widget (ch_dlg, hline_new (y - 1, -1, -1)); add_widget (ch_dlg, button_new (y, WIDGET (ch_dlg)->cols / 2 - chown_but[i].len, chown_but[i].ret_cmd, chown_but[i].flags, chown_but[i].text, NULL)); i++; add_widget (ch_dlg, button_new (y, WIDGET (ch_dlg)->cols / 2 + 1, chown_but[i].ret_cmd, chown_but[i].flags, chown_but[i].text, NULL)); /* select first listbox */ dlg_select_widget (l_user); return ch_dlg; }
static void do_enter_key (Dlg_head * h, int f_pos) { Dlg_head *chl_dlg; WListbox *chl_list; struct passwd *chl_pass; struct group *chl_grp; WLEntry *fe; int lxx, lyy, chl_end, b_pos; int is_owner; const char *title; do { is_owner = (f_pos == 3); title = is_owner ? _("owner") : _("group"); lxx = (COLS - 74) / 2 + (is_owner ? 35 : 53); lyy = (LINES - 13) / 2; chl_end = 0; chl_dlg = create_dlg (lyy, lxx, 13, 17, dialog_colors, chl_callback, "[Advanced Chown]", title, DLG_COMPACT | DLG_REVERSE); /* get new listboxes */ chl_list = listbox_new (1, 1, 11, 15, NULL); listbox_add_item (chl_list, LISTBOX_APPEND_AT_END, 0, "<Unknown>", NULL); if (is_owner) { /* get and put user names in the listbox */ setpwent (); while ((chl_pass = getpwent ())) { listbox_add_item (chl_list, LISTBOX_APPEND_SORTED, 0, chl_pass->pw_name, NULL); } endpwent (); fe = listbox_search_text (chl_list, get_owner (sf_stat->st_uid)); } else { /* get and put group names in the listbox */ setgrent (); while ((chl_grp = getgrent ())) { listbox_add_item (chl_list, LISTBOX_APPEND_SORTED, 0, chl_grp->gr_name, NULL); } endgrent (); fe = listbox_search_text (chl_list, get_group (sf_stat->st_gid)); } if (fe) listbox_select_entry (chl_list, fe); b_pos = chl_list->pos; add_widget (chl_dlg, chl_list); run_dlg (chl_dlg); if (b_pos != chl_list->pos) { int ok = 0; if (is_owner) { chl_pass = getpwnam (chl_list->current->text); if (chl_pass) { ok = 1; sf_stat->st_uid = chl_pass->pw_uid; } } else { chl_grp = getgrnam (chl_list->current->text); if (chl_grp) { sf_stat->st_gid = chl_grp->gr_gid; ok = 1; } } if (ok) { ch_flags[f_pos + 6] = '+'; update_ownership (); } dlg_focus (h); if (ok) print_flags (); } if (chl_dlg->ret_value == KEY_LEFT) { if (!is_owner) chl_end = 1; dlg_one_up (ch_dlg); f_pos--; } else if (chl_dlg->ret_value == KEY_RIGHT) { if (is_owner) chl_end = 1; dlg_one_down (ch_dlg); f_pos++; } /* Here we used to redraw the window */ destroy_dlg (chl_dlg); } while (chl_end); }