Prepare the transition to libDesktop's MimeHandler class
This commit is contained in:
parent
8b0e490d7a
commit
bd625a4482
184
tools/settings.c
184
tools/settings.c
|
@ -72,6 +72,9 @@ typedef enum _SettingsColumn
|
||||||
static int _settings(void);
|
static int _settings(void);
|
||||||
|
|
||||||
/* accessors */
|
/* accessors */
|
||||||
|
static int _mimehandler_can_display(Config * config);
|
||||||
|
static int _mimehandler_can_execute(Config * config);
|
||||||
|
static int _mimehandler_is_deleted(Config * config);
|
||||||
static gboolean _settings_get_iter(Settings * settings, GtkTreeIter * iter,
|
static gboolean _settings_get_iter(Settings * settings, GtkTreeIter * iter,
|
||||||
GtkTreePath * path);
|
GtkTreePath * path);
|
||||||
static GtkTreeModel * _settings_get_model(Settings * settings);
|
static GtkTreeModel * _settings_get_model(Settings * settings);
|
||||||
|
@ -216,6 +219,116 @@ static void _settings_on_item_activated(GtkWidget * widget, GtkTreePath * path,
|
||||||
|
|
||||||
|
|
||||||
/* accessors */
|
/* accessors */
|
||||||
|
/* mimehandler_can_display */
|
||||||
|
static gboolean _mimehandler_can_display(Config * config)
|
||||||
|
{
|
||||||
|
const char section[] = "Desktop Entry";
|
||||||
|
String const * p;
|
||||||
|
|
||||||
|
/* FIXME re-implement with libDesktop's MimeHandler class */
|
||||||
|
if(_mimehandler_is_deleted(config))
|
||||||
|
return 0;
|
||||||
|
if(config_get(config, section, "OnlyShowIn") != NULL)
|
||||||
|
return 0;
|
||||||
|
return ((p = config_get(config, section, "NoDisplay")) == NULL
|
||||||
|
|| string_compare(p, "true") != 0) ? 1 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* mimehandler_can_execute */
|
||||||
|
static int _can_execute_access(char const * path, int mode);
|
||||||
|
static int _can_execute_access_path(char const * path, char const * filename,
|
||||||
|
int mode);
|
||||||
|
|
||||||
|
static int _mimehandler_can_execute(Config * config)
|
||||||
|
{
|
||||||
|
const char section[] = "Desktop Entry";
|
||||||
|
String const * p;
|
||||||
|
|
||||||
|
/* FIXME re-implement with libDesktop's MimeHandler class */
|
||||||
|
if((p = config_get(config, section, "Type")) == NULL)
|
||||||
|
return 0;
|
||||||
|
if(string_compare(p, "Application") != 0)
|
||||||
|
return 0;
|
||||||
|
if((p = config_get(config, section, "TryExec")) != NULL
|
||||||
|
&& _can_execute_access(p, X_OK) <= 0)
|
||||||
|
return 0;
|
||||||
|
return (config_get(config, section, "Exec") != NULL) ? 1 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int _can_execute_access(char const * path, int mode)
|
||||||
|
{
|
||||||
|
int ret = -1;
|
||||||
|
char const * p;
|
||||||
|
char * q;
|
||||||
|
size_t i;
|
||||||
|
size_t j;
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
fprintf(stderr, "DEBUG: %s(\"%s\", %d)\n", __func__, path, mode);
|
||||||
|
#endif
|
||||||
|
if(path[0] == '/')
|
||||||
|
return (access(path, mode) == 0) ? 1 : 0;
|
||||||
|
if((p = getenv("PATH")) == NULL)
|
||||||
|
return 0;
|
||||||
|
if((q = string_new(p)) == NULL)
|
||||||
|
return -1;
|
||||||
|
errno = ENOENT;
|
||||||
|
for(i = 0, j = 0;; i++)
|
||||||
|
if(q[i] == '\0')
|
||||||
|
{
|
||||||
|
ret = _can_execute_access_path(&q[j], path, mode);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else if(q[i] == ':')
|
||||||
|
{
|
||||||
|
q[i] = '\0';
|
||||||
|
if((ret = _can_execute_access_path(&q[j], path, mode))
|
||||||
|
> 0)
|
||||||
|
break;
|
||||||
|
j = i + 1;
|
||||||
|
}
|
||||||
|
string_delete(q);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int _can_execute_access_path(char const * path, char const * filename,
|
||||||
|
int mode)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
String * p;
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
fprintf(stderr, "DEBUG: %s(\"%s\", \"%s\", %d)\n", __func__, path,
|
||||||
|
filename, mode);
|
||||||
|
#endif
|
||||||
|
if((p = string_new_append(path, "/", filename, NULL)) == NULL)
|
||||||
|
return -1;
|
||||||
|
ret = (access(p, mode) == 0) ? 1 : 0;
|
||||||
|
string_delete(p);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* mimehandler_is_deleted */
|
||||||
|
static int _mimehandler_is_deleted(Config * config)
|
||||||
|
{
|
||||||
|
const char section[] = "Desktop Entry";
|
||||||
|
String const * p;
|
||||||
|
|
||||||
|
/* FIXME re-implement with libDesktop's MimeHandler class */
|
||||||
|
if((p = config_get(config, section, "Hidden")) != NULL
|
||||||
|
&& string_compare(p, "true") == 0)
|
||||||
|
return 1;
|
||||||
|
if((p = config_get(config, section, "Type")) == NULL)
|
||||||
|
return 1;
|
||||||
|
if(string_compare(p, "Application") == 0)
|
||||||
|
if(_mimehandler_can_execute(config) <= 0)
|
||||||
|
return 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* settings_get_iter */
|
/* settings_get_iter */
|
||||||
static gboolean _settings_get_iter(Settings * settings, GtkTreeIter * iter,
|
static gboolean _settings_get_iter(Settings * settings, GtkTreeIter * iter,
|
||||||
GtkTreePath * path)
|
GtkTreePath * path)
|
||||||
|
@ -250,9 +363,6 @@ static GtkTreeModel * _settings_get_model(Settings * settings)
|
||||||
/* settings_browse */
|
/* settings_browse */
|
||||||
static int _settings_browse_folder(Settings * settings, Config * config,
|
static int _settings_browse_folder(Settings * settings, Config * config,
|
||||||
char const * folder);
|
char const * folder);
|
||||||
static int _settings_browse_folder_access(char const * filename, int mode);
|
|
||||||
static int _settings_browse_folder_access_path(char const * path,
|
|
||||||
char const * filename, int mode);
|
|
||||||
static int _settings_browse_home(Settings * settings, Config * config);
|
static int _settings_browse_home(Settings * settings, Config * config);
|
||||||
|
|
||||||
static int _settings_browse(Settings * settings)
|
static int _settings_browse(Settings * settings)
|
||||||
|
@ -310,7 +420,6 @@ static int _settings_browse_folder(Settings * settings, Config * config,
|
||||||
{
|
{
|
||||||
const char ext[8] = ".desktop";
|
const char ext[8] = ".desktop";
|
||||||
const char section[] = "Desktop Entry";
|
const char section[] = "Desktop Entry";
|
||||||
const char application[] = "Application";
|
|
||||||
const int flags = GTK_ICON_LOOKUP_FORCE_SIZE;
|
const int flags = GTK_ICON_LOOKUP_FORCE_SIZE;
|
||||||
const gint iconsize = 48;
|
const gint iconsize = 48;
|
||||||
GtkIconTheme * theme;
|
GtkIconTheme * theme;
|
||||||
|
@ -365,21 +474,18 @@ static int _settings_browse_folder(Settings * settings, Config * config,
|
||||||
_settings_error(error_get(NULL), 1);
|
_settings_error(error_get(NULL), 1);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
p = config_get(config, section, "Type");
|
if(_mimehandler_can_display(config) == 0)
|
||||||
|
continue;
|
||||||
name = config_get(config, section, "Name");
|
name = config_get(config, section, "Name");
|
||||||
exec = config_get(config, section, "Exec");
|
exec = config_get(config, section, "Exec");
|
||||||
if(p == NULL || name == NULL || exec == NULL
|
if(name == NULL || exec == NULL
|
||||||
|| strcmp(exec, PROGNAME_SETTINGS) == 0)
|
|| strcmp(exec, PROGNAME_SETTINGS) == 0)
|
||||||
continue;
|
continue;
|
||||||
if(strcmp(p, application) != 0)
|
|
||||||
continue;
|
|
||||||
if((p = config_get(config, section, "Categories")) == NULL
|
if((p = config_get(config, section, "Categories")) == NULL
|
||||||
|| string_find(p, "Settings") == NULL)
|
|| string_find(p, "Settings") == NULL)
|
||||||
continue;
|
continue;
|
||||||
if((p = config_get(config, section, "TryExec")) != NULL
|
if(_mimehandler_can_execute(config) <= 0)
|
||||||
&& _settings_browse_folder_access(p, X_OK)
|
continue;
|
||||||
!= 0 && errno == ENOENT)
|
|
||||||
continue;
|
|
||||||
if((icon = config_get(config, section, "Icon")) == NULL)
|
if((icon = config_get(config, section, "Icon")) == NULL)
|
||||||
icon = GTK_STOCK_PREFERENCES;
|
icon = GTK_STOCK_PREFERENCES;
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
|
@ -407,60 +513,6 @@ static int _settings_browse_folder(Settings * settings, Config * config,
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int _settings_browse_folder_access(char const * path, int mode)
|
|
||||||
{
|
|
||||||
int ret = -1;
|
|
||||||
char const * p;
|
|
||||||
char * q;
|
|
||||||
size_t i;
|
|
||||||
size_t j;
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
fprintf(stderr, "DEBUG: %s(\"%s\", %d)\n", __func__, path, mode);
|
|
||||||
#endif
|
|
||||||
if(path[0] == '/')
|
|
||||||
return access(path, mode);
|
|
||||||
if((p = getenv("PATH")) == NULL)
|
|
||||||
return 0;
|
|
||||||
if((q = string_new(p)) == NULL)
|
|
||||||
return -1;
|
|
||||||
errno = ENOENT;
|
|
||||||
for(i = 0, j = 0;; i++)
|
|
||||||
if(q[i] == '\0')
|
|
||||||
{
|
|
||||||
ret = _settings_browse_folder_access_path(&q[j], path,
|
|
||||||
mode);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else if(q[i] == ':')
|
|
||||||
{
|
|
||||||
q[i] = '\0';
|
|
||||||
if((ret = _settings_browse_folder_access_path(&q[j],
|
|
||||||
path, mode)) == 0)
|
|
||||||
break;
|
|
||||||
j = i + 1;
|
|
||||||
}
|
|
||||||
string_delete(q);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int _settings_browse_folder_access_path(char const * path,
|
|
||||||
char const * filename, int mode)
|
|
||||||
{
|
|
||||||
int ret;
|
|
||||||
String * p;
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
fprintf(stderr, "DEBUG: %s(\"%s\", \"%s\", %d)\n", __func__, path,
|
|
||||||
filename, mode);
|
|
||||||
#endif
|
|
||||||
if((p = string_new_append(path, "/", filename, NULL)) == NULL)
|
|
||||||
return -1;
|
|
||||||
ret = access(p, mode);
|
|
||||||
string_delete(p);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int _settings_browse_home(Settings * settings, Config * config)
|
static int _settings_browse_home(Settings * settings, Config * config)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user