diff -cB notify-osd-0.9.29/src/bubble.c notify-osd-0.9.29.patch/src/bubble.c
*** notify-osd-0.9.29/src/bubble.c	2010-04-08 10:10:57.000000000 +0200
--- notify-osd-0.9.29.patch/src/bubble.c	2010-04-19 22:55:56.211446601 +0200
***************
*** 128,152 ****
  // FIXME: this is in class Defaults already, but not yet hooked up so for the
  // moment we use the macros here, these values reflect the visual-guideline
  // for jaunty notifications
! #define TEXT_TITLE_COLOR_R 1.0f
! #define TEXT_TITLE_COLOR_G 1.0f
! #define TEXT_TITLE_COLOR_B 1.0f
! #define TEXT_TITLE_COLOR_A 1.0f
! 
! #define TEXT_BODY_COLOR_R  0.91f
! #define TEXT_BODY_COLOR_G  0.91f
! #define TEXT_BODY_COLOR_B  0.91f
! #define TEXT_BODY_COLOR_A  1.0f
! 
! #define TEXT_SHADOW_COLOR_R 0.0f
! #define TEXT_SHADOW_COLOR_G 0.0f 
! #define TEXT_SHADOW_COLOR_B 0.0f 
! #define TEXT_SHADOW_COLOR_A 1.0f 
! 
! #define BUBBLE_BG_COLOR_R  0.15f
! #define BUBBLE_BG_COLOR_G  0.15f
! #define BUBBLE_BG_COLOR_B  0.15f
! #define BUBBLE_BG_COLOR_A  0.9f
  
  #define INDICATOR_UNLIT_R  1.0f
  #define INDICATOR_UNLIT_G  1.0f
--- 128,154 ----
  // FIXME: this is in class Defaults already, but not yet hooked up so for the
  // moment we use the macros here, these values reflect the visual-guideline
  // for jaunty notifications
! float TEXT_TITLE_COLOR_R = 1.0f;
! float TEXT_TITLE_COLOR_G = 1.0f;
! float TEXT_TITLE_COLOR_B = 1.0f;
! float TEXT_TITLE_COLOR_A = 1.0f;
! 
! float TEXT_BODY_COLOR_R  = 0.91f;
! float TEXT_BODY_COLOR_G  = 0.91f;
! float TEXT_BODY_COLOR_B  = 0.91f;
! float TEXT_BODY_COLOR_A  = 1.0f;
! 
! float TEXT_SHADOW_COLOR_R = 0.0f;
! float TEXT_SHADOW_COLOR_G = 0.0f;
! float TEXT_SHADOW_COLOR_B = 0.0f;
! float TEXT_SHADOW_COLOR_A = 1.0f;
! 
! float BUBBLE_BG_COLOR_R  = 0.15f;
! float BUBBLE_BG_COLOR_G  = 0.15f;
! float BUBBLE_BG_COLOR_B  = 0.15f;
! float BUBBLE_BG_COLOR_A  = 0.9f;
! 
! int TEXT_TITLE_DROP_SHADOW = 1;
  
  #define INDICATOR_UNLIT_R  1.0f
  #define INDICATOR_UNLIT_G  1.0f
***************
*** 1009,1030 ****
  					     defaults_get_screen_dpi (d));
  	pango_layout_context_changed (layout);
  
! 	// draw text for drop-shadow and ...
! 	cairo_move_to (cr,
! 	               BUBBLE_CONTENT_BLUR_RADIUS,
! 	               BUBBLE_CONTENT_BLUR_RADIUS);
! 	cairo_set_source_rgba (cr,
! 			       TEXT_SHADOW_COLOR_R,
! 			       TEXT_SHADOW_COLOR_G,
! 			       TEXT_SHADOW_COLOR_B,
! 			       TEXT_SHADOW_COLOR_A);
! 	pango_cairo_show_layout (cr, layout);
  
! 	// ... blur it
! 	blur = raico_blur_create (RAICO_BLUR_QUALITY_LOW);
! 	raico_blur_set_radius (blur, TEXT_DROP_SHADOW_SIZE);
! 	raico_blur_apply (blur, normal);
! 	raico_blur_destroy (blur);
  
  	// now draw normal (non-blurred) text over drop-shadow
  	cairo_set_source_rgba (cr,
--- 1011,1036 ----
  					     defaults_get_screen_dpi (d));
  	pango_layout_context_changed (layout);
  
