drun now actually works

This commit is contained in:
Scoopta 2019-08-17 20:58:06 -07:00
parent 67e6dce992
commit ff58351a73

View File

@ -71,6 +71,8 @@ static void do_run(GtkWidget* box) {
if(access(full_path, X_OK) == 0 && S_ISREG(info.st_mode)) { if(access(full_path, X_OK) == 0 && S_ISREG(info.st_mode)) {
GtkWidget* label = gtk_label_new(entry->d_name); GtkWidget* label = gtk_label_new(entry->d_name);
gtk_widget_set_name(label, "unselected"); gtk_widget_set_name(label, "unselected");
gtk_widget_set_tooltip_text(label, full_path);
gtk_widget_set_has_tooltip(label, FALSE);
gtk_label_set_xalign(GTK_LABEL(label), 0); gtk_label_set_xalign(GTK_LABEL(label), 0);
gtk_container_add(GTK_CONTAINER(box), label); gtk_container_add(GTK_CONTAINER(box), label);
} }
@ -128,18 +130,22 @@ static void do_drun(GtkWidget* box) {
} }
char* full_path = utils_concat(3, app_dir, "/", entry->d_name); char* full_path = utils_concat(3, app_dir, "/", entry->d_name);
GDesktopAppInfo* info = g_desktop_app_info_new_from_filename(full_path); GDesktopAppInfo* info = g_desktop_app_info_new_from_filename(full_path);
free(full_path);
if(!G_IS_DESKTOP_APP_INFO(info)) { if(!G_IS_DESKTOP_APP_INFO(info)) {
free(full_path);
continue; continue;
} }
const gchar* name = g_desktop_app_info_get_string(info, "Name"); const char* name = g_app_info_get_display_name(G_APP_INFO(info));
if(name == NULL) { if(name == NULL) {
free(full_path);
continue; continue;
} }
GtkWidget* label = gtk_label_new(name); GtkWidget* label = gtk_label_new(name);
gtk_widget_set_name(label, "unselected"); gtk_widget_set_name(label, "unselected");
gtk_widget_set_tooltip_text(label, full_path);
gtk_widget_set_has_tooltip(label, FALSE);
gtk_label_set_xalign(GTK_LABEL(label), 0); gtk_label_set_xalign(GTK_LABEL(label), 0);
gtk_container_add(GTK_CONTAINER(box), label); gtk_container_add(GTK_CONTAINER(box), label);
free(full_path);
} }
closedir(dir); closedir(dir);
cont: cont:
@ -157,6 +163,17 @@ static void execute_action(char* mode, const gchar* cmd) {
} else if(strcmp(mode, "dmenu") == 0) { } else if(strcmp(mode, "dmenu") == 0) {
printf("%s\n", cmd); printf("%s\n", cmd);
exit(0); exit(0);
} else if(strcmp(mode, "drun") == 0) {
GDesktopAppInfo* info = g_desktop_app_info_new_from_filename(cmd);
if(G_IS_DESKTOP_APP_INFO(info)) {
const char* exec = g_app_info_get_executable(G_APP_INFO(info));
execlp(exec, exec, NULL);
fprintf(stderr, "%s cannot be executed\n", exec);
exit(errno);
} else {
fprintf(stderr, "%s cannot be executed\n", cmd);
exit(1);
}
} }
} }
@ -164,7 +181,7 @@ static void activate_item(GtkListBox* box, GtkListBoxRow* row, gpointer data) {
(void) box; (void) box;
char* mode = data; char* mode = data;
GtkWidget* label = gtk_bin_get_child(GTK_BIN(row)); GtkWidget* label = gtk_bin_get_child(GTK_BIN(row));
execute_action(mode, gtk_label_get_text(GTK_LABEL(label))); execute_action(mode, gtk_widget_get_tooltip_text(label));
} }
static void select_item(GtkListBox* box, GtkListBoxRow* row, gpointer data) { static void select_item(GtkListBox* box, GtkListBoxRow* row, gpointer data) {