r1978 - trunk/src/target/OM-2007/panel-plugins/openmoko-panel-startup/src

stefan at sita.openmoko.org stefan at sita.openmoko.org
Wed May 16 21:50:56 CEST 2007


Author: stefan
Date: 2007-05-16 21:50:55 +0200 (Wed, 16 May 2007)
New Revision: 1978

Added:
   trunk/src/target/OM-2007/panel-plugins/openmoko-panel-startup/src/Makefile.am
   trunk/src/target/OM-2007/panel-plugins/openmoko-panel-startup/src/openmoko-panel-startup.c
Log:
Not yet, but hopefully soon, upstream version from startup-notification applet.
NOTE: This version is only checked in to have the full changes in svn history.


Added: trunk/src/target/OM-2007/panel-plugins/openmoko-panel-startup/src/Makefile.am
===================================================================
--- trunk/src/target/OM-2007/panel-plugins/openmoko-panel-startup/src/Makefile.am	2007-05-16 19:47:42 UTC (rev 1977)
+++ trunk/src/target/OM-2007/panel-plugins/openmoko-panel-startup/src/Makefile.am	2007-05-16 19:50:55 UTC (rev 1978)
@@ -0,0 +1,11 @@
+AM_CPPFLAGS=-DPKGDATADIR=\"$(pkgdatadir)\" -DGETTEXT_PACKAGE=\"matchbox-panel\"
+AM_CFLAGS = -Wall -std=c99 -pedantic @OPENMOKO_CFLAGS@
+
+appletdir = $(libdir)/matchbox-panel/
+applet_LTLIBRARIES = libopenmoko-panel-startup.la
+
+libopenmoko_panel_startup_la_SOURCES = openmoko-panel-startup.c
+libopenmoko_panel_startup_la_LIBADD = @OPENMOKO_LIBS@
+
+MAINTAINERCLEANFILES = Makefile.in
+

