#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
+#include <glib/gi18n.h>
+
+#ifdef HAVE_SN
+#include <libsn/sn.h>
+#endif
#include "window.h"
#include "server.h"
}
}
-void launcher_action(LauncherIcon *icon)
+void launcher_action(LauncherIcon *icon, XEvent* evt)
{
char *cmd = malloc(strlen(icon->cmd) + 10);
sprintf(cmd, "(%s&)", icon->cmd);
- tint_exec(cmd);
+#if HAVE_SN
+ SnLauncherContext* ctx;
+ Time time;
+
+ ctx = sn_launcher_context_new(server.sn_dsp, server.screen);
+ sn_launcher_context_set_name(ctx, icon->icon_tooltip);
+ sn_launcher_context_set_description(ctx, "Application launched from tint2");
+ sn_launcher_context_set_binary_name (ctx, icon->cmd);
+ // Get a timestamp from the X event
+ if (evt->type == ButtonPress || evt->type == ButtonRelease) {
+ time = evt->xbutton.time;
+ }
+ else {
+ fprintf(stderr, "Unknown X event: %d\n", evt->type);
+ free(cmd);
+ return;
+ }
+ sn_launcher_context_initiate(ctx, "tint2", icon->cmd, time);
+#endif /* HAVE_SN */
+ pid_t pid;
+ pid = fork();
+ if (pid < 0) {
+ fprintf(stderr, "Could not fork\n");
+ }
+ else if (pid == 0) {
+#if HAVE_SN
+ sn_launcher_context_setup_child_process (ctx);
+#endif // HAVE_SN
+ // Allow children to exist after parent destruction
+ setsid ();
+ // Run the command
+ execl("/bin/sh", "/bin/sh", "-c", icon->cmd, NULL);
+
+ fprintf(stderr, "Failed to execlp %s\n", icon->cmd);
+#if HAVE_SN
+ sn_launcher_context_unref (ctx);
+#endif // HAVE_SN
+ _exit(1);
+ }
+#if HAVE_SN
+ else {
+ g_tree_insert (server.pids, GINT_TO_POINTER (pid), ctx);
+ }
+#endif // HAVE_SN
free(cmd);
}
}
}
-//TODO Use UTF8 when parsing the file
int launcher_read_desktop_file(const char *path, DesktopEntry *entry)
{
FILE *fp;
char *line = NULL;
size_t line_size;
char *key, *value;
+ int i;
entry->name = entry->icon = entry->exec = NULL;
return 0;
}
+ gchar **languages = (gchar **)g_get_language_names();
+ // lang_index is the index of the language for the best Name key in the language vector
+ // lang_index_default is a constant that encodes the Name key without a language
+ int lang_index, lang_index_default;
+#define LANG_DBG 0
+ if (LANG_DBG) printf("Languages:");
+ for (i = 0; languages[i]; i++) {
+ if (LANG_DBG) printf(" %s", languages[i]);
+ }
+ if (LANG_DBG) printf("\n");
+ lang_index_default = i;
+ // we currently do not know about any Name key at all, so use an invalid index
+ lang_index = lang_index_default + 1;
+
int inside_desktop_entry = 0;
while (getline(&line, &line_size, fp) >= 0) {
int len = strlen(line);
inside_desktop_entry = (strcmp(line, "[Desktop Entry]") == 0);
}
if (inside_desktop_entry && parse_dektop_line(line, &key, &value)) {
- if (!entry->name && strcmp(key, "Name") == 0) {
- entry->name = strdup(value);
+ if (strstr(key, "Name") == key) {
+ if (strcmp(key, "Name") == 0 && lang_index > lang_index_default) {
+ entry->name = strdup(value);
+ lang_index = lang_index_default;
+ } else {
+ for (i = 0; languages[i] && i < lang_index; i++) {
+ gchar *localized_key = g_strdup_printf("Name[%s]", languages[i]);
+ if (strcmp(key, localized_key) == 0) {
+ if (entry->name)
+ free(entry->name);
+ entry->name = strdup(value);
+ lang_index = i;
+ }
+ g_free(localized_key);
+ }
+ }
} else if (!entry->exec && strcmp(key, "Exec") == 0) {
entry->exec = strdup(value);
} else if (!entry->icon && strcmp(key, "Icon") == 0) {