[Galago-commits] r2423 - in trunk/notification-daemon: . src themes themes/standard

galago-commits at freedesktop.org galago-commits at freedesktop.org
Thu Jan 12 00:11:11 PST 2006


Author: chipx86
Date: 2006-01-12 00:11:08 -0800 (Thu, 12 Jan 2006)
New Revision: 2423

Added:
   trunk/notification-daemon/themes/standard/Makefile.am
   trunk/notification-daemon/themes/standard/theme.c
Modified:
   trunk/notification-daemon/ChangeLog
   trunk/notification-daemon/configure.ac
   trunk/notification-daemon/src/engines.c
   trunk/notification-daemon/themes/Makefile.am
   trunk/notification-daemon/themes/standard/
Log:
Add the beginnings of the "standard" theme. This is now the default.  It's not complete. Many things are still missing. Theme selection will be added later.


Modified: trunk/notification-daemon/ChangeLog
===================================================================
--- trunk/notification-daemon/ChangeLog	2006-01-11 10:20:10 UTC (rev 2422)
+++ trunk/notification-daemon/ChangeLog	2006-01-12 08:11:08 UTC (rev 2423)
@@ -1,3 +1,14 @@
+Thu Jan 12 00:10:18 PST 2006  Christian Hammond <chipx86 at chipx86.com>
+
+	* src/engines.c:
+	A themes/standard/Makefile.am:
+	A themes/standard/theme.c:
+	* themes/Makefile.am:
+	* configure.ac:
+	  - Add the beginnings of the "standard" theme. This is now the default.
+	    It's not complete. Many things are still missing. Theme selection
+	    will be added later.
+
 Wed Jan 11 01:51:12 PST 2006  Christian Hammond <chipx86 at chipx86.com>
 
 	* src/Makefile.am:

Modified: trunk/notification-daemon/configure.ac
===================================================================
--- trunk/notification-daemon/configure.ac	2006-01-11 10:20:10 UTC (rev 2422)
+++ trunk/notification-daemon/configure.ac	2006-01-12 08:11:08 UTC (rev 2423)
@@ -69,7 +69,7 @@
 AC_CHECK_LIB([popt], [poptGetArg], , AC_MSG_ERROR([Popt is required]))
 
 REQ_DBUS_VERSION=0.36
-pkg_modules="gtk+-2.0 >= 2.2.2 glib-2.0 >= 2.2.2, dbus-1 >= $REQ_DBUS_VERSION, dbus-glib-1 >= $REQ_DBUS_VERSION"
+pkg_modules="gtk+-2.0 >= 2.2.2 glib-2.0 >= 2.2.2, dbus-1 >= $REQ_DBUS_VERSION, dbus-glib-1 >= $REQ_DBUS_VERSION libsexy >= 0.1.3"
 PKG_CHECK_MODULES(NOTIFICATION_DAEMON, [$pkg_modules])
 AC_SUBST(NOTIFICATION_DAEMON_CFLAGS)
 AC_SUBST(NOTIFICATION_DAEMON_LIBS)
@@ -145,6 +145,7 @@
 src/Makefile
 themes/Makefile
 themes/bubble/Makefile
+themes/standard/Makefile
 ])
 
 AC_OUTPUT

Modified: trunk/notification-daemon/src/engines.c
===================================================================
--- trunk/notification-daemon/src/engines.c	2006-01-11 10:20:10 UTC (rev 2422)
+++ trunk/notification-daemon/src/engines.c	2006-01-12 08:11:08 UTC (rev 2423)
@@ -69,7 +69,7 @@
 	if (active_engine == NULL)
 	{
 		/* XXX */
-		active_engine = load_theme_engine(ENGINES_DIR"/libbubble.so");
+		active_engine = load_theme_engine(ENGINES_DIR"/libstandard.so");
 		g_assert(active_engine != NULL);
 	}
 

Modified: trunk/notification-daemon/themes/Makefile.am
===================================================================
--- trunk/notification-daemon/themes/Makefile.am	2006-01-11 10:20:10 UTC (rev 2422)
+++ trunk/notification-daemon/themes/Makefile.am	2006-01-12 08:11:08 UTC (rev 2423)
@@ -1,2 +1 @@
-#SUBDIRS = standard bubble
-SUBDIRS = bubble
+SUBDIRS = standard bubble


Property changes on: trunk/notification-daemon/themes/standard
___________________________________________________________________
Name: svn:ignore
   + Makefile
