-
Notifications
You must be signed in to change notification settings - Fork 0
/
Window.ZC
83 lines (74 loc) · 1.7 KB
/
Window.ZC
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#define TILE_POS_MASK 15
#define TILE_POS_TOP 0b1000
#define TILE_POS_BOTTOM 0b1100
#define TILE_POS_LEFT 0b0010
#define TILE_POS_RIGHT 0b0011
#define TILE_POS_MIDDLE 0b0000
#define TILE_POS_HORZ 0b0011
#define TILE_POS_VERT 0b1100
#define SCREEN_WIDTH (sys_framebuffer_width / 8)
#define SCREEN_HEIGHT (sys_framebuffer_height / 8)
class Tile
{
I64 left;
I64 top;
I64 bottom;
I64 right;
};
U0 TaskApplyTile(CTask *task, Tile *tile)
{
WinHorz(tile->left, (tile->right - 1), task);
WinVert(tile->top, (tile->bottom - 1), task);
}
U0 TileApplyGap(Tile *tile, U64 gap)
{
if (BOTTOM_GAP)
tile->bottom -= gap;
else
tile->bottom -= 1;
if (STATUS_BAR_GAP)
tile->top++;
tile->left += gap;
tile->top += gap;
tile->right -= gap;
}
I32 TileFromFlags(Tile *tile, U64 flags)
{
I64 tile_pos;
I64 left;
I64 top;
I64 width;
I64 height;
tile_pos = flags & TILE_POS_MASK;
left = 0;
top = 0;
width = 0;
height = 0;
if (tile_pos & TILE_POS_HORZ == TILE_POS_RIGHT || tile_pos & TILE_POS_HORZ == TILE_POS_LEFT)
width = SCREEN_WIDTH / 2;
else
width = SCREEN_WIDTH;
if (tile_pos & TILE_POS_VERT == TILE_POS_BOTTOM || tile_pos & TILE_POS_VERT == TILE_POS_TOP)
height = SCREEN_HEIGHT / 2;
else
height = SCREEN_HEIGHT;
if (tile_pos & TILE_POS_HORZ == TILE_POS_RIGHT)
left = SCREEN_WIDTH / 2;
if (tile_pos & TILE_POS_VERT == TILE_POS_BOTTOM)
top = SCREEN_HEIGHT / 2;
tile->left = left;
tile->top = top;
tile->right = left + width;
tile->bottom = top + height;
return 1;
}
U0 TileWindow(CTask *task = NULL, U64 tile_flags)
{
Tile *t = CAlloc(sizeof(Tile));
if (task == NULL)
task = sys_focus_task;
TileFromFlags(t, tile_flags);
TileApplyGap(t, GAP);
TaskApplyTile(task, t);
Free(t);
}