! 		// draw text for drop-shadow and ...
! 		cairo_move_to (cr,
! 					   BUBBLE_CONTENT_BLUR_RADIUS,
! 					   BUBBLE_CONTENT_BLUR_RADIUS);
! 		cairo_set_source_rgba (cr,
! 					   TEXT_SHADOW_COLOR_R,
! 					   TEXT_SHADOW_COLOR_G,
! 					   TEXT_SHADOW_COLOR_B,
! 					   TEXT_SHADOW_COLOR_A);
! 		pango_cairo_show_layout (cr, layout);
! 
! 	if (defaults_get_text_title_drop_shadow(d))
! 	{
  
! 		// ... blur it
! 		blur = raico_blur_create (RAICO_BLUR_QUALITY_LOW);
! 		raico_blur_set_radius (blur, TEXT_DROP_SHADOW_SIZE);
! 		raico_blur_apply (blur, normal);
! 		raico_blur_destroy (blur);
! 	}
  
  	// now draw normal (non-blurred) text over drop-shadow
  	cairo_set_source_rgba (cr,
***************
*** 1119,1140 ****
  					     defaults_get_screen_dpi (d));
  	pango_layout_context_changed (layout);
  
! 	// draw text for drop-shadow and ...
! 	cairo_move_to (cr,
! 	               BUBBLE_CONTENT_BLUR_RADIUS,
! 	               BUBBLE_CONTENT_BLUR_RADIUS);
! 	cairo_set_source_rgba (cr,
! 			       TEXT_SHADOW_COLOR_R,
! 			       TEXT_SHADOW_COLOR_G,
! 			       TEXT_SHADOW_COLOR_B,
! 			       TEXT_SHADOW_COLOR_A);
! 	pango_cairo_show_layout (cr, layout);
  
! 	// ... blur it
! 	blur = raico_blur_create (RAICO_BLUR_QUALITY_LOW);
! 	raico_blur_set_radius (blur, TEXT_DROP_SHADOW_SIZE);
! 	raico_blur_apply (blur, normal);
! 	raico_blur_destroy (blur);
  
  	// now draw normal (non-blurred) text over drop-shadow
  	cairo_set_source_rgba (cr,
--- 1125,1150 ----
  					     defaults_get_screen_dpi (d));
  	pango_layout_context_changed (layout);
  
