int editcmd_dialog_raw_key_query (const char *heading, const char *query, gboolean cancel) { int w, wq; int y = 2; WDialog *raw_dlg; w = str_term_width1 (heading) + 6; wq = str_term_width1 (query); w = max (w, wq + 3 * 2 + 1 + 2); raw_dlg = create_dlg (TRUE, 0, 0, cancel ? 7 : 5, w, dialog_colors, editcmd_dialog_raw_key_query_cb, NULL, NULL, heading, DLG_CENTER | DLG_TRYUP | DLG_WANT_TAB); add_widget (raw_dlg, label_new (y, 3, query)); add_widget (raw_dlg, input_new (y++, 3 + wq + 1, input_get_default_colors (), w - (6 + wq + 1), "", 0, INPUT_COMPLETE_NONE)); if (cancel) { add_widget (raw_dlg, hline_new (y++, -1, -1)); /* Button w/o hotkey to allow use any key as raw or macro one */ add_widget_autopos (raw_dlg, button_new (y, 1, B_CANCEL, NORMAL_BUTTON, _("Cancel"), NULL), WPOS_KEEP_TOP | WPOS_CENTER_HORZ, NULL); } w = run_dlg (raw_dlg); destroy_dlg (raw_dlg); return (cancel && (w == ESC_CHAR || w == B_CANCEL)) ? 0 : w; }
char * tree_box (const char *current_dir) { WTree *mytree; Dlg_head *dlg; char *val = NULL; WButtonBar *bar; (void) current_dir; /* Create the components */ dlg = create_dlg (TRUE, 0, 0, LINES - 9, COLS - 20, dialog_colors, tree_callback, "[Directory Tree]", _("Directory tree"), DLG_CENTER | DLG_REVERSE); mytree = tree_new (2, 2, dlg->lines - 6, dlg->cols - 5, FALSE); add_widget (dlg, mytree); add_widget (dlg, hline_new (dlg->lines - 4, 1, -1)); bar = buttonbar_new (TRUE); add_widget (dlg, bar); /* restore ButtonBar coordinates after add_widget() */ ((Widget *) bar)->x = 0; ((Widget *) bar)->y = LINES - 1; if (run_dlg (dlg) == B_ENTER) val = g_strdup (tree_selected_name (mytree)); destroy_dlg (dlg); return val; }
/* Show tree in a box, not on a panel */ char * tree_box (const char *current_dir) { WTree *mytree; Dlg_head *dlg; char *val; WButtonBar *bar; /* Create the components */ dlg = create_dlg (0, 0, TREE_Y, TREE_X, dialog_colors, tree_callback, "[Directory Tree]", NULL, DLG_CENTER | DLG_REVERSE); mytree = tree_new (0, 2, 2, TREE_Y - 6, TREE_X - 5); add_widget (dlg, mytree); bar = buttonbar_new(1); add_widget (dlg, bar); bar->widget.x = 0; bar->widget.y = LINES - 1; run_dlg (dlg); if (dlg->ret_value == B_ENTER) val = g_strdup (tree_selected_name (mytree)); else val = 0; destroy_dlg (dlg); return val; }
char * tree (char *current_dir) { WTree *mytree; Dlg_head *dlg; char *val; WButtonBar *bar; tree_colors [3] = dialog_colors [0]; tree_colors [1] = dialog_colors [1]; /* Create the components */ dlg = create_dlg (0, 0, TREE_Y, TREE_X, tree_colors, tree_callback, "[Directory Tree]", "tree", DLG_CENTER); mytree = tree_new (0, 2, 2, TREE_Y - 6, TREE_X - 5); add_widget (dlg, mytree); bar = buttonbar_new(1); add_widget (dlg, bar); bar->widget.x = 0; bar->widget.y = LINES - 1; run_dlg (dlg); if (dlg->ret_value == B_ENTER) val = strdup (mytree->selected_ptr->name); else val = 0; destroy_dlg (dlg); return val; }
Listbox * create_listbox_window (int cols, int lines, const char *title, const char *help) { int xpos, ypos, len; Listbox *listbox = g_new (Listbox, 1); const char *cancel_string = _("&Cancel"); /* Adjust sizes */ lines = (lines > LINES - 6) ? LINES - 6 : lines; if (title && (cols < (len = strlen (title) + 2))) cols = len; /* no &, but 4 spaces around button for brackets and such */ if (cols < (len = strlen (cancel_string) + 3)) cols = len; cols = cols > COLS - 6 ? COLS - 6 : cols; xpos = (COLS - cols) / 2; ypos = (LINES - lines) / 2 - 2; /* Create components */ listbox->dlg = create_dlg (ypos, xpos, lines + 6, cols + 4, dialog_colors, NULL, help, title, DLG_CENTER | DLG_REVERSE); listbox->list = listbox_new (2, 2, cols, lines, 0); add_widget (listbox->dlg, button_new (lines + 3, (cols / 2 + 2) - len / 2, B_CANCEL, NORMAL_BUTTON, cancel_string, 0)); add_widget (listbox->dlg, listbox->list); return listbox; }
gboolean edit_files (const GList * files) { static gboolean made_directory = FALSE; Dlg_head *edit_dlg; WMenuBar *menubar; const GList *file; gboolean ok = FALSE; if (!made_directory) { char *dir; dir = mc_build_filename (mc_config_get_cache_path (), EDIT_DIR, NULL); made_directory = (mkdir (dir, 0700) != -1 || errno == EEXIST); g_free (dir); dir = mc_build_filename (mc_config_get_path (), EDIT_DIR, NULL); made_directory = (mkdir (dir, 0700) != -1 || errno == EEXIST); g_free (dir); dir = mc_build_filename (mc_config_get_data_path (), EDIT_DIR, NULL); made_directory = (mkdir (dir, 0700) != -1 || errno == EEXIST); g_free (dir); } /* Create a new dialog and add it widgets to it */ edit_dlg = create_dlg (FALSE, 0, 0, LINES, COLS, NULL, edit_dialog_callback, edit_dialog_event, "[Internal File Editor]", NULL, DLG_WANT_TAB); edit_dlg->get_shortcut = edit_get_shortcut; edit_dlg->get_title = edit_get_title; menubar = menubar_new (0, 0, COLS, NULL); add_widget (edit_dlg, menubar); edit_init_menu (menubar); add_widget (edit_dlg, buttonbar_new (TRUE)); for (file = files; file != NULL; file = g_list_next (file)) { mcedit_arg_t *f = (mcedit_arg_t *) file->data; gboolean f_ok; f_ok = edit_add_window (edit_dlg, edit_dlg->y + 1, edit_dlg->x, edit_dlg->lines - 2, edit_dlg->cols, f->file_vpath, f->line_number); /* at least one file has been opened succefully */ ok = ok || f_ok; } if (ok) run_dlg (edit_dlg); if (!ok || edit_dlg->state == DLG_CLOSED) destroy_dlg (edit_dlg); return ok; }
static void init_chown_advanced (void) { int i; enum { dlg_h = 13, dlg_w = 74, n_elem = 4 }; #ifdef ENABLE_NLS static int i18n_len = 0; if (i18n_len == 0) { int dx, cx; for (i = 0 ; i < n_elem ; i++) { chown_advanced_but[i].text = _(chown_advanced_but[i].text); i18n_len += str_term_width1 (chown_advanced_but[i].text) + 3; if (DEFPUSH_BUTTON == chown_advanced_but[i].flags) i18n_len += 2; /* "<>" */ } cx = dx = (dlg_w - i18n_len - 2) / (n_elem + 1); /* Reversed order */ for (i = n_elem - 1; i >= 0; i--) { chown_advanced_but[i].x = cx; cx += str_term_width1 (chown_advanced_but[i].text) + 3 + dx; } } #endif /* ENABLE_NLS */ sf_stat = g_new (struct stat, 1); do_refresh (); end_chown = need_update = current_file = 0; single_set = (current_panel->marked < 2) ? 2 : 0; memset (ch_flags, '=', 11); flag_pos = 0; x_toggle = 070; ch_dlg = create_dlg (0, 0, dlg_h, dlg_w, dialog_colors, advanced_chown_callback, "[Advanced Chown]", _(" Chown advanced command "), DLG_CENTER | DLG_REVERSE); #define XTRACT(i) BY+chown_advanced_but[i].y, BX+chown_advanced_but[i].x, \ chown_advanced_but[i].ret_cmd, chown_advanced_but[i].flags, \ (chown_advanced_but[i].text), 0 for (i = 0; i < BUTTONS - 5; i++) if (!single_set || i < 2) add_widget (ch_dlg, button_new (XTRACT (i))); b_att[0] = button_new (XTRACT (8)); b_att[1] = button_new (XTRACT (7)); b_att[2] = button_new (XTRACT (6)); b_user = button_new (XTRACT (5)); b_group = button_new (XTRACT (4)); add_widget (ch_dlg, b_group); add_widget (ch_dlg, b_user); add_widget (ch_dlg, b_att[2]); add_widget (ch_dlg, b_att[1]); add_widget (ch_dlg, b_att[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; }
int edit_file (const char *_file, int line) { static gboolean made_directory = FALSE; Dlg_head *edit_dlg; WEdit *wedit; WMenuBar *menubar; if (!made_directory) { char *dir = concat_dir_and_file (mc_config_get_cache_path (), EDIT_DIR); made_directory = (mkdir (dir, 0700) != -1 || errno == EEXIST); g_free (dir); dir = concat_dir_and_file (mc_config_get_path (), EDIT_DIR); made_directory = (mkdir (dir, 0700) != -1 || errno == EEXIST); g_free (dir); dir = concat_dir_and_file (mc_config_get_data_path (), EDIT_DIR); made_directory = (mkdir (dir, 0700) != -1 || errno == EEXIST); g_free (dir); } wedit = edit_init (NULL, 1, 0, LINES - 2, COLS, _file, line); if (wedit == NULL) return 0; /* Create a new dialog and add it widgets to it */ edit_dlg = create_dlg (FALSE, 0, 0, LINES, COLS, NULL, edit_dialog_callback, "[Internal File Editor]", NULL, DLG_WANT_TAB); edit_dlg->get_shortcut = edit_get_shortcut; edit_dlg->get_title = edit_get_title; menubar = menubar_new (0, 0, COLS, NULL); add_widget (edit_dlg, menubar); edit_init_menu (menubar); init_widget (&wedit->widget, wedit->widget.y, wedit->widget.x, wedit->widget.lines, wedit->widget.cols, edit_callback, edit_event); widget_want_cursor (wedit->widget, TRUE); add_widget (edit_dlg, wedit); add_widget (edit_dlg, buttonbar_new (TRUE)); run_dlg (edit_dlg); if (edit_dlg->state == DLG_CLOSED) destroy_dlg (edit_dlg); return 1; }
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 void edit_about (void) { const char *header = N_("About"); const char *button_name = N_("&OK"); const char *const version = "MCEdit " VERSION; char text[BUF_LARGE]; int win_len, version_len, button_len; int cols, lines; Dlg_head *about_dlg; #ifdef ENABLE_NLS header = _(header); button_name = _(button_name); #endif button_len = str_term_width1 (button_name) + 5; version_len = str_term_width1 (version); g_snprintf (text, sizeof (text), _("Copyright (C) 1996-2012 the Free Software Foundation\n\n" " A user friendly text editor\n" " written for the Midnight Commander")); win_len = str_term_width1 (header); win_len = max (win_len, version_len); win_len = max (win_len, button_len); /* count width and height of text */ str_msg_term_size (text, &lines, &cols); lines += 9; cols = max (win_len, cols) + 6; /* dialog */ about_dlg = create_dlg (TRUE, 0, 0, lines, cols, dialog_colors, NULL, NULL, "[Internal File Editor]", header, DLG_CENTER | DLG_TRYUP); add_widget (about_dlg, label_new (3, (cols - version_len) / 2, version)); add_widget (about_dlg, label_new (5, 3, text)); add_widget (about_dlg, button_new (lines - 3, (cols - button_len) / 2, B_ENTER, NORMAL_BUTTON, button_name, NULL)); run_dlg (about_dlg); destroy_dlg (about_dlg); }
static Dlg_head * init_disp_bits_box (void) { /* dialog sizes */ const int DISPY = 11; const int DISPX = 46; const char *cpname; Dlg_head *dbits_dlg; do_refresh (); dbits_dlg = create_dlg (0, 0, DISPY, DISPX, dialog_colors, NULL, "[Display bits]", _(" Display bits "), DLG_CENTER | DLG_REVERSE); add_widget (dbits_dlg, label_new (3, 4, _("Input / display codepage:"))); cpname = (new_display_codepage < 0) ? _("Other 8 bit") : codepages[new_display_codepage].name; cplabel = label_new (4, 4, cpname); add_widget (dbits_dlg, cplabel); add_widget (dbits_dlg, button_new (DISPY - 3, DISPX / 2 + 3, B_CANCEL, NORMAL_BUTTON, _("&Cancel"), 0)); add_widget (dbits_dlg, button_new (DISPY - 3, 7, B_ENTER, NORMAL_BUTTON, _("&OK"), 0)); inpcheck = check_new (6, 4, !use_8th_bit_as_meta, _("F&ull 8 bits input")); add_widget (dbits_dlg, inpcheck); cpname = _("&Select"); add_widget (dbits_dlg, button_new (4, DISPX - 7 - str_term_width1 (cpname), B_USER, NORMAL_BUTTON, cpname, sel_charset_button)); return dbits_dlg; }
int xdiff_view (const char *file1, const char *file2) { int error; WDiff *view; WButtonBar *bar; Dlg_head *view_dlg; /* Create dialog and widgets, put them on the dialog */ view_dlg = create_dlg(0, 0, LINES, COLS, NULL, view_dialog_callback, "[Binary Diff Viewer]", NULL, DLG_WANT_TAB); view = g_new0(WDiff, 1); init_widget(&view->widget, 0, 0, LINES - 1, COLS, (callback_fn)view_callback, (mouse_h)view_event); widget_want_cursor(view->widget, 0); bar = buttonbar_new(1); add_widget(view_dlg, bar); add_widget(view_dlg, view); error = view_init(view, file1, file2); /* Please note that if you add another widget, * you have to modify view_adjust_size to * be aware of it */ if (!error) { run_dlg(view_dlg); view_search(view, -1); view_fini(view, 1); } destroy_dlg(view_dlg); return error; }
int editcmd_dialog_raw_key_query (const char *heading, const char *query, int cancel) { int w = str_term_width1 (query) + 7; struct Dlg_head *raw_dlg = create_dlg (0, 0, 7, w, dialog_colors, editcmd_dialog_raw_key_query_cb, NULL, heading, DLG_CENTER | DLG_TRYUP | DLG_WANT_TAB); add_widget (raw_dlg, input_new (3 - cancel, w - 5, INPUT_COLOR, 2, "", 0, INPUT_COMPLETE_DEFAULT)); add_widget (raw_dlg, label_new (3 - cancel, 2, query)); if (cancel) add_widget (raw_dlg, button_new (4, w / 2 - 5, B_CANCEL, NORMAL_BUTTON, _("Cancel"), 0)); w = run_dlg (raw_dlg); destroy_dlg (raw_dlg); if (cancel) { if (w == XCTRL ('g') || w == XCTRL ('c') || w == ESC_CHAR || w == B_CANCEL) return 0; } return w; }
static Dlg_head * init_chmod (void) { int i; Dlg_head *ch_dlg; do_refresh (); end_chmod = c_file = need_update = 0; single_set = (current_panel->marked < 2) ? 2 : 0; ch_dlg = create_dlg (TRUE, 0, 0, 22 - single_set, 70, dialog_colors, chmod_callback, "[Chmod]", _("Chmod command"), DLG_CENTER | DLG_REVERSE); for (i = 0; i < BUTTONS; i++) { if (i == 2 && single_set) break; else add_widget (ch_dlg, button_new (BY + chmod_but[i].y - single_set, BX + chmod_but[i].x, chmod_but[i].ret_cmd, chmod_but[i].flags, _(chmod_but[i].text), 0)); } add_widget (ch_dlg, groupbox_new (FY, FX, 10, 25, _("File"))); for (i = 0; i < PERMISSIONS; i++) { check_perm[i].check = check_new (PY + (PERMISSIONS - i), PX + 2, 0, _(check_perm[i].text)); add_widget (ch_dlg, check_perm[i].check); } add_widget (ch_dlg, groupbox_new (PY, PX, PERMISSIONS + 2, 33, _("Permission"))); return ch_dlg; }
gboolean mcview_viewer (const char *command, const vfs_path_t * file_vpath, int start_line) { gboolean succeeded; mcview_t *lc_mcview; WDialog *view_dlg; /* Create dialog and widgets, put them on the dialog */ view_dlg = create_dlg (FALSE, 0, 0, LINES, COLS, NULL, mcview_dialog_callback, NULL, "[Internal File Viewer]", NULL, DLG_WANT_TAB); lc_mcview = mcview_new (0, 0, LINES - 1, COLS, FALSE); add_widget (view_dlg, lc_mcview); add_widget (view_dlg, buttonbar_new (TRUE)); view_dlg->get_title = mcview_get_title; { char *file; file = vfs_path_to_str (file_vpath); succeeded = mcview_load (lc_mcview, command, file, start_line); g_free (file); } if (succeeded) run_dlg (view_dlg); else view_dlg->state = DLG_CLOSED; if (view_dlg->state == DLG_CLOSED) destroy_dlg (view_dlg); return succeeded; }
static void init_layout (void) { static int i18n_layt_flag = 0; static int b1, b2, b3; int i = sizeof (s_split_direction) / sizeof(char*) ; char* ok_button = _("&Ok"); char* cancel_button = _("&Cancel"); char* save_button = _("&Save"); if (!i18n_layt_flag) { register int l1; first_width = 19; /* length of line with '<' '>' buttons */ layout_title = _(" Layout "); title1 = _(" Panel split "); title2 = _(" Highlight... "); title3 = _(" Other options "); output_lines_label = _("output lines"); while (i--) { s_split_direction [i] = _(s_split_direction [i]); l1 = strlen (s_split_direction [i]) + 7; if (l1 > first_width) first_width = l1; } for (i = 0; i <= 8; i++) { check_options[i].text = _(check_options[i].text); l1 = strlen (check_options[i].text) + 7; if (l1 > first_width) first_width = l1; } l1 = strlen (title1) + 1; if (l1 > first_width) first_width = l1; l1 = strlen (title2) + 1; if (l1 > first_width) first_width = l1; second_width = strlen (title3) + 1; for (i = 0; i < 6; i++) { check_options[i].text = _(check_options[i].text); l1 = strlen (check_options[i].text) + 7; if (l1 > second_width) second_width = l1; } if (console_flag) { l1 = strlen (output_lines_label) + 13; if (l1 > second_width) second_width = l1; } /* * [email protected]: * To be completely correct, one need to check if layout_title * does not exceed dialog length and total length of 3 buttons * allows their placement in one row. But assuming this dialog * is wide enough, I don't include such a tests. * * Now the last thing to do - properly space buttons... */ l1 = 11 + strlen (ok_button) /* 14 - all brackets and inner space */ + strlen (save_button) /* notice: it is 3 char less because */ + strlen (cancel_button); /* of '&' char in button text */ i = (first_width + second_width - l1) / 4; b1 = 5 + i; b2 = b1 + strlen(ok_button) + i + 6; b3 = b2 + strlen(save_button) + i + 4; i18n_layt_flag = 1; } layout_dlg = create_dlg (0, 0, 15, first_width + second_width + 9, dialog_colors, layout_callback, "[Layout]", "layout", DLG_CENTER | DLG_GRID); x_set_dialog_title (layout_dlg, _("Layout")); add_widgetl (layout_dlg, button_new (BY, b3, B_CANCEL, NORMAL_BUTTON, cancel_button, 0, 0, "c"), XV_WLAY_RIGHTOF); add_widgetl (layout_dlg, button_new (BY, b2, B_EXIT, NORMAL_BUTTON, save_button, 0, 0, "s"), XV_WLAY_RIGHTOF); add_widgetl (layout_dlg, button_new (BY, b1, B_ENTER, DEFPUSH_BUTTON, ok_button, 0, 0, "o"), XV_WLAY_CENTERROW); #ifndef HAVE_X if (console_flag){ add_widget (layout_dlg, button_new (9, 12 + first_width, B_MINUS, NARROW_BUTTON, "&-", bminus_cback, 0, NULL)); add_widget (layout_dlg, button_new (9, 7 + first_width, B_PLUS, NARROW_BUTTON, "&+", bplus_cback, 0, NULL)); } #endif #define XTRACT(i) *check_options[i].variable, check_options[i].text, check_options[i].tkname for (i = 0; i < 6; i++){ check_options [i].widget = check_new (8 - i, 7 + first_width, XTRACT(i)); add_widgetl (layout_dlg, check_options [i].widget, XV_WLAY_BELOWCLOSE); } #ifdef HAVE_XVIEW add_widgetl (layout_dlg, label_new (2, 7 + first_width, _("Other options"), "oo"), XV_WLAY_NEXTCOLUMN); add_widgetl (layout_dlg, label_new (8, 5, _("Highlight..."), "hl"), XV_WLAY_NEXTCOLUMN); add_widgetl (layout_dlg, label_new (2, 5, _("Panel split"), "ps"), XV_WLAY_NEXTCOLUMN); #endif check_options [8].widget = check_new (10, 6, XTRACT(8)); add_widgetl (layout_dlg, check_options [8].widget, XV_WLAY_BELOWCLOSE); check_options [7].widget = check_new (9, 6, XTRACT(7)); add_widgetl (layout_dlg, check_options [7].widget, XV_WLAY_BELOWCLOSE); _filetype_mode = filetype_mode; _permission_mode = permission_mode; _equal_split = equal_split; _menubar_visible = menubar_visible; _command_prompt = command_prompt; _keybar_visible = keybar_visible; _message_visible = message_visible; _xterm_hintbar = xterm_hintbar; #ifndef HAVE_X bright_widget = button_new(6, 15, B_2RIGHT, NARROW_BUTTON, "&>", b2right_cback, 0, ">"); add_widgetl (layout_dlg, bright_widget, XV_WLAY_RIGHTOF); bleft_widget = button_new (6, 9, B_2LEFT, NARROW_BUTTON, "&<", b2left_cback, 0, "<"); add_widgetl (layout_dlg, bleft_widget, XV_WLAY_RIGHTOF); check_options [6].widget = check_new (5, 6, XTRACT(6)); #endif old_first_panel_size = -1; old_horizontal_split = -1; old_output_lines = -1; _first_panel_size = first_panel_size; _output_lines = output_lines; #ifndef HAVE_X add_widget (layout_dlg, check_options [6].widget); radio_widget = radio_new (3, 6, 2, s_split_direction, 1, "r"); add_widget (layout_dlg, radio_widget); radio_widget->sel = horizontal_split; #endif }
/* * FIXME: probably it is better to replace this with quick dialog machinery, * but actually I'm not familiar with it and have not much time :( * alex */ static replace_action_t overwrite_query_dialog (FileOpContext * ctx, enum OperationMode mode) { #define ADD_RD_BUTTON(i) \ add_widget (ui->replace_dlg, \ button_new (rd_widgets [i].ypos, rd_widgets [i].xpos, rd_widgets [i].value, \ NORMAL_BUTTON, rd_widgets [i].text, 0)) #define ADD_RD_LABEL(i, p1, p2) \ g_snprintf (buffer, sizeof (buffer), rd_widgets [i].text, p1, p2); \ add_widget (ui->replace_dlg, label_new (rd_widgets [i].ypos, rd_widgets [i].xpos, buffer)) /* dialog sizes */ const int rd_ylen = 17; int rd_xlen = 60; struct { const char *text; int ypos, xpos; int value; /* 0 for labels */ } rd_widgets[] = { /* *INDENT-OFF* */ /* 0 */ { N_("Target file already exists!"), 3, 4, 0 }, /* 1 */ { "%s", 4, 4, 0 }, /* 2 */ /* cannot use PRIuMAX here; %llu is used instead */ { N_("Source date: %s, size %llu"), 6, 4, 0 }, /* 3 */ /* cannot use PRIuMAX here; %llu is used instead */ { N_("Target date: %s, size %llu"), 7, 4, 0 }, /* 4 */ { N_("&Abort"), 14, 25, REPLACE_ABORT }, /* 5 */ { N_("If &size differs"), 12, 28, REPLACE_SIZE }, /* 6 */ { N_("Non&e"), 11, 47, REPLACE_NEVER }, /* 7 */ { N_("&Update"), 11, 36, REPLACE_UPDATE }, /* 8 */ { N_("A&ll"), 11, 28, REPLACE_ALWAYS }, /* 9 */ { N_("Overwrite all targets?"), 11, 4, 0 }, /* 10 */ { N_("&Reget"), 10, 28, REPLACE_REGET }, /* 11 */ { N_("A&ppend"), 9, 45, REPLACE_APPEND }, /* 12 */ { N_("&No"), 9, 37, REPLACE_NO }, /* 13 */ { N_("&Yes"), 9, 28, REPLACE_YES }, /* 14 */ { N_("Overwrite this target?"), 9, 4, 0 } /* *INDENT-ON* */ }; const int num = sizeof (rd_widgets) / sizeof (rd_widgets[0]); int *widgets_len; FileOpContextUI *ui = ctx->ui; char buffer[BUF_SMALL]; const char *title; const char *stripped_name = strip_home_and_password (ui->replace_filename); int stripped_name_len; int result; widgets_len = g_new0 (int, num); if (mode == Foreground) title = _("File exists"); else title = _("Background process: File exists"); stripped_name_len = str_term_width1 (stripped_name); { int i, l1, l2, l, row; for (i = 0; i < num; i++) { #ifdef ENABLE_NLS if (i != 1) /* skip filename */ rd_widgets[i].text = _(rd_widgets[i].text); #endif /* ENABLE_NLS */ widgets_len[i] = str_term_width1 (rd_widgets[i].text); } /* * longest of "Overwrite..." labels * (assume "Target date..." are short enough) */ l1 = max (widgets_len[9], widgets_len[14]); /* longest of button rows */ i = num; for (row = l = l2 = 0; i--;) if (rd_widgets[i].value != 0) { if (row != rd_widgets[i].ypos) { row = rd_widgets[i].ypos; l2 = max (l2, l); l = 0; } l += widgets_len[i] + 4; } l2 = max (l2, l); /* last row */ rd_xlen = max (rd_xlen, l1 + l2 + 8); rd_xlen = max (rd_xlen, str_term_width1 (title) + 2); rd_xlen = max (rd_xlen, min (COLS, stripped_name_len + 8)); /* Now place widgets */ l1 += 5; /* start of first button in the row */ i = num; for (l = l1, row = 0; --i > 1;) if (rd_widgets[i].value != 0) { if (row != rd_widgets[i].ypos) { row = rd_widgets[i].ypos; l = l1; } rd_widgets[i].xpos = l; l += widgets_len[i] + 4; } /* Abort button is centered */ rd_widgets[4].xpos = (rd_xlen - widgets_len[4] - 3) / 2; } /* FIXME - missing help node */ ui->replace_dlg = create_dlg (TRUE, 0, 0, rd_ylen, rd_xlen, alarm_colors, NULL, "[Replace]", title, DLG_CENTER | DLG_REVERSE); /* prompt -- centered */ add_widget (ui->replace_dlg, label_new (rd_widgets[0].ypos, (rd_xlen - widgets_len[0]) / 2, rd_widgets[0].text)); /* file name -- centered */ stripped_name = str_trunc (stripped_name, rd_xlen - 8); stripped_name_len = str_term_width1 (stripped_name); add_widget (ui->replace_dlg, label_new (rd_widgets[1].ypos, (rd_xlen - stripped_name_len) / 2, stripped_name)); /* source date and size */ ADD_RD_LABEL (2, file_date (ui->s_stat->st_mtime), (unsigned long long) ui->s_stat->st_size); /* destination date and size */ ADD_RD_LABEL (3, file_date (ui->d_stat->st_mtime), (unsigned long long) ui->d_stat->st_size); ADD_RD_BUTTON (4); /* Abort */ ADD_RD_BUTTON (5); /* If size differs */ ADD_RD_BUTTON (6); /* None */ ADD_RD_BUTTON (7); /* Update */ ADD_RD_BUTTON (8); /* All" */ ADD_RD_LABEL (9, 0, 0); /* Overwrite all targets? */ /* "this target..." widgets */ if (!S_ISDIR (ui->d_stat->st_mode)) { if ((ctx->operation == OP_COPY) && (ui->d_stat->st_size != 0) && (ui->s_stat->st_size > ui->d_stat->st_size)) ADD_RD_BUTTON (10); /* Reget */ ADD_RD_BUTTON (11); /* Append */ } ADD_RD_BUTTON (12); /* No */ ADD_RD_BUTTON (13); /* Yes */ ADD_RD_LABEL (14, 0, 0); /* Overwrite this target? */ result = run_dlg (ui->replace_dlg); destroy_dlg (ui->replace_dlg); g_free (widgets_len); return (result == B_CANCEL) ? REPLACE_ABORT : (replace_action_t) result; #undef ADD_RD_LABEL #undef ADD_RD_BUTTON }
static void init_learn (void) { int x, y, i, j; key_code_name_t *key; char buffer[BUF_TINY]; #ifdef ENABLE_NLS static int i18n_flag = 0; if (!i18n_flag) { learn_but[0].text = _(learn_but[0].text); learn_but[0].x = 78 / 2 + 4; learn_but[1].text = _(learn_but[1].text); learn_but[1].x = 78 / 2 - (strlen (learn_but[1].text) + 9); learn_title = _(learn_title); i18n_flag = 1; } #endif /* ENABLE_NLS */ do_refresh (); learn_dlg = create_dlg (0, 0, 23, 78, dialog_colors, learn_callback, "[Learn keys]", learn_title, DLG_CENTER | DLG_REVERSE); for (i = 0; i < BUTTONS; i++) add_widget (learn_dlg, button_new (BY + learn_but[i].y, learn_but[i].x, learn_but[i].ret_cmd, learn_but[i].flags, _(learn_but[i].text), 0)); x = UX; y = UY; for (key = key_name_conv_tab, j = 0; key->name != NULL && strcmp (key->name, "kpleft"); key++, j++); learnkeys = g_new (learnkey, j); x += ((j - 1) / ROWS) * COLSHIFT; y += (j - 1) % ROWS; learn_total = j; learnok = 0; learnchanged = 0; for (i = j - 1, key = key_name_conv_tab + j - 1; i >= 0; i--, key--) { learnkeys[i].ok = 0; learnkeys[i].sequence = NULL; g_snprintf (buffer, sizeof (buffer), "%-16s", _(key->longname)); add_widget (learn_dlg, learnkeys[i].button = (Widget *) button_new (y, x, B_USER + i, NARROW_BUTTON, buffer, learn_button)); add_widget (learn_dlg, learnkeys[i].label = (Widget *) label_new (y, x + 19, "")); if (i % 13) y--; else { x -= COLSHIFT; y = UY + ROWS - 1; } } add_widget (learn_dlg, label_new (UY + 14, 5, _ ("Press all the keys mentioned here. After you have done it, check"))); add_widget (learn_dlg, label_new (UY + 15, 5, _ ("which keys are not marked with OK. Press space on the missing"))); add_widget (learn_dlg, label_new (UY + 16, 5, _ ("key, or click with the mouse to define it. Move around with Tab."))); }
/* 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; }
static Dlg_head * display_init (int radio_sel, char *init_text, int _check_status, char **_status) { int dlg_width = 48, dlg_height = 15; Dlg_head *dd; /* Controls whether the array strings have been translated */ const char *displays[LIST_TYPES] = { N_("&Full file list"), N_("&Brief file list"), N_("&Long file list"), N_("&User defined:") }; /* Index in displays[] for "user defined" */ const int user_type_idx = 3; const char *display_title = N_("Listing mode"); const char *user_mini_status = N_("User &mini status"); const char *ok_name = N_("&OK"); const char *cancel_name = N_("&Cancel"); WButton *ok_button, *cancel_button; { int i, maxlen = 0; const char *cp; int ok_len, cancel_len, b_len, gap; #ifdef ENABLE_NLS display_title = _(display_title); user_mini_status = _(user_mini_status); ok_name = _(ok_name); cancel_name = _(cancel_name); for (i = 0; i < LIST_TYPES; i++) displays[i] = _(displays[i]); #endif /* get hotkey of user-defined format string */ cp = strchr (displays[user_type_idx], '&'); if (cp != NULL && *++cp != '\0') display_user_hotkey = g_ascii_tolower (*cp); /* xpos will be fixed later */ ok_button = button_new (dlg_height - 3, 0, B_ENTER, DEFPUSH_BUTTON, ok_name, 0); ok_len = button_get_len (ok_button); cancel_button = button_new (dlg_height - 3, 0, B_CANCEL, NORMAL_BUTTON, cancel_name, 0); cancel_len = button_get_len (cancel_button); b_len = ok_len + cancel_len + 2; dlg_width = max (dlg_width, str_term_width1 (display_title) + 10); /* calculate max width of radiobutons */ for (i = 0; i < LIST_TYPES; i++) maxlen = max (maxlen, str_term_width1 (displays[i])); dlg_width = max (dlg_width, maxlen); dlg_width = max (dlg_width, str_term_width1 (user_mini_status) + 13); /* buttons */ dlg_width = max (dlg_width, b_len + 6); gap = (dlg_width - 6 - b_len) / 3; ok_button->widget.x = 3 + gap; cancel_button->widget.x = ok_button->widget.x + ok_len + gap + 2; } displays_status = _status; dd = create_dlg (TRUE, 0, 0, dlg_height, dlg_width, dialog_colors, display_callback, "[Listing Mode...]", display_title, DLG_CENTER | DLG_REVERSE); add_widget (dd, cancel_button); add_widget (dd, ok_button); display_mini_status = input_new (10, 8, input_get_default_colors (), dlg_width - 12, _status[radio_sel], "mini-input", INPUT_COMPLETE_DEFAULT); add_widget (dd, display_mini_status); display_check_status = check_new (9, 4, _check_status, user_mini_status); add_widget (dd, display_check_status); display_user_format = input_new (7, 8, input_get_default_colors (), dlg_width - 12, init_text, "user-fmt-input", INPUT_COMPLETE_DEFAULT); add_widget (dd, display_user_format); display_radio = radio_new (3, 4, LIST_TYPES, displays); display_radio->sel = display_radio->pos = radio_sel; add_widget (dd, display_radio); return dd; }
char *cp = va_arg (ap, char *); win_len += str_term_width1 (cp) + 6; if (strchr (cp, '&') != NULL) win_len--; } va_end (ap); } /* count coordinates */ str_msg_term_size (text, &lines, &cols); cols = 6 + max (win_len, max (str_term_width1 (header), cols)); lines += 4 + (count > 0 ? 2 : 0); /* prepare dialog */ query_dlg = create_dlg (TRUE, 0, 0, lines, cols, query_colors, default_query_callback, "[QueryBox]", header, dlg_flags); if (count > 0) { cols = (cols - win_len - 2) / 2 + 2; va_start (ap, count); for (i = 0; i < count; i++) { int xpos; cur_name = va_arg (ap, char *); xpos = str_term_width1 (cur_name) + 6; if (strchr (cur_name, '&') != NULL) xpos--; button = button_new (lines - 3, cols, B_USER + i, NORMAL_BUTTON, cur_name, 0);
int quick_dialog_skip (QuickDialog * qd, int nskip) { #ifdef ENABLE_NLS #define I18N(x) (x = !qd->i18n && x != NULL && *x != '\0' ? _(x): x) #else #define I18N(x) (x = x) #endif Dlg_head *dd; QuickWidget *qw; WInput *in; WRadio *r; int return_val; I18N (qd->title); if ((qd->xpos == -1) || (qd->ypos == -1)) dd = create_dlg (TRUE, 0, 0, qd->ylen, qd->xlen, dialog_colors, qd->callback, qd->mouse, qd->help, qd->title, DLG_CENTER | DLG_TRYUP | DLG_REVERSE); else dd = create_dlg (TRUE, qd->ypos, qd->xpos, qd->ylen, qd->xlen, dialog_colors, qd->callback, qd->mouse, qd->help, qd->title, DLG_REVERSE); for (qw = qd->widgets; qw->widget_type != quick_end; qw++) { int xpos; int ypos; xpos = (qd->xlen * qw->relative_x) / qw->x_divisions; ypos = (qd->ylen * qw->relative_y) / qw->y_divisions; switch (qw->widget_type) { case quick_checkbox: qw->widget = (Widget *) check_new (ypos, xpos, *qw->u.checkbox.state, I18N (qw->u.checkbox.text)); break; case quick_button: qw->widget = (Widget *) button_new (ypos, xpos, qw->u.button.action, (qw->u.button.action == B_ENTER) ? DEFPUSH_BUTTON : NORMAL_BUTTON, I18N (qw->u.button.text), qw->u.button.callback); break; case quick_input: in = input_new (ypos, xpos, input_get_default_colors (), qw->u.input.len, qw->u.input.text, qw->u.input.histname, INPUT_COMPLETE_DEFAULT); in->is_password = (qw->u.input.flags == 1); if ((qw->u.input.flags & 2) != 0) in->completion_flags |= INPUT_COMPLETE_CD; if ((qw->u.input.flags & 4) != 0) in->strip_password = TRUE; qw->widget = (Widget *) in; *qw->u.input.result = NULL; break; case quick_label: qw->widget = (Widget *) label_new (ypos, xpos, I18N (qw->u.label.text)); break; case quick_groupbox: qw->widget = (Widget *) groupbox_new (ypos, xpos, qw->u.groupbox.height, qw->u.groupbox.width, I18N (qw->u.groupbox.title)); break; case quick_radio: { int i; char **items = NULL; /* create the copy of radio_items to avoid mwmory leak */ items = g_new0 (char *, qw->u.radio.count + 1); if (!qd->i18n) for (i = 0; i < qw->u.radio.count; i++) items[i] = g_strdup (_(qw->u.radio.items[i])); else for (i = 0; i < qw->u.radio.count; i++) items[i] = g_strdup (qw->u.radio.items[i]); r = radio_new (ypos, xpos, qw->u.radio.count, (const char **) items); r->pos = r->sel = *qw->u.radio.value; qw->widget = (Widget *) r; g_strfreev (items); break; } default: qw->widget = NULL; fprintf (stderr, "QuickWidget: unknown widget type\n"); break; } if (qw->widget != NULL) { qw->widget->options |= qw->options; /* FIXME: cannot reset flags, setup only */ add_widget (dd, qw->widget); } } while (nskip-- != 0) { dd->current = g_list_next (dd->current); if (dd->current == NULL) dd->current = dd->widgets; } return_val = run_dlg (dd); /* Get the data if we found something interesting */ if (return_val != B_CANCEL) { for (qw = qd->widgets; qw->widget_type != quick_end; qw++) { switch (qw->widget_type) { case quick_checkbox: *qw->u.checkbox.state = ((WCheck *) qw->widget)->state & C_BOOL; break; case quick_input: if ((qw->u.input.flags & 2) != 0) *qw->u.input.result = tilde_expand (((WInput *) qw->widget)->buffer); else *qw->u.input.result = g_strdup (((WInput *) qw->widget)->buffer); break; case quick_radio: *qw->u.radio.value = ((WRadio *) qw->widget)->sel; break; default: break; } } } destroy_dlg (dd); return return_val; #undef I18N }
static Dlg_head * init_listmode (char *oldlistformat) { int i; char *s; int format_width = 0; int format_columns = 0; Dlg_head *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 = create_dlg (0, 0, 22, 74, dialog_colors, NULL, listmode_section, "Listing format edit", DLG_CENTER | DLG_REVERSE); add_widget (listmode_dlg, groupbox_new (UX, UY, 63, 4, "General options")); add_widget (listmode_dlg, groupbox_new (UX, UY + 4, 18, 11, "Items")); add_widget (listmode_dlg, groupbox_new (UX + 20, UY + 4, 43, 11, "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, 16, 9, 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_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 int find_parameters (char **start_dir, char **pattern, char **content) { int return_value; char *temp_dir; static char *in_contents = NULL; static char *in_start_dir = NULL; static char *in_start_name = NULL; static char* labs[] = {N_("Start at:"), N_("Filename:"), N_("Content: ")}; static char* buts[] = {N_("&Ok"), N_("&Tree"), N_("&Cancel")}; static int ilen = 30, istart = 14; static int b0 = 3, b1 = 16, b2 = 36; #ifdef ENABLE_NLS static int i18n_flag = 0; if (!i18n_flag) { register int i = sizeof(labs)/sizeof(labs[0]); int l1, maxlen = 0; while (i--) { l1 = strlen (labs [i] = _(labs [i])); if (l1 > maxlen) maxlen = l1; } i = maxlen + ilen + 7; if (i > FIND_X) FIND_X = i; for (i = sizeof(buts)/sizeof(buts[0]), l1 = 0; i--; ) { l1 += strlen (buts [i] = _(buts [i])); } l1 += 21; if (l1 > FIND_X) FIND_X = l1; ilen = FIND_X - 7 - maxlen; /* for the case of very long buttons :) */ istart = FIND_X - 3 - ilen; b1 = b0 + strlen(buts[0]) + 7; b2 = FIND_X - (strlen(buts[2]) + 6); i18n_flag = 1; } #endif /* ENABLE_NLS */ find_par_start: if (!in_start_dir) in_start_dir = strdup ("."); if (!in_start_name) in_start_name = strdup (easy_patterns ? "*" : "."); if (!in_contents) in_contents = strdup (""); find_dlg = create_dlg (0, 0, FIND_Y, FIND_X, dialog_colors, common_dialog_callback, "[Find File]", "findfile", DLG_CENTER | DLG_GRID); x_set_dialog_title (find_dlg, _("Find File")); add_widgetl (find_dlg, button_new (9, b2, B_CANCEL, NORMAL_BUTTON, buts[2], 0 ,0, "cancel"), XV_WLAY_RIGHTOF); #ifndef HAVE_GNOME add_widgetl (find_dlg, button_new (9, b1, B_TREE, NORMAL_BUTTON, buts[1], 0, 0, "tree"), XV_WLAY_RIGHTOF); #endif add_widgetl (find_dlg, button_new (9, b0, B_ENTER, DEFPUSH_BUTTON, buts[0], 0, 0, "ok"), XV_WLAY_CENTERROW); in_with = input_new (7, istart, INPUT_COLOR, ilen, in_contents, "content"); add_widgetl (find_dlg, in_with, XV_WLAY_BELOWOF); in_name = input_new (5, istart, INPUT_COLOR, ilen, in_start_name, "name"); add_widgetl (find_dlg, in_name, XV_WLAY_BELOWOF); in_start = input_new (3, istart, INPUT_COLOR, ilen, in_start_dir, "start"); add_widgetl (find_dlg, in_start, XV_WLAY_NEXTCOLUMN); add_widgetl (find_dlg, label_new (7, 3, labs[2], "label-cont"), XV_WLAY_BELOWOF); add_widgetl (find_dlg, label_new (5, 3, labs[1], "label-file"), XV_WLAY_BELOWOF); add_widgetl (find_dlg, label_new (3, 3, labs[0], "label-start"), XV_WLAY_NEXTCOLUMN); run_dlg (find_dlg); switch (find_dlg->ret_value){ case B_CANCEL: return_value = 0; break; #ifndef HAVE_GNOME case B_TREE: temp_dir = strdup (in_start->buffer); destroy_dlg (find_dlg); free (in_start_dir); if (strcmp (temp_dir, ".") == 0){ free (temp_dir); temp_dir = strdup (cpanel->cwd); } in_start_dir = tree (temp_dir); if (in_start_dir) free (temp_dir); else in_start_dir = temp_dir; /* Warning: Dreadful goto */ goto find_par_start; break; #endif default: return_value = 1; *start_dir = strdup (in_start->buffer); *pattern = strdup (in_name->buffer); free (in_contents); if (in_with->buffer [0]){ *content = strdup (in_with->buffer); in_contents = strdup (*content); } else *content = in_contents = NULL; free (in_start_dir); in_start_dir = strdup (*start_dir); free (in_start_name); in_start_name = strdup (*pattern); } destroy_dlg (find_dlg); return return_value; }
int quick_dialog_skip (quick_dialog_t * quick_dlg, int nskip) { int len; int blen = 0; int x, y; /* current positions */ int y1 = 0; /* bottom of 1st column in case of two columns */ int y2 = -1; /* start of two columns */ int width1 = 0; /* width of single column */ int width2 = 0; /* width of each of two columns */ gboolean have_groupbox = FALSE; gboolean two_columns = FALSE; gboolean put_buttons = FALSE; /* x position of 1st column is 3 */ const int x1 = 3; /* x position of 2nd column is 4 and it will be fixed later, after creation of all widgets */ int x2 = 4; GArray *widgets; size_t i; quick_widget_t *quick_widget; WGroupbox *g = NULL; WDialog *dd; int return_val; len = str_term_width1 (I18N (quick_dlg->title)) + 6; quick_dlg->cols = max (quick_dlg->cols, len); y = 1; x = x1; /* create widgets */ widgets = g_array_sized_new (FALSE, FALSE, sizeof (quick_widget_item_t), 8); for (quick_widget = quick_dlg->widgets; quick_widget->widget_type != quick_end; quick_widget++) { quick_widget_item_t item = { NULL, quick_widget }; int width = 0; switch (quick_widget->widget_type) { case quick_checkbox: item.widget = WIDGET (check_new (++y, x, *quick_widget->u.checkbox.state, I18N (quick_widget->u.checkbox.text))); g_array_append_val (widgets, item); width = item.widget->cols; if (g != NULL) width += 2; if (two_columns) width2 = max (width2, width); else width1 = max (width1, width); break; case quick_button: /* single button */ item.widget = WIDGET (button_new (++y, x, quick_widget->u.button.action, quick_widget->u.button.action == B_ENTER ? DEFPUSH_BUTTON : NORMAL_BUTTON, I18N (quick_widget->u.button.text), quick_widget->u.button.callback)); g_array_append_val (widgets, item); width = item.widget->cols; if (g != NULL) width += 2; if (two_columns) width2 = max (width2, width); else width1 = max (width1, width); break; case quick_input: *quick_widget->u.input.result = NULL; y++; if (quick_widget->u.input.label_location != input_label_none) quick_create_labeled_input (widgets, &y, x, quick_widget, &width); else { item.widget = WIDGET (quick_create_input (y, x, quick_widget)); g_array_append_val (widgets, item); width = item.widget->cols; } if (g != NULL) width += 2; if (two_columns) width2 = max (width2, width); else width1 = max (width1, width); break; case quick_label: item.widget = WIDGET (label_new (++y, x, I18N (quick_widget->u.label.text))); g_array_append_val (widgets, item); y += item.widget->lines - 1; width = item.widget->cols; if (g != NULL) width += 2; if (two_columns) width2 = max (width2, width); else width1 = max (width1, width); break; case quick_radio: { WRadio *r; char **items = NULL; /* create the copy of radio_items to avoid mwmory leak */ items = g_new (char *, quick_widget->u.radio.count + 1); for (i = 0; i < (size_t) quick_widget->u.radio.count; i++) items[i] = g_strdup (_(quick_widget->u.radio.items[i])); items[i] = NULL; r = radio_new (++y, x, quick_widget->u.radio.count, (const char **) items); r->pos = r->sel = *quick_widget->u.radio.value; g_strfreev (items); item.widget = WIDGET (r); g_array_append_val (widgets, item); y += item.widget->lines - 1; width = item.widget->cols; if (g != NULL) width += 2; if (two_columns) width2 = max (width2, width); else width1 = max (width1, width); } break; case quick_start_groupbox: I18N (quick_widget->u.groupbox.title); len = str_term_width1 (quick_widget->u.groupbox.title); g = groupbox_new (++y, x, 1, len + 4, quick_widget->u.groupbox.title); item.widget = WIDGET (g); g_array_append_val (widgets, item); have_groupbox = TRUE; break; case quick_stop_groupbox: if (g != NULL) { Widget *w = WIDGET (g); y++; w->lines = y + 1 - w->y; g = NULL; g_array_append_val (widgets, item); } break; case quick_separator: y++; if (quick_widget->u.separator.line) { item.widget = WIDGET (hline_new (y, x, 1)); g_array_append_val (widgets, item); } break; case quick_start_columns: y2 = y; g_array_append_val (widgets, item); two_columns = TRUE; break; case quick_next_column: x = x2; y1 = y; y = y2; break; case quick_stop_columns: x = x1; y = max (y1, y); g_array_append_val (widgets, item); two_columns = FALSE; break; case quick_buttons: /* start put several buttons in bottom line */ if (quick_widget->u.separator.space) { y++; if (quick_widget->u.separator.line) item.widget = WIDGET (hline_new (y, 1, -1)); } g_array_append_val (widgets, item); /* several buttons in bottom line */ y++; quick_widget++; for (; quick_widget->widget_type == quick_button; quick_widget++) { item.widget = WIDGET (button_new (y, x++, quick_widget->u.button.action, quick_widget->u.button.action == B_ENTER ? DEFPUSH_BUTTON : NORMAL_BUTTON, I18N (quick_widget->u.button.text), quick_widget->u.button.callback)); item.quick_widget = quick_widget; g_array_append_val (widgets, item); blen += item.widget->cols + 1; } /* stop dialog build here */ blen--; quick_widget->widget_type = quick_end; quick_widget--; break; default: break; } } /* adjust dialog width */ quick_dlg->cols = max (quick_dlg->cols, blen + 6); if (have_groupbox) { if (width1 != 0) width1 += 2; if (width2 != 0) width2 += 2; } if (width2 == 0) len = width1 + 6; else { len = width2 * 2 + 7; if (width1 != 0) len = max (len, width1 + 6); } quick_dlg->cols = max (quick_dlg->cols, len); width1 = quick_dlg->cols - 6; width2 = (quick_dlg->cols - 7) / 2; if (quick_dlg->x == -1 || quick_dlg->y == -1) dd = create_dlg (TRUE, 0, 0, y + 3, quick_dlg->cols, dialog_colors, quick_dlg->callback, quick_dlg->mouse, quick_dlg->help, quick_dlg->title, DLG_CENTER | DLG_TRYUP); else dd = create_dlg (TRUE, quick_dlg->y, quick_dlg->x, y + 3, quick_dlg->cols, dialog_colors, quick_dlg->callback, quick_dlg->mouse, quick_dlg->help, quick_dlg->title, DLG_NONE); /* add widgets into the dialog */ x2 = x1 + width2 + 1; g = NULL; two_columns = FALSE; x = (WIDGET (dd)->cols - blen) / 2; for (i = 0; i < widgets->len; i++) { quick_widget_item_t *item; int column_width; item = &g_array_index (widgets, quick_widget_item_t, i); column_width = two_columns ? width2 : width1; /* adjust widget width and x position */ switch (item->quick_widget->widget_type) { case quick_label: { quick_widget_t *input = item->quick_widget->u.label.input; if (input != NULL && input->u.input.label_location == input_label_right) { /* location of this label will be adjusted later */ break; } } /* fall through */ case quick_checkbox: case quick_radio: if (item->widget->x != x1) item->widget->x = x2; if (g != NULL) item->widget->x += 2; break; case quick_button: if (!put_buttons) { if (item->widget->x != x1) item->widget->x = x2; if (g != NULL) item->widget->x += 2; } else { item->widget->x = x; x += item->widget->cols + 1; } break; case quick_input: { Widget *label = WIDGET (INPUT (item->widget)->label); int width = column_width; if (g != NULL) width -= 4; switch (item->quick_widget->u.input.label_location) { case input_label_left: /* label was adjusted before; adjust input line */ item->widget->x = label->x + label->cols + 1 - WIDGET (label->owner)->x; item->widget->cols = width - label->cols - 1; break; case input_label_right: label->x = item->widget->x + item->widget->cols + 1 - WIDGET (item->widget->owner)->x; item->widget->cols = width - label->cols - 1; break; default: if (item->widget->x != x1) item->widget->x = x2; if (g != NULL) item->widget->x += 2; item->widget->cols = width; break; } /* forced update internal variables of inpuit line */ input_set_origin (INPUT (item->widget), item->widget->x, item->widget->cols); } break; case quick_start_groupbox: g = GROUPBOX (item->widget); if (item->widget->x != x1) item->widget->x = x2; item->widget->cols = column_width; break; case quick_stop_groupbox: g = NULL; break; case quick_separator: if (item->widget != NULL) { if (g != NULL) { Widget *wg = WIDGET (g); HLINE (item->widget)->auto_adjust_cols = FALSE; item->widget->x = wg->x + 1 - WIDGET (wg->owner)->x; item->widget->cols = wg->cols; } else if (two_columns) { HLINE (item->widget)->auto_adjust_cols = FALSE; if (item->widget->x != x1) item->widget->x = x2; item->widget->x--; item->widget->cols = column_width + 2; } else HLINE (item->widget)->auto_adjust_cols = TRUE; } break; case quick_start_columns: two_columns = TRUE; break; case quick_stop_columns: two_columns = FALSE; break; case quick_buttons: /* several buttons in bottom line */ put_buttons = TRUE; break; default: break; } if (item->widget != NULL) { unsigned long id; /* add widget into dialog */ item->widget->options |= item->quick_widget->options; /* FIXME: cannot reset flags, setup only */ id = add_widget_autopos (dd, item->widget, item->quick_widget->pos_flags, NULL); if (item->quick_widget->id != NULL) *item->quick_widget->id = id; } } while (nskip-- != 0) { dd->current = g_list_next (dd->current); if (dd->current == NULL) dd->current = dd->widgets; } return_val = run_dlg (dd); /* Get the data if we found something interesting */ if (return_val != B_CANCEL) for (i = 0; i < widgets->len; i++) { quick_widget_item_t *item; item = &g_array_index (widgets, quick_widget_item_t, i); switch (item->quick_widget->widget_type) { case quick_checkbox: *item->quick_widget->u.checkbox.state = CHECK (item->widget)->state & C_BOOL; break; case quick_input: if ((quick_widget->u.input.flags & 2) != 0) *item->quick_widget->u.input.result = tilde_expand (INPUT (item->widget)->buffer); else *item->quick_widget->u.input.result = g_strdup (INPUT (item->widget)->buffer); break; case quick_radio: *item->quick_widget->u.radio.value = RADIO (item->widget)->sel; break; default: break; } } destroy_dlg (dd); /* destroy input labels created before */ for (i = 0; i < widgets->len; i++) { quick_widget_item_t *item; item = &g_array_index (widgets, quick_widget_item_t, i); if (item->quick_widget->widget_type == quick_input) g_free (item->quick_widget->u.input.label); } g_array_free (widgets, TRUE); return return_val; }
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; }
char * history_show (GList ** history, Widget * widget, int current) { GList *z, *hlist = NULL, *hi; size_t maxlen, i, count = 0; char *r = NULL; Dlg_head *query_dlg; WListbox *query_list; history_dlg_data hist_data; if (*history == NULL) return NULL; maxlen = str_term_width1 (_("History")) + 2; for (z = *history; z != NULL; z = g_list_previous (z)) { WLEntry *entry; i = str_term_width1 ((char *) z->data); maxlen = max (maxlen, i); count++; entry = g_new0 (WLEntry, 1); /* history is being reverted here */ entry->text = g_strdup ((char *) z->data); hlist = g_list_prepend (hlist, entry); } hist_data.widget = widget; hist_data.count = count; hist_data.maxlen = maxlen; query_dlg = create_dlg (TRUE, 0, 0, 4, 4, dialog_colors, history_dlg_callback, NULL, "[History-query]", _("History"), DLG_COMPACT); query_dlg->data = &hist_data; query_list = listbox_new (1, 1, 2, 2, TRUE, NULL); /* this call makes list stick to all sides of dialog, effectively make it be resized with dialog */ add_widget_autopos (query_dlg, query_list, WPOS_KEEP_ALL, NULL); /* to avoid diplicating of (calculating sizes in two places) code, call dlg_hist_callback function here, to set dialog and controls positions. The main idea - create 4x4 dialog and add 2x2 list in center of it, and let dialog function resize it to needed size. */ history_dlg_callback (query_dlg, NULL, DLG_RESIZE, 0, NULL); if (query_dlg->y < widget->y) { /* draw list entries from bottom upto top */ listbox_set_list (query_list, hlist); if (current < 0 || (size_t) current >= count) listbox_select_last (query_list); else listbox_select_entry (query_list, count - 1 - (size_t) current); } else { /* draw list entries from top downto bottom */ /* revert history direction */ hlist = g_list_reverse (hlist); listbox_set_list (query_list, hlist); if (current > 0) listbox_select_entry (query_list, current); } if (run_dlg (query_dlg) != B_CANCEL) { char *q; listbox_get_current (query_list, &q, NULL); r = g_strdup (q); } /* get modified history from dialog */ z = NULL; for (hi = query_list->list; hi != NULL; hi = g_list_next (hi)) { WLEntry *entry; entry = (WLEntry *) hi->data; /* history is being reverted here again */ z = g_list_prepend (z, entry->text); entry->text = NULL; } /* restore history direction */ if (query_dlg->y < widget->y) z = g_list_reverse (z); destroy_dlg (query_dlg); g_list_foreach (*history, (GFunc) g_free, NULL); g_list_free (*history); *history = g_list_last (z); return r; }
void file_op_context_create_ui_without_init (FileOpContext * ctx, gboolean with_eta, filegui_dialog_type_t dialog_type) { FileOpContextUI *ui; int minus = 0, total_reserve = 0; const char *abort_button_label = N_("&Abort"); const char *skip_button_label = N_("&Skip"); int abort_button_width, skip_button_width, buttons_width; int dlg_width; g_return_if_fail (ctx != NULL); g_return_if_fail (ctx->ui == NULL); #ifdef ENABLE_NLS abort_button_label = _(abort_button_label); skip_button_label = _(skip_button_label); #endif abort_button_width = str_term_width1 (abort_button_label) + 3; skip_button_width = str_term_width1 (skip_button_label) + 3; buttons_width = abort_button_width + skip_button_width + 2; dlg_width = max (WX, buttons_width + 6); ui = g_new0 (FileOpContextUI, 1); ctx->ui = ui; ctx->dialog_type = dialog_type; switch (dialog_type) { case FILEGUI_DIALOG_ONE_ITEM: total_reserve = 0; minus = verbose ? 0 : 2; break; case FILEGUI_DIALOG_MULTI_ITEM: total_reserve = 5; minus = verbose ? 0 : 7; break; case FILEGUI_DIALOG_DELETE_ITEM: total_reserve = -5; minus = 0; break; } ctx->recursive_result = RECURSIVE_YES; ui->replace_result = REPLACE_YES; ui->showing_eta = with_eta; ui->showing_bps = with_eta; ui->op_dlg = create_dlg (TRUE, 0, 0, WY - minus + 1 + total_reserve, dlg_width, dialog_colors, NULL, NULL, op_names[ctx->operation], DLG_CENTER | DLG_REVERSE); add_widget (ui->op_dlg, button_new (WY - minus - 2 + total_reserve, dlg_width / 2 + 1, FILE_ABORT, NORMAL_BUTTON, abort_button_label, NULL)); add_widget (ui->op_dlg, button_new (WY - minus - 2 + total_reserve, dlg_width / 2 - 1 - skip_button_width, FILE_SKIP, NORMAL_BUTTON, skip_button_label, NULL)); if (verbose && dialog_type == FILEGUI_DIALOG_MULTI_ITEM) { add_widget (ui->op_dlg, hline_new (8, 1, dlg_width - 2)); add_widget (ui->op_dlg, ui->total_bytes_label = label_new (8, FCOPY_LABEL_X + 15, "")); add_widget (ui->op_dlg, ui->progress_total_gauge = gauge_new (9, FCOPY_LABEL_X + 3, 0, 100, 0)); add_widget (ui->op_dlg, ui->total_files_processed_label = label_new (11, FCOPY_LABEL_X, "")); add_widget (ui->op_dlg, ui->time_label = label_new (12, FCOPY_LABEL_X, "")); } add_widget (ui->op_dlg, ui->progress_file_label = label_new (7, FCOPY_LABEL_X, "")); add_widget (ui->op_dlg, ui->progress_file_gauge = gauge_new (6, FCOPY_LABEL_X + 3, 0, 100, 0)); add_widget (ui->op_dlg, ui->file_string[1] = label_new (5, FCOPY_LABEL_X, "")); add_widget (ui->op_dlg, ui->file_label[1] = label_new (4, FCOPY_LABEL_X, "")); add_widget (ui->op_dlg, ui->file_string[0] = label_new (3, FCOPY_LABEL_X, "")); add_widget (ui->op_dlg, ui->file_label[0] = label_new (2, FCOPY_LABEL_X, "")); if ((right_panel == current_panel) && !classic_progressbar) { ui->progress_file_gauge->from_left_to_right = FALSE; if (verbose && dialog_type == FILEGUI_DIALOG_MULTI_ITEM) ui->progress_total_gauge->from_left_to_right = FALSE; } }
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 = create_dlg (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_get_default_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); }