Add config option startup_notifications = 0/1

git-svn-id: http://tint2.googlecode.com/svn/trunk@737 121b4492-b84c-0410-8b4c-0d4edfb3f3cc
This commit is contained in:
o9000 2015-03-21 13:39:43 +00:00 committed by mrovi9000@gmail.com
parent c900bc24b2
commit 5faf063f96
7 changed files with 76 additions and 44 deletions

View file

@ -651,6 +651,9 @@ void add_entry (char *key, char *value)
else if (strcmp(key, "launcher_tooltip") == 0) { else if (strcmp(key, "launcher_tooltip") == 0) {
launcher_tooltip_enabled = atoi(value); launcher_tooltip_enabled = atoi(value);
} }
else if (strcmp(key, "startup_notifications") == 0) {
startup_notifications = atoi(value);
}
/* Tooltip */ /* Tooltip */
else if (strcmp (key, "tooltip_show_timeout") == 0) { else if (strcmp (key, "tooltip_show_timeout") == 0) {

View file

@ -55,6 +55,7 @@ int launcher_brightness;
char *icon_theme_name_config; char *icon_theme_name_config;
char *icon_theme_name_xsettings; char *icon_theme_name_xsettings;
XSettingsClient *xsettings_client; XSettingsClient *xsettings_client;
int startup_notifications;
Imlib_Image scale_icon(Imlib_Image original, int icon_size); Imlib_Image scale_icon(Imlib_Image original, int icon_size);
void free_icon(Imlib_Image icon); void free_icon(Imlib_Image icon);
@ -70,6 +71,7 @@ void default_launcher()
icon_theme_name_config = NULL; icon_theme_name_config = NULL;
icon_theme_name_xsettings = NULL; icon_theme_name_xsettings = NULL;
xsettings_client = NULL; xsettings_client = NULL;
startup_notifications = 0;
} }
@ -118,7 +120,7 @@ void cleanup_launcher()
xsettings_client_destroy(xsettings_client); xsettings_client_destroy(xsettings_client);
for (i = 0 ; i < nb_panel ; i++) { for (i = 0 ; i < nb_panel ; i++) {
Panel *panel = &panel1[i]; Panel *panel = &panel1[i];
Launcher *launcher = &panel->launcher; Launcher *launcher = &panel->launcher;
cleanup_launcher_theme(launcher); cleanup_launcher_theme(launcher);
} }
for (l = panel_config.launcher.list_apps; l ; l = l->next) { for (l = panel_config.launcher.list_apps; l ; l = l->next) {
@ -243,10 +245,10 @@ int resize_launcher(void *obj)
free(new_icon_path); free(new_icon_path);
} else { } else {
// Loaded icon successfully // Loaded icon successfully
launcherIcon->icon_scaled = scale_icon(launcherIcon->icon_original, launcherIcon->icon_size); launcherIcon->icon_scaled = scale_icon(launcherIcon->icon_original, launcherIcon->icon_size);
free(launcherIcon->icon_path); free(launcherIcon->icon_path);
launcherIcon->icon_path = new_icon_path; launcherIcon->icon_path = new_icon_path;
fprintf(stderr, "launcher.c %d: Using icon %s\n", __LINE__, launcherIcon->icon_path); fprintf(stderr, "launcher.c %d: Using icon %s\n", __LINE__, launcherIcon->icon_path);
} }
} }
} }
@ -386,49 +388,54 @@ void launcher_action(LauncherIcon *icon, XEvent* evt)
char *cmd = malloc(strlen(icon->cmd) + 10); char *cmd = malloc(strlen(icon->cmd) + 10);
sprintf(cmd, "(%s&)", icon->cmd); sprintf(cmd, "(%s&)", icon->cmd);
#if HAVE_SN #if HAVE_SN
SnLauncherContext* ctx; SnLauncherContext* ctx;
Time time; Time time;
if (startup_notifications) {
ctx = sn_launcher_context_new(server.sn_dsp, server.screen); ctx = sn_launcher_context_new(server.sn_dsp, server.screen);
sn_launcher_context_set_name(ctx, icon->icon_tooltip); sn_launcher_context_set_name(ctx, icon->icon_tooltip);
sn_launcher_context_set_description(ctx, "Application launched from tint2"); sn_launcher_context_set_description(ctx, "Application launched from tint2");
sn_launcher_context_set_binary_name (ctx, icon->cmd); sn_launcher_context_set_binary_name (ctx, icon->cmd);
// Get a timestamp from the X event // Get a timestamp from the X event
if (evt->type == ButtonPress || evt->type == ButtonRelease) { if (evt->type == ButtonPress || evt->type == ButtonRelease) {
time = evt->xbutton.time; time = evt->xbutton.time;
} } else {
else { fprintf(stderr, "Unknown X event: %d\n", evt->type);
fprintf(stderr, "Unknown X event: %d\n", evt->type);
free(cmd); free(cmd);
return; return;
} }
sn_launcher_context_initiate(ctx, "tint2", icon->cmd, time); sn_launcher_context_initiate(ctx, "tint2", icon->cmd, time);
}
#endif /* HAVE_SN */ #endif /* HAVE_SN */
pid_t pid; pid_t pid;
pid = fork(); pid = fork();
if (pid < 0) { if (pid < 0) {
fprintf(stderr, "Could not fork\n"); fprintf(stderr, "Could not fork\n");
} } else if (pid == 0) {
else if (pid == 0) { // Child process
#if HAVE_SN #if HAVE_SN
sn_launcher_context_setup_child_process (ctx); if (startup_notifications) {
sn_launcher_context_setup_child_process(ctx);
}
#endif // HAVE_SN #endif // HAVE_SN
// Allow children to exist after parent destruction // Allow children to exist after parent destruction
setsid (); setsid();
// Run the command // Run the command
execl("/bin/sh", "/bin/sh", "-c", icon->cmd, NULL); execl("/bin/sh", "/bin/sh", "-c", icon->cmd, NULL);
fprintf(stderr, "Failed to execlp %s\n", icon->cmd); fprintf(stderr, "Failed to execlp %s\n", icon->cmd);
#if HAVE_SN #if HAVE_SN
sn_launcher_context_unref (ctx); if (startup_notifications) {
sn_launcher_context_unref(ctx);
}
#endif // HAVE_SN #endif // HAVE_SN
_exit(1); exit(1);
} } else {
// Parent process
#if HAVE_SN #if HAVE_SN
else { if (startup_notifications) {
g_tree_insert (server.pids, GINT_TO_POINTER (pid), ctx); g_tree_insert(server.pids, GINT_TO_POINTER (pid), ctx);
} }
#endif // HAVE_SN #endif // HAVE_SN
}
free(cmd); free(cmd);
} }