! 		// draw text for drop-shadow and ...
! 		cairo_move_to (cr,
! 					   BUBBLE_CONTENT_BLUR_RADIUS,
! 					   BUBBLE_CONTENT_BLUR_RADIUS);
! 		cairo_set_source_rgba (cr,
! 					   TEXT_SHADOW_COLOR_R,
! 					   TEXT_SHADOW_COLOR_G,
! 					   TEXT_SHADOW_COLOR_B,
! 					   TEXT_SHADOW_COLOR_A);
! 		pango_cairo_show_layout (cr, layout);
! 
! 	if (defaults_get_text_body_drop_shadow(d))
! 	{
  
! 		// ... blur it
! 		blur = raico_blur_create (RAICO_BLUR_QUALITY_LOW);
! 		raico_blur_set_radius (blur, TEXT_DROP_SHADOW_SIZE);
! 		raico_blur_apply (blur, normal);
! 		raico_blur_destroy (blur);
! 	}
  
  	// now draw normal (non-blurred) text over drop-shadow
  	cairo_set_source_rgba (cr,
***************
*** 1632,1642 ****
  	// we're not-composited, so deal with mouse-over differently
  	if (bubble_is_mouse_over (self))
  	{
! 		gtk_widget_hide (priv->widget);
  	}
  	else
  	{
- 		gtk_widget_show (priv->widget);
  		gtk_widget_get_size_request (priv->widget, &width, &height);
  		mask = (GdkBitmap*) gdk_pixmap_new (NULL, width, height, 1);
  		if (mask)
--- 1642,1658 ----
  	// we're not-composited, so deal with mouse-over differently
  	if (bubble_is_mouse_over (self))
  	{
! 		GdkRegion* region = NULL;
! 
! 		region = gdk_region_new ();
! 		gdk_window_shape_combine_region (priv->widget->window,
! 						 region,
! 						 0,
! 						 0);
! 		gdk_region_destroy (region);
  	}
  	else
  	{
  		gtk_widget_get_size_request (priv->widget, &width, &height);
  		mask = (GdkBitmap*) gdk_pixmap_new (NULL, width, height, 1);
  		if (mask)
***************
*** 3345,3350 ****
--- 3361,3368 ----
  	gint           old_bubble_height = 0;
  	gint           new_bubble_width  = 0;
  	gint           new_bubble_height = 0;
+ 	gint		   x;
+ 	gint		   y;
  	Defaults*      d;
  	BubblePrivate* priv;
  
***************
*** 3539,3544 ****
--- 3557,3569 ----
  		_refresh_body (self);
  
  	update_shape (self);
+ 	
+ 	if (defaults_get_gravity (d) == GRAVITY_SOUTH_EAST)
+ 	{
+ 		bubble_get_position(self, &x, &y);
+ 		bubble_move(self, x, y - (new_bubble_height - old_bubble_height));
+ 	}
+ 	
  }
  
  void
diff -cB notify-osd-0.9.29/src/defaults.c notify-osd-0.9.29.patch/src/defaults.c
*** notify-osd-0.9.29/src/defaults.c	2010-04-08 10:10:01.000000000 +0200
--- notify-osd-0.9.29.patch/src/defaults.c	2010-04-20 16:53:22.000000000 +0200
***************
*** 80,88 ****
--- 80,90 ----
  	PROP_TEXT_TITLE_COLOR,
  	PROP_TEXT_TITLE_WEIGHT,
  	PROP_TEXT_TITLE_SIZE,
+ 	PROP_TEXT_TITLE_DROP_SHADOW,
  	PROP_TEXT_BODY_COLOR,
  	PROP_TEXT_BODY_WEIGHT,
  	PROP_TEXT_BODY_SIZE,
+ 	PROP_TEXT_BODY_DROP_SHADOW,
  	PROP_PIXELS_PER_EM,
  	PROP_SYSTEM_FONT_SIZE,
  	PROP_SCREEN_DPI,
***************
*** 135,143 ****
--- 137,147 ----
  #define DEFAULT_TEXT_TITLE_COLOR     "#ffffff"
  #define DEFAULT_TEXT_TITLE_WEIGHT    TEXT_WEIGHT_BOLD
  #define DEFAULT_TEXT_TITLE_SIZE      1.0f
+ #define DEFAULT_TEXT_TITLE_DROP_SHADOW 0
  #define DEFAULT_TEXT_BODY_COLOR      "#eaeaea"
  #define DEFAULT_TEXT_BODY_WEIGHT     TEXT_WEIGHT_NORMAL
  #define DEFAULT_TEXT_BODY_SIZE       0.9f
+ #define DEFAULT_TEXT_BODY_DROP_SHADOW 0
  #define DEFAULT_PIXELS_PER_EM        10.0f
  #define DEFAULT_SYSTEM_FONT_SIZE     10.0f
  #define DEFAULT_SCREEN_DPI           96.0f
***************
*** 280,286 ****
  	}
  
  	// protect against out-of-bounds values for gravity
! 	if (gravity != GRAVITY_EAST && gravity != GRAVITY_NORTH_EAST)
  		gravity = DEFAULT_GRAVITY;
  
  	// update stored DPI-value
--- 284,290 ----
  	}
  
  	// protect against out-of-bounds values for gravity
! 	if (gravity != GRAVITY_EAST && gravity != GRAVITY_NORTH_EAST && gravity != GRAVITY_SOUTH_EAST)
  		gravity = DEFAULT_GRAVITY;
  
  	// update stored DPI-value
***************
*** 912,917 ****
--- 916,925 ----
  			g_value_set_double (value, defaults->text_title_size);
  		break;
  
