diff options
Diffstat (limited to 'source/dialogs/filebrowser.c')
-rw-r--r-- | source/dialogs/filebrowser.c | 340 |
1 files changed, 175 insertions, 165 deletions
diff --git a/source/dialogs/filebrowser.c b/source/dialogs/filebrowser.c index b2294a3a..80730f17 100644 --- a/source/dialogs/filebrowser.c +++ b/source/dialogs/filebrowser.c @@ -35,7 +35,6 @@ #include <sys/stat.h> #include <dirent.h> - #include "mode.h" #include "helper.h" #include "mode-private.h" @@ -47,13 +46,13 @@ #include "rofi-icon-fetcher.h" - -#define FILEBROWSER_CACHE_FILE "rofi3.filebrowsercache" +#define FILEBROWSER_CACHE_FILE "rofi3.filebrowsercache" /** * The internal data structure holding the private data of the TEST Mode. */ -enum FBFileType { +enum FBFileType +{ UP, DIRECTORY, RFILE, @@ -65,30 +64,31 @@ const char *icon_name[NUM_FILE_TYPES] = "folder", "gtk-file" }; -typedef struct { - char *name; - char *path; +typedef struct +{ + char *name; + char *path; enum FBFileType type; uint32_t icon_fetch_uid; - gboolean link; + gboolean link; } FBFile; typedef struct { - GFile *current_dir; - FBFile *array; - unsigned int array_length; + GFile *current_dir; + FBFile *array; + unsigned int array_length; } FileBrowserModePrivateData; static void free_list ( FileBrowserModePrivateData *pd ) { for ( unsigned int i = 0; i < pd->array_length; i++ ) { - FBFile *fb = & ( pd->array[i] ); + FBFile *fb = &( pd->array[i] ); g_free ( fb->name ); g_free ( fb->path ); } - g_free (pd->array); - pd->array = NULL; + g_free ( pd->array ); + pd->array = NULL; pd->array_length = 0; } #include <sys/types.h> @@ -96,10 +96,10 @@ static void free_list ( FileBrowserModePrivateData *pd ) static gint compare ( gconstpointer a, gconstpointer b, G_GNUC_UNUSED gpointer data ) { - FBFile *fa = (FBFile*)a; - FBFile *fb = (FBFile*)b; - if ( fa->type != fb->type ){ - return (fa->type - fb->type); + FBFile *fa = (FBFile*) a; + FBFile *fb = (FBFile*) b; + if ( fa->type != fb->type ) { + return fa->type - fb->type; } return g_strcmp0 ( fa->name, fb->name ); @@ -113,85 +113,85 @@ static void get_file_browser ( Mode *sw ) * this gets called on plugin initialization. */ char *cdir = g_file_get_path ( pd->current_dir ); - DIR *dir = opendir ( cdir ); + DIR *dir = opendir ( cdir ); if ( dir ) { struct dirent *rd = NULL; - while ((rd = readdir (dir)) != NULL ) - { - if ( g_strcmp0 ( rd->d_name, ".." ) == 0 ){ - pd->array = g_realloc ( pd->array, (pd->array_length+1)*sizeof(FBFile)); - // Rofi expects utf-8, so lets convert the filename. - pd->array[pd->array_length].name = g_strdup ( ".." ); - pd->array[pd->array_length].path = NULL; - pd->array[pd->array_length].type = UP; - pd->array[pd->array_length].icon_fetch_uid = 0; - pd->array[pd->array_length].link = FALSE; - pd->array_length++; - continue; - - } else if ( rd->d_name[0] == '.' ) { + while ( ( rd = readdir ( dir ) ) != NULL ) { + if ( g_strcmp0 ( rd->d_name, ".." ) == 0 ) { + pd->array = g_realloc ( pd->array, ( pd->array_length + 1 ) * sizeof ( FBFile ) ); + // Rofi expects utf-8, so lets convert the filename. + pd->array[pd->array_length].name = g_strdup ( ".." ); + pd->array[pd->array_length].path = NULL; + pd->array[pd->array_length].type = UP; + pd->array[pd->array_length].icon_fetch_uid = 0; + pd->array[pd->array_length].link = FALSE; + pd->array_length++; + continue; + } + else if ( rd->d_name[0] == '.' ) { continue; } switch ( rd->d_type ) { - case DT_BLK: - case DT_CHR: - case DT_FIFO: - case DT_UNKNOWN: - case DT_SOCK: - default: - break; - case DT_REG: - case DT_DIR: - pd->array = g_realloc ( pd->array, (pd->array_length+1)*sizeof(FBFile)); - // Rofi expects utf-8, so lets convert the filename. - pd->array[pd->array_length].name = g_filename_to_utf8 ( rd->d_name, -1, NULL, NULL, NULL); - pd->array[pd->array_length].path = g_build_filename ( cdir, rd->d_name, NULL ); - pd->array[pd->array_length].type = (rd->d_type == DT_DIR)? DIRECTORY: RFILE; - pd->array[pd->array_length].icon_fetch_uid = 0; - pd->array[pd->array_length].link = FALSE; - pd->array_length++; - break; - case DT_LNK: - pd->array = g_realloc ( pd->array, (pd->array_length+1)*sizeof(FBFile)); - // Rofi expects utf-8, so lets convert the filename. - pd->array[pd->array_length].name = g_filename_to_utf8 ( rd->d_name, -1, NULL, NULL, NULL); - pd->array[pd->array_length].path = g_build_filename ( cdir, rd->d_name, NULL ); - pd->array[pd->array_length].icon_fetch_uid = 0; - pd->array[pd->array_length].link = TRUE; - // Default to file. - pd->array[pd->array_length].type = RFILE; - { - // If we have link, use a stat to fine out what it is, if we fail, we mark it as file. - // TODO have a 'broken link' mode? - // Convert full path to right encoding. - char *file = g_filename_from_utf8(pd->array[pd->array_length].path,-1, NULL, NULL, NULL ); - if ( file ) { - struct stat statbuf; - if ( stat(file, &statbuf ) == 0 ) { - if ( S_ISDIR(statbuf.st_mode ) ) { - pd->array[pd->array_length].type = DIRECTORY; - } else if ( S_ISREG ( statbuf.st_mode ) ) { - pd->array[pd->array_length].type = RFILE; - } - } else { - g_warning("Failed to stat file: %s, %s" , file, strerror(errno)); + case DT_BLK: + case DT_CHR: + case DT_FIFO: + case DT_UNKNOWN: + case DT_SOCK: + default: + break; + case DT_REG: + case DT_DIR: + pd->array = g_realloc ( pd->array, ( pd->array_length + 1 ) * sizeof ( FBFile ) ); + // Rofi expects utf-8, so lets convert the filename. + pd->array[pd->array_length].name = g_filename_to_utf8 ( rd->d_name, -1, NULL, NULL, NULL ); + pd->array[pd->array_length].path = g_build_filename ( cdir, rd->d_name, NULL ); + pd->array[pd->array_length].type = ( rd->d_type == DT_DIR ) ? DIRECTORY : RFILE; + pd->array[pd->array_length].icon_fetch_uid = 0; + pd->array[pd->array_length].link = FALSE; + pd->array_length++; + break; + case DT_LNK: + pd->array = g_realloc ( pd->array, ( pd->array_length + 1 ) * sizeof ( FBFile ) ); + // Rofi expects utf-8, so lets convert the filename. + pd->array[pd->array_length].name = g_filename_to_utf8 ( rd->d_name, -1, NULL, NULL, NULL ); + pd->array[pd->array_length].path = g_build_filename ( cdir, rd->d_name, NULL ); + pd->array[pd->array_length].icon_fetch_uid = 0; + pd->array[pd->array_length].link = TRUE; + // Default to file. + pd->array[pd->array_length].type = RFILE; + { + // If we have link, use a stat to fine out what it is, if we fail, we mark it as file. + // TODO have a 'broken link' mode? + // Convert full path to right encoding. + char *file = g_filename_from_utf8 ( pd->array[pd->array_length].path, -1, NULL, NULL, NULL ); + if ( file ) { + struct stat statbuf; + if ( stat ( file, &statbuf ) == 0 ) { + if ( S_ISDIR ( statbuf.st_mode ) ) { + pd->array[pd->array_length].type = DIRECTORY; } - - g_free ( file ); + else if ( S_ISREG ( statbuf.st_mode ) ) { + pd->array[pd->array_length].type = RFILE; + } + } + else { + g_warning ( "Failed to stat file: %s, %s", file, strerror ( errno ) ); } + + g_free ( file ); } - pd->array_length++; - break; - } + } + pd->array_length++; + break; + } } closedir ( dir ); } - g_qsort_with_data ( pd->array, pd->array_length, sizeof (FBFile ), compare, NULL ); + g_qsort_with_data ( pd->array, pd->array_length, sizeof ( FBFile ), compare, NULL ); } - static int file_browser_mode_init ( Mode *sw ) { /** @@ -203,16 +203,16 @@ static int file_browser_mode_init ( Mode *sw ) { char *path = g_build_filename ( cache_dir, FILEBROWSER_CACHE_FILE, NULL ); char *file = NULL; - if ( g_file_get_contents (path, &file, NULL, NULL ) ) { - if ( g_file_test ( file, G_FILE_TEST_IS_DIR ) ){ - pd->current_dir = g_file_new_for_path( file ); + if ( g_file_get_contents ( path, &file, NULL, NULL ) ) { + if ( g_file_test ( file, G_FILE_TEST_IS_DIR ) ) { + pd->current_dir = g_file_new_for_path ( file ); } g_free ( file ); } // Store it based on the unique identifiers (desktop_id). g_free ( path ); if ( pd->current_dir == NULL ) { - pd->current_dir = g_file_new_for_path(g_get_home_dir () ); + pd->current_dir = g_file_new_for_path ( g_get_home_dir () ); } } // Load content. @@ -228,73 +228,76 @@ static unsigned int file_browser_mode_get_num_entries ( const Mode *sw ) static ModeMode file_browser_mode_result ( Mode *sw, int mretv, char **input, unsigned int selected_line ) { - ModeMode retv = MODE_EXIT; - FileBrowserModePrivateData *pd = (FileBrowserModePrivateData *) mode_get_private_data ( sw ); + ModeMode retv = MODE_EXIT; + FileBrowserModePrivateData *pd = (FileBrowserModePrivateData *) mode_get_private_data ( sw ); if ( mretv & MENU_NEXT ) { retv = NEXT_DIALOG; - } else if ( mretv & MENU_PREVIOUS ) { + } + else if ( mretv & MENU_PREVIOUS ) { retv = PREVIOUS_DIALOG; - } else if ( mretv & MENU_QUICK_SWITCH ) { + } + else if ( mretv & MENU_QUICK_SWITCH ) { retv = ( mretv & MENU_LOWER_MASK ); - } else if ( ( mretv & MENU_OK ) ) { - if ( selected_line < pd->array_length ) - { + } + else if ( ( mretv & MENU_OK ) ) { + if ( selected_line < pd->array_length ) { if ( pd->array[selected_line].type == UP ) { GFile *new = g_file_get_parent ( pd->current_dir ); - if ( new ){ - g_object_unref ( pd->current_dir ); - pd->current_dir = new; - free_list (pd); - get_file_browser ( sw ); - return RESET_DIALOG; - } - } else if ( pd->array[selected_line].type == DIRECTORY ) { + if ( new ) { + g_object_unref ( pd->current_dir ); + pd->current_dir = new; + free_list ( pd ); + get_file_browser ( sw ); + return RESET_DIALOG; + } + } + else if ( pd->array[selected_line].type == DIRECTORY ) { char *path = g_build_filename ( cache_dir, FILEBROWSER_CACHE_FILE, NULL ); - g_file_set_contents (path, pd->array[selected_line].path, -1, NULL ); - g_free(path); + g_file_set_contents ( path, pd->array[selected_line].path, -1, NULL ); + g_free ( path ); GFile *new = g_file_new_for_path ( pd->array[selected_line].path ); g_object_unref ( pd->current_dir ); pd->current_dir = new; - free_list (pd); + free_list ( pd ); get_file_browser ( sw ); return RESET_DIALOG; - } else if ( pd->array[selected_line].type == RFILE ) { - char *d = g_filename_from_utf8 (pd->array[selected_line].path, -1, NULL, NULL, NULL); - char *cmd = g_strdup_printf("xdg-open '%s'", d ); - g_free(d); + } + else if ( pd->array[selected_line].type == RFILE ) { + char *d = g_filename_from_utf8 ( pd->array[selected_line].path, -1, NULL, NULL, NULL ); + char *cmd = g_strdup_printf ( "xdg-open '%s'", d ); + g_free ( d ); char *cdir = g_file_get_path ( pd->current_dir ); - helper_execute_command ( cdir,cmd, FALSE,NULL ); + helper_execute_command ( cdir, cmd, FALSE, NULL ); g_free ( cdir ); g_free ( cmd ); return MODE_EXIT; } } retv = RELOAD_DIALOG; - } else if ( (mretv&MENU_CUSTOM_INPUT) && *input ) { - char *p = rofi_expand_path ( *input ); + } + else if ( ( mretv & MENU_CUSTOM_INPUT ) && *input ) { + char *p = rofi_expand_path ( *input ); char *dir = g_filename_from_utf8 ( p, -1, NULL, NULL, NULL ); - g_free (p); - if ( g_file_test ( dir, G_FILE_TEST_EXISTS ) ) - { - if ( g_file_test ( dir, G_FILE_TEST_IS_DIR ) ){ + g_free ( p ); + if ( g_file_test ( dir, G_FILE_TEST_EXISTS ) ) { + if ( g_file_test ( dir, G_FILE_TEST_IS_DIR ) ) { g_object_unref ( pd->current_dir ); pd->current_dir = g_file_new_for_path ( dir ); g_free ( dir ); - free_list (pd); + free_list ( pd ); get_file_browser ( sw ); return RESET_DIALOG; } - } g_free ( dir ); retv = RELOAD_DIALOG; - } else if ( ( mretv & MENU_ENTRY_DELETE ) == MENU_ENTRY_DELETE ) { + } + else if ( ( mretv & MENU_ENTRY_DELETE ) == MENU_ENTRY_DELETE ) { retv = RELOAD_DIALOG; } return retv; } - static void file_browser_mode_destroy ( Mode *sw ) { FileBrowserModePrivateData *pd = (FileBrowserModePrivateData *) mode_get_private_data ( sw ); @@ -311,17 +314,21 @@ static char *_get_display_value ( const Mode *sw, unsigned int selected_line, G_ FileBrowserModePrivateData *pd = (FileBrowserModePrivateData *) mode_get_private_data ( sw ); // Only return the string if requested, otherwise only set state. - if ( !get_entry ) return NULL; - if ( pd->array[selected_line].type == UP ){ - return g_strdup( " .."); - } else { + if ( !get_entry ) { + return NULL; + } + if ( pd->array[selected_line].type == UP ) { + return g_strdup ( " .." ); + } + else { if ( pd->array[selected_line].link ) { - return g_strconcat ( "@", pd->array[selected_line].name, NULL); - } else { - return g_strdup ( pd->array[selected_line].name); + return g_strconcat ( "@", pd->array[selected_line].name, NULL ); + } + else { + return g_strdup ( pd->array[selected_line].name ); } } - return g_strdup("n/a"); + return g_strdup ( "n/a" ); } /** @@ -338,21 +345,21 @@ static int file_browser_token_match ( const Mode *sw, rofi_int_matcher **tokens, FileBrowserModePrivateData *pd = (FileBrowserModePrivateData *) mode_get_private_data ( sw ); // Call default matching function. - return helper_token_match ( tokens, pd->array[index].name); + return helper_token_match ( tokens, pd->array[index].name ); } - static cairo_surface_t *_get_icon ( const Mode *sw, unsigned int selected_line, int height ) { FileBrowserModePrivateData *pd = (FileBrowserModePrivateData *) mode_get_private_data ( sw ); g_return_val_if_fail ( pd->array != NULL, NULL ); - FBFile *dr = &( pd->array[selected_line] ); + FBFile *dr = &( pd->array[selected_line] ); if ( dr->icon_fetch_uid > 0 ) { return rofi_icon_fetcher_get ( dr->icon_fetch_uid ); } - if ( rofi_icon_fetcher_file_is_image ( dr->path ) ){ - dr->icon_fetch_uid = rofi_icon_fetcher_query ( dr->path, height ); - } else { + if ( rofi_icon_fetcher_file_is_image ( dr->path ) ) { + dr->icon_fetch_uid = rofi_icon_fetcher_query ( dr->path, height ); + } + else { dr->icon_fetch_uid = rofi_icon_fetcher_query ( icon_name[dr->type], height ); } return rofi_icon_fetcher_get ( dr->icon_fetch_uid ); @@ -363,25 +370,24 @@ static char * _get_message ( const Mode *sw ) FileBrowserModePrivateData *pd = (FileBrowserModePrivateData *) mode_get_private_data ( sw ); if ( pd->current_dir ) { char *dirname = g_file_get_parse_name ( pd->current_dir ); - char *str = g_markup_printf_escaped("<b>Current directory:</b> %s", dirname); + char *str = g_markup_printf_escaped ( "<b>Current directory:</b> %s", dirname ); g_free ( dirname ); return str; } return "n/a"; } - static char *_get_completion ( const Mode *sw, unsigned int index ) { FileBrowserModePrivateData *pd = (FileBrowserModePrivateData *) mode_get_private_data ( sw ); - char *d = g_strescape ( pd->array[index].path,NULL ); + char *d = g_strescape ( pd->array[index].path, NULL ); return d; } -Mode *create_new_file_browser (void ) +Mode *create_new_file_browser ( void ) { - Mode *sw = g_malloc0(sizeof(Mode)); + Mode *sw = g_malloc0 ( sizeof ( Mode ) ); *sw = file_browser_mode; @@ -392,58 +398,62 @@ Mode *create_new_file_browser (void ) #if 0 ModeMode file_browser_mode_completer ( Mode *sw, int mretv, char **input, unsigned int selected_line, char **path ) { - ModeMode retv = MODE_EXIT; - FileBrowserModePrivateData *pd = (FileBrowserModePrivateData *) mode_get_private_data ( sw ); + ModeMode retv = MODE_EXIT; + FileBrowserModePrivateData *pd = (FileBrowserModePrivateData *) mode_get_private_data ( sw ); if ( mretv & MENU_NEXT ) { retv = NEXT_DIALOG; - } else if ( mretv & MENU_PREVIOUS ) { + } + else if ( mretv & MENU_PREVIOUS ) { retv = PREVIOUS_DIALOG; - } else if ( mretv & MENU_QUICK_SWITCH ) { + } + else if ( mretv & MENU_QUICK_SWITCH ) { retv = ( mretv & MENU_LOWER_MASK ); - } else if ( ( mretv & MENU_OK ) ) { - if ( selected_line < pd->array_length ) - { + } + else if ( ( mretv & MENU_OK ) ) { + if ( selected_line < pd->array_length ) { if ( pd->array[selected_line].type == UP ) { GFile *new = g_file_get_parent ( pd->current_dir ); - if ( new ){ - g_object_unref ( pd->current_dir ); - pd->current_dir = new; - free_list (pd); - get_file_browser ( sw ); - return RESET_DIALOG; - } - } else if ( pd->array[selected_line].type == DIRECTORY ) { + if ( new ) { + g_object_unref ( pd->current_dir ); + pd->current_dir = new; + free_list ( pd ); + get_file_browser ( sw ); + return RESET_DIALOG; + } + } + else if ( pd->array[selected_line].type == DIRECTORY ) { GFile *new = g_file_new_for_path ( pd->array[selected_line].path ); g_object_unref ( pd->current_dir ); pd->current_dir = new; - free_list (pd); + free_list ( pd ); get_file_browser ( sw ); return RESET_DIALOG; - } else if ( pd->array[selected_line].type == RFILE ) { - *path = g_strescape ( pd->array[selected_line].path,NULL ); + } + else if ( pd->array[selected_line].type == RFILE ) { + *path = g_strescape ( pd->array[selected_line].path, NULL ); return MODE_EXIT; } } retv = RELOAD_DIALOG; - } else if ( (mretv&MENU_CUSTOM_INPUT) && *input ) { - char *p = rofi_expand_path ( *input ); + } + else if ( ( mretv & MENU_CUSTOM_INPUT ) && *input ) { + char *p = rofi_expand_path ( *input ); char *dir = g_filename_from_utf8 ( p, -1, NULL, NULL, NULL ); - g_free (p); - if ( g_file_test ( dir, G_FILE_TEST_EXISTS ) ) - { - if ( g_file_test ( dir, G_FILE_TEST_IS_DIR ) ){ + g_free ( p ); + if ( g_file_test ( dir, G_FILE_TEST_EXISTS ) ) { + if ( g_file_test ( dir, G_FILE_TEST_IS_DIR ) ) { g_object_unref ( pd->current_dir ); pd->current_dir = g_file_new_for_path ( dir ); g_free ( dir ); - free_list (pd); + free_list ( pd ); get_file_browser ( sw ); return RESET_DIALOG; } - } g_free ( dir ); retv = RELOAD_DIALOG; - } else if ( ( mretv & MENU_ENTRY_DELETE ) == MENU_ENTRY_DELETE ) { + } + else if ( ( mretv & MENU_ENTRY_DELETE ) == MENU_ENTRY_DELETE ) { retv = RELOAD_DIALOG; } return retv; |