Merge pull request #684 from chronus7/master

Adding vertical content alignment control.
This commit is contained in:
Nikos Tsipinakis 2020-01-30 15:07:52 +02:00 committed by GitHub
commit dfd6e76de5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 72 additions and 13 deletions

View File

@ -33,6 +33,7 @@ struct settings defaults = {
.idle_threshold = 0, /* don't timeout notifications when idle for x seconds */ .idle_threshold = 0, /* don't timeout notifications when idle for x seconds */
.show_age_threshold = -1, /* show age of notification, when notification is older than x seconds */ .show_age_threshold = -1, /* show age of notification, when notification is older than x seconds */
.align = ALIGN_LEFT, /* text alignment ALIGN_[LEFT|CENTER|RIGHT] */ .align = ALIGN_LEFT, /* text alignment ALIGN_[LEFT|CENTER|RIGHT] */
.vertical_alignment = VERTICAL_CENTER, /* vertical content alignment VERTICAL_[TOP|CENTER|BOTTOM] */
.sticky_history = true, .sticky_history = true,
.history_length = 20, /* max amount of notifications kept in history */ .history_length = 20, /* max amount of notifications kept in history */
.show_indicators = true, .show_indicators = true,

View File

@ -337,6 +337,11 @@ removed from the format.
Defines how the text should be aligned within the notification. Defines how the text should be aligned within the notification.
=item B<vertical_alignment> (values: [top/center/bottom], default: center)
Defines how the text and icon should be aligned vertically within the
notification. If icons are disabled, this option has no effect.
=item B<show_age_threshold> (default: -1) =item B<show_age_threshold> (default: -1)
Show age of message if message is older than this time. Show age of message if message is older than this time.

View File

@ -132,6 +132,10 @@
# Possible values are "left", "center" and "right". # Possible values are "left", "center" and "right".
alignment = left alignment = left
# Vertical alignment of message text and icon.
# Possible values are "top", "center" and "bottom".
vertical_alignment = center
# Show age of message if message is older than show_age_threshold # Show age of message if message is older than show_age_threshold
# seconds. # seconds.
# Set to -1 to disable. # Set to -1 to disable.

View File

@ -511,33 +511,52 @@ static void render_content(cairo_t *c, struct colored_layout *cl, int width)
int h_text; int h_text;
pango_layout_get_pixel_size(cl->l, NULL, &h_text); pango_layout_get_pixel_size(cl->l, NULL, &h_text);
if (cl->icon && settings.icon_position == ICON_LEFT) { int text_x = settings.h_padding,
cairo_move_to(c, cairo_image_surface_get_width(cl->icon) + 2 * settings.h_padding, text_y = settings.padding + h / 2 - h_text / 2;
settings.padding + h/2 - h_text/2);
} else if (cl->icon && settings.icon_position == ICON_RIGHT) { // text positioning
cairo_move_to(c, settings.h_padding, settings.padding + h/2 - h_text/2); if (cl->icon) {
} else { // vertical alignment
cairo_move_to(c, settings.h_padding, settings.padding); if (settings.vertical_alignment == VERTICAL_TOP) {
text_y = settings.padding;
} else if (settings.vertical_alignment == VERTICAL_BOTTOM) {
text_y = h + settings.padding - h_text;
if (text_y < 0)
text_y = settings.padding;
} // else VERTICAL_CENTER
// icon position
if (settings.icon_position == ICON_LEFT) {
text_x = cairo_image_surface_get_width(cl->icon) + 2 * settings.h_padding;
} // else ICON_RIGHT
} }
cairo_move_to(c, text_x, text_y);
cairo_set_source_rgb(c, cl->fg.r, cl->fg.g, cl->fg.b); cairo_set_source_rgb(c, cl->fg.r, cl->fg.g, cl->fg.b);
pango_cairo_update_layout(c, cl->l); pango_cairo_update_layout(c, cl->l);
pango_cairo_show_layout(c, cl->l); pango_cairo_show_layout(c, cl->l);
// icon positioning
if (cl->icon) { if (cl->icon) {
unsigned int image_width = cairo_image_surface_get_width(cl->icon), unsigned int image_width = cairo_image_surface_get_width(cl->icon),
image_height = cairo_image_surface_get_height(cl->icon), image_height = cairo_image_surface_get_height(cl->icon),
image_x, image_x = width - settings.h_padding - image_width,
image_y = settings.padding + h/2 - image_height/2; image_y = settings.padding + h/2 - image_height/2;
// vertical alignment
if (settings.vertical_alignment == VERTICAL_TOP) {
image_y = settings.padding;
} else if (settings.vertical_alignment == VERTICAL_BOTTOM) {
image_y = h + settings.padding - image_height;
if (image_y < settings.padding || image_y > h)
image_y = settings.padding;
} // else VERTICAL_CENTER
// icon position
if (settings.icon_position == ICON_LEFT) { if (settings.icon_position == ICON_LEFT) {
image_x = settings.h_padding; image_x = settings.h_padding;
} else if (settings.icon_position == ICON_RIGHT){ } // else ICON_RIGHT
image_x = width - settings.h_padding - image_width;
} else {
LOG_E("Tried to draw icon but icon position is not valid. %s:%d", __FILE__, __LINE__);
}
cairo_set_source_surface(c, cl->icon, image_x, image_y); cairo_set_source_surface(c, cl->icon, image_x, image_y);
cairo_rectangle(c, image_x, image_y, image_width, image_height); cairo_rectangle(c, image_x, image_y, image_width, image_height);

View File

@ -103,6 +103,18 @@ bool string_parse_icon_position(const char *s, enum icon_position *ret)
return false; return false;
} }
bool string_parse_vertical_alignment(const char *s, enum vertical_alignment *ret)
{
ASSERT_OR_RET(STR_FULL(s), false);
ASSERT_OR_RET(ret, false);
STRING_PARSE_RET("top", VERTICAL_TOP);
STRING_PARSE_RET("center", VERTICAL_CENTER);
STRING_PARSE_RET("bottom", VERTICAL_BOTTOM);
return false;
}
bool string_parse_markup_mode(const char *s, enum markup_mode *ret) bool string_parse_markup_mode(const char *s, enum markup_mode *ret)
{ {
ASSERT_OR_RET(STR_FULL(s), false); ASSERT_OR_RET(STR_FULL(s), false);

View File

@ -14,6 +14,7 @@ bool string_parse_ellipsize(const char *s, enum ellipsize *ret);
bool string_parse_follow_mode(const char *s, enum follow_mode *ret); bool string_parse_follow_mode(const char *s, enum follow_mode *ret);
bool string_parse_fullscreen(const char *s, enum behavior_fullscreen *ret); bool string_parse_fullscreen(const char *s, enum behavior_fullscreen *ret);
bool string_parse_icon_position(const char *s, enum icon_position *ret); bool string_parse_icon_position(const char *s, enum icon_position *ret);
bool string_parse_vertical_alignment(const char *s, enum vertical_alignment *ret);
bool string_parse_markup_mode(const char *s, enum markup_mode *ret); bool string_parse_markup_mode(const char *s, enum markup_mode *ret);
bool string_parse_mouse_action(const char *s, enum mouse_action *ret); bool string_parse_mouse_action(const char *s, enum mouse_action *ret);
bool string_parse_sepcolor(const char *s, struct separator_color_data *ret); bool string_parse_sepcolor(const char *s, struct separator_color_data *ret);

View File

@ -423,6 +423,21 @@ void load_settings(char *cmdline_config_path)
g_free(c); g_free(c);
} }
{
char *c = option_get_string(
"global",
"vertical_alignment", "-vertical_alignment", "center",
"Align icon and text top/center/bottom"
);
if (!string_parse_vertical_alignment(c, &settings.vertical_alignment)) {
if (c)
LOG_W("Unknown vertical alignment: '%s'", c);
settings.vertical_alignment = defaults.vertical_alignment;
}
g_free(c);
}
settings.min_icon_size = option_get_int( settings.min_icon_size = option_get_int(
"global", "global",
"min_icon_size", "-min_icon_size", defaults.min_icon_size, "min_icon_size", "-min_icon_size", defaults.min_icon_size,

View File

@ -11,6 +11,7 @@
enum alignment { ALIGN_LEFT, ALIGN_CENTER, ALIGN_RIGHT }; enum alignment { ALIGN_LEFT, ALIGN_CENTER, ALIGN_RIGHT };
enum ellipsize { ELLIPSE_START, ELLIPSE_MIDDLE, ELLIPSE_END }; enum ellipsize { ELLIPSE_START, ELLIPSE_MIDDLE, ELLIPSE_END };
enum icon_position { ICON_LEFT, ICON_RIGHT, ICON_OFF }; enum icon_position { ICON_LEFT, ICON_RIGHT, ICON_OFF };
enum vertical_alignment { VERTICAL_TOP, VERTICAL_CENTER, VERTICAL_BOTTOM };
enum separator_color { SEP_FOREGROUND, SEP_AUTO, SEP_FRAME, SEP_CUSTOM }; enum separator_color { SEP_FOREGROUND, SEP_AUTO, SEP_FRAME, SEP_CUSTOM };
enum follow_mode { FOLLOW_NONE, FOLLOW_MOUSE, FOLLOW_KEYBOARD }; enum follow_mode { FOLLOW_NONE, FOLLOW_MOUSE, FOLLOW_KEYBOARD };
enum mouse_action { MOUSE_NONE, MOUSE_DO_ACTION, MOUSE_CLOSE_CURRENT, MOUSE_CLOSE_ALL }; enum mouse_action { MOUSE_NONE, MOUSE_DO_ACTION, MOUSE_CLOSE_CURRENT, MOUSE_CLOSE_ALL };
@ -75,6 +76,7 @@ struct settings {
char *browser; char *browser;
char **browser_cmd; char **browser_cmd;
enum icon_position icon_position; enum icon_position icon_position;
enum vertical_alignment vertical_alignment;
int min_icon_size; int min_icon_size;
int max_icon_size; int max_icon_size;
char *icon_path; char *icon_path;