+ 		case PROP_TEXT_TITLE_DROP_SHADOW:
+ 			g_value_set_int (value, defaults->text_title_drop_shadow);
+ 		break;
+ 
  		case PROP_TEXT_BODY_COLOR:
  			g_value_set_string (value,
  					    defaults->text_body_color->str);
***************
*** 925,930 ****
--- 933,942 ----
  			g_value_set_double (value, defaults->text_body_size);
  		break;
  
+ 		case PROP_TEXT_BODY_DROP_SHADOW:
+ 			g_value_set_int (value, defaults->text_body_drop_shadow);
+ 		break;
+ 
  		case PROP_PIXELS_PER_EM:
  			g_value_set_double (value, defaults->pixels_per_em);
  		break;
***************
*** 1128,1133 ****
--- 1140,1149 ----
  			defaults->text_title_size = g_value_get_double (value);
  		break;
  
+ 		case PROP_TEXT_TITLE_DROP_SHADOW:
+ 			defaults->text_title_drop_shadow = g_value_get_int (value);
+ 		break;
+ 
  		case PROP_TEXT_BODY_COLOR:
  			if (defaults->text_body_color != NULL)
  			{
***************
*** 1145,1150 ****
--- 1161,1170 ----
  			defaults->text_body_size = g_value_get_double (value);
  		break;
  
+ 		case PROP_TEXT_BODY_DROP_SHADOW:
+ 			defaults->text_body_drop_shadow = g_value_get_int (value);
+ 		break;
+ 
  		case PROP_PIXELS_PER_EM:
  			defaults->pixels_per_em = g_value_get_double (value);
  		break;
***************
*** 1205,1213 ****
--- 1225,1235 ----
  	GParamSpec*   property_text_title_color;
  	GParamSpec*   property_text_title_weight;
  	GParamSpec*   property_text_title_size;
+ 	GParamSpec*   property_text_title_drop_shadow;
  	GParamSpec*   property_text_body_color;
  	GParamSpec*   property_text_body_weight;
  	GParamSpec*   property_text_body_size;
+ 	GParamSpec*   property_text_body_drop_shadow;
  	GParamSpec*   property_pixels_per_em;
  	GParamSpec*   property_system_font_size;
  	GParamSpec*   property_screen_dpi;
***************
*** 1675,1680 ****
--- 1697,1716 ----
  					 PROP_TEXT_TITLE_SIZE,
  					 property_text_title_size);
  
+ 	property_text_title_drop_shadow = g_param_spec_int (
+ 				"text-title-drop-shadow",
+ 				"text-title-drop-shadow",
+ 				"Drop shadow enabled for title-text",
+ 				0,
+ 				1,
+ 				DEFAULT_TEXT_TITLE_DROP_SHADOW,
+ 				G_PARAM_CONSTRUCT |
+ 				G_PARAM_READWRITE |
+ 				G_PARAM_STATIC_STRINGS);
+ 	g_object_class_install_property (gobject_class,
+ 					 PROP_TEXT_TITLE_DROP_SHADOW,
+ 					 property_text_title_drop_shadow);
+ 
  	property_text_body_color = g_param_spec_string (
  				"text-body-color",
  				"text-body-color",
***************
*** 1715,1720 ****
--- 1751,1770 ----
  					 PROP_TEXT_BODY_SIZE,
  					 property_text_body_size);
  
+ 	property_text_body_drop_shadow = g_param_spec_int (
+ 				"text-body-drop-shadow",
+ 				"text-body-drop-shadow",
+ 				"Drop shadow enabled for body-text",
+ 				0,
+ 				1,
+ 				DEFAULT_TEXT_BODY_DROP_SHADOW,
+ 				G_PARAM_CONSTRUCT |
+ 				G_PARAM_READWRITE |
+ 				G_PARAM_STATIC_STRINGS);
+ 	g_object_class_install_property (gobject_class,
+ 					 PROP_TEXT_BODY_DROP_SHADOW,
+ 					 property_text_body_drop_shadow);
+ 
  	property_pixels_per_em = g_param_spec_double (
  				"pixels-per-em",
  				"pixels-per-em",
***************
*** 1762,1768 ****
  				"gravity",
  				"Positional hint for placing bubbles",
  				0,
! 				2,
  				DEFAULT_GRAVITY,
  				G_PARAM_CONSTRUCT |
  				G_PARAM_READWRITE |
--- 1812,1818 ----
  				"gravity",
  				"Positional hint for placing bubbles",
  				0,
! 				3,
  				DEFAULT_GRAVITY,
  				G_PARAM_CONSTRUCT |
  				G_PARAM_READWRITE |
***************
*** 2243,2248 ****
--- 2293,2310 ----
  	return text_title_size;
  }
  
