No longer need to confirm when launching applications

This commit is contained in:
Pierre Pronchery 2010-05-18 20:07:03 +00:00
parent c7f2e956ae
commit 5aed562176
2 changed files with 42 additions and 28 deletions

View File

@ -55,6 +55,7 @@ struct _DesktopIcon
char * exec;
char * tryexec;
gboolean confirm;
gboolean immutable; /* cannot be deleted */
gboolean selected;
gboolean updated; /* XXX for desktop refresh */
@ -152,9 +153,7 @@ DesktopIcon * desktopicon_new(Desktop * desktop, char const * name,
name++;
}
if((desktopicon = _desktopicon_new_do(desktop, image, name)) == NULL)
{
return NULL;
}
desktopicon->isdir = isdir;
desktopicon_set_executable(desktopicon, isexec);
desktopicon->mimetype = mimetype;
@ -231,6 +230,7 @@ DesktopIcon * desktopicon_new_application(Desktop * desktop, char const * path)
}
desktopicon->exec = exec;
desktopicon->tryexec = tryexec;
desktopicon_set_confirm(desktopicon, FALSE);
desktopicon_set_executable(desktopicon, TRUE);
desktopicon_set_immutable(desktopicon, TRUE);
return desktopicon;
@ -285,6 +285,13 @@ gboolean desktopicon_get_updated(DesktopIcon * desktopicon)
}
/* desktopicon_set_confirm */
void desktopicon_set_confirm(DesktopIcon * desktopicon, gboolean confirm)
{
desktopicon->confirm = confirm;
}
/* desktopicon_set_executable */
void desktopicon_set_executable(DesktopIcon * desktopicon, gboolean executable)
{
@ -375,6 +382,7 @@ static DesktopIcon * _desktopicon_new_do(Desktop * desktop, GdkPixbuf * image,
return NULL;
memset(desktopicon, 0, sizeof(*desktopicon));
desktopicon->desktop = desktop;
desktopicon->confirm = TRUE;
desktopicon->updated = TRUE;
/* window */
desktopicon->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
@ -679,12 +687,41 @@ static void _on_icon_edit(gpointer data)
mime_action(mime, "edit", desktopicon->path);
}
static gboolean _run_confirm(DesktopIcon * desktopicon);
static void _on_icon_run(gpointer data)
{
DesktopIcon * desktopicon = data;
pid_t pid;
if(desktopicon->confirm != FALSE && _run_confirm(desktopicon) != TRUE)
return;
if((pid = fork()) == -1)
desktop_error(desktopicon->desktop, "fork", 0);
else if(pid != 0)
return;
if(desktopicon->tryexec != NULL) /* XXX ugly */
{
execlp(desktopicon->tryexec, desktopicon->tryexec, NULL);
desktop_error(NULL, desktopicon->tryexec, 0);
}
if(desktopicon->exec != NULL)
{
/* FIXME it's actually a format string */
execlp(desktopicon->exec, desktopicon->exec, NULL);
desktop_error(NULL, desktopicon->exec, 0);
}
else
{
execl(desktopicon->path, desktopicon->path, NULL);
desktop_error(NULL, desktopicon->path, 0);
}
exit(127);
}
static gboolean _run_confirm(DesktopIcon * desktopicon)
{
GtkWidget * dialog;
int res;
pid_t pid;
dialog = gtk_message_dialog_new(NULL, GTK_DIALOG_MODAL,
GTK_MESSAGE_WARNING, GTK_BUTTONS_YES_NO, "%s",
@ -697,31 +734,7 @@ static void _on_icon_run(gpointer data)
gtk_window_set_title(GTK_WINDOW(dialog), _("Warning"));
res = gtk_dialog_run(GTK_DIALOG(dialog));
gtk_widget_destroy(dialog);
if(res != GTK_RESPONSE_YES)
return;
if((pid = fork()) == -1)
desktop_error(desktopicon->desktop, "fork", 0);
else if(pid == 0)
{
if(desktopicon->tryexec != NULL) /* XXX ugly */
{
execlp(desktopicon->tryexec, desktopicon->tryexec,
NULL);
desktop_error(NULL, desktopicon->tryexec, 0);
}
if(desktopicon->exec != NULL)
{
/* FIXME it's actually a format string */
execlp(desktopicon->exec, desktopicon->exec, NULL);
desktop_error(NULL, desktopicon->exec, 0);
}
else
{
execl(desktopicon->path, desktopicon->path, NULL);
desktop_error(NULL, desktopicon->path, 0);
}
exit(127);
}
return (res == GTK_RESPONSE_YES) ? TRUE : FALSE;
}
static void _on_icon_open_with(gpointer data)

View File

@ -54,6 +54,7 @@ char const * desktopicon_get_name(DesktopIcon * desktopicon);
char const * desktopicon_get_path(DesktopIcon * desktopicon);
gboolean desktopicon_get_selected(DesktopIcon * desktopicon);
gboolean desktopicon_get_updated(DesktopIcon * desktopicon);
void desktopicon_set_confirm(DesktopIcon * desktopicon, gboolean confirm);
void desktopicon_set_executable(DesktopIcon * desktopicon, gboolean executable);
void desktopicon_set_first(DesktopIcon * desktopicon, gboolean first);
void desktopicon_set_icon(DesktopIcon * desktopicon, GdkPixbuf * icon);