PatchworkOS
Loading...
Searching...
No Matches
compositor.c
Go to the documentation of this file.
1#include "compositor.h"
2
3#include "dwm.h"
4#include "region.h"
5#include "screen.h"
6#include "surface.h"
7
8#include <stdio.h>
9
12
14
16{
18 prevCursorRect = RECT_INIT(0, 0, 0, 0);
19}
20
22{
23 if (!(surface->flags & SURFACE_VISIBLE))
24 {
25 return false;
26 }
27
28 region_t surfaceRegion = REGION_CREATE;
29 rect_t surfaceRect = SURFACE_SCREEN_RECT(surface);
30 region_intersect(&invalidRegion, &surfaceRegion, &surfaceRect);
31 if (region_is_empty(&surfaceRegion))
32 {
33 return false;
34 }
35
36 for (uint64_t i = 0; i < surfaceRegion.count; i++)
37 {
38 screen_transfer(surface, &surfaceRegion.rects[i]);
39 }
40
41 region_subtract(&invalidRegion, &surfaceRect);
43}
44
46{
47 if (!(ctx->fullscreen->flags & SURFACE_VISIBLE))
48 {
49 return;
50 }
51
52 region_t surfaceRegion = REGION_CREATE;
53 rect_t surfaceRect = SURFACE_SCREEN_RECT(ctx->fullscreen);
54 region_intersect(&invalidRegion, &surfaceRegion, &surfaceRect);
55 if (region_is_empty(&surfaceRegion))
56 {
57 return;
58 }
59
60 for (uint64_t i = 0; i < surfaceRegion.count; i++)
61 {
62 screen_transfer_frontbuffer(ctx->fullscreen, &surfaceRegion.rects[i]);
63 }
64
66}
67
69{
70 if (RECT_AREA(&prevCursorRect) > 0)
71 {
73 }
74
76 {
77 return;
78 }
79
80 surface_t* surface;
81 LIST_FOR_EACH_REVERSE(surface, ctx->panels, dwmEntry)
82 {
83 if (compositor_draw_surface(surface))
84 {
85 goto draw_cursor;
86 }
87 }
88
89 LIST_FOR_EACH_REVERSE(surface, ctx->windows, dwmEntry)
90 {
91 if (compositor_draw_surface(surface))
92 {
93 goto draw_cursor;
94 }
95 }
96
97 if (ctx->wall != NULL)
98 {
100 }
101
102draw_cursor:
103 if (ctx->cursor != NULL && (ctx->cursor->flags & SURFACE_VISIBLE))
104 {
105 rect_t cursorRect = SURFACE_SCREEN_RECT(ctx->cursor);
106 screen_transfer_blend(ctx->cursor, &cursorRect);
107 prevCursorRect = cursorRect;
108 }
109 else
110 {
111 prevCursorRect = RECT_INIT(0, 0, 0, 0);
112 }
113
115}
116
118{
119 if (ctx->wall == NULL)
120 {
121 return;
122 }
123
124 if (ctx->fullscreen != NULL)
125 {
127 }
128 else
129 {
131 screen_swap();
132 }
133}
134
136{
137 rect_t fitRect = *rect;
138 RECT_FIT(&fitRect, &screenRect);
139 region_add(&invalidRegion, &fitRect);
140}
static bool compositor_draw_surface(surface_t *surface)
Definition compositor.c:21
static rect_t prevCursorRect
Definition compositor.c:11
static region_t invalidRegion
Definition compositor.c:13
void compositor_invalidate(const rect_t *rect)
Definition compositor.c:135
static void compositor_draw_fullscreen(compositor_ctx_t *ctx)
Definition compositor.c:45
void compositor_init(void)
Definition compositor.c:15
void compositor_draw(compositor_ctx_t *ctx)
Definition compositor.c:117
static rect_t screenRect
Definition compositor.c:10
static void compositor_draw_all(compositor_ctx_t *ctx)
Definition compositor.c:68
@ SURFACE_VISIBLE
Definition surface.h:49
#define LIST_FOR_EACH_REVERSE(elem, list, member)
Iterates over a list in reverse.
Definition list.h:95
#define NULL
Pointer error value.
Definition NULL.h:23
#define RECT_FIT(rect, parent)
Definition rect.h:73
#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
static void region_intersect(region_t *region, region_t *out, const rect_t *clipRect)
Definition region.h:86
static bool region_is_empty(const region_t *region)
Definition region.h:27
static void region_add(region_t *region, const rect_t *rect)
Definition region.h:32
#define REGION_CREATE
Definition region.h:15
static void region_clear(region_t *region)
Definition region.h:22
static void region_subtract(region_t *region, const rect_t *subRect)
Definition region.h:69
void screen_swap(void)
Definition screen.c:166
void screen_transfer(surface_t *surface, const rect_t *rect)
Definition screen.c:93
uint64_t screen_height(void)
Definition screen.c:199
void screen_transfer_blend(surface_t *surface, const rect_t *rect)
Definition screen.c:112
void screen_transfer_frontbuffer(surface_t *surface, const rect_t *rect)
Definition screen.c:135
uint64_t screen_width(void)
Definition screen.c:194
#define SURFACE_SCREEN_RECT(surface)
Definition surface.h:37
__UINT64_TYPE__ uint64_t
Definition stdint.h:17
surface_t * wall
Definition compositor.h:13
surface_t * cursor
Definition compositor.h:14
list_t * panels
Definition compositor.h:12
surface_t * fullscreen
Definition compositor.h:15
list_t * windows
Definition compositor.h:11
Definition rect.h:13
rect_t rects[MAX_REGION_RECTS]
Definition region.h:11
uint64_t count
Definition region.h:12
surface_flags_t flags
Definition surface.h:33