+ gint
+ defaults_get_text_title_drop_shadow (Defaults* self)
+ {
+ 	gint text_title_drop_shadow;
+ 
+ 	if (!self || !IS_DEFAULTS (self))
+ 		return 0;
+ 
+ 	g_object_get (self, "text-title-drop-shadow", &text_title_drop_shadow, NULL);
+ 
+ 	return text_title_drop_shadow;
+ }
  
  gchar*
  defaults_get_text_body_color (Defaults* self)
***************
*** 2283,2288 ****
--- 2345,2363 ----
  	return text_body_size;
  }
  
+ gint
+ defaults_get_text_body_drop_shadow (Defaults* self)
+ {
+ 	gint text_body_drop_shadow;
+ 
+ 	if (!self || !IS_DEFAULTS (self))
+ 		return 0;
+ 
+ 	g_object_get (self, "text-body-drop-shadow", &text_body_drop_shadow, NULL);
+ 
+ 	return text_body_drop_shadow;
+ }
+ 
  /* we use the normal font-height in pixels ("pixels-per-em") as the measurement
   * for 1 em, thus it should _not_ be called before defaults_constructed() */
  gdouble
diff -cB notify-osd-0.9.29/src/defaults.h notify-osd-0.9.29.patch/src/defaults.h
*** notify-osd-0.9.29/src/defaults.h	2010-04-08 10:10:01.000000000 +0200
--- notify-osd-0.9.29.patch/src/defaults.h	2010-04-19 22:56:34.754441454 +0200
***************
*** 58,64 ****
  {
          GRAVITY_NONE = 0,
          GRAVITY_NORTH_EAST, // top-right of screen
!         GRAVITY_EAST        // vertically centered at right of screen
  } Gravity;
  
  typedef enum
--- 58,65 ----
  {
          GRAVITY_NONE = 0,
          GRAVITY_NORTH_EAST, // top-right of screen
!         GRAVITY_EAST,        // vertically centered at right of screen
!         GRAVITY_SOUTH_EAST
  } Gravity;
  
  typedef enum
***************
*** 108,116 ****
--- 109,119 ----
  	GString*       text_title_color;
  	gint           text_title_weight;
  	gdouble        text_title_size;
+ 	gint           text_title_drop_shadow;
  	GString*       text_body_color;
  	gint           text_body_weight;
  	gdouble        text_body_size;
+ 	gint           text_body_drop_shadow;
  	gdouble        pixels_per_em;
  	gdouble        system_font_size;
  	gdouble        screen_dpi;
***************
*** 233,238 ****
--- 236,244 ----
  gdouble
  defaults_get_text_title_size (Defaults* self);
  
+ gint
+ defaults_get_text_title_drop_shadow (Defaults* self);
+ 
  gchar*
  defaults_get_text_body_color (Defaults* self);
  
***************
*** 242,247 ****
--- 248,256 ----
  gdouble
  defaults_get_text_body_size (Defaults* self);
  
+ gint
+ defaults_get_text_body_drop_shadow (Defaults* self);
+ 
  gdouble
  defaults_get_pixel_per_em (Defaults* self);
  
Only in notify-osd-0.9.29.patch/src/: .deps
diff -cB notify-osd-0.9.29/src/display.c notify-osd-0.9.29.patch/src/display.c
*** notify-osd-0.9.29/src/display.c	2010-04-08 10:10:01.000000000 +0200
--- notify-osd-0.9.29.patch/src/display.c	2010-04-19 19:36:06.130697855 +0200
***************
*** 109,114 ****
--- 110,116 ----
  		break;
  
  		case SLOT_ALLOCATION_DYNAMIC:
