rofi 1.7.9
widget.c
Go to the documentation of this file.
1/*
2 * rofi
3 *
4 * MIT/X11 License
5 * Copyright © 2013-2023 Qball Cow <qball@gmpclient.org>
6 *
7 * Permission is hereby granted, free of charge, to any person obtaining
8 * a copy of this software and associated documentation files (the
9 * "Software"), to deal in the Software without restriction, including
10 * without limitation the rights to use, copy, modify, merge, publish,
11 * distribute, sublicense, and/or sell copies of the Software, and to
12 * permit persons to whom the Software is furnished to do so, subject to
13 * the following conditions:
14 *
15 * The above copyright notice and this permission notice shall be
16 * included in all copies or substantial portions of the Software.
17 *
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
21 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
22 * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25 *
26 */
27#include "cairo.h"
28#include "config.h"
29
30#include "theme.h"
32#include "widgets/widget.h"
33#include <glib.h>
34#include <math.h>
35
36void widget_init(widget *wid, widget *parent, WidgetType type,
37 const char *name) {
38 wid->type = type;
39 wid->parent = parent;
40 wid->name = g_strdup(name);
45
46 wid->padding = rofi_theme_get_padding(wid, "padding", wid->def_padding);
47 wid->border = rofi_theme_get_padding(wid, "border", wid->def_border);
48 wid->border_radius =
49 rofi_theme_get_padding(wid, "border-radius", wid->def_border_radius);
50 wid->margin = rofi_theme_get_padding(wid, "margin", wid->def_margin);
51
52 wid->cursor_type =
54
55 // enabled by default
56 wid->enabled = rofi_theme_get_boolean(wid, "enabled", TRUE);
57
58 wid->border_antialiasing = rofi_theme_get_boolean(wid, "border-aa", TRUE);
60 rofi_theme_get_boolean(wid, "border-disable-nvidia-workaround", FALSE);
61}
62
63void widget_set_state(widget *wid, const char *state) {
64 if (wid == NULL) {
65 return;
66 }
67 if (g_strcmp0(wid->state, state)) {
68 wid->state = state;
69 // Update border.
70 wid->border = rofi_theme_get_padding(wid, "border", wid->def_border);
71 wid->border_radius =
72 rofi_theme_get_padding(wid, "border-radius", wid->def_border_radius);
73 if (wid->set_state != NULL) {
74 wid->set_state(wid, state);
75 }
77 }
78}
79
80int widget_intersect(const widget *wid, int x, int y) {
81 if (wid == NULL) {
82 return FALSE;
83 }
84
85 if (x >= (wid->x) && x < (wid->x + wid->w) && y >= (wid->y) &&
86 y < (wid->y + wid->h)) {
87 return TRUE;
88 }
89 return FALSE;
90}
91
92void widget_resize(widget *wid, short w, short h) {
93 if (wid == NULL) {
94 return;
95 }
96 if (wid->resize != NULL) {
97 if (wid->w != w || wid->h != h) {
98 wid->resize(wid, w, h);
99 }
100 } else {
101 wid->w = w;
102 wid->h = h;
103 }
104 // On a resize we always want to update.
106}
107void widget_move(widget *wid, short x, short y) {
108 if (wid == NULL) {
109 return;
110 }
111 wid->x = x;
112 wid->y = y;
113}
115 if (wid == NULL) {
116 return;
117 }
118 wid->type = type;
119}
120
121gboolean widget_enabled(widget *wid) {
122 if (wid == NULL) {
123 return FALSE;
124 }
125 return wid->enabled;
126}
127
128void widget_set_enabled(widget *wid, gboolean enabled) {
129 if (wid == NULL) {
130 return;
131 }
132 if (wid->enabled != enabled) {
133 wid->enabled = enabled;
134 widget_update(wid);
135 widget_update(wid->parent);
137 }
138}
139
140void widget_draw(widget *wid, cairo_t *d) {
141 if (wid == NULL) {
142 return;
143 }
144 // Check if enabled and if draw is implemented.
145 if (wid->enabled && wid->draw) {
146 // Don't draw if there is no space.
147 if (wid->h < 1 || wid->w < 1) {
148 wid->need_redraw = FALSE;
149 return;
150 }
151 // Store current state.
152 cairo_save(d);
153 const int margin_left =
155 const int margin_top =
157 const int margin_right =
159 const int margin_bottom =
161 const int left =
163 const int right =
165 const int top =
167 const int bottom =
169 int radius_bl = distance_get_pixel(wid->border_radius.left,
171 int radius_tr = distance_get_pixel(wid->border_radius.right,
173 int radius_tl =
175 int radius_br = distance_get_pixel(wid->border_radius.bottom,
177
178 double vspace =
179 wid->h - margin_top - margin_bottom - top / 2.0 - bottom / 2.0;
180 double hspace =
181 wid->w - margin_left - margin_right - left / 2.0 - right / 2.0;
182 if ((radius_bl + radius_tl) > (vspace)) {
183 int j = ((vspace) / 2.0);
184 radius_bl = MIN(radius_bl, j);
185 radius_tl = MIN(radius_tl, j);
186 }
187 if ((radius_br + radius_tr) > (vspace)) {
188 int j = ((vspace) / 2.0);
189 radius_br = MIN(radius_br, j);
190 radius_tr = MIN(radius_tr, j);
191 }
192 if ((radius_tl + radius_tr) > (hspace)) {
193 int j = ((hspace) / 2.0);
194 radius_tr = MIN(radius_tr, j);
195 radius_tl = MIN(radius_tl, j);
196 }
197 if ((radius_bl + radius_br) > (hspace)) {
198 int j = ((hspace) / 2.0);
199 radius_br = MIN(radius_br, j);
200 radius_bl = MIN(radius_bl, j);
201 }
202
203 // Background painting.
204 // Set new x/y position.
205 cairo_translate(d, wid->x, wid->y);
206 cairo_set_line_width(d, 0);
207
208 // Outer outline outlines
209 double x1, y1, x2, y2;
210 x1 = margin_left + left / 2.0, y1 = margin_top + top / 2.0,
211 x2 = wid->w - margin_right - right / 2.0,
212 y2 = wid->h - margin_bottom - bottom / 2.0;
213
214 if (radius_tl > 0) {
215 cairo_move_to(d, x1, y1 + radius_tl);
216 cairo_arc(d, x1 + radius_tl, y1 + radius_tl, radius_tl, -1.0 * G_PI,
217 -G_PI_2);
218 } else {
219 cairo_move_to(d, x1, y1);
220 }
221 if (radius_tr > 0) {
222 cairo_line_to(d, x2 - radius_tr, y1);
223 cairo_arc(d, x2 - radius_tr, y1 + radius_tr, radius_tr, -G_PI_2,
224 0 * G_PI);
225 } else {
226 cairo_line_to(d, x2, y1);
227 }
228 if (radius_br > 0) {
229 cairo_line_to(d, x2, y2 - radius_br);
230 cairo_arc(d, x2 - radius_br, y2 - radius_br, radius_br, 0.0 * G_PI,
231 G_PI_2);
232 } else {
233 cairo_line_to(d, x2, y2);
234 }
235 if (radius_bl > 0) {
236 cairo_line_to(d, x1 + radius_bl, y2);
237 cairo_arc(d, x1 + radius_bl, y2 - radius_bl, radius_bl, G_PI_2,
238 1.0 * G_PI);
239 } else {
240 cairo_line_to(d, x1, y2);
241 }
242 cairo_close_path(d);
243
244 cairo_set_source_rgba(d, 1.0, 1.0, 1.0, 1.0);
245 rofi_theme_get_color(wid, "background-color", d);
246 cairo_fill_preserve(d);
247 if (rofi_theme_get_image(wid, "background-image", d)) {
248 cairo_fill_preserve(d);
249 }
250 cairo_clip(d);
251
252 wid->draw(wid, d);
253 wid->need_redraw = FALSE;
254
255 cairo_restore(d);
256
257 if (left != 0 || top != 0 || right != 0 || bottom != 0) {
258 cairo_save(d);
259 if (wid->border_antialiasing == FALSE) {
260 cairo_set_antialias(d, CAIRO_ANTIALIAS_NONE);
261 }
263 cairo_set_operator(d, CAIRO_OPERATOR_ADD);
264 }
265 cairo_translate(d, wid->x, wid->y);
266 cairo_new_path(d);
267 rofi_theme_get_color(wid, "border-color", d);
268
269 // Calculate the different offsets for the corners.
270 double minof_tr = MIN(right / 2.0, top / 2.0);
271 double minof_tl = MIN(left / 2.0, top / 2.0);
272 double minof_br = MIN(right / 2.0, bottom / 2.0);
273 double minof_bl = MIN(left / 2.0, bottom / 2.0);
274 // Inner radius
275 double radius_inner_tl = radius_tl - minof_tl;
276 double radius_inner_tr = radius_tr - minof_tr;
277 double radius_inner_bl = radius_bl - minof_bl;
278 double radius_inner_br = radius_br - minof_br;
279
280 // Offsets of the different lines in each corner.
281 //
282 // | |
283 // ttl ttr
284 // | |
285 // -ltl-###############-rtr-
286 // $ $
287 // $ $
288 // -lbl-###############-rbr-
289 // | |
290 // bbl bbr
291 // | |
292 //
293 // The left and right part ($) start at thinkness top bottom when no
294 // radius
295 double offset_ltl =
296 (radius_inner_tl > 0) ? (left) + radius_inner_tl : left;
297 double offset_rtr =
298 (radius_inner_tr > 0) ? (right) + radius_inner_tr : right;
299 double offset_lbl =
300 (radius_inner_bl > 0) ? (left) + radius_inner_bl : left;
301 double offset_rbr =
302 (radius_inner_br > 0) ? (right) + radius_inner_br : right;
303 // The top and bottom part (#) go into the corner when no radius
304 double offset_ttl = (radius_inner_tl > 0) ? (top) + radius_inner_tl
305 : (radius_tl > 0) ? top
306 : 0;
307 double offset_ttr = (radius_inner_tr > 0) ? (top) + radius_inner_tr
308 : (radius_tr > 0) ? top
309 : 0;
310 double offset_bbl = (radius_inner_bl > 0) ? (bottom) + radius_inner_bl
311 : (radius_bl > 0) ? bottom
312 : 0;
313 double offset_bbr = (radius_inner_br > 0) ? (bottom) + radius_inner_br
314 : (radius_br > 0) ? bottom
315 : 0;
316
317 if (left > 0) {
318 cairo_set_line_width(d, left);
320 cairo_move_to(d, x1, margin_top + offset_ttl);
321 cairo_line_to(d, x1, wid->h - margin_bottom - offset_bbl);
322 cairo_stroke(d);
323 }
324 if (right > 0) {
325 cairo_set_line_width(d, right);
327 cairo_move_to(d, x2, margin_top + offset_ttr);
328 cairo_line_to(d, x2, wid->h - margin_bottom - offset_bbr);
329 cairo_stroke(d);
330 }
331 if (top > 0) {
332 cairo_set_line_width(d, top);
334 cairo_move_to(d, margin_left + offset_ltl, y1);
335 cairo_line_to(d, wid->w - margin_right - offset_rtr, y1);
336 cairo_stroke(d);
337 }
338 if (bottom > 0) {
339 cairo_set_line_width(d, bottom);
341 cairo_move_to(d, margin_left + offset_lbl, y2);
342 cairo_line_to(d, wid->w - margin_right - offset_rbr, y2);
343 cairo_stroke(d);
344 }
345 if (radius_tl > 0) {
346 double radius_outer = radius_tl + minof_tl;
347 cairo_arc(d, margin_left + radius_outer, margin_top + radius_outer,
348 radius_outer, -G_PI, -G_PI_2);
349 cairo_line_to(d, margin_left + offset_ltl, margin_top);
350 cairo_line_to(d, margin_left + offset_ltl, margin_top + top);
351 if (radius_inner_tl > 0) {
352 cairo_arc_negative(d, margin_left + left + radius_inner_tl,
353 margin_top + top + radius_inner_tl,
354 radius_inner_tl, -G_PI_2, G_PI);
355 cairo_line_to(d, margin_left + left, margin_top + offset_ttl);
356 }
357 cairo_line_to(d, margin_left, margin_top + offset_ttl);
358 cairo_close_path(d);
359 cairo_fill(d);
360 }
361 if (radius_tr > 0) {
362 double radius_outer = radius_tr + minof_tr;
363 cairo_arc(d, wid->w - margin_right - radius_outer,
364 margin_top + radius_outer, radius_outer, -G_PI_2, 0);
365 cairo_line_to(d, wid->w - margin_right, margin_top + offset_ttr);
366 cairo_line_to(d, wid->w - margin_right - right,
367 margin_top + offset_ttr);
368 if (radius_inner_tr > 0) {
369 cairo_arc_negative(d, wid->w - margin_right - right - radius_inner_tr,
370 margin_top + top + radius_inner_tr,
371 radius_inner_tr, 0, -G_PI_2);
372 cairo_line_to(d, wid->w - margin_right - offset_rtr,
373 margin_top + top);
374 }
375 cairo_line_to(d, wid->w - margin_right - offset_rtr, margin_top);
376 cairo_close_path(d);
377 cairo_fill(d);
378 }
379 if (radius_br > 0) {
380 double radius_outer = radius_br + minof_br;
381 cairo_arc(d, wid->w - margin_right - radius_outer,
382 wid->h - margin_bottom - radius_outer, radius_outer, 0.0,
383 G_PI_2);
384 cairo_line_to(d, wid->w - margin_right - offset_rbr,
385 wid->h - margin_bottom);
386 cairo_line_to(d, wid->w - margin_right - offset_rbr,
387 wid->h - margin_bottom - bottom);
388 if (radius_inner_br > 0) {
389 cairo_arc_negative(d, wid->w - margin_right - right - radius_inner_br,
390 wid->h - margin_bottom - bottom - radius_inner_br,
391 radius_inner_br, G_PI_2, 0.0);
392 cairo_line_to(d, wid->w - margin_right - right,
393 wid->h - margin_bottom - offset_bbr);
394 }
395 cairo_line_to(d, wid->w - margin_right,
396 wid->h - margin_bottom - offset_bbr);
397 cairo_close_path(d);
398 cairo_fill(d);
399 }
400 if (radius_bl > 0) {
401 double radius_outer = radius_bl + minof_bl;
402 cairo_arc(d, margin_left + radius_outer,
403 wid->h - margin_bottom - radius_outer, radius_outer, G_PI_2,
404 G_PI);
405 cairo_line_to(d, margin_left, wid->h - margin_bottom - offset_bbl);
406 cairo_line_to(d, margin_left + left,
407 wid->h - margin_bottom - offset_bbl);
408 if (radius_inner_bl > 0) {
409 cairo_arc_negative(d, margin_left + left + radius_inner_bl,
410 wid->h - margin_bottom - bottom - radius_inner_bl,
411 radius_inner_bl, G_PI, G_PI_2);
412 cairo_line_to(d, margin_left + offset_lbl,
413 wid->h - margin_bottom - bottom);
414 }
415 cairo_line_to(d, margin_left + offset_lbl, wid->h - margin_bottom);
416 cairo_close_path(d);
417
418 cairo_fill(d);
419 }
420 cairo_restore(d);
421 }
422 }
423}
424
425void widget_free(widget *wid) {
426 if (wid == NULL) {
427 return;
428 }
429 if (wid->name != NULL) {
430 g_free(wid->name);
431 }
432 if (wid->free != NULL) {
433 wid->free(wid);
434 }
435}
436
438 if (wid == NULL) {
439 return 0;
440 }
441 if (wid->get_height == NULL) {
442 return wid->h;
443 }
444 return wid->get_height(wid);
445}
447 if (wid == NULL) {
448 return 0;
449 }
450 if (wid->get_width == NULL) {
451 return wid->w;
452 }
453 return wid->get_width(wid);
454}
456 if (wid == NULL) {
457 return 0;
458 }
459 return wid->x;
460}
462 if (wid == NULL) {
463 return 0;
464 }
465 return wid->y;
466}
467
468void widget_xy_to_relative(widget *wid, gint *x, gint *y) {
469 *x -= wid->x;
470 *y -= wid->y;
471 if (wid->parent == NULL) {
472 return;
473 }
474 widget_xy_to_relative(wid->parent, x, y);
475}
476
478 if (wid == NULL) {
479 return;
480 }
481 // When (desired )size of wid changes.
482 if (wid->update != NULL) {
483 wid->update(wid);
484 }
485}
486
488 if (wid == NULL) {
489 return;
490 }
491 widget *iter = wid;
492 // Find toplevel widget.
493 while (iter->parent != NULL) {
494 iter->need_redraw = TRUE;
495 iter = iter->parent;
496 }
497 iter->need_redraw = TRUE;
498}
499
501 if (wid == NULL) {
502 return FALSE;
503 }
504 if (!wid->enabled) {
505 return FALSE;
506 }
507 return wid->need_redraw;
508}
509
510widget *widget_find_mouse_target(widget *wid, WidgetType type, gint x, gint y) {
511 if (wid == NULL) {
512 return NULL;
513 }
514
515 if (wid->find_mouse_target != NULL) {
516 widget *target = wid->find_mouse_target(wid, type, x, y);
517 if (target != NULL) {
518 return target;
519 }
520 }
521
522 if (wid->type == type || type == WIDGET_TYPE_UNKNOWN) {
523 return wid;
524 }
525
526 return NULL;
527}
528
530 G_GNUC_UNUSED guint action,
531 G_GNUC_UNUSED gint x,
532 G_GNUC_UNUSED gint y) {
533 if (wid == NULL) {
534 return FALSE;
535 }
536 if (wid->trigger_action == NULL) {
537 return FALSE;
538 }
539 /*
540 * TODO: We should probably add a check_action callback to the widgets
541 * to do extra checks
542 */
544}
545
547 gint x, gint y) {
548 if (wid == NULL) {
549 return FALSE;
550 }
551 if (wid->trigger_action == NULL) {
552 return FALSE;
553 }
554 return wid->trigger_action(wid, action, x, y, wid->trigger_action_cb_data);
555}
556
558 void *cb_data) {
559 if (wid == NULL) {
560 return;
561 }
562 wid->trigger_action = cb;
563 wid->trigger_action_cb_data = cb_data;
564}
565
566gboolean widget_motion_notify(widget *wid, gint x, gint y) {
567 if (wid == NULL) {
568 return FALSE;
569 }
570 if (wid->motion_notify == NULL) {
571 return FALSE;
572 }
573 return wid->motion_notify(wid, x, y);
574}
575
577 if (wid == NULL) {
578 return 0;
579 }
580 int distance =
584 return distance;
585}
587 if (wid == NULL) {
588 return 0;
589 }
590 int distance =
592 distance +=
594 distance +=
596 return distance;
597}
599 if (wid == NULL) {
600 return 0;
601 }
602 int distance =
606 return distance;
607}
609 if (wid == NULL) {
610 return 0;
611 }
612 int distance =
616 return distance;
617}
618
620 int width = wid->w;
621 width -= widget_padding_get_left(wid);
622 width -= widget_padding_get_right(wid);
623 return width;
624}
626 int height = wid->h;
627 height -= widget_padding_get_top(wid);
628 height -= widget_padding_get_bottom(wid);
629 return height;
630}
632 int height = 0;
633 height += widget_padding_get_top(wid);
634 height += widget_padding_get_bottom(wid);
635 return height;
636}
638 int width = 0;
639 width += widget_padding_get_left(wid);
640 width += widget_padding_get_right(wid);
641 return width;
642}
643
644int widget_get_desired_height(widget *wid, const int width) {
645 if (wid == NULL) {
646 return 0;
647 }
648 if (wid->get_desired_height == NULL) {
649 return wid->h;
650 }
651 return wid->get_desired_height(wid, width);
652}
653int widget_get_desired_width(widget *wid, const int height) {
654 if (wid == NULL) {
655 return 0;
656 }
657 if (wid->get_desired_width == NULL) {
658 return wid->w;
659 }
660 return wid->get_desired_width(wid, height);
661}
662
664 if (wid == NULL) {
665 return 0;
666 }
667 int retv = wid->x;
668 if (wid->parent != NULL) {
669 retv += widget_get_absolute_xpos(wid->parent);
670 }
671 return retv;
672}
674 if (wid == NULL) {
675 return 0;
676 }
677 int retv = wid->y;
678 if (wid->parent != NULL) {
679 retv += widget_get_absolute_ypos(wid->parent);
680 }
681 return retv;
682}
WidgetTriggerActionResult widget_trigger_action(widget *wid, guint action, gint x, gint y)
Definition widget.c:546
void widget_queue_redraw(widget *wid)
Definition widget.c:487
void widget_move(widget *wid, short x, short y)
Definition widget.c:107
void widget_free(widget *wid)
Definition widget.c:425
void widget_draw(widget *wid, cairo_t *d)
Definition widget.c:140
int widget_get_width(widget *wid)
Definition widget.c:446
int widget_get_height(widget *wid)
Definition widget.c:437
struct _widget widget
Definition widget.h:51
int widget_get_y_pos(widget *wid)
Definition widget.c:461
void widget_update(widget *wid)
Definition widget.c:477
void widget_set_type(widget *wid, WidgetType type)
Definition widget.c:114
WidgetType
Definition widget.h:56
void widget_set_enabled(widget *wid, gboolean enabled)
Definition widget.c:128
int widget_get_desired_width(widget *wid, const int height)
Definition widget.c:653
int widget_get_absolute_ypos(widget *wid)
Definition widget.c:673
int widget_get_x_pos(widget *wid)
Definition widget.c:455
WidgetTriggerActionResult(* widget_trigger_action_cb)(widget *wid, guint action, gint x, gint y, void *user_data)
Definition widget.h:113
int widget_get_absolute_xpos(widget *wid)
Definition widget.c:663
void widget_resize(widget *wid, short w, short h)
Definition widget.c:92
WidgetTriggerActionResult
Definition widget.h:76
WidgetTriggerActionResult widget_check_action(widget *wid, G_GNUC_UNUSED guint action, G_GNUC_UNUSED gint x, G_GNUC_UNUSED gint y)
Definition widget.c:529
void widget_set_trigger_action_handler(widget *wid, widget_trigger_action_cb cb, void *cb_data)
Definition widget.c:557
int widget_get_desired_height(widget *wid, const int width)
Definition widget.c:644
gboolean widget_motion_notify(widget *wid, gint x, gint y)
Definition widget.c:566
void widget_xy_to_relative(widget *wid, gint *x, gint *y)
Definition widget.c:468
gboolean widget_need_redraw(widget *wid)
Definition widget.c:500
gboolean widget_enabled(widget *wid)
Definition widget.c:121
int widget_intersect(const widget *wid, int x, int y)
Definition widget.c:80
widget * widget_find_mouse_target(widget *wid, WidgetType type, gint x, gint y)
Definition widget.c:510
@ WIDGET_TYPE_UNKNOWN
Definition widget.h:58
@ WIDGET_TRIGGER_ACTION_RESULT_HANDLED
Definition widget.h:80
@ ROFI_ORIENTATION_HORIZONTAL
Definition rofi-types.h:141
@ ROFI_ORIENTATION_VERTICAL
Definition rofi-types.h:140
@ ROFI_CURSOR_DEFAULT
Definition rofi-types.h:148
RofiDistance bottom
Definition rofi-types.h:210
RofiDistance top
Definition rofi-types.h:208
RofiDistance right
Definition rofi-types.h:209
RofiDistance left
Definition rofi-types.h:211
void(* free)(struct _widget *widget)
void(* set_state)(struct _widget *, const char *)
const char * state
RofiPadding border
widget_find_mouse_target_cb find_mouse_target
gboolean border_antialiasing
gboolean enabled
gboolean need_redraw
widget_trigger_action_cb trigger_action
void * trigger_action_cb_data
RofiPadding padding
int(* get_desired_width)(struct _widget *, const int height)
int(* get_width)(struct _widget *)
RofiPadding margin
RofiPadding border_radius
RofiPadding def_border_radius
int(* get_height)(struct _widget *)
int(* get_desired_height)(struct _widget *, const int width)
RofiPadding def_margin
RofiCursorType cursor_type
RofiPadding def_border
struct _widget * parent
void(* update)(struct _widget *)
RofiPadding def_padding
void(* draw)(struct _widget *widget, cairo_t *draw)
gboolean border_disable_nvidia_workaround
gboolean(* motion_notify)(struct _widget *, gint x, gint y)
void(* resize)(struct _widget *, short, short)
WidgetType type
int distance_get_pixel(RofiDistance d, RofiOrientation ori)
Definition theme.c:1405
gboolean rofi_theme_get_image(const widget *wid, const char *property, cairo_t *d)
Definition theme.c:1173
int rofi_theme_get_boolean(const widget *wid, const char *property, int def)
Definition theme.c:901
RofiCursorType rofi_theme_get_cursor_type(const widget *wid, const char *property, RofiCursorType def)
Definition theme.c:960
RofiPadding rofi_theme_get_padding(const widget *wid, const char *property, RofiPadding pad)
Definition theme.c:1207
void rofi_theme_get_color(const widget *wid, const char *property, cairo_t *d)
Definition theme.c:1065
void distance_get_linestyle(RofiDistance d, cairo_t *draw)
Definition theme.c:1409
#define WIDGET_PADDING_INIT
int widget_padding_get_remaining_width(const widget *wid)
Definition widget.c:619
void widget_set_state(widget *wid, const char *state)
Definition widget.c:63
void widget_init(widget *wid, widget *parent, WidgetType type, const char *name)
Definition widget.c:36
int widget_padding_get_padding_width(const widget *wid)
Definition widget.c:637
int widget_padding_get_left(const widget *wid)
Definition widget.c:576
int widget_padding_get_right(const widget *wid)
Definition widget.c:586
int widget_padding_get_padding_height(const widget *wid)
Definition widget.c:631
int widget_padding_get_top(const widget *wid)
Definition widget.c:598
int widget_padding_get_bottom(const widget *wid)
Definition widget.c:608
int widget_padding_get_remaining_height(const widget *wid)
Definition widget.c:625