//设置当前文件的一些信息,比如说窗口标题,该文件的路径名等 void MyMdi::SetCurrentFile(const QString &file_name) { current_file_path_ = QFileInfo(file_name).canonicalFilePath();//得到解释过后的绝对路径名 is_saved_ = true;//设置为被保存过,因为该函数是被LoadFile()函数调用的,所以肯定可以被当做是保存过的了 document()->setModified(false);//文档没有被改过 setWindowModified(false);//窗口不显示被更改的标志 setWindowTitle(get_current_file_name() + "[*]");//设置窗口标题 }
void TextWriter::open() { /*IMP_INTERNAL_CHECK(!(file_name_.find("%1%") != std::string::npos && get_frame() == -1), "Cant open file without a frame.");*/ out_ = TextOutput(); out_ = TextOutput(get_current_file_name()); do_open(); }
static void complete_filetype(const char *str) { const char *filename = get_current_file_name(curr_view); assoc_records_t ft = get_all_programs_for_file(filename); complete_progs(str, ft); free(ft.list); complete_progs(str, get_magic_handlers(filename)); vle_compl_finish_group(); vle_compl_add_last_match(str); }
/* Returns increment for curr_y */ static int show_mime_type(FileView *view, int curr_y) { const char* mimetype = NULL; mimetype = get_mimetype(get_current_file_name(view)); mvwaddstr(menu_win, curr_y, 2, "Mime Type: "); if(mimetype == NULL) mimetype = "Unknown"; mvwaddstr(menu_win, curr_y, 13, mimetype); return 2; }
/* Clones one view into another. Path specifies location of active pane and can * be NULL. The destination view is assumed to not own any resources. */ static void clone_view(view_t *dst, view_t *src, const char path[]) { strcpy(dst->curr_dir, path == NULL ? flist_get_dir(src) : path); dst->timestamps_mutex = src->timestamps_mutex; dst->win = src->win; dst->title = src->title; flist_init_view(dst); dst->dir_entry[0].origin = src->curr_dir; clone_local_options(src, dst, 1); matcher_free(dst->manual_filter); dst->manual_filter = matcher_clone(src->manual_filter); filter_assign(&dst->auto_filter, &src->auto_filter); dst->prev_invert = src->prev_invert; dst->invert = src->invert; /* Clone current entry even though we populate file list later to give * reloading reference point for cursor. */ replace_dir_entries(dst, &dst->dir_entry, &dst->list_rows, get_current_entry(src), 1); dst->list_pos = 0; /* Clone viewport configuration. */ dst->curr_line = src->curr_line; dst->top_line = src->top_line; dst->window_rows = src->window_rows; dst->window_cols = src->window_cols; dst->window_cells = src->window_cells; flist_hist_resize(dst, cfg.history_len); flist_hist_clone(dst, src); if(path != NULL && !flist_custom_active(src)) { /* Record location we're leaving. */ flist_hist_save(dst, src->curr_dir, get_current_file_name(src), src->list_pos - src->top_line); } (void)populate_dir_list(dst, path == NULL); /* XXX: do we need to update origins or is this a leftover from before list * population was introduced? */ flist_update_origins(dst, &dst->curr_dir[0], &src->curr_dir[0]); /* Record new location. */ flist_hist_save(dst, NULL, NULL, -1); }
void *run_test(void *arg) { RunContext *ctxt = (RunContext *)arg; Buffer wbuf(BUFFER_SIZE); while (ctxt->current_file < FILES_TO_WRITE) { std::string fname = get_current_file_name(ctxt); int fd; fd = open(fname.c_str(), O_WRONLY | O_CREAT, 0666); while (fd < 0 && errno == ENOSPC) { context_gc(ctxt); fd = open(fname.c_str(), O_WRONLY | O_CREAT, 0666); } if (fd < 0) { std::cout << "Failed to create file: " << errno << std::endl; return NULL; } wbuf.fillAt(ctxt->current_pos); char *buf = wbuf.get(); size_t count = BUFFER_SIZE; off_t pos = ctxt->current_pos; while (count > 0) { ssize_t ret = pwrite(fd, buf, count, pos); if (ret > 0) { buf += ret; pos += ret; count -= ret; } else if (ret == 0 || errno == ENOSPC) { context_gc(ctxt); } else { std::cout << "Write ERROR: " << errno << std::endl; return NULL; } } close(fd); ctxt->current_pos += BUFFER_SIZE; if (ctxt->current_pos >= FILE_SIZE) { ctxt->current_pos = 0; ctxt->current_file++; } } return NULL; }
void update_stat_window(FileView *view) { char name_buf[20]; char perm_buf[26]; char size_buf[56]; char uid_buf[26]; struct passwd *pwd_buf; int x, y; getmaxyx(stat_win, y, x); snprintf(name_buf, sizeof(name_buf), "%s", get_current_file_name(view)); describe_file_size(size_buf, sizeof(size_buf), view->dir_entry[view->list_pos].size); if((pwd_buf = getpwuid(view->dir_entry[view->list_pos].uid)) == NULL) { snprintf (uid_buf, sizeof(uid_buf), " %d", (int) view->dir_entry[view->list_pos].uid); } else { snprintf(uid_buf, sizeof(uid_buf), " %s", pwd_buf->pw_name); } get_perm_string(perm_buf, sizeof(perm_buf), view->dir_entry[view->list_pos].mode); werase(stat_win); mvwaddstr(stat_win, 0, 2, name_buf); mvwaddstr(stat_win, 0, 24, size_buf); mvwaddstr(stat_win, 0, 36, perm_buf); mvwaddstr(stat_win, 0, 46, uid_buf); snprintf(name_buf, sizeof(name_buf), "%d %s filtered", view->filtered, view->filtered == 1 ? "file" : "files"); if(view->filtered > 0) mvwaddstr(stat_win, 0, x - (strlen(name_buf) +2) , name_buf); wnoutrefresh(stat_win); update_pos_window(view); }
void open_dir(FileView *view) { char full_path[PATH_MAX]; const char *filename; filename = get_current_file_name(view); if(is_parent_dir(filename)) { cd_updir(view, 1); return; } get_current_full_path(view, sizeof(full_path), full_path); if(cd_is_possible(full_path)) { navigate_to(view, full_path); } }
bool MyMdi::has_saved() { if(document()->isModified()) { QMessageBox box; box.setWindowTitle(QStringLiteral("多文档编辑器")); box.setText(QStringLiteral("是否保存对%1的更改?").arg(get_current_file_name())); box.setIcon(QMessageBox::Warning);//警告图标 //下面是消息box上添加3个按钮,分别为yes,no,cancel QPushButton *yes_button = box.addButton(QStringLiteral("是"), QMessageBox::YesRole); QPushButton *no_button = box.addButton(QStringLiteral("否"), QMessageBox::NoRole); QPushButton *cancel_button = box.addButton(QStringLiteral("取消"), QMessageBox::RejectRole); box.exec();//在这里等待用户选择3个按钮中的一个 if(box.clickedButton() == yes_button) return Save(); else if(box.clickedButton() == no_button) return true;//不用保存,直接关掉 else if(box.clickedButton() == cancel_button) return false;//什么都不做 } return true;//要么已经保存好了,要么根本就没更改过其内容 }
/* Returns a pointer to newly allocated memory, which should be released by the * caller. */ static char * get_viewer_command(const char viewer[]) { char *result; if(strchr(viewer, '%') == NULL) { char *escaped; FileView *view = curr_stats.preview_hint; if(view == NULL) { view = curr_view; } escaped = escape_filename(get_current_file_name(view), 0); result = format_str("%s %s", viewer, escaped); free(escaped); } else { result = expand_macros(viewer, NULL, NULL, 1); } return result; }
/* mount_point should be an array of at least PATH_MAX characters * Returns non-zero on error. */ static int fuse_mount(FileView *view, char file_full_path[], const char param[], const char program[], char mount_point[]) { /* TODO: refactor this function fuse_mount(). */ int mount_point_id; char buf[2*PATH_MAX]; char *escaped_filename; int foreground; char errors_file[PATH_MAX]; int status; int cancelled; escaped_filename = escape_filename(get_current_file_name(view), 0); mount_point_id = get_last_mount_point_id(fuse_mounts); do { snprintf(mount_point, PATH_MAX, "%s/%03d_%s", cfg.fuse_home, ++mount_point_id, get_current_file_name(view)); } while(path_exists(mount_point, DEREF)); if(os_mkdir(mount_point, S_IRWXU) != 0) { free(escaped_filename); show_error_msg("Unable to create FUSE mount directory", mount_point); return -1; } free(escaped_filename); /* Just before running the mount, I need to chdir out temporarily from any FUSE mounted paths, Otherwise the fuse-zip command fails with "fusermount: failed to open current directory: permission denied" (this happens when mounting JARs from mounted JARs) */ if(vifm_chdir(cfg.fuse_home) != 0) { show_error_msg("FUSE MOUNT ERROR", "Can't chdir() to FUSE home"); return -1; } format_mount_command(mount_point, file_full_path, param, program, sizeof(buf), buf, &foreground); status_bar_message("FUSE mounting selected file, please stand by.."); if(foreground) { def_prog_mode(); endwin(); } generate_tmp_file_name("vifm.errors", errors_file, sizeof(errors_file)); strcat(buf, " 2> "); strcat(buf, errors_file); LOG_INFO_MSG("FUSE mount command: `%s`", buf); status = background_and_wait_for_status(buf, !foreground, &cancelled); clean_status_bar(); /* Check child process exit status. */ if(!WIFEXITED(status) || WEXITSTATUS(status) != EXIT_SUCCESS) { FILE *ef; if(!WIFEXITED(status)) { LOG_ERROR_MSG("FUSE mounter didn't exit!"); } else { LOG_ERROR_MSG("FUSE mount command exit status: %d", WEXITSTATUS(status)); } ef = os_fopen(errors_file, "r"); if(ef == NULL) { LOG_SERROR_MSG(errno, "Failed to open temporary stderr file: %s", errors_file); } show_errors_from_file(ef, "FUSE mounter error"); werase(status_bar); if(cancelled) { status_bar_message("FUSE mount cancelled"); curr_stats.save_msg = 1; } else { show_error_msg("FUSE MOUNT ERROR", file_full_path); } if(unlink(errors_file) != 0) { LOG_SERROR_MSG(errno, "Error file deletion failure: %d", errors_file); } /* Remove the directory we created for the mount. */ (void)rmdir(mount_point); (void)vifm_chdir(flist_get_dir(view)); return -1; } unlink(errors_file); status_bar_message("FUSE mount success"); register_mount(&fuse_mounts, file_full_path, mount_point, mount_point_id); return 0; }
void fuse_try_mount(FileView *view, const char *program) { /* TODO: refactor this function fuse_try_mount() */ fuse_mount_t *runner; char file_full_path[PATH_MAX]; char mount_point[PATH_MAX]; if(!path_exists(cfg.fuse_home)) { if(make_dir(cfg.fuse_home, S_IRWXU) != 0) { show_error_msg("Unable to create FUSE mount home directory", cfg.fuse_home); return; } } snprintf(file_full_path, PATH_MAX, "%s/%s", view->curr_dir, get_current_file_name(view)); /* check if already mounted */ runner = get_mount_by_source(file_full_path); if(runner != NULL) { strcpy(mount_point, runner->mount_point); } else { char param[PATH_MAX] = ""; /* new file to be mounted */ if(starts_with(program, "FUSE_MOUNT2")) { FILE *f; if((f = fopen(file_full_path, "r")) == NULL) { show_error_msg("SSH mount failed", "Can't open file for reading"); curr_stats.save_msg = 1; return; } if(fgets(param, sizeof(param), f) == NULL) { show_error_msg("SSH mount failed", "Can't read file content"); curr_stats.save_msg = 1; fclose(f); return; } fclose(f); chomp(param); if(param[0] == '\0') { show_error_msg("SSH mount failed", "File is empty"); curr_stats.save_msg = 1; return; } } if(fuse_mount(view, file_full_path, param, program, mount_point) != 0) return; } navigate_to(view, mount_point); }
/* * mount_point should be an array of at least PATH_MAX characters * Returns non-zero on error. */ static int fuse_mount(FileView *view, char *file_full_path, const char *param, const char *program, char *mount_point) { /* TODO: refactor this function fuse_mount() */ fuse_mount_t *runner = NULL; int mount_point_id = 0; fuse_mount_t *fuse_item = NULL; char buf[2*PATH_MAX]; char *escaped_filename; int clear_before_mount = 0; char errors_file[PATH_MAX]; int status; escaped_filename = escape_filename(get_current_file_name(view), 0); /* get mount_point_id + mount_point and set runner pointing to the list's * tail */ if(fuse_mounts != NULL) { runner = fuse_mounts; while(runner->next != NULL) runner = runner->next; mount_point_id = runner->mount_point_id; } do { snprintf(mount_point, PATH_MAX, "%s/%03d_%s", cfg.fuse_home, ++mount_point_id, get_current_file_name(view)); } while(path_exists(mount_point)); if(make_dir(mount_point, S_IRWXU) != 0) { free(escaped_filename); show_error_msg("Unable to create FUSE mount directory", mount_point); return -1; } free(escaped_filename); /* Just before running the mount, I need to chdir out temporarily from any FUSE mounted paths, Otherwise the fuse-zip command fails with "fusermount: failed to open current directory: permission denied" (this happens when mounting JARs from mounted JARs) */ if(vifm_chdir(cfg.fuse_home) != 0) { show_error_msg("FUSE MOUNT ERROR", "Can't chdir() to FUSE home"); return -1; } clear_before_mount = format_mount_command(mount_point, file_full_path, param, program, sizeof(buf), buf); status_bar_message("FUSE mounting selected file, please stand by.."); if(clear_before_mount) { def_prog_mode(); endwin(); } generate_tmp_file_name("vifm.errors", errors_file, sizeof(errors_file)); strcat(buf, " 2> "); strcat(buf, errors_file); LOG_INFO_MSG("FUSE mount command: `%s`", buf); status = background_and_wait_for_status(buf); clean_status_bar(); /* check child status */ if(!WIFEXITED(status) || (WIFEXITED(status) && WEXITSTATUS(status))) { FILE *ef = fopen(errors_file, "r"); print_errors(ef); unlink(errors_file); werase(status_bar); /* remove the directory we created for the mount */ if(path_exists(mount_point)) rmdir(mount_point); show_error_msg("FUSE MOUNT ERROR", file_full_path); (void)vifm_chdir(view->curr_dir); return -1; } unlink(errors_file); status_bar_message("FUSE mount success"); fuse_item = malloc(sizeof(*fuse_item)); copy_str(fuse_item->source_file_name, sizeof(fuse_item->source_file_name), file_full_path); strcpy(fuse_item->source_file_dir, view->curr_dir); canonicalize_path(mount_point, fuse_item->mount_point, sizeof(fuse_item->mount_point)); fuse_item->mount_point_id = mount_point_id; fuse_item->next = NULL; if(fuse_mounts == NULL) fuse_mounts = fuse_item; else runner->next = fuse_item; return 0; }
/* Formats status line in the "old way" (before introduction of 'statusline' * option). */ static void update_stat_window_old(FileView *view, int lazy_redraw) { const dir_entry_t *const entry = &view->dir_entry[view->list_pos]; char name_buf[160*2 + 1]; char perm_buf[26]; char size_buf[56]; char id_buf[52]; int x; int cur_x; size_t print_width; char *filename; x = getmaxx(stdscr); wresize(stat_win, 1, x); wbkgdset(stat_win, COLOR_PAIR(cfg.cs.pair[STATUS_LINE_COLOR]) | cfg.cs.color[STATUS_LINE_COLOR].attr); filename = get_current_file_name(view); print_width = utf8_strsnlen(filename, 20 + MAX(0, x - 83)); snprintf(name_buf, MIN(sizeof(name_buf), print_width + 1), "%s", filename); friendly_size_notation(entry->size, sizeof(size_buf), size_buf); get_uid_string(entry, 0, sizeof(id_buf), id_buf); if(id_buf[0] != '\0') strcat(id_buf, ":"); get_gid_string(entry, 0, sizeof(id_buf) - strlen(id_buf), id_buf + strlen(id_buf)); #ifndef _WIN32 get_perm_string(perm_buf, sizeof(perm_buf), entry->mode); #else snprintf(perm_buf, sizeof(perm_buf), "%s", attr_str_long(entry->attrs)); #endif werase(stat_win); cur_x = 2; checked_wmove(stat_win, 0, cur_x); wprint(stat_win, name_buf); cur_x += 22; if(x > 83) cur_x += x - 83; mvwaddstr(stat_win, 0, cur_x, size_buf); cur_x += 12; mvwaddstr(stat_win, 0, cur_x, perm_buf); cur_x += 11; snprintf(name_buf, sizeof(name_buf), "%d %s filtered", view->filtered, (view->filtered == 1) ? "file" : "files"); if(view->filtered > 0) mvwaddstr(stat_win, 0, x - (strlen(name_buf) + 2), name_buf); if(cur_x + strlen(id_buf) + 1 > x - (strlen(name_buf) + 2)) break_at(id_buf, ':'); if(cur_x + strlen(id_buf) + 1 > x - (strlen(name_buf) + 2)) id_buf[0] = '\0'; mvwaddstr(stat_win, 0, cur_x, id_buf); if(lazy_redraw) { wnoutrefresh(stat_win); } else { wrefresh(stat_win); } }
/* Formats status line in the "old way" (before introduction of 'statusline' * option). */ static void update_stat_window_old(view_t *view, int lazy_redraw) { const dir_entry_t *const curr = get_current_entry(view); char name_buf[160*2 + 1]; char perm_buf[26]; char size_buf[64]; char id_buf[52]; int x; int cur_x; size_t print_width; char *filename; if(curr == NULL || fentry_is_fake(curr)) { werase(stat_win); refresh_window(stat_win, lazy_redraw); return; } x = getmaxx(stdscr); wresize(stat_win, 1, x); ui_set_bg(stat_win, &cfg.cs.color[STATUS_LINE_COLOR], cfg.cs.pair[STATUS_LINE_COLOR]); filename = get_current_file_name(view); print_width = utf8_strsnlen(filename, 20 + MAX(0, x - 83)); copy_str(name_buf, MIN(sizeof(name_buf), print_width + 1), filename); friendly_size_notation(fentry_get_size(view, curr), sizeof(size_buf), size_buf); get_uid_string(curr, 0, sizeof(id_buf), id_buf); if(id_buf[0] != '\0') strcat(id_buf, ":"); get_gid_string(curr, 0, sizeof(id_buf) - strlen(id_buf), id_buf + strlen(id_buf)); #ifndef _WIN32 get_perm_string(perm_buf, sizeof(perm_buf), curr->mode); #else copy_str(perm_buf, sizeof(perm_buf), attr_str_long(curr->attrs)); #endif werase(stat_win); cur_x = 2; checked_wmove(stat_win, 0, cur_x); wprint(stat_win, name_buf); cur_x += 22; if(x > 83) cur_x += x - 83; mvwaddstr(stat_win, 0, cur_x, size_buf); cur_x += 12; mvwaddstr(stat_win, 0, cur_x, perm_buf); cur_x += 11; snprintf(name_buf, sizeof(name_buf), "%d %s filtered", view->filtered, (view->filtered == 1) ? "file" : "files"); if(view->filtered > 0) mvwaddstr(stat_win, 0, x - (strlen(name_buf) + 2), name_buf); if(cur_x + strlen(id_buf) + 1 > x - (strlen(name_buf) + 2)) break_at(id_buf, ':'); if(cur_x + strlen(id_buf) + 1 > x - (strlen(name_buf) + 2)) id_buf[0] = '\0'; mvwaddstr(stat_win, 0, cur_x, id_buf); refresh_window(stat_win, lazy_redraw); }