aboutsummaryrefslogtreecommitdiffstats
path: root/swaylock/render.c
diff options
context:
space:
mode:
Diffstat (limited to 'swaylock/render.c')
-rw-r--r--swaylock/render.c77
1 files changed, 34 insertions, 43 deletions
diff --git a/swaylock/render.c b/swaylock/render.c
index 2032ddcf..66c55965 100644
--- a/swaylock/render.c
+++ b/swaylock/render.c
@@ -7,11 +7,22 @@
7#include "swaylock/swaylock.h" 7#include "swaylock/swaylock.h"
8 8
9#define M_PI 3.14159265358979323846 9#define M_PI 3.14159265358979323846
10const int ARC_RADIUS = 50;
11const int ARC_THICKNESS = 10;
12const float TYPE_INDICATOR_RANGE = M_PI / 3.0f; 10const float TYPE_INDICATOR_RANGE = M_PI / 3.0f;
13const float TYPE_INDICATOR_BORDER_THICKNESS = M_PI / 128.0f; 11const float TYPE_INDICATOR_BORDER_THICKNESS = M_PI / 128.0f;
14 12
13static void set_color_for_state(cairo_t *cairo, struct swaylock_state *state,
14 struct swaylock_colorset *colorset) {
15 if (state->auth_state == AUTH_STATE_VALIDATING) {
16 cairo_set_source_u32(cairo, colorset->verifying);
17 } else if (state->auth_state == AUTH_STATE_INVALID) {
18 cairo_set_source_u32(cairo, colorset->wrong);
19 } else if (state->auth_state == AUTH_STATE_CLEAR) {
20 cairo_set_source_u32(cairo, colorset->cleared);
21 } else {
22 cairo_set_source_u32(cairo, colorset->input);
23 }
24}
25
15void render_frame(struct swaylock_surface *surface) { 26void render_frame(struct swaylock_surface *surface) {
16 struct swaylock_state *state = surface->state; 27 struct swaylock_state *state = surface->state;
17 28
@@ -30,58 +41,37 @@ void render_frame(struct swaylock_surface *surface) {
30 cairo_t *cairo = surface->current_buffer->cairo; 41 cairo_t *cairo = surface->current_buffer->cairo;
31 cairo_identity_matrix(cairo); 42 cairo_identity_matrix(cairo);
32 43
44 cairo_save(cairo);
45 cairo_set_operator(cairo, CAIRO_OPERATOR_SOURCE);
33 if (state->args.mode == BACKGROUND_MODE_SOLID_COLOR || !surface->image) { 46 if (state->args.mode == BACKGROUND_MODE_SOLID_COLOR || !surface->image) {
34 cairo_set_source_u32(cairo, state->args.color); 47 cairo_set_source_u32(cairo, state->args.colors.background);
35 cairo_paint(cairo); 48 cairo_paint(cairo);
36 } else { 49 } else {
37 render_background_image(cairo, surface->image, 50 render_background_image(cairo, surface->image,
38 state->args.mode, buffer_width, buffer_height); 51 state->args.mode, buffer_width, buffer_height);
39 } 52 }
53 cairo_restore(cairo);
40 cairo_identity_matrix(cairo); 54 cairo_identity_matrix(cairo);
41 55
42 int arc_radius = ARC_RADIUS * surface->scale; 56 int arc_radius = state->args.radius * surface->scale;
43 int arc_thickness = ARC_THICKNESS * surface->scale; 57 int arc_thickness = state->args.thickness * surface->scale;
44 float type_indicator_border_thickness = 58 float type_indicator_border_thickness =
45 TYPE_INDICATOR_BORDER_THICKNESS * surface->scale; 59 TYPE_INDICATOR_BORDER_THICKNESS * surface->scale;
46 60
47 if (state->args.show_indicator && state->auth_state != AUTH_STATE_IDLE) { 61 if (state->args.show_indicator && state->auth_state != AUTH_STATE_IDLE) {
48 // Draw circle 62 // Draw circle
49 cairo_set_line_width(cairo, arc_thickness); 63 cairo_set_line_width(cairo, arc_thickness);
50 cairo_arc(cairo, buffer_width / 2, buffer_height / 2, arc_radius, 0, 2 * M_PI); 64 cairo_arc(cairo, buffer_width / 2, buffer_height / 2, arc_radius,
51 switch (state->auth_state) { 65 0, 2 * M_PI);
52 case AUTH_STATE_INPUT: 66 set_color_for_state(cairo, state, &state->args.colors.inside);
53 case AUTH_STATE_INPUT_NOP: 67 cairo_fill_preserve(cairo);
54 case AUTH_STATE_BACKSPACE: { 68 set_color_for_state(cairo, state, &state->args.colors.ring);
55 cairo_set_source_rgba(cairo, 0, 0, 0, 0.75); 69 cairo_stroke(cairo);
56 cairo_fill_preserve(cairo);
57 cairo_set_source_rgb(cairo, 51.0 / 255, 125.0 / 255, 0);
58 cairo_stroke(cairo);
59 } break;
60 case AUTH_STATE_VALIDATING: {
61 cairo_set_source_rgba(cairo, 0, 114.0 / 255, 255.0 / 255, 0.75);
62 cairo_fill_preserve(cairo);
63 cairo_set_source_rgb(cairo, 51.0 / 255, 0, 250.0 / 255);
64 cairo_stroke(cairo);
65 } break;
66 case AUTH_STATE_INVALID: {
67 cairo_set_source_rgba(cairo, 250.0 / 255, 0, 0, 0.75);
68 cairo_fill_preserve(cairo);
69 cairo_set_source_rgb(cairo, 125.0 / 255, 51.0 / 255, 0);
70 cairo_stroke(cairo);
71 } break;
72 case AUTH_STATE_CLEAR: {
73 cairo_set_source_rgba(cairo, 229.0/255, 164.0/255, 69.0/255, 0.75);
74 cairo_fill_preserve(cairo);
75 cairo_set_source_rgb(cairo, 229.0/255, 164.0/255, 69.0/255);
76 cairo_stroke(cairo);
77 } break;
78 default: break;
79 }
80 70
81 // Draw a message 71 // Draw a message
82 char *text = NULL; 72 char *text = NULL;
83 cairo_set_source_rgb(cairo, 0, 0, 0); 73 set_color_for_state(cairo, state, &state->args.colors.text);
84 cairo_select_font_face(cairo, "sans-serif", 74 cairo_select_font_face(cairo, state->args.font,
85 CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); 75 CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL);
86 cairo_set_font_size(cairo, arc_radius / 3.0f); 76 cairo_set_font_size(cairo, arc_radius / 3.0f);
87 switch (state->auth_state) { 77 switch (state->auth_state) {
@@ -98,9 +88,10 @@ void render_frame(struct swaylock_surface *surface) {
98 case AUTH_STATE_INPUT_NOP: 88 case AUTH_STATE_INPUT_NOP:
99 if (state->xkb.caps_lock) { 89 if (state->xkb.caps_lock) {
100 text = "Caps Lock"; 90 text = "Caps Lock";
101 cairo_set_source_rgb(cairo, 229.0/255, 164.0/255, 69.0/255);
102 } 91 }
103 default: break; 92 break;
93 default:
94 break;
104 } 95 }
105 96
106 if (text) { 97 if (text) {
@@ -128,14 +119,14 @@ void render_frame(struct swaylock_surface *surface) {
128 arc_radius, highlight_start, 119 arc_radius, highlight_start,
129 highlight_start + TYPE_INDICATOR_RANGE); 120 highlight_start + TYPE_INDICATOR_RANGE);
130 if (state->auth_state == AUTH_STATE_INPUT) { 121 if (state->auth_state == AUTH_STATE_INPUT) {
131 cairo_set_source_rgb(cairo, 51.0 / 255, 219.0 / 255, 0); 122 cairo_set_source_u32(cairo, state->args.colors.key_highlight);
132 } else { 123 } else {
133 cairo_set_source_rgb(cairo, 219.0 / 255, 51.0 / 255, 0); 124 cairo_set_source_u32(cairo, state->args.colors.bs_highlight);
134 } 125 }
135 cairo_stroke(cairo); 126 cairo_stroke(cairo);
136 127
137 // Draw borders 128 // Draw borders
138 cairo_set_source_rgb(cairo, 0, 0, 0); 129 cairo_set_source_u32(cairo, state->args.colors.separator);
139 cairo_arc(cairo, buffer_width / 2, buffer_height / 2, 130 cairo_arc(cairo, buffer_width / 2, buffer_height / 2,
140 arc_radius, highlight_start, 131 arc_radius, highlight_start,
141 highlight_start + type_indicator_border_thickness); 132 highlight_start + type_indicator_border_thickness);
@@ -149,7 +140,7 @@ void render_frame(struct swaylock_surface *surface) {
149 } 140 }
150 141
151 // Draw inner + outer border of the circle 142 // Draw inner + outer border of the circle
152 cairo_set_source_rgb(cairo, 0, 0, 0); 143 set_color_for_state(cairo, state, &state->args.colors.line);
153 cairo_set_line_width(cairo, 2.0 * surface->scale); 144 cairo_set_line_width(cairo, 2.0 * surface->scale);
154 cairo_arc(cairo, buffer_width / 2, buffer_height / 2, 145 cairo_arc(cairo, buffer_width / 2, buffer_height / 2,
155 arc_radius - arc_thickness / 2, 0, 2 * M_PI); 146 arc_radius - arc_thickness / 2, 0, 2 * M_PI);