/* Callback that is called when menu item is selected. Should return non-zero * to stay in menu mode. */ static int execute_commands_cb(FileView *view, menu_info *m) { break_at(m->items[m->pos], ' '); exec_command(m->items[m->pos], view, GET_COMMAND); return 0; }
void append_buf(char c) { if (c == '\n') { break_at(buf.i); reset_buf(""); } else { insert_ch(c); if (buf.i > WRAP_SIZE) { char save[BUFSIZ] = ""; if (buf.inword) { // TODO Handle words too long to wrap strncpy(save, buf.s + buf.wbeg, buf.i - buf.wbeg); buf.wc--; } break_at(buf.wbreak); reset_buf(save); } } }
/* Implementation of :u filename modifier. */ static int apply_u_mod(const char *path, char *buf, size_t buf_len) { if(!is_unc_path(path)) { DWORD size = buf_len - 2; snprintf(buf, buf_len, "//"); GetComputerNameA(buf + 2, &size); return 0; } snprintf(buf, buf_len, "%s", path); break_at(buf + 2, '/'); return 0; }
/* Menu-specific shortcut handler. Returns code that specifies both taken * actions and what should be done next. */ static KHandlerResponse commands_khandler(menu_info *m, const wchar_t keys[]) { if(wcscmp(keys, L"dd") == 0) /* remove element */ { char cmd_buf[512]; break_at(m->items[m->pos], ' '); snprintf(cmd_buf, sizeof(cmd_buf), "delcommand %s", m->items[m->pos]); execute_cmdline_command(cmd_buf); remove_current_item(m); return KHR_REFRESH_WINDOW; } return KHR_UNHANDLED; }
/* Menu-specific shortcut handler. Returns code that specifies both taken * actions and what should be done next. */ static KHandlerResponse commands_khandler(FileView *view, menu_data_t *m, const wchar_t keys[]) { if(wcscmp(keys, L"dd") == 0) /* Remove element. */ { char cmd_buf[512]; break_at(m->items[m->pos], ' '); snprintf(cmd_buf, sizeof(cmd_buf), "cunabbrev %s", m->items[m->pos]); execute_cmdline_command(cmd_buf); remove_current_item(m->state); return KHR_REFRESH_WINDOW; } return KHR_UNHANDLED; }
/* Menu-specific shortcut handler. Returns code that specifies both taken * actions and what should be done next. */ static KHandlerResponse commands_khandler(menu_info *m, const wchar_t keys[]) { if(wcscmp(keys, L"dd") == 0) { /* Remove element. */ char cmd_buf[512]; break_at(m->items[m->pos], ' '); snprintf(cmd_buf, sizeof(cmd_buf), "delcommand %s", m->items[m->pos]); execute_cmdline_command(cmd_buf); remove_current_item(m); return KHR_REFRESH_WINDOW; } else if(wcscmp(keys, L"c") == 0) { const char *const rhs = skip_whitespace(after_first(m->items[m->pos], ' ')); /* Insert command RHS. */ if(rhs[0] == ':') { menu_morph_into_cmdline(CLS_COMMAND, skip_whitespace(rhs + 1), 0); } else if(rhs[0] == '/') { menu_morph_into_cmdline(CLS_FSEARCH, rhs + 1, 0); } else if(rhs[0] == '=') { menu_morph_into_cmdline(CLS_FILTER, rhs + 1, 0); } else { /* filter commands go here. */ menu_morph_into_cmdline(CLS_COMMAND, rhs, (rhs[0] != '!')); } return KHR_MORPHED_MENU; } return KHR_UNHANDLED; }
/* 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); }