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 + #include + #include + #include #include #include *************** *** 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;