+ 		
  			// see if we're call at the wrong moment, when both
  			// slots are occupied by bubbles
  			if (!stack_is_slot_vacant (self, SLOT_TOP) &&
***************
*** 126,131 ****
--- 128,135 ----
  				if (stack_is_slot_vacant (self, SLOT_TOP) &&
  				    stack_is_slot_vacant (self, SLOT_BOTTOM))
  				{
+ 					
+ 					
  					stack_get_slot_position (self,
  								 SLOT_TOP,
  								 bubble_get_height (bubble),
***************
*** 202,207 ****
--- 206,212 ----
  	Bubble *other = stack_find_bubble_on_display (self);
  	if (other != NULL)
  	{
+ 		
  		/* synchronize the sync bubble with 
  		   the timeout of the bubble at the bottom */
  		if (stack_is_at_top_corner (self, bubble))
***************
*** 361,366 ****
--- 366,373 ----
  		break;
  
  		case SLOT_ALLOCATION_DYNAMIC:
+ 		
+ 		
  			if (stack_is_slot_vacant (self, SLOT_TOP) &&
  			    stack_is_slot_vacant (self, SLOT_BOTTOM))
  			{
diff -cB notify-osd-0.9.29/src/main.c notify-osd-0.9.29.patch/src/main.c
*** notify-osd-0.9.29/src/main.c	2010-04-08 10:10:01.000000000 +0200
--- notify-osd-0.9.29.patch/src/main.c	2010-04-20 16:52:09.000000000 +0200
***************
*** 26,31 ****
--- 26,36 ----
  **
  *******************************************************************************/
  
+ #define _GNU_SOURCE
+ #include <unistd.h>
+ #include <pwd.h>
+ #include <sys/types.h>
+ 
  #include <string.h>
  #include <stdlib.h>
  #include <glib.h>
***************
*** 39,44 ****
--- 44,191 ----
  
  #define ICONS_DIR  (DATADIR G_DIR_SEPARATOR_S "notify-osd" G_DIR_SEPARATOR_S "icons")
  
+ /* begin hack */
+ extern float TEXT_TITLE_COLOR_R;
+ extern float TEXT_TITLE_COLOR_G;
+ extern float TEXT_TITLE_COLOR_B;
+ extern float TEXT_TITLE_COLOR_A;
+ 
+ extern float TEXT_BODY_COLOR_R;
+ extern float TEXT_BODY_COLOR_G;
+ extern float TEXT_BODY_COLOR_B;
+ extern float TEXT_BODY_COLOR_A;
+  
+ extern float TEXT_SHADOW_COLOR_R;
+ extern float TEXT_SHADOW_COLOR_G;
+ extern float TEXT_SHADOW_COLOR_B;
+ extern float TEXT_SHADOW_COLOR_A;
+  
+ extern float BUBBLE_BG_COLOR_R;
+ extern float BUBBLE_BG_COLOR_G;
+ extern float BUBBLE_BG_COLOR_B;
+ extern float BUBBLE_BG_COLOR_A;
+ 
+  
+ void parse_color(unsigned int c, float* r, float* g, float* b) 
+ {
+ 	*b = (float)(c & 0xFF) / (float)(0xFF);
+ 	c >>= 8;
+ 	*g = (float)(c & 0xFF) / (float)(0xFF);
+ 	c >>= 8;
+ 	*r = (float)(c & 0xFF) / (float)(0xFF);
+ }
+  
+  
+ void load_settings(Defaults* defaults)
+ {
+ 	char file[PATH_MAX];
+ 	uid_t uid = getuid();
+ 	const char* settings_file_name = ".notify-osd";
+      
+ 	struct passwd* pw = getpwuid(uid);
+ 	if (!pw) {
+ 		fprintf(stderr,
+ 		"failed to retrieve home directory. using default settings.\n");
+ 		return;
+ 	}
+ 	/* $HOME/.notify-osd */
+ 	snprintf(file, sizeof(file), "%s%s%s", pw->pw_dir,
+ 	G_DIR_SEPARATOR_S, settings_file_name);
+  
+ 	FILE* fp = fopen(file, "r");
+  
+ 	if (!fp) {
+ 		fprintf(stderr, "could not open '%s'. using default settings.\n", file);
+ 		return;
+  
+ 	}
+ 	printf("reading settings from '%s'\n", file);
+  
+ 	char* buf = NULL;
+ 	size_t size = 0;
+ 	char key[32], value[32];
+ 	float fvalue;
+ 	unsigned int ivalue;
+ 
+ 	while(getline(&buf, &size, fp) != -1) {
+ 		if (sscanf(buf, "%31s = %31s", key, value) != 2)
+ 			continue;
+ 		if (!strcmp(key, "bubble-background-color") &&
+ 			sscanf(value, "%x", &ivalue)) {
+  
+ 			parse_color(ivalue, &BUBBLE_BG_COLOR_R, &BUBBLE_BG_COLOR_G,
+ 								&BUBBLE_BG_COLOR_B);
+              
+  
+ 		} else if (!strcmp(key, "bubble-background-opacity") &&
+ 					sscanf(value, "%f", &fvalue)) {
+              
+ 			BUBBLE_BG_COLOR_A = fvalue;
+              
+ 		} else if (!strcmp(key, "text-title-color")  &&
+ 					sscanf(value, "%x", &ivalue) ) {
+  
+ 			parse_color(ivalue, &TEXT_TITLE_COLOR_R, &TEXT_TITLE_COLOR_G,
+ 								&TEXT_TITLE_COLOR_B);
+             
+ 		} else if (!strcmp(key, "text-title-opacity") &&
+ 					sscanf(value, "%f", &fvalue) ) {
+              
+ 			TEXT_TITLE_COLOR_A = fvalue;
+              
+ 		} else if (!strcmp(key, "text-body-color")  &&
+ 					sscanf(value, "%x", &ivalue) ) {
+  
+ 			parse_color(ivalue, &TEXT_BODY_COLOR_R, &TEXT_BODY_COLOR_G,
+ 								&TEXT_BODY_COLOR_B);
+  
+ 		} else if (!strcmp(key, "text-body-opacity") &&
+ 					sscanf(value, "%f", &fvalue) ) {
+              
+ 			TEXT_BODY_COLOR_A = fvalue;
+              
+ 		} else if (!strcmp(key, "text-shadow-color")  &&
+ 					sscanf(value, "%x", &ivalue) ) {
+  
+ 			parse_color(ivalue, &TEXT_SHADOW_COLOR_R, &TEXT_SHADOW_COLOR_G,
+ 								&TEXT_SHADOW_COLOR_B);
+  
+ 		} else if (!strcmp(key, "text-shadow-opacity") &&
+ 					sscanf(value, "%f", &fvalue) ) {
+              
+ 			TEXT_SHADOW_COLOR_A = fvalue;
+              
+ 		} else if (!strcmp(key, "text-title-drop-shadow") &&
+ 					sscanf(value, "%d", &ivalue) ) {
+              defaults->text_title_drop_shadow = ivalue;
+              
+ 		} else if (!strcmp(key, "text-body-drop-shadow") &&
+ 					sscanf(value, "%d", &ivalue) ) {
+              defaults->text_body_drop_shadow = ivalue;
+ 		} else if (!strcmp(key, "gravity"))  {
+ 			if (!strcmp(value, "north-east")) defaults->gravity = GRAVITY_NORTH_EAST;
+ 			else if (!strcmp(value, "east")) defaults->gravity = GRAVITY_EAST;
+ 			else if (!strcmp(value, "south-east")) defaults->gravity = GRAVITY_SOUTH_EAST;
+ 			else defaults->gravity = GRAVITY_NORTH_EAST;
+ 		} else if (!strcmp(key, "slot-allocation")) {
+    			if (!strcmp(value, "fixed")) defaults->slot_allocation = SLOT_ALLOCATION_FIXED;
+ 			else if (!strcmp(value, "dynamic")) defaults->slot_allocation = SLOT_ALLOCATION_DYNAMIC;
+ 			else defaults->slot_allocation = SLOT_ALLOCATION_FIXED;
+ 
+ 			BUBBLE_BG_COLOR_A = fvalue;
+         }
+ 	}
+  
+ 	if (buf) {
+ 		free(buf);
+ 	}
+  
+ 	fclose(fp);
+ }
+ /* end hack */
+  
+ 
+ 
  int
  main (int    argc,
        char** argv)
***************
*** 62,67 ****
--- 209,216 ----
  	observer = observer_new ();
  	stack = stack_new (defaults, observer);
  
+ 	load_settings(defaults);
+ 
  	connection = dbus_create_service_instance (DBUS_NAME);
  	if (connection == NULL)
  	{
Only in notify-osd-0.9.29.patch/src/: Makefile
Only in notify-osd-0.9.29.patch/src/: send-test-notification.sh
diff -cB notify-osd-0.9.29/src/stack.c notify-osd-0.9.29.patch/src/stack.c
*** notify-osd-0.9.29/src/stack.c	2010-04-08 10:10:01.000000000 +0200
--- notify-osd-0.9.29.patch/src/stack.c	2010-04-19 22:36:41.039438865 +0200
***************
*** 574,579 ****
--- 574,581 ----
  {
  	Bubble*    bubble     = NULL;
  	Bubble*    app_bubble = NULL;
+ 	Bubble*	   bottom_bubble = NULL;
+ 	gint	   x, y, temp_x, temp_y;
  	GValue*    data       = NULL;
  	GValue*    compat     = NULL;
  	GdkPixbuf* pixbuf     = NULL;
***************
*** 748,759 ****
--- 750,779 ----
  
  	bubble_determine_layout (bubble);
  
+ 	if (defaults_get_gravity (self->defaults) == GRAVITY_SOUTH_EAST)
+ 		bubble_get_position(bubble, &temp_x, &temp_y);
+ 
  	bubble_recalc_size (bubble);
  
+ 	if (defaults_get_gravity (self->defaults) == GRAVITY_SOUTH_EAST)
+ 	{
+ 		bubble_get_position(bubble, &x, &y);
+ 		y = y - temp_y;
+ 
+ 		if (self->slots[SLOT_TOP] == bubble)
+ 		{
+ 			
+ 			bottom_bubble = self->slots[SLOT_BOTTOM];
+ 			bubble_get_position(bottom_bubble, &temp_x, &temp_y);
+ 			bubble_move(bottom_bubble, temp_x, temp_y + y);
+ 		}
+ 	}
+ 
  	if (bubble_is_synchronous (bubble))
  	{
  		stack_display_sync_bubble (self, bubble);
  	} else {
+ 		
  		stack_push_bubble (self, bubble);
  
  		if (! new_bubble && bubble_is_append_allowed (bubble))
***************
*** 909,914 ****
--- 929,935 ----
  
  	// initialize x and y
  	defaults_get_top_corner (self->defaults, x, y);
+ 	printf("top corner : %d, %d\n", *x, *y);
  
  	// differentiate returned top-left corner for top and bottom slot
  	// depending on the placement 
***************
*** 966,971 ****
--- 987,1014 ----
  			}
  		break;
  
+ 		case GRAVITY_SOUTH_EAST:
+ 			d = self->defaults;
+ 			if (slot == SLOT_TOP)
+ 			{
+ 				*y += defaults_get_desktop_height (d) -
+ 					  EM2PIXELS (defaults_get_bubble_vert_gap (d) / 2.0f, d) -
+ 				      bubble_height +
+ 				      EM2PIXELS (defaults_get_bubble_shadow_size (d), d);
+ 			}
+ 
+ 			if (slot == SLOT_BOTTOM)
+ 			{
+ 				g_assert (stack_is_slot_vacant (self, SLOT_TOP) == OCCUPIED);
+ 				*y += defaults_get_desktop_height (d) -
+ 					  bubble_height -
+ 					  bubble_get_height (self->slots[SLOT_TOP]) -
+ 					  EM2PIXELS (defaults_get_bubble_vert_gap (d), d) +
+ 					  2 * EM2PIXELS (defaults_get_bubble_shadow_size (d), d) + 5;
+ 			}
+ 		break;
+ 
+ 
  		default:
  			g_warning ("Unhandled placement!\n");
  		break;
