static gboolean startup_notification_timeout (gpointer data) { StartupNotificationData *sn_data = data; end_startup_notification (sn_data->display, sn_data->startup_id); g_object_unref (sn_data->display); g_free (sn_data->startup_id); g_free (sn_data); return FALSE; }
static gboolean startup_timeout (void *data) { StartupTimeoutData *std; GSList *tmp; GTimeVal now; int min_timeout; std = data; min_timeout = STARTUP_TIMEOUT_LENGTH; g_get_current_time (&now); tmp = std->contexts; while (tmp != NULL) { StartupNotificationData *sn_data; GSList *next; double elapsed; sn_data = tmp->data; next = tmp->next; elapsed = ((((double) now.tv_sec - sn_data->time.tv_sec) * G_USEC_PER_SEC + (now.tv_usec - sn_data->time.tv_usec))) / 1000.0; if (elapsed >= STARTUP_TIMEOUT_LENGTH) { std->contexts = g_slist_remove (std->contexts, sn_data); end_startup_notification (sn_data->display, sn_data->startup_id); free_startup_notification_data (sn_data); } else { min_timeout = MIN (min_timeout, (STARTUP_TIMEOUT_LENGTH - elapsed)); } tmp = next; } if (std->contexts == NULL) std->timeout_id = 0; else { std->timeout_id = g_timeout_add_seconds ((min_timeout + 500)/1000, startup_timeout, std); g_source_set_name_by_id (std->timeout_id, "[gtk+] startup_timeout"); } /* always remove this one, but we may have reinstalled another one. */ return G_SOURCE_REMOVE; }
void mpl_gdk_windowing_launch_failed (GAppLaunchContext *context, const char *startup_notify_id) { #if 0 GdkAppLaunchContextPrivate *priv; #endif GdkScreen *screen; StartupTimeoutData *data; StartupNotificationData *sn_data; GSList *l; #if 0 priv = GDK_APP_LAUNCH_CONTEXT (context)->priv; if (priv->screen) screen = priv->screen; else if (priv->display) screen = gdk_display_get_default_screen (priv->display); else #endif screen = gdk_display_get_default_screen (gdk_display_get_default ()); data = g_object_get_data (G_OBJECT (screen), "appinfo-startup-data"); if (data) { for (l = data->contexts; l != NULL; l = l->next) { sn_data = l->data; if (strcmp (startup_notify_id, sn_data->startup_id) == 0) { data->contexts = g_slist_remove (data->contexts, sn_data); end_startup_notification (sn_data->display, sn_data->startup_id); free_startup_notification_data (sn_data); break; } } if (data->contexts == NULL) { g_source_remove (data->timeout_id); data->timeout_id = 0; } } }
static void gdk_x11_app_launch_context_launch_failed (GAppLaunchContext *context, const gchar *startup_notify_id) { GdkAppLaunchContext *ctx; GdkX11Screen *screen; StartupTimeoutData *data; StartupNotificationData *sn_data; GSList *l; ctx = GDK_APP_LAUNCH_CONTEXT (context); screen = GDK_X11_DISPLAY (ctx->display)->screen; data = g_object_get_data (G_OBJECT (screen), "appinfo-startup-data"); if (data) { for (l = data->contexts; l != NULL; l = l->next) { sn_data = l->data; if (strcmp (startup_notify_id, sn_data->startup_id) == 0) { data->contexts = g_slist_remove (data->contexts, sn_data); end_startup_notification (sn_data->display, sn_data->startup_id); free_startup_notification_data (sn_data); break; } } if (data->contexts == NULL) { g_source_remove (data->timeout_id); data->timeout_id = 0; } } }