PatchworkOS  19e446b
A non-POSIX operating system.
Loading...
Searching...
No Matches
window.c
Go to the documentation of this file.
1#include <patchwork/display.h>
2#include <patchwork/image.h>
3#define __STDC_WANT_LIB_EXT1__ 1
4#include "internal.h"
5
6#include <stdio.h>
7#include <stdlib.h>
8#include <string.h>
9#include <sys/defs.h>
10
11#define WINDOW_CLIENT_ELEM_ID (UINT64_MAX)
12#define WINDOW_DECO_ELEM_ID (UINT64_MAX - 1)
13#define WINDOW_DECO_CLOSE_BUTTON_ID (UINT64_MAX - 2)
14#define WINDOW_DECO_MINIMIZE_BUTTON_ID (UINT64_MAX - 3)
15
16#define WINDOW_DECO_CLOSE_BUTTON_INDEX 0
17#define WINDOW_DECO_MINIMIZE_BUTTON_INDEX 1
18#define WINDOW_DECO_BUTTON_AMOUNT 2
19
29
30static void window_deco_titlebar_rect(window_t* win, element_t* elem, rect_t* rect)
31{
32 UNUSED(win);
33
34 rect_t contentRect = element_get_content_rect(elem);
35 const theme_t* theme = element_get_theme(elem);
36
37 *rect = (rect_t){
40 .right = RECT_WIDTH(&contentRect) - theme->frameSize - theme->smallPadding,
41 .bottom = theme->frameSize + theme->titlebarSize,
42 };
43}
44
45static void window_deco_button_rect(window_t* win, element_t* elem, rect_t* rect, uint64_t index)
46{
47 window_deco_titlebar_rect(win, elem, rect);
48 RECT_SHRINK(rect, element_get_theme(elem)->frameSize);
49 uint64_t size = (rect->bottom - rect->top);
50 rect->right -= size * index;
51 rect->left = rect->right - size;
52}
53
55{
56 deco_private_t* private = element_get_private(elem);
57 const theme_t* theme = element_get_theme(elem);
58
59 rect_t titlebar;
60 window_deco_titlebar_rect(win, elem, &titlebar);
61
63 RECT_SHRINK(&titlebar, theme->frameSize);
64 if (private->isFocused)
65 {
68 }
69 else
70 {
73 }
74
75 titlebar.left += theme->bigPadding;
76 titlebar.right -= theme->panelSize; // Space for buttons
78}
79
80static void window_deco_handle_dragging(window_t* win, element_t* elem, const event_mouse_t* event)
81{
82 deco_private_t* private = element_get_private(elem);
83
84 rect_t titlebarWithoutButtons;
85 window_deco_titlebar_rect(win, elem, &titlebarWithoutButtons);
86 if (!(win->flags & WINDOW_NO_CONTROLS))
87 {
88 rect_t lastButton;
89 window_deco_button_rect(win, elem, &lastButton, WINDOW_DECO_BUTTON_AMOUNT - 1);
90 titlebarWithoutButtons.right = lastButton.left;
91 }
92
93 if (private->isDragging)
94 {
95 if (event->held & MOUSE_LEFT)
96 {
97 rect_t rect = RECT_INIT_DIM(event->screenPos.x - private->dragOffset.x,
98 event->screenPos.y - private->dragOffset.y, RECT_WIDTH(&win->rect), RECT_HEIGHT(&win->rect));
99 window_move(win, &rect);
100 }
101 else
102 {
103 private
104 ->isDragging = false;
105 }
106 }
107 else if (RECT_CONTAINS_POINT(&titlebarWithoutButtons, &event->pos) && (event->pressed & MOUSE_LEFT))
108 {
109 private
110 ->dragOffset = (point_t){.x = event->screenPos.x - win->rect.left, .y = event->screenPos.y - win->rect.top};
111 private
112 ->isDragging = true;
113 }
114}
115
117{
118 const theme_t* theme = element_get_theme(elem);
119 element_t* closeButton = NULL;
120 element_t* minimizeButton = NULL;
121
122 rect_t closeRect;
124 closeButton = button_new(elem, WINDOW_DECO_CLOSE_BUTTON_ID, &closeRect, "", ELEMENT_NO_OUTLINE);
125 if (closeButton == NULL)
126 {
127 goto error;
128 }
129
130 rect_t minimizeRect;
132 minimizeButton = button_new(elem, WINDOW_DECO_MINIMIZE_BUTTON_ID, &minimizeRect, "", ELEMENT_NO_OUTLINE);
133 if (minimizeButton == NULL)
134 {
135 goto error;
136 }
137
138 private
139 ->closeIcon = image_new(window_get_display(win), theme->iconClose);
140 if (private->closeIcon == NULL)
141 {
142 goto error;
143 }
144
145 private
146 ->minimizeIcon = image_new(window_get_display(win), theme->iconMinimize);
147 if (private->minimizeIcon == NULL)
148 {
149 goto error;
150 }
151
152 element_set_image(closeButton, private->closeIcon);
153 element_set_image(minimizeButton, private->minimizeIcon);
154
155 return 0;
156
157error:
158 if (private->minimizeIcon != NULL)
159 {
160 image_free(private->minimizeIcon);
161 }
162 if (private->closeIcon != NULL)
163 {
164 image_free(private->closeIcon);
165 }
166 if (closeButton != NULL)
167 {
168 element_free(closeButton);
169 }
170 if (minimizeButton != NULL)
171 {
172 element_free(minimizeButton);
173 }
174 return ERR;
175}
176
178{
179 deco_private_t* private = malloc(sizeof(deco_private_t));
180 if (private == NULL)
181 {
182 return ERR;
183 }
184 private
185 ->isFocused = false;
186 private
187 ->isVisible = true;
188 private
189 ->isDragging = false;
190 private
191 ->minimizeIcon = NULL;
192 private
193 ->closeIcon = NULL;
194
195 if (!(win->flags & WINDOW_NO_CONTROLS))
196 {
197 if (window_deco_init_controls(win, elem, private) == ERR)
198 {
199 free(private);
200 return ERR;
201 }
202 }
203
204 element_set_private(elem, private);
205 return 0;
206}
207
208static void window_deco_free(element_t* elem)
209{
210 deco_private_t* private = element_get_private(elem);
211 if (private != NULL)
212 {
213 if (private->closeIcon != NULL)
214 {
215 image_free(private->closeIcon);
216 }
217 if (private->minimizeIcon != NULL)
218 {
219 image_free(private->minimizeIcon);
220 }
221 free(private);
222 }
223}
224
225static void window_deco_redraw(window_t* win, element_t* elem)
226{
227 const theme_t* theme = element_get_theme(elem);
228 rect_t rect = element_get_content_rect(elem);
229
230 drawable_t draw;
231 element_draw_begin(elem, &draw);
232
234 RECT_SHRINK(&rect, theme->frameSize);
235 draw_rect(&draw, &rect, theme->deco.backgroundNormal);
236
237 window_deco_draw_titlebar(win, elem, &draw);
238
239 element_draw_end(elem, &draw);
240}
241
242static void window_deco_action(window_t* win, const event_lib_action_t* action)
243{
244 if (action->type != ACTION_RELEASE)
245 {
246 return;
247 }
248
249 switch (action->source)
250 {
253 break;
255 display_set_is_visible(win->disp, win->surface, false);
256 break;
257 }
258}
259
260static void window_deco_report(window_t* win, element_t* elem, const event_report_t* report)
261{
262 if (!(report->flags & REPORT_IS_FOCUSED))
263 {
264 return;
265 }
266
267 deco_private_t* private = element_get_private(elem);
268 private
269 ->isFocused = report->info.flags & SURFACE_FOCUSED;
270 private
271 ->isVisible = report->info.flags & SURFACE_VISIBLE;
272
273 drawable_t draw;
274 element_draw_begin(elem, &draw);
275 window_deco_draw_titlebar(win, elem, &draw);
276 element_draw_end(elem, &draw);
277}
278
279static uint64_t window_deco_procedure(window_t* win, element_t* elem, const event_t* event)
280{
281 switch (event->type)
282 {
283 case EVENT_LIB_INIT:
284 return window_deco_init(win, elem);
285
286 case EVENT_LIB_DEINIT:
287 window_deco_free(elem);
288 break;
289
290 case EVENT_LIB_REDRAW:
291 window_deco_redraw(win, elem);
292 break;
293
294 case EVENT_LIB_ACTION:
295 window_deco_action(win, &event->libAction);
296 break;
297
298 case EVENT_REPORT:
299 window_deco_report(win, elem, &event->report);
300 break;
301
302 case EVENT_MOUSE:
303 window_deco_handle_dragging(win, elem, &event->mouse);
304 break;
305
306 default:
307 break;
308 }
309
310 return 0;
311}
312
313window_t* window_new(display_t* disp, const char* name, const rect_t* rect, surface_type_t type, window_flags_t flags,
315{
316 if (disp == NULL || name == NULL || rect == NULL || procedure == NULL || strnlen_s(name, MAX_NAME + 1) >= MAX_NAME)
317 {
318 errno = EINVAL;
319 return NULL;
320 }
321
322 window_t* win = malloc(sizeof(window_t));
323 if (win == NULL)
324 {
325 errno = ENOMEM;
326 return NULL;
327 }
328 list_entry_init(&win->entry);
329 win->disp = disp;
330 strcpy(win->name, name);
331 win->rect = (rect_t){0};
332 win->invalidRect = (rect_t){0};
333 win->type = type;
334 win->flags = flags;
335 win->buffer = NULL;
336 win->root = NULL;
337 win->clientElement = NULL;
338
339 const theme_t* theme = theme_global_get();
340 if (flags & WINDOW_DECO)
341 {
342 // Expand window to fit decorations
343 win->rect.left = rect->left - theme->frameSize;
344 win->rect.top = rect->top - theme->frameSize - theme->titlebarSize;
345 win->rect.right = rect->right + theme->frameSize;
346 win->rect.bottom = rect->bottom + theme->frameSize;
347 }
348 else
349 {
350 win->rect = *rect;
351 }
352
354 if (cmd == NULL)
355 {
356 free(win);
357 return NULL;
358 }
359 cmd->type = win->type;
360 cmd->rect = win->rect;
361 strcpy(cmd->name, win->name);
362 display_cmds_flush(disp);
363 event_t event;
364 if (display_wait(disp, &event, EVENT_SURFACE_NEW) == ERR)
365 {
366 window_free(win);
367 return NULL;
368 }
369 win->surface = event.target;
370
371 fd_t shmem = claim(event.surfaceNew.shmemKey);
372 if (shmem == ERR)
373 {
374 window_free(win);
375 return NULL;
376 }
377 win->buffer =
378 mmap(shmem, NULL, RECT_WIDTH(&win->rect) * RECT_HEIGHT(&win->rect) * sizeof(pixel_t), PROT_READ | PROT_WRITE);
379 close(shmem);
380 if (win->buffer == NULL)
381 {
382 window_free(win);
383 return NULL;
384 }
385
386 mtx_lock(&disp->mutex);
387 list_push_back(&disp->windows, &win->entry);
388 mtx_unlock(&disp->mutex);
389
390 rect_t rootRect = RECT_INIT_DIM(0, 0, RECT_WIDTH(&win->rect), RECT_HEIGHT(&win->rect));
391 if (flags & WINDOW_DECO)
392 {
393 win->root =
395 if (win->root == NULL)
396 {
397 window_free(win);
398 return NULL;
399 }
400
403
404 win->clientElement =
405 element_new(win->root, WINDOW_CLIENT_ELEM_ID, &clientRect, "client", ELEMENT_NONE, procedure, data);
406 if (win->clientElement == NULL)
407 {
408 window_free(win);
409 return NULL;
410 }
411 }
412 else
413 {
414 win->clientElement =
416 if (win->clientElement == NULL)
417 {
418 window_free(win);
419 return NULL;
420 }
421 win->root = win->clientElement;
422 }
423
424 return win;
425}
426
428{
429 if (win == NULL)
430 {
431 return;
432 }
433
434 if (win->root != NULL)
435 {
436 element_free(win->root);
437 }
438
439 if (win->buffer != NULL)
440 {
441 munmap(win->buffer, RECT_WIDTH(&win->rect) * RECT_HEIGHT(&win->rect) * sizeof(pixel_t));
442 }
443
445 if (cmd == NULL)
446 {
447 abort();
448 }
449 cmd->target = win->surface;
451
452 mtx_lock(&win->disp->mutex);
453 list_remove(&win->entry);
454 mtx_unlock(&win->disp->mutex);
455
456 free(win);
457}
458
460{
461 if (win == NULL)
462 {
463 return (rect_t){0};
464 }
465
466 return win->rect;
467}
468
470{
471 if (win == NULL)
472 {
473 return (rect_t){0};
474 }
475
476 return RECT_INIT_DIM(0, 0, RECT_WIDTH(&win->rect), RECT_HEIGHT(&win->rect));
477}
478
480{
481 if (win == NULL)
482 {
483 return NULL;
484 }
485
486 return win->disp;
487}
488
490{
491 if (win == NULL)
492 {
493 return SURFACE_ID_NONE;
494 }
495
496 return win->surface;
497}
498
500{
501 if (win == NULL)
502 {
503 return SURFACE_NONE;
504 }
505
506 return win->type;
507}
508
510{
511 if (win == NULL)
512 {
513 return NULL;
514 }
515
516 return win->clientElement;
517}
518
520{
521 if (win == NULL || rect == NULL)
522 {
523 errno = EINVAL;
524 return ERR;
525 }
526
527 bool hasSizeChanged = RECT_WIDTH(&win->rect) != RECT_WIDTH(rect) || RECT_HEIGHT(&win->rect) != RECT_HEIGHT(rect);
528 if (hasSizeChanged && !(win->flags & WINDOW_RESIZABLE))
529 {
530 errno = EPERM;
531 return ERR;
532 }
533
535 if (cmd == NULL)
536 {
537 return ERR;
538 }
539 cmd->target = win->surface;
540 cmd->rect = *rect;
542 return 0;
543}
544
546{
547 if (win == NULL)
548 {
549 errno = EINVAL;
550 return ERR;
551 }
552
554 if (cmd == NULL)
555 {
556 return ERR;
557 }
558 cmd->target = win->surface;
559 cmd->flags = flags;
560 cmd->timeout = timeout;
562 return 0;
563}
564
565void window_invalidate(window_t* win, const rect_t* rect)
566{
567 if (win == NULL || rect == NULL)
568 {
569 return;
570 }
571
572 if (RECT_AREA(&win->invalidRect) == 0)
573 {
574 win->invalidRect = *rect;
575 }
576 else
577 {
579 }
580}
581
583{
584 if (win == NULL)
585 {
586 errno = EINVAL;
587 return ERR;
588 }
589
590 if (RECT_AREA(&win->invalidRect) == 0)
591 {
592 return 0;
593 }
594
597 if (cmd == NULL)
598 {
599 return ERR;
600 }
601
602 cmd->target = win->surface;
603 cmd->invalidRect = win->invalidRect;
605
606 win->invalidRect = (rect_t){0};
607 return 0;
608}
609
611{
612 if (win == NULL || event == NULL)
613 {
614 errno = EINVAL;
615 return ERR;
616 }
617
618 switch (event->type)
619 {
620 case EVENT_LIB_REDRAW:
621 {
622 element_t* elem = element_find(win->root, event->libRedraw.id);
623 if (elem == NULL)
624 {
625 return ERR;
626 }
627
628 if (element_dispatch(elem, event) == ERR)
629 {
630 return ERR;
631 }
632 }
633 break;
635 {
636 element_t* elem = element_find(win->root, event->libForceAction.dest);
637 if (elem == NULL)
638 {
639 return ERR;
640 }
641
642 if (element_dispatch(elem, event) == ERR)
643 {
644 return ERR;
645 }
646 }
647 break;
648 case EVENT_REPORT:
649 {
650 if (event->report.flags & REPORT_RECT)
651 {
652 rect_t newRect = event->report.info.rect;
653
654 if (RECT_WIDTH(&win->rect) != RECT_WIDTH(&newRect) || RECT_HEIGHT(&win->rect) != RECT_HEIGHT(&newRect))
655 {
656 event_lib_redraw_t event;
657 event.id = win->root->id;
658 event.shouldPropagate = true;
659 display_push(win->disp, win->surface, EVENT_LIB_REDRAW, &event, sizeof(event_lib_redraw_t));
660 }
661
662 win->rect = newRect;
663 }
664
665 if (element_dispatch(win->root, event) == ERR)
666 {
667 return ERR;
668 }
669 }
670 break;
671 default:
672 {
673 if (element_dispatch(win->root, event) == ERR)
674 {
675 return ERR;
676 }
677 }
678 break;
679 }
680
682 return 0;
683}
684
686{
687 if (win == NULL)
688 {
689 errno = EINVAL;
690 return ERR;
691 }
692
694 if (cmd == NULL)
695 {
696 return ERR;
697 }
698 cmd->isGlobal = false;
699 cmd->target = win->surface;
701 return 0;
702}
703
705{
706 if (win == NULL)
707 {
708 errno = EINVAL;
709 return ERR;
710 }
711
713 {
714 return ERR;
715 }
716
719 if (cmd == NULL)
720 {
721 return ERR;
722 }
723 cmd->isGlobal = false;
724 cmd->target = win->surface;
725 cmd->isVisible = isVisible;
727 return 0;
728}
#define MAX_NAME
Maximum length of names.
Definition MAX_NAME.h:11
static uint64_t procedure(window_t *win, element_t *elem, const event_t *event)
Definition main.c:46
@ CMD_SURFACE_TIMER_SET
Definition cmd.h:28
@ CMD_SURFACE_MOVE
Definition cmd.h:27
@ CMD_SURFACE_NEW
Definition cmd.h:25
@ CMD_SURFACE_VISIBLE_SET
Definition cmd.h:31
@ CMD_SURFACE_FREE
Definition cmd.h:26
@ CMD_SURFACE_FOCUS_SET
Definition cmd.h:30
@ CMD_SURFACE_INVALIDATE
Definition cmd.h:29
timer_flags_t
Definition cmd.h:75
static fd_t data
Definition dwm.c:21
element_t * element_new_root(window_t *win, element_id_t id, const rect_t *rect, const char *text, element_flags_t flags, procedure_t procedure, void *data)
Definition element.c:76
void * display_cmd_alloc(display_t *disp, cmd_type_t type, uint64_t size)
Allocate a section of the displays command buffer.
Definition display.c:171
void display_cmds_flush(display_t *disp)
Flush the display's command buffer.
Definition display.c:196
void display_push(display_t *disp, surface_id_t target, event_type_t type, void *data, uint64_t size)
Push an event to the display's internal event queue.
Definition display.c:321
uint64_t display_wait(display_t *disp, event_t *event, event_type_t expected)
Wait for the display to receive an event of the expected type.
Definition display.c:339
uint64_t display_dispatch_pending(display_t *disp, event_type_t type, surface_id_t target)
Dispatch all events currently in the display's internal event queue of a specific type and target.
Definition display.c:442
uint64_t display_set_is_visible(display_t *disp, surface_id_t id, bool isVisible)
Set the visibility of a surface.
Definition display.c:558
void draw_gradient(drawable_t *draw, const rect_t *rect, pixel_t start, pixel_t end, direction_t direction, bool shouldAddNoise)
Draw a gradient filled rectangle.
Definition drawable.c:382
void draw_rect(drawable_t *draw, const rect_t *rect, pixel_t pixel)
Draw a filled rectangle.
Definition drawable.c:7
void draw_text(drawable_t *draw, const rect_t *rect, const font_t *font, align_t xAlign, align_t yAlign, pixel_t pixel, const char *text)
Draw text to a drawable.
Definition drawable.c:667
void draw_frame(drawable_t *draw, const rect_t *rect, uint64_t width, pixel_t foreground, pixel_t background)
Draw a skeuomorphic frame.
Definition drawable.c:204
@ ALIGN_MIN
Definition drawable.h:51
@ ALIGN_CENTER
Definition drawable.h:49
@ DIRECTION_HORIZONTAL
Definition drawable.h:61
void element_set_image(element_t *elem, image_t *image)
Set the image of an element.
Definition element.c:381
element_t * element_find(element_t *elem, element_id_t id)
Find a child element by its ID.
Definition element.c:134
theme_t * element_get_theme(element_t *elem)
Get the theme of an element.
Definition element.c:401
element_t * element_new(element_t *parent, element_id_t id, const rect_t *rect, const char *text, element_flags_t flags, procedure_t procedure, void *data)
Allocate and initialize a new element.
Definition element.c:48
#define ELEMENT_NO_OUTLINE
Definition element.h:47
uint64_t element_dispatch(element_t *elem, const event_t *event)
Dispatch an event to an element.
Definition element.c:476
void element_draw_end(element_t *elem, drawable_t *draw)
End drawing to an element.
Definition element.c:427
#define ELEMENT_NONE
Definition element.h:43
rect_t element_get_content_rect(element_t *elem)
Get the element's rectangle in local coordinates.
Definition element.c:213
void element_draw_begin(element_t *elem, drawable_t *draw)
Begin drawing to an element.
Definition element.c:411
void element_free(element_t *elem)
Deinitialize and free an element and all its children.
Definition element.c:113
void element_set_private(element_t *elem, void *data)
Set private data for an element.
Definition element.c:163
void * element_get_private(element_t *elem)
Get private data for an element.
Definition element.c:173
#define EVENT_LIB_QUIT
Definition event.h:102
#define EVENT_LIB_FORCE_ACTION
Definition event.h:103
#define EVENT_MOUSE
Definition event.h:84
#define EVENT_LIB_DEINIT
Definition event.h:99
#define EVENT_SURFACE_NEW
Definition event.h:82
#define EVENT_LIB_INIT
Definition event.h:98
#define EVENT_LIB_REDRAW
Definition event.h:100
#define EVENT_REPORT
Definition event.h:88
#define EVENT_LIB_ACTION
Definition event.h:101
@ REPORT_IS_FOCUSED
Definition event.h:37
@ REPORT_RECT
Definition event.h:35
@ ACTION_RELEASE
Definition event.h:49
@ MOUSE_LEFT
Left mouse button.
Definition event.h:175
#define SURFACE_ID_NONE
Definition surface.h:54
surface_type_t
Surface types.
Definition surface.h:33
uint64_t surface_id_t
Definition surface.h:53
@ SURFACE_NONE
Definition surface.h:34
@ SURFACE_VISIBLE
Definition surface.h:49
@ SURFACE_FOCUSED
Definition surface.h:50
theme_t * theme_global_get(void)
Get the global theme.
Definition theme.c:97
element_t * button_new(element_t *parent, element_id_t id, const rect_t *rect, const char *text, element_flags_t flags)
Create a new button element.
Definition button.c:309
uint64_t window_set_visible(window_t *win, bool isVisible)
Set the visibility of the window.
Definition window.c:704
rect_t window_get_rect(window_t *win)
Get the window's rectangle in screen coordinates.
Definition window.c:459
uint64_t window_move(window_t *win, const rect_t *rect)
Move and/or resize the window.
Definition window.c:519
uint64_t window_set_focus(window_t *win)
Set the focus to the window.
Definition window.c:685
surface_id_t window_get_id(window_t *win)
Get the surface ID of the window.
Definition window.c:489
window_flags_t
Window flags.
Definition window.h:44
uint64_t window_invalidate_flush(window_t *win)
Flush invalidated rectangles to the DWM.
Definition window.c:582
surface_type_t window_get_type(window_t *win)
Get the surface type of the window.
Definition window.c:499
uint64_t window_set_timer(window_t *win, timer_flags_t flags, clock_t timeout)
Set the window timer.
Definition window.c:545
uint64_t window_dispatch(window_t *win, const event_t *event)
Dispatch an event to the window's elements.
Definition window.c:610
window_t * window_new(display_t *disp, const char *name, const rect_t *rect, surface_type_t type, window_flags_t flags, procedure_t procedure, void *data)
Allocate and initialize a new window.
Definition window.c:313
element_t * window_get_client_element(window_t *win)
Get the client element of the window.
Definition window.c:509
void window_free(window_t *win)
Free a window.
Definition window.c:427
display_t * window_get_display(window_t *win)
Get the display associated with the window.
Definition window.c:479
void window_invalidate(window_t *win, const rect_t *rect)
Invalidate a rectangle of the window.
Definition window.c:565
@ WINDOW_RESIZABLE
Allows window_move() to resize the window.
Definition window.h:47
@ WINDOW_NO_CONTROLS
Disable controls (close/minimize buttons), only applies if WINDOW_DECO is set.
Definition window.h:48
@ WINDOW_DECO
Enable decorations (titlebar, close/minimize buttons, etc).
Definition window.h:46
#define EINVAL
Invalid argument.
Definition errno.h:142
#define ENOMEM
Out of memory.
Definition errno.h:92
#define errno
Error number variable.
Definition errno.h:27
#define EPERM
Operation not permitted.
Definition errno.h:37
#define UNUSED(x)
Mark a variable as unused.
Definition defs.h:96
uint64_t close(fd_t fd)
System call for closing files.
Definition close.c:8
fd_t claim(const char *key)
System call for claiming a shared file descriptor.
Definition claim.c:6
static void list_remove(list_entry_t *entry)
Removes a list entry from its current list.
Definition list.h:290
static void list_push_back(list_t *list, list_entry_t *entry)
Pushes an entry to the end of the list.
Definition list.h:322
static void list_entry_init(list_entry_t *entry)
Initializes a list entry.
Definition list.h:173
void * mmap(fd_t fd, void *address, size_t length, prot_t prot)
System call to map memory from a file.
Definition mmap.c:6
void * munmap(void *address, size_t length)
System call to unmap mapped memory.
Definition munmap.c:6
@ PROT_READ
Readable memory.
Definition proc.h:124
@ PROT_WRITE
Writable memory.
Definition proc.h:125
#define NULL
Pointer error value.
Definition NULL.h:25
#define ERR
Integer error value.
Definition ERR.h:17
__UINT64_TYPE__ fd_t
File descriptor type.
Definition fd_t.h:10
__UINT64_TYPE__ clock_t
A nanosecond time.
Definition clock_t.h:13
void image_free(image_t *image)
Definition image.c:74
image_t * image_new(display_t *disp, const char *path)
Definition image.c:27
static const path_flag_t flags[]
Definition path.c:47
uint32_t pixel_t
Definition pixel.h:11
uint64_t(* procedure_t)(window_t *, element_t *, const event_t *)
Definition procedure.h:15
#define RECT_SHRINK(rect, margin)
Definition rect.h:81
#define RECT_AREA(rect)
Definition rect.h:40
#define RECT_INIT_DIM(x, y, width, height)
Definition rect.h:32
#define RECT_INIT(left, top, right, bottom)
Definition rect.h:26
#define RECT_HEIGHT(rect)
Definition rect.h:39
#define RECT_WIDTH(rect)
Definition rect.h:38
#define RECT_EXPAND_TO_CONTAIN(rect, other)
Definition rect.h:44
#define RECT_CONTAINS_POINT(rect, point)
Definition rect.h:61
__UINT64_TYPE__ uint64_t
Definition stdint.h:17
_PUBLIC void * malloc(size_t size)
Definition malloc.c:5
_PUBLIC _NORETURN void abort(void)
Definition abort.c:9
_PUBLIC void free(void *ptr)
Definition free.c:11
_PUBLIC char * strcpy(char *_RESTRICT s1, const char *_RESTRICT s2)
Definition strcpy.c:3
size_t strnlen_s(const char *s, size_t maxsize)
Definition strnlen_s.c:4
surface_id_t target
Definition cmd.h:99
surface_id_t target
Definition cmd.h:64
surface_id_t target
Definition cmd.h:91
surface_id_t target
Definition cmd.h:70
rect_t rect
Definition cmd.h:71
char name[MAX_NAME]
Definition cmd.h:58
rect_t rect
Definition cmd.h:57
surface_type_t type
Definition cmd.h:56
surface_id_t target
Definition cmd.h:83
timer_flags_t flags
Definition cmd.h:84
surface_id_t target
Definition cmd.h:106
bool isFocused
Definition window.c:22
bool isVisible
Definition window.c:23
point_t dragOffset
Definition window.c:25
image_t * closeIcon
Definition window.c:26
image_t * minimizeIcon
Definition window.c:27
bool isDragging
Definition window.c:24
Opaque display structure.
Definition internal.h:68
mtx_t mutex
Definition internal.h:79
list_t windows
Definition internal.h:75
Drawable structure.
Definition drawable.h:35
Opaque element structure.
Definition internal.h:23
element_id_t id
Definition internal.h:27
Library Action event.
Definition event.h:279
action_type_t type
Definition event.h:281
element_id_t source
Definition event.h:280
element_id_t dest
Definition event.h:291
Library Redraw event.
Definition event.h:268
element_id_t id
Definition event.h:269
Mouse event.
Definition event.h:186
point_t screenPos
Definition event.h:191
mouse_buttons_t pressed
Definition event.h:188
mouse_buttons_t held
Definition event.h:187
point_t pos
Definition event.h:190
Report event.
Definition event.h:215
surface_info_t info
Definition event.h:217
report_flags_t flags
Definition event.h:216
char shmemKey[KEY_128BIT]
Key that can be claim()ed to access the surface's shared memory.
Definition event.h:128
Event structure.
Definition event.h:306
event_lib_action_t libAction
Definition event.h:323
event_lib_redraw_t libRedraw
Definition event.h:322
event_report_t report
Definition event.h:316
event_surface_new_t surfaceNew
Definition event.h:311
event_type_t type
Definition event.h:307
event_mouse_t mouse
Definition event.h:313
event_lib_force_action_t libForceAction
Definition event.h:324
int64_t y
Definition point.h:14
int64_t x
Definition point.h:13
Definition rect.h:13
int32_t bottom
Definition rect.h:17
int32_t top
Definition rect.h:15
int32_t right
Definition rect.h:16
int32_t left
Definition rect.h:14
surface_flags_t flags
Definition surface.h:61
pixel_t backgroundNormal
Definition theme.h:35
pixel_t backgroundSelectedEnd
Definition theme.h:37
pixel_t highlight
Definition theme.h:45
pixel_t backgroundUnselectedEnd
Definition theme.h:39
pixel_t backgroundUnselectedStart
Definition theme.h:38
pixel_t foregroundNormal
Definition theme.h:40
pixel_t shadow
Definition theme.h:46
pixel_t backgroundSelectedStart
Definition theme.h:36
Theme structure.
Definition theme.h:71
int64_t smallPadding
Definition theme.h:88
char iconMinimize[MAX_PATH]
Definition theme.h:82
theme_color_set_t deco
Definition theme.h:76
int64_t panelSize
Definition theme.h:86
int64_t titlebarSize
Definition theme.h:85
int64_t frameSize
Definition theme.h:83
char iconClose[MAX_PATH]
Definition theme.h:81
int64_t bigPadding
Definition theme.h:87
Opaque window structure.
Definition internal.h:44
list_entry_t entry
Definition internal.h:45
rect_t rect
Definition internal.h:48
rect_t invalidRect
Definition internal.h:49
char name[MAX_NAME]
Definition internal.h:47
window_flags_t flags
Definition internal.h:51
element_t * root
Definition internal.h:54
surface_type_t type
Definition internal.h:50
pixel_t * buffer
Definition internal.h:53
surface_id_t surface
Definition internal.h:52
element_t * clientElement
Definition internal.h:55
display_t * disp
Definition internal.h:46
static theme_t theme
Definition theme.c:12
_PUBLIC int mtx_lock(mtx_t *mtx)
Definition mtx_lock.c:11
_PUBLIC int mtx_unlock(mtx_t *mtx)
Definition mtx_unlock.c:10
static uint64_t window_deco_init(window_t *win, element_t *elem)
Definition window.c:177
static void window_deco_action(window_t *win, const event_lib_action_t *action)
Definition window.c:242
#define WINDOW_DECO_BUTTON_AMOUNT
Definition window.c:18
#define WINDOW_DECO_CLOSE_BUTTON_ID
Definition window.c:13
static void window_deco_handle_dragging(window_t *win, element_t *elem, const event_mouse_t *event)
Definition window.c:80
rect_t window_get_local_rect(window_t *win)
Definition window.c:469
static void window_deco_titlebar_rect(window_t *win, element_t *elem, rect_t *rect)
Definition window.c:30
#define WINDOW_DECO_MINIMIZE_BUTTON_ID
Definition window.c:14
static void window_deco_draw_titlebar(window_t *win, element_t *elem, drawable_t *draw)
Definition window.c:54
#define WINDOW_CLIENT_ELEM_ID
Definition window.c:11
#define WINDOW_DECO_MINIMIZE_BUTTON_INDEX
Definition window.c:17
static void window_deco_redraw(window_t *win, element_t *elem)
Definition window.c:225
static void window_deco_button_rect(window_t *win, element_t *elem, rect_t *rect, uint64_t index)
Definition window.c:45
static uint64_t window_deco_procedure(window_t *win, element_t *elem, const event_t *event)
Definition window.c:279
#define WINDOW_DECO_CLOSE_BUTTON_INDEX
Definition window.c:16
static void window_deco_report(window_t *win, element_t *elem, const event_report_t *report)
Definition window.c:260
#define WINDOW_DECO_ELEM_ID
Definition window.c:12
static void window_deco_free(element_t *elem)
Definition window.c:208
static uint64_t window_deco_init_controls(window_t *win, element_t *elem, deco_private_t *private)
Definition window.c:116