Added: trunk/src/target/OM-2007/panel-plugins/openmoko-panel-startup/src/openmoko-panel-startup.c
===================================================================
--- trunk/src/target/OM-2007/panel-plugins/openmoko-panel-startup/src/openmoko-panel-startup.c	2007-05-16 19:47:42 UTC (rev 1977)
+++ trunk/src/target/OM-2007/panel-plugins/openmoko-panel-startup/src/openmoko-panel-startup.c	2007-05-16 19:50:55 UTC (rev 1978)
@@ -0,0 +1,306 @@
+/*
+ * startup-monitor - A tray app that provides feedback
+ *                             on application startup.
+ *
+ * Copyright 2004, Openedhand Ltd. By Matthew Allum <mallum at o-hand.com>
+ * Copyright 2007 OpenMoko Inc. By Stefan Schmidt <stefan at openmoko.org>
+ *
+ * Based very roughly on GPE's startup monitor.
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use, copy,
+ * modify, merge, publish, distribute, sublicense, and/or sell copies
+ * of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+
+#include <gdk/gdkx.h>
+#include <gdk/gdk.h>
+#include <gtk/gtk.h>
+
+/* FIXME */
+#define USE_LIBSN
+
+#ifdef USE_LIBSN
+  #define SN_API_NOT_YET_FROZEN 1
+  #include <libsn/sn.h>
+#endif
+
+#include <string.h>
+
+#define TIMEOUT		   20
+#define HOURGLASS_PIXMAPS 8
+
+typedef struct {
+	GtkImage *image;
+	GdkPixbuf *hglass[HOURGLASS_PIXMAPS];
+	const char *last_icon;
+	guint timeout_id;
+	GdkWindow *root_window;
+	GtkWidget* eventbox;
+	SnDisplay *sn_display;
+} StartupApplet;
+
+typedef struct LaunchList LaunchList;
+
+struct LaunchList {
+	char *id;
+	time_t when;
+	LaunchList *next;
+};
+
+static GdkFilterReturn filter_func(GdkXEvent *gdk_xevent,
+				GdkEvent *event, StartupApplet *applet);
+
+static gboolean applet_main(StartupApplet *applet);
+
+/* Applet destroyed */
+static void startup_applet_free(StartupApplet *applet)
+{
+	gdk_window_remove_filter (applet->root_window,
+					(GdkFilterFunc) filter_func, applet);
+	g_source_remove(applet->timeout_id);
+	g_slice_free(StartupApplet, applet);
+}
+
+/*
+ * Lazy boy globals :/
+ */
+static LaunchList *launch_list = NULL;
+static gboolean hourglass_shown = FALSE;
+static int hourglass_cur_frame_n = 0;
+
+
+static void show_hourglass(StartupApplet *applet)
+{
+	g_message("Entered %s", G_STRFUNC);
+	gtk_widget_show_all(GTK_WIDGET (applet->eventbox));
+	hourglass_shown = TRUE;
+}
+
+static void hide_hourglass(StartupApplet *applet)
+{
+	g_message("Entered %s", G_STRFUNC);
+	gtk_widget_hide_all(GTK_WIDGET (applet->eventbox));
+	hourglass_shown = FALSE;
+}
+
+static void monitor_event_func(SnMonitorEvent *event, void *user_data)
+{
+	SnMonitorContext *context;
+	SnStartupSequence *sequence;
+	const char *id;
+	time_t t;
+	StartupApplet *applet = (StartupApplet *) user_data;
+
+	g_message("Entered %s", G_STRFUNC);
+	context = sn_monitor_event_get_context(event);
+	sequence = sn_monitor_event_get_startup_sequence(event);
+	id = sn_startup_sequence_get_id(sequence);
+
+	switch (sn_monitor_event_get_type(event)) {
+	case SN_MONITOR_EVENT_INITIATED:
+		{
+			g_message("Entered SN_MONITOR_EVENT_INITIATED");
+
+			/* Set up a timeout that will be called every 0.5 seconds */
+			applet->timeout_id = g_timeout_add(500,
+					   (GSourceFunc) applet_main, applet);
+
+			LaunchList *item = launch_list;
+
+			/* Reset counter */
+			hourglass_cur_frame_n = 0;
+
+			/* Add a new launch at the end of LaunchList */
+			if (item == NULL) {
+				launch_list = item = malloc(sizeof(LaunchList));
+			} else {
+				while (item->next != NULL)
+					item = item->next;
+				item->next = malloc(sizeof(LaunchList));
+				item = item->next;
+			}
+
+			item->next = NULL;
+			item->id = strdup(id);
+			t = time(NULL);
+			item->when = t + TIMEOUT;
+
+			if (!hourglass_shown)
+				show_hourglass(applet);
+		}
+		break;
+
+	case SN_MONITOR_EVENT_COMPLETED:
+	case SN_MONITOR_EVENT_CANCELED:
+		{
+			g_message("Entered SN_MONITOR_EVENT_CANCELED/COMPLETED");
+			LaunchList *item = launch_list, *last_item = NULL;
+
+			/* Find actual list item and free it*/
+			while (item != NULL) {
+				if (!strcmp(item->id, id)) {
+					if (last_item == NULL)
+						launch_list = item->next;
+					else
+						last_item->next = item->next;
+
+					free(item->id);
+					free(item);
+
+					break;
+				}
+				last_item = item;
+				item = item->next;
+			}
+
+			if (launch_list == NULL && hourglass_shown)
+				hide_hourglass(applet);
+
+			g_source_remove(applet->timeout_id);
+		}
+		break;
+	default:
+		break;		/* Nothing */
+	}
+}
+
+static gboolean applet_main(StartupApplet *applet)
+{
+	LaunchList *item = launch_list;
+	LaunchList *last_item = NULL;
+	time_t t;
+
+	g_message("Entered %s", G_STRFUNC);
+
+	if (!hourglass_shown)
+		return TRUE;
+
+	t = time(NULL);
+
+	/* handle launchee timeouts */
+	while (item) {
+		if ((item->when - t) <= 0) {
+			if (last_item == NULL)
+				launch_list = item->next;
+			else
+				last_item->next = item->next;
+
+			free(item->id);
+			free(item);
+
+			break;
+		}
+
+		last_item = item;
+		item = item->next;
+	}
+
+	if (launch_list == NULL && hourglass_shown) {
+		hide_hourglass(applet);
+		return TRUE;
+	}
+
+	hourglass_cur_frame_n++;
+	if (hourglass_cur_frame_n == 8)
+		hourglass_cur_frame_n = 0;
+
+	g_message("hourglass_cur_frame_n =%i", hourglass_cur_frame_n);
+
+    gtk_image_set_from_pixbuf( applet->image, applet->hglass[hourglass_cur_frame_n] );
+
+	return TRUE;
+}
+
+static GdkFilterReturn filter_func(GdkXEvent *gdk_xevent, GdkEvent *event, StartupApplet *applet) {
+	XEvent *xevent;
+	xevent = (XEvent *) gdk_xevent;
+	gboolean ret;
+
+	ret = sn_display_process_event(applet->sn_display, xevent);
+
+	g_message("%s: sn_display_process return value: %i", G_STRFUNC, ret);
+
+	return GDK_FILTER_CONTINUE;
+}
+
+G_MODULE_EXPORT GtkWidget *mb_panel_applet_create(const char *id,
+						  GtkOrientation orientation)
+{
+	StartupApplet *applet;
+	Display *xdisplay;
+	SnMonitorContext *context;
+
+	/* Create applet data structure */
+	applet = g_slice_new(StartupApplet);
+
+	//applet->last_icon = NULL;
+
+	/* Create image */
+    applet->image = GTK_IMAGE(gtk_image_new());
+
+	gtk_widget_set_name( GTK_WIDGET(applet->image), "MatchboxPanelStartupMonitor" );
+    g_object_weak_ref( G_OBJECT(applet->image), (GWeakNotify) startup_applet_free, applet );
+
+	/* preload pixbufs */
+	guint i = 0;
+	applet->hglass[i++] = gdk_pixbuf_new_from_file(DATADIR "/hourglass-0.png", NULL);
+	applet->hglass[i++] = gdk_pixbuf_new_from_file(DATADIR "/hourglass-1.png", NULL);
+	applet->hglass[i++] = gdk_pixbuf_new_from_file(DATADIR "/hourglass-2.png", NULL);
+	applet->hglass[i++] = gdk_pixbuf_new_from_file(DATADIR "/hourglass-3.png", NULL);
+	applet->hglass[i++] = gdk_pixbuf_new_from_file(DATADIR "/hourglass-4.png", NULL);
+	applet->hglass[i++] = gdk_pixbuf_new_from_file(DATADIR "/hourglass-5.png", NULL);
+	applet->hglass[i++] = gdk_pixbuf_new_from_file(DATADIR "/hourglass-6.png", NULL);
+	applet->hglass[i] = gdk_pixbuf_new_from_file(DATADIR "/hourglass-7.png", NULL);
+
+	xdisplay = GDK_DISPLAY_XDISPLAY
+				(gtk_widget_get_display(GTK_WIDGET (applet->image)));
+
+	applet->sn_display = sn_display_new (xdisplay, NULL, NULL);
+
+	context = sn_monitor_context_new (applet->sn_display, DefaultScreen(xdisplay),
+					monitor_event_func, (void *)applet, NULL);
+
+	/* We have to select for property events on at least one
+	 * root window (but not all as INITIATE messages go to
+	 * all root windows)
+	 */
+	XSelectInput (xdisplay, DefaultRootWindow(xdisplay), PropertyChangeMask);
+
+	/* Get root window */
+	//applet->root_window = gdk_screen_get_root_window
+	//					(gtk_widget_get_screen( GTK_WIDGET (applet->image)));
+
+	applet->root_window = gdk_window_lookup_for_display(gdk_x11_lookup_xdisplay(xdisplay), 0);
+
+	gdk_window_add_filter (applet->root_window, (GdkFilterFunc) filter_func, applet);
+
+	/* Show! */
+	applet->eventbox = gtk_event_box_new();
+	gtk_container_add(GTK_CONTAINER(applet->eventbox), GTK_WIDGET(applet->image));
+	gtk_widget_show_all(GTK_WIDGET(applet->eventbox));
+
+	return GTK_WIDGET(applet->eventbox);
+}





More information about the commitlog mailing list