View file

@ -43,6 +43,7 @@ extern int launcher_brightness;
extern char *icon_theme_name_xsettings; // theme name extern char *icon_theme_name_xsettings; // theme name
extern char *icon_theme_name_config; extern char *icon_theme_name_config;
extern XSettingsClient *xsettings_client; extern XSettingsClient *xsettings_client;
extern int startup_notifications;
// default global data // default global data
void default_launcher(); void default_launcher();

View file

@ -148,6 +148,8 @@ static void error_trap_pop(SnDisplay *display, Display *xdisplay)
} }
static void sigchld_handler(int sig) { static void sigchld_handler(int sig) {
if (!startup_notifications)
return;
if (!sn_pipe_valid) if (!sn_pipe_valid)
return; return;
ssize_t wur = write(sn_pipe[1], "x", 1); ssize_t wur = write(sn_pipe[1], "x", 1);
@ -156,6 +158,8 @@ static void sigchld_handler(int sig) {
} }
static void sigchld_handler_async() { static void sigchld_handler_async() {
if (!startup_notifications)
return;
// Wait for all dead processes // Wait for all dead processes
pid_t pid; pid_t pid;
while ((pid = waitpid(-1, NULL, WNOHANG)) > 0) { while ((pid = waitpid(-1, NULL, WNOHANG)) > 0) {
@ -213,18 +217,20 @@ void init_X11_post_config()
#ifdef HAVE_SN #ifdef HAVE_SN
// Initialize startup-notification // Initialize startup-notification
server.sn_dsp = sn_display_new (server.dsp, error_trap_push, error_trap_pop); if (startup_notifications) {
server.pids = g_tree_new (cmp_ptr); server.sn_dsp = sn_display_new (server.dsp, error_trap_push, error_trap_pop);
// Setup a handler for child termination server.pids = g_tree_new (cmp_ptr);
if (pipe(sn_pipe) != 0) { // Setup a handler for child termination
fprintf(stderr, "Creating pipe failed.\n"); if (pipe(sn_pipe) != 0) {
} else { fprintf(stderr, "Creating pipe failed.\n");
sn_pipe_valid = 1; } else {
struct sigaction act; sn_pipe_valid = 1;
memset (&act, 0, sizeof (struct sigaction)); struct sigaction act;
act.sa_handler = sigchld_handler; memset (&act, 0, sizeof (struct sigaction));
if (sigaction(SIGCHLD, &act, 0)) { act.sa_handler = sigchld_handler;
perror("sigaction"); if (sigaction(SIGCHLD, &act, 0)) {
perror("sigaction");
}
} }
} }
#endif // HAVE_SN #endif // HAVE_SN
@ -273,10 +279,12 @@ void cleanup()
if (server.dsp) XCloseDisplay(server.dsp); if (server.dsp) XCloseDisplay(server.dsp);
#ifdef HAVE_SN #ifdef HAVE_SN
if (sn_pipe_valid) { if (startup_notifications) {
sn_pipe_valid = 0; if (sn_pipe_valid) {
close(sn_pipe[1]); sn_pipe_valid = 0;
close(sn_pipe[0]); close(sn_pipe[1]);
close(sn_pipe[0]);
}
} }
#endif #endif
} }
@ -1160,7 +1168,8 @@ start:
while (XPending (server.dsp)) { while (XPending (server.dsp)) {
XNextEvent(server.dsp, &e); XNextEvent(server.dsp, &e);
#if HAVE_SN #if HAVE_SN
sn_display_process_event (server.sn_dsp, &e); if (startup_notifications)
sn_display_process_event(server.sn_dsp, &e);
#endif // HAVE_SN #endif // HAVE_SN
panel = get_panel(e.xany.window); panel = get_panel(e.xany.window);

View file

@ -108,7 +108,7 @@ GtkWidget *launcher_apps_dirs;
GtkWidget *launcher_icon_size, *launcher_icon_theme, *launcher_padding_x, *launcher_padding_y, *launcher_spacing; GtkWidget *launcher_icon_size, *launcher_icon_theme, *launcher_padding_x, *launcher_padding_y, *launcher_spacing;
GtkWidget *margin_x, *margin_y; GtkWidget *margin_x, *margin_y;
GtkWidget *launcher_background; GtkWidget *launcher_background;
GtkWidget *startup_notifications;
IconThemeWrapper *icon_theme; IconThemeWrapper *icon_theme;
GtkListStore *backgrounds; GtkListStore *backgrounds;
@ -1780,7 +1780,7 @@ void create_launcher(GtkWidget *parent)
gtk_widget_show(label); gtk_widget_show(label);
gtk_box_pack_start(GTK_BOX(parent), label, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(parent), label, FALSE, FALSE, 0);
table = gtk_table_new(6, 10, FALSE); table = gtk_table_new(7, 10, FALSE);
gtk_widget_show(table); gtk_widget_show(table);
gtk_box_pack_start(GTK_BOX(parent), table, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(parent), table, FALSE, FALSE, 0);
gtk_table_set_row_spacings(GTK_TABLE(table), ROW_SPACING); gtk_table_set_row_spacings(GTK_TABLE(table), ROW_SPACING);
@ -1836,7 +1836,6 @@ void create_launcher(GtkWidget *parent)
gtk_widget_show(label); gtk_widget_show(label);
gtk_table_attach(GTK_TABLE(table), label, 6, 7, 2, 3, GTK_FILL, 0, 0, 0); gtk_table_attach(GTK_TABLE(table), label, 6, 7, 2, 3, GTK_FILL, 0, 0, 0);
launcher_icon_theme = gtk_combo_box_new_with_model(GTK_TREE_MODEL(icon_themes)); launcher_icon_theme = gtk_combo_box_new_with_model(GTK_TREE_MODEL(icon_themes));
GtkCellRenderer *renderer = gtk_cell_renderer_text_new(); GtkCellRenderer *renderer = gtk_cell_renderer_text_new();
gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(launcher_icon_theme), renderer, FALSE); gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(launcher_icon_theme), renderer, FALSE);
@ -1845,6 +1844,15 @@ void create_launcher(GtkWidget *parent)
gtk_widget_show(launcher_icon_theme); gtk_widget_show(launcher_icon_theme);
gtk_table_attach(GTK_TABLE(table), launcher_icon_theme, 7, 8, 2, 3, GTK_FILL, 0, 0, 0); gtk_table_attach(GTK_TABLE(table), launcher_icon_theme, 7, 8, 2, 3, GTK_FILL, 0, 0, 0);
label = gtk_label_new(_("Startup notifications"));
gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
gtk_widget_show(label);
gtk_table_attach(GTK_TABLE(table), label, 2, 3, 3, 4, GTK_FILL, 0, 0, 0);
startup_notifications = gtk_check_button_new();
gtk_widget_show(startup_notifications);
gtk_table_attach(GTK_TABLE(table), startup_notifications, 3, 4, 3, 4, GTK_FILL, 0, 0, 0);
change_paragraph(parent); change_paragraph(parent);
GtkTreeIter iter; GtkTreeIter iter;

View file

@ -121,7 +121,7 @@ extern GtkWidget *launcher_apps_dirs;
extern GtkWidget *launcher_icon_size, *launcher_icon_theme, *launcher_padding_x, *launcher_padding_y, *launcher_spacing; extern GtkWidget *launcher_icon_size, *launcher_icon_theme, *launcher_padding_x, *launcher_padding_y, *launcher_spacing;
extern GtkWidget *margin_x, *margin_y; extern GtkWidget *margin_x, *margin_y;
extern GtkWidget *launcher_background; extern GtkWidget *launcher_background;
extern GtkWidget *startup_notifications;
extern IconThemeWrapper *icon_theme; extern IconThemeWrapper *icon_theme;
void load_desktop_file(const char *file, gboolean selected); void load_desktop_file(const char *file, gboolean selected);

View file

@ -393,6 +393,7 @@ void config_write_launcher(FILE *fp)
g_free(icon_theme); g_free(icon_theme);
icon_theme = NULL; icon_theme = NULL;
} }
fprintf(fp, "startup_notifications = %d\n", gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(startup_notifications)) ? 1 : 0);
int index; int index;
for (index = 0; ; index++) { for (index = 0; ; index++) {
@ -1119,6 +1120,9 @@ void add_entry(char *key, char *value)
else if (strcmp(key, "launcher_icon_theme") == 0) { else if (strcmp(key, "launcher_icon_theme") == 0) {
set_current_icon_theme(value); set_current_icon_theme(value);
} }
else if (strcmp(key, "startup_notifications") == 0) {
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(startup_notifications), atoi(value));
}
/* Tooltip */ /* Tooltip */
else if (strcmp(key, "tooltip_show_timeout") == 0) { else if (strcmp(key, "tooltip_show_timeout") == 0) {