void file_progress_show_total (FileOpTotalContext * tctx, FileOpContext * ctx, uintmax_t copyed_bytes, gboolean show_summary) { char buffer[BUF_TINY]; char buffer2[BUF_TINY]; char buffer3[BUF_TINY]; char buffer4[BUF_TINY]; struct timeval tv_current; FileOpContextUI *ui; g_return_if_fail (ctx != NULL); g_return_if_fail (ctx->ui != NULL); ui = ctx->ui; if (ctx->progress_bytes != 0) { gauge_set_value (ui->progress_total_gauge, 1024, (int) (1024 * copyed_bytes / ctx->progress_bytes)); gauge_show (ui->progress_total_gauge, 1); } else gauge_show (ui->progress_total_gauge, 0); if (!show_summary && tctx->bps == 0) return; gettimeofday (&tv_current, NULL); file_frmt_time (buffer2, tv_current.tv_sec - tctx->transfer_start.tv_sec); file_eta_prepare_for_show (buffer3, tctx->eta_secs, TRUE); file_bps_prepare_for_show (buffer4, (long) tctx->bps); g_snprintf (buffer, BUF_TINY, _("Time: %s %s (%s)"), buffer2, buffer3, buffer4); label_set_text (ui->time_label, buffer); size_trunc_len (buffer2, 5, tctx->copyed_bytes, 0, panels_options.kilobyte_si); size_trunc_len (buffer3, 5, ctx->progress_bytes, 0, panels_options.kilobyte_si); g_snprintf (buffer, BUF_TINY, _("Total: %s of %s"), buffer2, buffer3); label_set_text (ui->total_bytes_label, buffer); }
static void mcview_display_status (WView * view) { const screen_dimen top = view->status_area.top; const screen_dimen left = view->status_area.left; const screen_dimen width = view->status_area.width; const screen_dimen height = view->status_area.height; const char *file_label; if (height < 1) return; tty_setcolor (STATUSBAR_COLOR); tty_draw_hline (WIDGET (view)->y + top, WIDGET (view)->x + left, ' ', width); file_label = view->filename_vpath != NULL ? vfs_path_get_last_path_str (view->filename_vpath) : view->command != NULL ? view->command : ""; if (width > 40) { widget_move (view, top, width - 32); if (view->hex_mode) tty_printf ("0x%08" PRIxMAX, (uintmax_t) view->hex_cursor); else { char buffer[BUF_TRUNC_LEN + 1]; size_trunc_len (buffer, BUF_TRUNC_LEN, mcview_get_filesize (view), 0, panels_options.kilobyte_si); tty_printf ("%9" PRIuMAX "/%s%s %s", (uintmax_t) view->dpy_end, buffer, mcview_may_still_grow (view) ? "+" : " ", #ifdef HAVE_CHARSET mc_global.source_codepage >= 0 ? get_codepage_id (mc_global.source_codepage) : #endif ""); } } widget_move (view, top, left); if (width > 40) tty_print_string (str_fit_to_term (file_label, width - 34, J_LEFT_FIT)); else tty_print_string (str_fit_to_term (file_label, width - 5, J_LEFT_FIT)); if (width > 26) mcview_display_percent (view, view->hex_mode ? view->hex_cursor : view->dpy_end); }
static void mcview_display_status (mcview_t * view) { const screen_dimen top = view->status_area.top; const screen_dimen left = view->status_area.left; const screen_dimen width = view->status_area.width; const screen_dimen height = view->status_area.height; const char *file_label; screen_dimen file_label_width; if (height < 1) return; tty_setcolor (STATUSBAR_COLOR); widget_move (view, top, left); tty_draw_hline (-1, -1, ' ', width); file_label = view->filename ? view->filename : view->command ? view->command : ""; file_label_width = str_term_width1 (file_label) - 2; if (width > 40) { char buffer[BUF_TINY]; widget_move (view, top, width - 32); if (view->hex_mode) tty_printf ("0x%08" PRIxMAX, (uintmax_t) view->hex_cursor); else { size_trunc_len (buffer, 5, mcview_get_filesize (view), 0, panels_options.kilobyte_si); tty_printf ("%9" PRIuMAX "/%s%s %s", (uintmax_t) view->dpy_end, buffer, mcview_may_still_grow (view) ? "+" : " ", #ifdef HAVE_CHARSET mc_global.source_codepage >= 0 ? get_codepage_id (mc_global.source_codepage) : "" #else "" #endif ); } } widget_move (view, top, left); if (width > 40) tty_print_string (str_fit_to_term (file_label, width - 34, J_LEFT_FIT)); else tty_print_string (str_fit_to_term (file_label, width - 5, J_LEFT_FIT)); if (width > 26) mcview_percent (view, view->hex_mode ? view->hex_cursor : view->dpy_end); }
void chown_cmd (void) { char *fname; struct stat sf_stat; uid_t new_user; gid_t new_group; char buffer[BUF_TINY]; chown_i18n (); do { /* do while any files remaining */ vfs_path_t *vpath; WDialog *ch_dlg; ch_dlg = init_chown (); new_user = new_group = -1; if (current_panel->marked) fname = next_file (); /* next marked file */ else fname = selection (current_panel)->fname; /* single file */ vpath = vfs_path_from_str (fname); if (mc_stat (vpath, &sf_stat) != 0) { /* get status of file */ dlg_destroy (ch_dlg); vfs_path_free (vpath); break; } vfs_path_free (vpath); /* select in listboxes */ listbox_select_entry (l_user, listbox_search_text (l_user, get_owner (sf_stat.st_uid))); listbox_select_entry (l_group, listbox_search_text (l_group, get_group (sf_stat.st_gid))); chown_label (0, str_trunc (fname, GW - 4)); chown_label (1, str_trunc (get_owner (sf_stat.st_uid), GW - 4)); chown_label (2, str_trunc (get_group (sf_stat.st_gid), GW - 4)); size_trunc_len (buffer, GW - 4, sf_stat.st_size, 0, panels_options.kilobyte_si); chown_label (3, buffer); chown_label (4, string_perm (sf_stat.st_mode)); switch (dlg_run (ch_dlg)) { case B_CANCEL: end_chown = 1; break; case B_SETUSR: { struct passwd *user; char *text; listbox_get_current (l_user, &text, NULL); user = getpwnam (text); if (user) { new_user = user->pw_uid; apply_chowns (new_user, new_group); } break; } case B_SETGRP: { struct group *grp; char *text; listbox_get_current (l_group, &text, NULL); grp = getgrnam (text); if (grp) { new_group = grp->gr_gid; apply_chowns (new_user, new_group); } break; } case B_SETALL: case B_ENTER: { struct group *grp; struct passwd *user; char *text; listbox_get_current (l_group, &text, NULL); grp = getgrnam (text); if (grp) new_group = grp->gr_gid; listbox_get_current (l_user, &text, NULL); user = getpwnam (text); if (user) new_user = user->pw_uid; if (ch_dlg->ret_value == B_ENTER) { vfs_path_t *fname_vpath; fname_vpath = vfs_path_from_str (fname); need_update = 1; if (mc_chown (fname_vpath, new_user, new_group) == -1) message (D_ERROR, MSG_ERROR, _("Cannot chown \"%s\"\n%s"), fname, unix_error_string (errno)); vfs_path_free (fname_vpath); } else apply_chowns (new_user, new_group); break; } } /* switch */ if (current_panel->marked && ch_dlg->ret_value != B_CANCEL) { do_file_mark (current_panel, current_file, 0); need_update = 1; } dlg_destroy (ch_dlg); } while (current_panel->marked && !end_chown); chown_done (); }
void file_progress_show_total (FileOpTotalContext * tctx, file_op_context_t * ctx, uintmax_t copied_bytes, gboolean show_summary) { char buffer[BUF_TINY]; char buffer2[BUF_TINY]; char buffer3[BUF_TINY]; file_op_context_ui_t *ui; if (ctx == NULL || ctx->ui == NULL) return; ui = ctx->ui; if (ui->progress_total_gauge != NULL) { if (ctx->progress_bytes == 0) gauge_show (ui->progress_total_gauge, 0); else { gauge_set_value (ui->progress_total_gauge, 1024, (int) (1024 * copied_bytes / ctx->progress_bytes)); gauge_show (ui->progress_total_gauge, 1); } } if (!show_summary && tctx->bps == 0) return; if (ui->time_label != NULL) { struct timeval tv_current; char buffer4[BUF_TINY]; gettimeofday (&tv_current, NULL); file_frmt_time (buffer2, tv_current.tv_sec - tctx->transfer_start.tv_sec); if (ctx->progress_totals_computed) { file_eta_prepare_for_show (buffer3, tctx->eta_secs, TRUE); if (tctx->bps == 0) g_snprintf (buffer, BUF_TINY, _("Time: %s %s"), buffer2, buffer3); else { file_bps_prepare_for_show (buffer4, (long) tctx->bps); g_snprintf (buffer, BUF_TINY, _("Time: %s %s (%s)"), buffer2, buffer3, buffer4); } } else { if (tctx->bps == 0) g_snprintf (buffer, BUF_TINY, _("Time: %s"), buffer2); else { file_bps_prepare_for_show (buffer4, (long) tctx->bps); g_snprintf (buffer, BUF_TINY, _("Time: %s (%s)"), buffer2, buffer4); } } label_set_text (ui->time_label, buffer); } if (ui->total_bytes_label != NULL) { size_trunc_len (buffer2, 5, tctx->copied_bytes, 0, panels_options.kilobyte_si); if (!ctx->progress_totals_computed) g_snprintf (buffer, BUF_TINY, _(" Total: %s "), buffer2); else { size_trunc_len (buffer3, 5, ctx->progress_bytes, 0, panels_options.kilobyte_si); g_snprintf (buffer, BUF_TINY, _(" Total: %s/%s "), buffer2, buffer3); } hline_set_text (ui->total_bytes_label, buffer); } }
/* * 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 (file_op_context_t * ctx, enum OperationMode mode) { #define ADD_RD_BUTTON(i, ypos) \ add_widget_autopos (ui->replace_dlg, \ button_new (ypos, rd_widgets [i].xpos, rd_widgets [i].value, \ NORMAL_BUTTON, rd_widgets [i].text, NULL), \ rd_widgets [i].pos_flags, ui->replace_dlg->current->data) #define ADD_RD_LABEL(i, p1, p2, ypos) \ g_snprintf (buffer, sizeof (buffer), rd_widgets [i].text, p1, p2); \ label2 = WIDGET (label_new (ypos, rd_widgets [i].xpos, buffer)); \ add_widget_autopos (ui->replace_dlg, label2, rd_widgets [i].pos_flags, \ ui->replace_dlg->current != NULL ? ui->replace_dlg->current->data : NULL) /* dialog sizes */ const int rd_ylen = 1; int rd_xlen = 60; int y = 2; unsigned long yes_id; struct { const char *text; int ypos, xpos; widget_pos_flags_t pos_flags; int value; /* 0 for labels */ } rd_widgets[] = { /* *INDENT-OFF* */ /* 0 */ { N_("Target file already exists!"), 3, 4, WPOS_KEEP_TOP | WPOS_CENTER_HORZ, 0 }, /* 1 */ { "%s", 4, 4, WPOS_KEEP_TOP | WPOS_CENTER_HORZ, 0 }, /* 2 */ { N_("New : %s, size %s"), 6, 4, WPOS_KEEP_DEFAULT, 0 }, /* 3 */ { N_("Existing: %s, size %s"), 7, 4, WPOS_KEEP_DEFAULT, 0 }, /* 4 */ { N_("Overwrite this target?"), 9, 4, WPOS_KEEP_DEFAULT, 0 }, /* 5 */ { N_("&Yes"), 9, 28, WPOS_KEEP_DEFAULT, REPLACE_YES }, /* 6 */ { N_("&No"), 9, 37, WPOS_KEEP_DEFAULT, REPLACE_NO }, /* 7 */ { N_("A&ppend"), 9, 45, WPOS_KEEP_DEFAULT, REPLACE_APPEND }, /* 8 */ { N_("&Reget"), 10, 28, WPOS_KEEP_DEFAULT, REPLACE_REGET }, /* 9 */ { N_("Overwrite all targets?"), 11, 4, WPOS_KEEP_DEFAULT, 0 }, /* 10 */ { N_("A&ll"), 11, 28, WPOS_KEEP_DEFAULT, REPLACE_ALWAYS }, /* 11 */ { N_("&Update"), 11, 36, WPOS_KEEP_DEFAULT, REPLACE_UPDATE }, /* 12 */ { N_("Non&e"), 11, 47, WPOS_KEEP_DEFAULT, REPLACE_NEVER }, /* 13 */ { N_("If &size differs"), 12, 28, WPOS_KEEP_DEFAULT, REPLACE_SIZE }, /* 14 */ { N_("&Abort"), 14, 25, WPOS_KEEP_TOP | WPOS_CENTER_HORZ, REPLACE_ABORT } /* *INDENT-ON* */ }; const size_t num = G_N_ELEMENTS (rd_widgets); int *widgets_len; file_op_context_ui_t *ui = ctx->ui; char buffer[BUF_SMALL]; char fsize_buffer[BUF_SMALL]; Widget *label1, *label2; const char *title; vfs_path_t *stripped_vpath; const char *stripped_name; char *stripped_name_orig; int result; widgets_len = g_new0 (int, num); if (mode == Foreground) title = _("File exists"); else title = _("Background process: File exists"); stripped_vpath = vfs_path_from_str (ui->replace_filename); stripped_name = stripped_name_orig = vfs_path_to_str_flags (stripped_vpath, 0, VPF_STRIP_HOME | VPF_STRIP_PASSWORD); vfs_path_free (stripped_vpath); { size_t i; int l1, l2, l, row; int stripped_name_len; 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[4]); /* longest of button rows */ l = l2 = 0; row = 0; for (i = 1; i < num - 1; 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); */ stripped_name_len = str_term_width1 (stripped_name); rd_xlen = max (rd_xlen, min (COLS, stripped_name_len + 8)); /* Now place widgets */ l1 += 5; /* start of first button in the row */ l = l1; row = 0; for (i = 2; i < num - 1; i++) 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; } } /* FIXME - missing help node */ ui->replace_dlg = dlg_create (TRUE, 0, 0, rd_ylen, rd_xlen, alarm_colors, NULL, NULL, "[Replace]", title, DLG_CENTER); /* prompt */ ADD_RD_LABEL (0, "", "", y++); /* file name */ ADD_RD_LABEL (1, "", "", y++); label1 = label2; add_widget (ui->replace_dlg, hline_new (y++, -1, -1)); /* source date and size */ size_trunc_len (fsize_buffer, sizeof (fsize_buffer), ui->s_stat->st_size, 0, panels_options.kilobyte_si); ADD_RD_LABEL (2, file_date (ui->s_stat->st_mtime), fsize_buffer, y++); rd_xlen = max (rd_xlen, label2->cols + 8); /* destination date and size */ size_trunc_len (fsize_buffer, sizeof (fsize_buffer), ui->d_stat->st_size, 0, panels_options.kilobyte_si); ADD_RD_LABEL (3, file_date (ui->d_stat->st_mtime), fsize_buffer, y++); rd_xlen = max (rd_xlen, label2->cols + 8); add_widget (ui->replace_dlg, hline_new (y++, -1, -1)); ADD_RD_LABEL (4, 0, 0, y); /* Overwrite this target? */ yes_id = ADD_RD_BUTTON (5, y); /* Yes */ ADD_RD_BUTTON (6, y); /* No */ /* "this target..." widgets */ if (!S_ISDIR (ui->d_stat->st_mode)) { ADD_RD_BUTTON (7, y++); /* Append */ if ((ctx->operation == OP_COPY) && (ui->d_stat->st_size != 0) && (ui->s_stat->st_size > ui->d_stat->st_size)) ADD_RD_BUTTON (8, y++); /* Reget */ } add_widget (ui->replace_dlg, hline_new (y++, -1, -1)); ADD_RD_LABEL (9, 0, 0, y); /* Overwrite all targets? */ ADD_RD_BUTTON (10, y); /* All" */ ADD_RD_BUTTON (11, y); /* Update */ ADD_RD_BUTTON (12, y++); /* None */ ADD_RD_BUTTON (13, y++); /* If size differs */ add_widget (ui->replace_dlg, hline_new (y++, -1, -1)); ADD_RD_BUTTON (14, y); /* Abort */ label_set_text (LABEL (label1), str_trunc (stripped_name, rd_xlen - 8)); dlg_set_size (ui->replace_dlg, y + 3, rd_xlen); dlg_select_by_id (ui->replace_dlg, yes_id); result = dlg_run (ui->replace_dlg); dlg_destroy (ui->replace_dlg); g_free (widgets_len); g_free (stripped_name_orig); return (result == B_CANCEL) ? REPLACE_ABORT : (replace_action_t) result; #undef ADD_RD_LABEL #undef ADD_RD_BUTTON }
void chown_cmd (void) { char *fname; struct stat sf_stat; WLEntry *fe; Dlg_head *ch_dlg; uid_t new_user; gid_t new_group; char buffer [BUF_TINY]; do { /* do while any files remaining */ ch_dlg = init_chown (); new_user = new_group = -1; if (current_panel->marked) fname = next_file (); /* next marked file */ else fname = selection (current_panel)->fname; /* single file */ if (mc_stat (fname, &sf_stat) != 0) { /* get status of file */ destroy_dlg (ch_dlg); break; } /* select in listboxes */ fe = listbox_search_text (l_user, get_owner(sf_stat.st_uid)); if (fe) listbox_select_entry (l_user, fe); fe = listbox_search_text (l_group, get_group(sf_stat.st_gid)); if (fe) listbox_select_entry (l_group, fe); chown_label (0, name_trunc (fname, 15)); chown_label (1, name_trunc (get_owner (sf_stat.st_uid), 15)); chown_label (2, name_trunc (get_group (sf_stat.st_gid), 15)); size_trunc_len (buffer, 15, sf_stat.st_size, 0); chown_label (3, buffer); chown_label (4, string_perm (sf_stat.st_mode)); run_dlg (ch_dlg); switch (ch_dlg->ret_value) { case B_CANCEL: end_chown = 1; break; case B_SETUSR: { struct passwd *user; user = getpwnam (l_user->current->text); if (user){ new_user = user->pw_uid; apply_chowns (new_user, new_group); } break; } case B_SETGRP: { struct group *grp; grp = getgrnam (l_group->current->text); if (grp){ new_group = grp->gr_gid; apply_chowns (new_user, new_group); } break; } case B_SETALL: case B_ENTER: { struct group *grp; struct passwd *user; grp = getgrnam (l_group->current->text); if (grp) new_group = grp->gr_gid; user = getpwnam (l_user->current->text); if (user) new_user = user->pw_uid; if (ch_dlg->ret_value==B_ENTER) { need_update = 1; if (mc_chown (fname, new_user, new_group) == -1) message (1, MSG_ERROR, _(" Cannot chown \"%s\" \n %s "), fname, unix_error_string (errno)); } else apply_chowns (new_user, new_group); break; } } if (current_panel->marked && ch_dlg->ret_value != B_CANCEL){ do_file_mark (current_panel, current_file, 0); need_update = 1; } destroy_dlg (ch_dlg); } while (current_panel->marked && !end_chown); chown_done (); }