diff -ruN src-old/bubble.c src/bubble.c --- src-old/bubble.c 2009-10-20 11:48:09.000000000 +0300 +++ src/bubble.c 2009-12-05 01:13:41.000000000 +0200 @@ -122,25 +122,25 @@ // 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 +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; #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 +float 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 +float BUBBLE_BG_COLOR_R = 0.07f; +float BUBBLE_BG_COLOR_G = 0.07f; +float BUBBLE_BG_COLOR_B = 0.07f; +float BUBBLE_BG_COLOR_A = 0.9f; #define INDICATOR_UNLIT_R 1.0f #define INDICATOR_UNLIT_G 1.0f diff -ruN src-old/defaults.c src/defaults.c --- src-old/defaults.c 2009-10-20 11:29:52.000000000 +0300 +++ src/defaults.c 2009-12-04 04:46:41.000000000 +0200 @@ -114,40 +114,41 @@ /* these values are interpreted as em-measurements and do comply to the * visual guide for jaunty-notifications */ #define DEFAULT_DESKTOP_BOTTOM_GAP 6.0f -#define DEFAULT_BUBBLE_WIDTH 24.0f -#define DEFAULT_BUBBLE_MIN_HEIGHT 5.0f -#define DEFAULT_BUBBLE_MAX_HEIGHT 12.2f -#define DEFAULT_BUBBLE_VERT_GAP 0.5f -#define DEFAULT_BUBBLE_HORZ_GAP 0.5f +float DEFAULT_BUBBLE_WIDTH = 24.0f; +float DEFAULT_BUBBLE_MIN_HEIGHT = 5.0f; +float DEFAULT_BUBBLE_MAX_HEIGHT = 12.2f; +float DEFAULT_BUBBLE_VERT_GAP = 0.5f; +float DEFAULT_BUBBLE_HORZ_GAP = 0.5f; #define DEFAULT_BUBBLE_SHADOW_SIZE 0.7f #define DEFAULT_BUBBLE_SHADOW_COLOR "#000000" #define DEFAULT_BUBBLE_BG_COLOR "#131313" #define DEFAULT_BUBBLE_BG_OPACITY "#cc" #define DEFAULT_BUBBLE_HOVER_OPACITY "#66" -#define DEFAULT_BUBBLE_CORNER_RADIUS 0.375f +float DEFAULT_BUBBLE_CORNER_RADIUS = 0.375f; #define DEFAULT_CONTENT_SHADOW_SIZE 0.125f #define DEFAULT_CONTENT_SHADOW_COLOR "#000000" -#define DEFAULT_MARGIN_SIZE 1.0f -#define DEFAULT_ICON_SIZE 3.0f -#define DEFAULT_GAUGE_SIZE 0.625f -#define DEFAULT_GAUGE_OUTLINE_WIDTH 0.125f +float DEFAULT_MARGIN_SIZE = 1.0f; +float DEFAULT_ICON_SIZE = 3.0f; +float DEFAULT_GAUGE_SIZE = 0.625f; +#define DEFAULT_GAUGE_OUTLINE_WIDTH 0.125f #define DEFAULT_TEXT_FONT_FACE "Sans" #define DEFAULT_TEXT_TITLE_COLOR "#ffffff" -#define DEFAULT_TEXT_TITLE_WEIGHT TEXT_WEIGHT_BOLD -#define DEFAULT_TEXT_TITLE_SIZE 1.0f +short DEFAULT_TEXT_TITLE_WEIGHT = TEXT_WEIGHT_BOLD; +float DEFAULT_TEXT_TITLE_SIZE = 1.0f; #define DEFAULT_TEXT_BODY_COLOR "#eaeaea" -#define DEFAULT_TEXT_BODY_WEIGHT TEXT_WEIGHT_NORMAL -#define DEFAULT_TEXT_BODY_SIZE 0.9f +short DEFAULT_TEXT_BODY_WEIGHT = TEXT_WEIGHT_NORMAL; +float DEFAULT_TEXT_BODY_SIZE = 0.9f; #define DEFAULT_PIXELS_PER_EM 10.0f #define DEFAULT_SYSTEM_FONT_SIZE 10.0f #define DEFAULT_SCREEN_DPI 96.0f #define DEFAULT_GRAVITY GRAVITY_NORTH_EAST +short SLOT_ALLOCATION = SLOT_ALLOCATION_DYNAMIC; /* these values are interpreted as milliseconds-measurements and do comply to * the visual guide for jaunty-notifications */ -#define DEFAULT_FADE_IN_TIMEOUT 250 -#define DEFAULT_FADE_OUT_TIMEOUT 1000 -#define DEFAULT_ON_SCREEN_TIMEOUT 10000 +float DEFAULT_FADE_IN_TIMEOUT = 250; +float DEFAULT_FADE_OUT_TIMEOUT = 1000; +float DEFAULT_ON_SCREEN_TIMEOUT = 10000; /* GConf-keys to watch */ #define GCONF_UI_FONT_NAME "/desktop/gnome/interface/font_name" @@ -755,7 +756,7 @@ } // use fixed slot-allocation for async. and sync. bubbles - self->slot_allocation = SLOT_ALLOCATION_FIXED; + self->slot_allocation = SLOT_ALLOCATION; } static void diff -ruN src-old/main.c src/main.c --- src-old/main.c 2009-10-20 11:29:52.000000000 +0300 +++ src/main.c 2009-12-05 01:14:36.000000000 +0200 @@ -25,6 +25,10 @@ ** with this program. If not, see . ** *******************************************************************************/ +#define _GNU_SOURCE /* getline */ +#include /* getuid */ +#include /* getpwuid */ +#include #include #include @@ -39,6 +43,197 @@ #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_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; + +extern float DEFAULT_TEXT_TITLE_SIZE; +extern float DEFAULT_TEXT_BODY_SIZE; +extern float DEFAULT_ON_SCREEN_TIMEOUT; + +extern short DEFAULT_TEXT_TITLE_WEIGHT; +extern short DEFAULT_TEXT_BODY_WEIGHT; +extern short SLOT_ALLOCATION; + +extern float DEFAULT_MARGIN_SIZE; +extern float DEFAULT_BUBBLE_CORNER_RADIUS; +extern float DEFAULT_BUBBLE_WIDTH; +extern float DEFAULT_BUBBLE_VERT_GAP; +extern float DEFAULT_BUBBLE_HORZ_GAP; +extern float DEFAULT_ICON_SIZE; +extern float DEFAULT_GAUGE_SIZE; + +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(void) +{ + 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*0.01; + + } 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*0.01; + + } 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*0.01; + + } else if (!strcmp(key, "text-shadow-opacity") && + sscanf(value, "%f", &fvalue) ) { + + TEXT_SHADOW_COLOR_A = fvalue*0.01; + + } else if (!strcmp(key, "text-title-size") && + sscanf(value, "%f", &fvalue) ) { + DEFAULT_TEXT_TITLE_SIZE = fvalue*0.01; + + } else if (!strcmp(key, "text-body-size") && + sscanf(value, "%f", &fvalue) ) { + DEFAULT_TEXT_BODY_SIZE = fvalue*0.01; + + } else if (!strcmp(key, "bubble-expire-timeout") && + sscanf(value, "%f", &fvalue) ) { + DEFAULT_ON_SCREEN_TIMEOUT = fvalue*1000; + + } else if (!strcmp(key, "text-title-weight")) { + if (!strcmp(value, "bold")) { + DEFAULT_TEXT_TITLE_WEIGHT = 700; + } else if (!strcmp(value, "normal")) { + DEFAULT_TEXT_TITLE_WEIGHT = 400; + } else if (!strcmp(value, "light")) { + DEFAULT_TEXT_TITLE_WEIGHT = 300; + } + } else if (!strcmp(key, "text-body-weight")) { + if (!strcmp(value, "bold")) { + DEFAULT_TEXT_BODY_WEIGHT = 700; + } else if (!strcmp(value, "normal")) { + DEFAULT_TEXT_BODY_WEIGHT = 400; + } else if (!strcmp(value, "light")) { + DEFAULT_TEXT_BODY_WEIGHT = 300; + } + } else if (!strcmp(key, "text-margin-size") && + sscanf(value, "%f", &fvalue) ) { + DEFAULT_MARGIN_SIZE = fvalue*0.1; + + } else if (!strcmp(key, "bubble-corner-radius") && + sscanf(value, "%f", &fvalue) ) { + DEFAULT_BUBBLE_CORNER_RADIUS = fvalue*0.01; + + } else if (!strcmp(key, "bubble-width") && + sscanf(value, "%f", &fvalue) ) { + DEFAULT_BUBBLE_WIDTH = fvalue*0.1; + + } else if (!strcmp(key, "slot-allocation")) { + if (!strcmp(value, "dynamic")) { + SLOT_ALLOCATION = SLOT_ALLOCATION_DYNAMIC; + } else if (!strcmp(value, "fixed")) { + SLOT_ALLOCATION = SLOT_ALLOCATION_FIXED; + } + } else if (!strcmp(key, "bubble-vertical-gap") && + sscanf(value, "%f", &fvalue) ) { + DEFAULT_BUBBLE_VERT_GAP = fvalue*0.1; + + } else if (!strcmp(key, "bubble-horizontal-gap") && + sscanf(value, "%f", &fvalue) ) { + DEFAULT_BUBBLE_HORZ_GAP = fvalue*0.1; + + } else if (!strcmp(key, "bubble-icon-size") && + sscanf(value, "%f", &fvalue) ) { + DEFAULT_ICON_SIZE = fvalue*0.1; + + } else if (!strcmp(key, "bubble-gauge-size") && + sscanf(value, "%f", &fvalue) ) { + DEFAULT_GAUGE_SIZE = fvalue*0.1; + + } + + } + + if (buf) { + free(buf); + } + + fclose(fp); +} +/* end hack */ + int main (int argc, char** argv) @@ -58,6 +253,8 @@ gtk_icon_theme_append_search_path(gtk_icon_theme_get_default(), ICONS_DIR); + load_settings(); + defaults = defaults_new (); observer = observer_new (); stack = stack_new (defaults, observer);