Makefile.in
.deps
.libs
.*.swp


Added: trunk/notification-daemon/themes/standard/Makefile.am
===================================================================
--- trunk/notification-daemon/themes/standard/Makefile.am	2006-01-11 10:20:10 UTC (rev 2422)
+++ trunk/notification-daemon/themes/standard/Makefile.am	2006-01-12 08:11:08 UTC (rev 2423)
@@ -0,0 +1,9 @@
+enginedir = $(libdir)/notification-daemon/engines
+
+engine_LTLIBRARIES = libstandard.la
+
+libstandard_la_SOURCES = theme.c
+
+libstandard_la_LIBADD = $(NOTIFICATION_DAEMON_LIBS)
+
+INCLUDES = $(NOTIFICATION_DAEMON_CFLAGS)

Added: trunk/notification-daemon/themes/standard/theme.c
===================================================================
--- trunk/notification-daemon/themes/standard/theme.c	2006-01-11 10:20:10 UTC (rev 2422)
+++ trunk/notification-daemon/themes/standard/theme.c	2006-01-12 08:11:08 UTC (rev 2423)
@@ -0,0 +1,307 @@
+#include <gtk/gtk.h>
+#include <libsexy/sexy-url-label.h>
+
+typedef struct
+{
+	GtkWidget *spacer;
+	GtkWidget *iconbox;
+	GtkWidget *icon;
+	GtkWidget *contentbox;
+	GtkWidget *summary_label;
+	GtkWidget *body_label;
+	GtkWidget *actions_box;
+	gboolean has_arrow;
+	int point_x;
+	int point_y;
+	GdkGC *gc;
+	GdkPoint arrow_points[7];
+
+} WindowData;
+
+#define WIDTH         300
+#define MIN_HEIGHT    100
+#define IMAGE_SIZE    48
+#define IMAGE_PADDING 10
+#define ARROW_OFFSET  20
+#define ARROW_HEIGHT  20
+#define ARROW_WIDTH   20
+
+static gboolean
+draw_border(GtkWidget *win, GdkEventExpose *event, WindowData *windata)
+{
+	int w, h;
+
+	if (windata->gc == NULL)
+	{
+		GdkColor color;
+
+		windata->gc = gdk_gc_new(event->window);
+		gdk_color_parse("black", &color);
+		gdk_gc_set_rgb_fg_color(windata->gc, &color);
+	}
+
+	gdk_drawable_get_size(event->window, &w, &h);
+
+	if (windata->has_arrow)
+	{
+		gdk_draw_polygon(event->window, windata->gc, FALSE,
+						 windata->arrow_points,
+						 G_N_ELEMENTS(windata->arrow_points));
+
+		/* HACK! */
+		gdk_draw_line(event->window, windata->gc,
+					  ARROW_OFFSET + 1, ARROW_HEIGHT,
+					  ARROW_OFFSET + ARROW_WIDTH / 2 + 1, 0);
+		gdk_draw_line(event->window, windata->gc,
+					  ARROW_OFFSET + ARROW_WIDTH / 2 - 1, 0,
+					  ARROW_OFFSET + ARROW_WIDTH - 1, ARROW_HEIGHT);
+		gdk_draw_line(event->window, windata->gc, 0, h - 1, w - 1, h - 1);
+	}
+	else
+	{
+		gdk_draw_rectangle(event->window, windata->gc, FALSE,
+						   0, 0, w - 1, h - 1);
+	}
+
+	return FALSE;
+}
+
+GtkWindow *
+create_notification(void)
+{
+	GtkWidget *win;
+	GtkWidget *main_vbox;
+	GtkWidget *hbox;
+	GtkWidget *vbox;
+	GdkColor color;
+	GtkRequisition req;
+	WindowData *windata;
+
+	windata = g_new0(WindowData, 1);
+
+	win = gtk_window_new(GTK_WINDOW_POPUP);
+	gtk_widget_add_events(win, GDK_BUTTON_RELEASE_MASK);
+	g_object_set_data(G_OBJECT(win), "windata", windata);
+	gtk_widget_set_app_paintable(win, TRUE);
+
+	g_signal_connect(G_OBJECT(win), "expose-event",
+					 G_CALLBACK(draw_border), windata);
+
+	// TODO: Connect to button-release-event
+
+	main_vbox = gtk_vbox_new(FALSE, 0);
+	gtk_widget_show(main_vbox);
+	gtk_container_add(GTK_CONTAINER(win), main_vbox);
+	gtk_container_set_border_width(GTK_CONTAINER(main_vbox), 1);
+
+	windata->spacer = gtk_image_new();
+	gtk_box_pack_start(GTK_BOX(main_vbox), windata->spacer, FALSE, FALSE, 0);
+	gtk_widget_set_size_request(windata->spacer, -1, ARROW_HEIGHT);
+
+	hbox = gtk_hbox_new(FALSE, 0);
+	gtk_widget_show(hbox);
+	gtk_box_pack_start(GTK_BOX(main_vbox), hbox, FALSE, FALSE, 0);
+
+	windata->iconbox = gtk_event_box_new();
+	gtk_widget_show(windata->iconbox);
+	gtk_box_pack_start(GTK_BOX(hbox), windata->iconbox, FALSE, TRUE, 0);
+
+	windata->icon = gtk_image_new_from_stock(GTK_STOCK_DIALOG_INFO,
+											 GTK_ICON_SIZE_DIALOG);
+	gtk_widget_show(windata->icon);
+	gtk_container_add(GTK_CONTAINER(windata->iconbox), windata->icon);
+	gtk_misc_set_alignment(GTK_MISC(windata->icon), 0.5, 0.0);
+	gtk_container_set_border_width(GTK_CONTAINER(windata->iconbox), 12);
+
+	/* TODO: Make this like a view::BaseBGBox */
+	windata->contentbox = gtk_event_box_new();
+	gtk_widget_show(windata->contentbox);
+	gtk_box_pack_start(GTK_BOX(hbox), windata->contentbox, TRUE, TRUE, 0);
+	gdk_color_parse("white", &color);
+	gtk_widget_modify_bg(windata->contentbox, GTK_STATE_NORMAL, &color);
+
+	vbox = gtk_vbox_new(FALSE, 6);
+	gtk_widget_show(vbox);
+	gtk_container_add(GTK_CONTAINER(windata->contentbox), vbox);
+	gtk_container_set_border_width(GTK_CONTAINER(vbox), 10);
+
+	windata->summary_label = gtk_label_new(NULL);
+	gtk_widget_show(windata->summary_label);
+	gtk_box_pack_start(GTK_BOX(vbox), windata->summary_label, FALSE, FALSE, 0);
+	gtk_misc_set_alignment(GTK_MISC(windata->summary_label), 0, 0);
+
+	/* TODO: Use a SexyUrlLabel, and attach to url_activated. */
+	windata->body_label = sexy_url_label_new();
+	gtk_widget_show(windata->body_label);
+	gtk_box_pack_start(GTK_BOX(vbox), windata->body_label, TRUE, TRUE, 0);
+	gtk_misc_set_alignment(GTK_MISC(windata->body_label), 0, 0);
+	gtk_label_set_line_wrap(GTK_LABEL(windata->body_label), TRUE);
+
+	windata->actions_box = gtk_hbox_new(FALSE, 6);
+	gtk_widget_show(windata->actions_box);
+	gtk_box_pack_start(GTK_BOX(vbox), windata->actions_box, FALSE, TRUE, 0);
+
+	gtk_widget_size_request(hbox, &req);
+	gtk_widget_set_size_request(hbox, -1, MAX(MIN_HEIGHT, req.height));
+
+	return GTK_WINDOW(win);
+}
+
+void
+destroy_notification(GtkWindow *nw)
+{
+	WindowData *windata = g_object_get_data(G_OBJECT(nw), "windata");
+	g_assert(windata != NULL);
+
+	if (windata->gc != NULL)
+		g_object_unref(G_OBJECT(windata->gc));
+
+	gtk_widget_destroy(GTK_WIDGET(nw));
+}
+
+void
+show_notification(GtkWindow *nw)
+{
+	gtk_widget_show(GTK_WIDGET(nw));
+}
+
+void
+hide_notification(GtkWindow *nw)
+{
+	gtk_widget_hide(GTK_WIDGET(nw));
+}
+
+void
+set_notification_text(GtkWindow *nw, const char *summary, const char *body)
+{
+	char *str;
+	WindowData *windata = g_object_get_data(G_OBJECT(nw), "windata");
+	g_assert(windata != NULL);
+
+	str = g_strdup_printf("<b><big>%s</big></b>", summary);
+	gtk_label_set_markup(GTK_LABEL(windata->summary_label), str);
+	g_free(str);
+
+	sexy_url_label_set_markup(SEXY_URL_LABEL(windata->body_label), body);
+
+	gtk_widget_set_size_request(
+		((body != NULL && *body == '\0')
+		 ? windata->body_label : windata->summary_label),
+		WIDTH - (IMAGE_SIZE + IMAGE_PADDING) - 10,
+		-1);
+}
+
+void
+set_notification_icon(GtkWindow *nw, GdkPixbuf *pixbuf)
+{
+	WindowData *windata = g_object_get_data(G_OBJECT(nw), "windata");
+	g_assert(windata != NULL);
+
+	gtk_image_set_from_pixbuf(GTK_IMAGE(windata->icon), pixbuf);
+}
+
+void
+set_notification_arrow(GtkWindow *nw, gboolean visible, int x, int y)
+{
+	WindowData *windata = g_object_get_data(G_OBJECT(nw), "windata");
+	g_assert(windata != NULL);
+
+	windata->has_arrow = visible;
+	windata->point_x   = x;
+	windata->point_y   = y;
+
+	if (visible)
+		gtk_widget_show(windata->spacer);
+	else
+		gtk_widget_hide(windata->spacer);
+}
+
+void
+add_notification_action(GtkWindow *nw, const char *label, const char *key,
+						GCallback cb)
+{
+}
+
+static void
+generate_arrow(GtkWidget *nw, WindowData *windata, int *arrow_x, int *arrow_y)
+{
+	GtkRequisition req;
+	int new_height;
+	GdkRegion *region;
+
+	gtk_widget_realize(nw);
+	gtk_widget_size_request(nw, &req);
+
+	new_height = req.height + ARROW_HEIGHT;
+
+	windata->arrow_points[0].x = 0;
+	windata->arrow_points[0].y = ARROW_HEIGHT;
+
+	windata->arrow_points[1].x = ARROW_OFFSET;
+	windata->arrow_points[1].y = ARROW_HEIGHT;
+
+	windata->arrow_points[2].x = ARROW_OFFSET + ARROW_WIDTH / 2;
+	windata->arrow_points[2].y = 0;
+
+	windata->arrow_points[3].x = ARROW_OFFSET + ARROW_WIDTH;
+	windata->arrow_points[3].y = ARROW_HEIGHT;
+
+	windata->arrow_points[4].x = req.width;
+	windata->arrow_points[4].y = ARROW_HEIGHT;
+
+	windata->arrow_points[5].x = req.width;
+	windata->arrow_points[5].y = new_height;
+
+	windata->arrow_points[6].x = 0;
+	windata->arrow_points[6].y = new_height;
+
+	region = gdk_region_polygon(windata->arrow_points,
+								G_N_ELEMENTS(windata->arrow_points),
+								GDK_EVEN_ODD_RULE);
+	gdk_window_shape_combine_region(nw->window, region, 0, 0);
+	gdk_region_destroy(region);
+
+	windata->arrow_points[4].x--;
+	windata->arrow_points[5].x--;
+	windata->arrow_points[5].y--;
+	windata->arrow_points[6].y--;
+
+	*arrow_x = ARROW_OFFSET + ARROW_WIDTH / 2;
+	*arrow_y = 0;
+}
+
+void
+move_notification(GtkWindow *nw, int x, int y)
+{
+	WindowData *windata = g_object_get_data(G_OBJECT(nw), "windata");
+	g_assert(windata != NULL);
+
+	if (windata->has_arrow)
+	{
+		GtkRequisition req;
+		GdkDisplay *display = gtk_widget_get_display(GTK_WIDGET(nw));
+		//GdkScreen *screen   = gdk_display_get_screen(display, disp_screen);
+		//int screen_width    = gdk_screen_get_width(screen);
+		//int screen_height   = gdk_screen_get_height(screen);
+		int new_height;
+		int arrow_x;
+		int arrow_y;
+
+		gtk_widget_size_request(GTK_WIDGET(nw), &req);
+		new_height = req.height + ARROW_HEIGHT;
+		generate_arrow(GTK_WIDGET(nw), windata, &arrow_x, &arrow_y);
+#if 0
+		x = CLAMP(windata->point_x, 0, screen_width  - req.width);
+		y = CLAMP(windata->point_y, 0, screen_height - new_height);
+#endif
+	}
+	else
+	{
+#if 0
+		x = workarea.x + workarea.width - req.width;
+		y = workarea.y + workarea.height - get_height() - height_offset;
+#endif
+	}
+
+	gtk_window_move(GTK_WINDOW(nw), x, y);
+}



More information about the galago-commits mailing list