static void select_row_cb(GtkWidget *clist, gint row, gint col, GdkEvent *event, FileView *view) { view->row = row; if (curr_view != view) switch_views(); if (event && (event->type == GDK_2BUTTON_PRESS)) open_cb(NULL); }
static void mouse_click_cb(GtkWidget *widget, GdkEventButton *event, FileView *view) { if (event->button == 1) { /* Left Button: selection */ if (curr_view != view) { switch_views(); gtk_widget_grab_focus(view->clist); } } else if (event->button == 2) { /* Middle Button: Drag and Drop */ GtkTargetList *list; GdkDragContext *context; list = gtk_target_list_new(target_table, n_targets); context = gtk_drag_begin(curr_view->clist, list, GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK | GDK_ACTION_ASK, event->button, (GdkEvent *)event); gtk_drag_set_icon_default(context); } else if (event->button == 3) { /* Right Button: Menu */ if (cfg.windows_right_click && (view->tagged == NULL)) { /* if windows right click is enabled, we want to select the file */ gint xmouse,ymouse,row,column; GdkModifierType mask; gdk_window_get_pointer(GTK_CLIST(view->clist)->clist_window, &xmouse, &ymouse, &mask); gtk_clist_get_selection_info(GTK_CLIST(view->clist), xmouse, ymouse, &row, &column); /* don't screw up the current selection */ if (!clist_row_is_selected(view->clist, row)) gtk_clist_unselect_all(GTK_CLIST(view->clist)); focus_row(view, row, FALSE, FALSE, TRUE); } if (event->state & GDK_CONTROL_MASK) show_user_command_menu(event->button, event->time); else show_menu(event->button, event->time); } }
int main(int argc, char *argv[]) { char dir[PATH_MAX]; char config_dir[PATH_MAX]; char *console = NULL; int x; int rwin_args = 0; int lwin_args = 0; struct stat stat_buf; setlocale(LC_ALL, ""); getcwd(dir, sizeof(dir)); /* Window initializations */ rwin.curr_line = 0; rwin.top_line = 0; rwin.list_rows = 0; rwin.list_pos = 0; rwin.selected_filelist = NULL; rwin.history_num = 0; rwin.invert = 0; rwin.color_scheme = 0; lwin.curr_line = 0; lwin.top_line = 0; lwin.list_rows = 0; lwin.list_pos = 0; lwin.selected_filelist = NULL; lwin.history_num = 0; lwin.invert = 0; lwin.color_scheme = 0; /* These need to be initialized before reading the configuration file */ cfg.command_num = 0; cfg.filetypes_num = 0; cfg.nmapped_num = 0; cfg.vim_filter = 0; cfg.show_one_window = 0; command_list = NULL; filetypes = NULL; cfg.search_history_len = 15; cfg.search_history_num = -1; cfg.search_history = (char **)calloc(cfg.search_history_len, sizeof(char*)); cfg.cmd_history_len = 15; cfg.cmd_history_num = -1; cfg.cmd_history = (char **)calloc(cfg.cmd_history_len, sizeof(char *)); cfg.auto_execute = 0; cfg.color_scheme_num = 0; cfg.color_pairs_num = 0; col_schemes = malloc(sizeof(Col_scheme) * 8); /* Maximum argument length to pass to the shell */ if (! (cfg.max_args = sysconf(_SC_ARG_MAX)) > 0) cfg.max_args = 4096; /* POSIX MINIMUM */ init_config(); set_config_dir(); read_config_file(); /* Safety check for existing vifmrc file without FUSE_HOME */ if (cfg.fuse_home == NULL) cfg.fuse_home = strdup("/tmp/vifm_FUSE"); /* Misc configuration */ lwin.prev_invert = lwin.invert; lwin.hide_dot = 1; strncpy(lwin.regexp, "\\..~$", sizeof(lwin.regexp)); rwin.prev_invert = rwin.invert; rwin.hide_dot = 1; strncpy(rwin.regexp, "\\..~$", sizeof(rwin.regexp)); cfg.timer = 10; curr_stats.yanked_files = NULL; curr_stats.num_yanked_files = 0; curr_stats.need_redraw = 0; curr_stats.getting_input = 0; curr_stats.menu = 0; curr_stats.redraw_menu = 0; curr_stats.is_updir = 0; curr_stats.last_char = 0; curr_stats.is_console = 0; curr_stats.search = 0; curr_stats.save_msg = 0; curr_stats.use_register = 0; curr_stats.curr_register = -1; curr_stats.register_saved = 0; curr_stats.show_full = 0; curr_stats.view = 0; if (cfg.show_one_window) curr_stats.number_of_windows = 1; else curr_stats.number_of_windows = 2; snprintf(config_dir, sizeof(config_dir), "%s/vifmrc", cfg.config_dir); if(stat(config_dir, &stat_buf) == 0) curr_stats.config_file_mtime = stat_buf.st_mtime; else curr_stats.config_file_mtime = 0; /* Check if running in X */ console = getenv("DISPLAY"); if(!console || !*console) curr_stats.is_console = 1; /* Setup the ncurses interface. */ if(!setup_ncurses_interface()) return -1; /* Load the initial directory */ snprintf(rwin.curr_dir, sizeof(rwin.curr_dir), "%s", dir); snprintf(lwin.curr_dir, sizeof(lwin.curr_dir), "%s", dir); rwin.dir_entry = (dir_entry_t *)malloc(sizeof(dir_entry_t)); lwin.dir_entry = (dir_entry_t *)malloc(sizeof(dir_entry_t)); rwin.dir_entry[0].name = malloc(sizeof("../") +1); lwin.dir_entry[0].name = malloc(sizeof("../") +1); strcpy(rwin.dir_entry[0].name, "../"); strcpy(lwin.dir_entry[0].name, "../"); change_directory(&rwin, dir); change_directory(&lwin, dir); other_view = &lwin; curr_view = &rwin; /* Get Command Line Arguments */ for(x = 1; x < argc; x++) { if(argv[x] != NULL) { if(!strcmp(argv[x], "-f")) { cfg.vim_filter = 1; } else if(!strcmp(argv[x], "--version")) { endwin(); printf("\n\nvifm %s\n\n", VERSION); exit(0); } else if(!strcmp(argv[x], "--help")) { endwin(); show_help_msg(); exit(0); } else if(is_dir(argv[x])) { if(lwin_args) { snprintf(rwin.curr_dir, sizeof(rwin.curr_dir), "%s", argv[x]); rwin_args++; } else { snprintf(lwin.curr_dir, sizeof(lwin.curr_dir), "%s", argv[x]); lwin_args++; } } else { endwin(); show_help_msg(); exit(0); } } } load_dir_list(&rwin, 0); if (rwin_args) { change_directory(&rwin, rwin.curr_dir); load_dir_list(&rwin, 0); } mvwaddstr(rwin.win, rwin.curr_line, 0, "*"); wrefresh(rwin.win); /* This is needed for the sort_dir_list() which uses curr_view */ switch_views(); load_dir_list(&lwin, 0); if (lwin_args) { change_directory(&lwin, lwin.curr_dir); load_dir_list(&lwin, 0); } moveto_list_pos(&lwin, 0); update_all_windows(); setup_signals(); werase(status_bar); wnoutrefresh(status_bar); /* Need to wait until both lists are loaded before changing one of the * lists to show the file stats. This is only used for starting vifm * from the vifm.vim script */ if(cfg.vim_filter) curr_stats.number_of_windows = 1; /* Enter the main loop. */ main_key_press_cb(curr_view); return 0; }