aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sway/input/cursor.c8
-rw-r--r--sway/tree/output.c2
-rw-r--r--swaybar/render.c86
3 files changed, 53 insertions, 43 deletions
diff --git a/sway/input/cursor.c b/sway/input/cursor.c
index 0d5e9361..9af7ef57 100644
--- a/sway/input/cursor.c
+++ b/sway/input/cursor.c
@@ -87,6 +87,10 @@ static struct sway_node *node_at_coords(
return NULL;
}
struct sway_output *output = wlr_output->data;
+ if (!output) {
+ // output is being destroyed
+ return NULL;
+ }
double ox = lx, oy = ly;
wlr_output_layout_output_coords(root->output_layout, wlr_output, &ox, &oy);
@@ -1094,6 +1098,8 @@ static void dispatch_cursor_axis(struct sway_cursor *cursor,
enum wlr_edges edge = cont ? find_edge(cont, cursor) : WLR_EDGE_NONE;
bool on_border = edge != WLR_EDGE_NONE;
bool on_titlebar = cont && !on_border && !surface;
+ bool on_titlebar_border = cont && on_border &&
+ cursor->cursor->y < cont->content_y;
bool on_contents = cont && !on_border && surface;
float scroll_factor =
(ic == NULL || ic->scroll_factor == FLT_MIN) ? 1.0f : ic->scroll_factor;
@@ -1119,7 +1125,7 @@ static void dispatch_cursor_axis(struct sway_cursor *cursor,
}
// Scrolling on a tabbed or stacked title bar (handled as press event)
- if (!handled && on_titlebar) {
+ if (!handled && (on_titlebar || on_titlebar_border)) {
enum sway_container_layout layout = container_parent_layout(cont);
if (layout == L_TABBED || layout == L_STACKED) {
struct sway_node *tabcontainer = node_get_parent(node);
diff --git a/sway/tree/output.c b/sway/tree/output.c
index 95ab9378..f24be010 100644
--- a/sway/tree/output.c
+++ b/sway/tree/output.c
@@ -58,6 +58,7 @@ struct sway_output *output_create(struct wlr_output *wlr_output) {
wlr_output->data = output;
wl_signal_add(&wlr_output->events.destroy, &output->destroy);
+ wl_signal_init(&output->events.destroy);
wl_list_insert(&root->all_outputs, &output->link);
@@ -76,7 +77,6 @@ void output_enable(struct sway_output *output, struct output_config *oc) {
for (size_t i = 0; i < len; ++i) {
wl_list_init(&output->layers[i]);
}
- wl_signal_init(&output->events.destroy);
output->enabled = true;
list_add(root->outputs, output);
diff --git a/swaybar/render.c b/swaybar/render.c
index 9fe4ee9c..7cbcea07 100644
--- a/swaybar/render.c
+++ b/swaybar/render.c
@@ -90,13 +90,24 @@ static uint32_t render_status_line_text(cairo_t *cairo,
return output->height;
}
-static void render_sharp_line(cairo_t *cairo, uint32_t color,
+static void render_sharp_rectangle(cairo_t *cairo, uint32_t color,
double x, double y, double width, double height) {
+ cairo_save(cairo);
cairo_set_source_u32(cairo, color);
+ cairo_set_antialias(cairo, CAIRO_ANTIALIAS_NONE);
+ cairo_rectangle(cairo, x, y, width, height);
+ cairo_fill(cairo);
+ cairo_restore(cairo);
+}
+
+static void render_sharp_line(cairo_t *cairo, uint32_t color,
+ double x, double y, double width, double height) {
if (width > 1 && height > 1) {
- cairo_rectangle(cairo, x, y, width, height);
- cairo_fill(cairo);
+ render_sharp_rectangle(cairo, color, x, y, width, height);
} else {
+ cairo_save(cairo);
+ cairo_set_source_u32(cairo, color);
+ cairo_set_antialias(cairo, CAIRO_ANTIALIAS_NONE);
if (width == 1) {
x += 0.5;
height += y;
@@ -111,6 +122,7 @@ static void render_sharp_line(cairo_t *cairo, uint32_t color,
cairo_set_line_width(cairo, 1.0);
cairo_line_to(cairo, width, height);
cairo_stroke(cairo);
+ cairo_restore(cairo);
}
}
@@ -141,7 +153,7 @@ static uint32_t render_status_block(cairo_t *cairo,
output->scale, block->markup, "%s", block->full_text);
int margin = 3 * output->scale;
- int ws_vertical_padding = WS_VERTICAL_PADDING * 2;
+ double ws_vertical_padding = WS_VERTICAL_PADDING * 2 * output->scale;
int width = text_width;
if (width < block->min_width) {
@@ -157,12 +169,12 @@ static uint32_t render_status_block(cairo_t *cairo,
*x -= width;
if ((block->border || block->urgent) && block->border_left > 0) {
- *x -= (block->border_left + margin);
- block_width += block->border_left + margin;
+ *x -= (block->border_left * output->scale + margin);
+ block_width += block->border_left * output->scale + margin;
}
if ((block->border || block->urgent) && block->border_right > 0) {
- *x -= (block->border_right + margin);
- block_width += block->border_right + margin;
+ *x -= (block->border_right * output->scale + margin);
+ block_width += block->border_right * output->scale + margin;
}
int sep_width, sep_height;
@@ -199,48 +211,41 @@ static uint32_t render_status_block(cairo_t *cairo,
wl_list_insert(&output->hotspots, &hotspot->link);
}
- double pos = *x;
+ double x_pos = *x;
+ double y_pos = WS_VERTICAL_PADDING * output->scale;
+ double render_height = height - ws_vertical_padding + output->scale;
uint32_t bg_color = block->urgent
? config->colors.urgent_workspace.background : block->background;
if (bg_color) {
- cairo_set_source_u32(cairo, bg_color);
- cairo_rectangle(cairo, pos - 0.5 * output->scale,
- output->scale, width, height);
- cairo_fill(cairo);
+ render_sharp_rectangle(cairo, bg_color, x_pos, y_pos,
+ block_width, render_height);
}
uint32_t border_color = block->urgent
? config->colors.urgent_workspace.border : block->border;
if (border_color && block->border_top > 0) {
- render_sharp_line(cairo, border_color,
- pos - 0.5 * output->scale, output->scale,
- text_width, block->border_top);
+ render_sharp_line(cairo, border_color, x_pos, y_pos,
+ block_width, block->border_top * output->scale);
}
if (border_color && block->border_bottom > 0) {
- render_sharp_line(cairo, border_color,
- pos - 0.5 * output->scale,
- height - output->scale - block->border_bottom,
- text_width, block->border_bottom);
- }
- if (border_color != 0 && block->border_left > 0) {
- render_sharp_line(cairo, border_color,
- pos - 0.5 * output->scale, output->scale,
- block->border_left, height);
+ render_sharp_line(cairo, border_color, x_pos,
+ y_pos + render_height - block->border_bottom * output->scale,
+ block_width, block->border_bottom * output->scale);
}
- if (border_color != 0 && block->border_right > 0) {
- render_sharp_line(cairo, border_color,
- pos - 0.5 * output->scale + text_width, output->scale,
- block->border_right, height);
+ if (border_color && block->border_left > 0) {
+ render_sharp_line(cairo, border_color, x_pos, y_pos,
+ block->border_left * output->scale, render_height);
+ x_pos += block->border_left * output->scale + margin;
}
double offset = 0;
if (strncmp(block->align, "left", 5) == 0) {
- offset = pos;
+ offset = x_pos;
} else if (strncmp(block->align, "right", 5) == 0) {
- offset = pos + width - text_width;
+ offset = x_pos + width - text_width;
} else if (strncmp(block->align, "center", 6) == 0) {
- offset = pos + (width - text_width) / 2;
+ offset = x_pos + (width - text_width) / 2;
}
cairo_move_to(cairo, offset, height / 2.0 - text_height / 2.0);
uint32_t color = block->color ? *block->color : config->colors.statusline;
@@ -248,14 +253,13 @@ static uint32_t render_status_block(cairo_t *cairo,
cairo_set_source_u32(cairo, color);
pango_printf(cairo, config->font, output->scale,
block->markup, "%s", block->full_text);
- pos += width;
+ x_pos += width;
if (block->border && block->border_right > 0) {
- pos += margin;
- render_sharp_line(cairo, block->border,
- pos - 0.5 * output->scale, output->scale,
- block->border_right, height);
- pos += block->border_right;
+ x_pos += margin;
+ render_sharp_line(cairo, border_color, x_pos, y_pos,
+ block->border_right * output->scale, render_height);
+ x_pos += block->border_right * output->scale;
}
if (!edge && block->separator) {
@@ -265,14 +269,14 @@ static uint32_t render_status_block(cairo_t *cairo,
cairo_set_source_u32(cairo, config->colors.separator);
}
if (config->sep_symbol) {
- offset = pos + (sep_block_width - sep_width) / 2;
+ offset = x_pos + (sep_block_width - sep_width) / 2;
cairo_move_to(cairo, offset, height / 2.0 - sep_height / 2.0);
pango_printf(cairo, config->font, output->scale, false,
"%s", config->sep_symbol);
} else {
cairo_set_line_width(cairo, 1);
- cairo_move_to(cairo, pos + sep_block_width / 2, margin);
- cairo_line_to(cairo, pos + sep_block_width / 2, height - margin);
+ cairo_move_to(cairo, x_pos + sep_block_width / 2, margin);
+ cairo_line_to(cairo, x_pos + sep_block_width / 2, height - margin);
cairo_stroke(cairo);
}
}