PatchworkOS
Loading...
Searching...
No Matches
surface.c
Go to the documentation of this file.
1#include "surface.h"
2
3#include "client.h"
4
5#include <errno.h>
6#include <stdio.h>
7#include <stdlib.h>
8#include <string.h>
9#include <sys/io.h>
10#include <sys/list.h>
11
13
14surface_t* surface_new(client_t* client, const char* name, const point_t* point, uint64_t width, uint64_t height,
15 surface_type_t type)
16{
17 surface_t* surface = malloc(sizeof(surface_t));
18 if (surface == NULL)
19 {
20 printf("dwm surface error: failed to allocate surface\n");
21 errno = ENOMEM;
22 return NULL;
23 }
24
25 list_entry_init(&surface->dwmEntry);
27 surface->client = client;
28 surface->pos = *point;
29 surface->shmem = open("/dev/shmem/new");
30 if (surface->shmem == ERR)
31 {
32 free(surface);
33 printf("dwm surface error: failed to open shmem\n");
34 return NULL;
35 }
36 surface->buffer = mmap(surface->shmem, NULL, width * height * sizeof(pixel_t), PROT_READ | PROT_WRITE);
37 if (surface->buffer == NULL)
38 {
39 close(surface->shmem);
40 free(surface);
41 printf("dwm surface error: failed to allocate gfx buffer\n");
42 return NULL;
43 }
44 memset(surface->buffer, 0, width * height * sizeof(pixel_t));
45 surface->width = width;
46 surface->height = height;
47 surface->id = newId++;
48 surface->type = type;
49 surface->timer.flags = TIMER_NONE;
50 surface->timer.timeout = CLOCKS_NEVER;
51 surface->timer.deadline = CLOCKS_NEVER;
52 surface->flags = 0;
53 strcpy(surface->name, name);
54 return surface;
55}
56
57void surface_free(surface_t* surface)
58{
59 munmap(surface->buffer, surface->width * surface->height * sizeof(pixel_t));
60 free(surface);
61}
62
64{
65 info->type = surface->type;
66 info->id = surface->id;
67 info->rect = SURFACE_SCREEN_RECT(surface);
68 info->flags = surface->flags;
69 strcpy(info->name, surface->name);
70}
#define CLOCKS_NEVER
Definition clock_t.h:16
@ TIMER_NONE
Definition cmd.h:76
surface_type_t
Surface types.
Definition surface.h:33
uint64_t surface_id_t
Definition surface.h:53
#define ENOMEM
Out of memory.
Definition errno.h:92
#define errno
Error number variable.
Definition errno.h:27
fd_t open(const char *path)
System call for opening files.
Definition open.c:9
uint64_t close(fd_t fd)
System call for closing files.
Definition close.c:9
static void list_entry_init(list_entry_t *entry)
Initializes a list entry.
Definition list.h:184
void * mmap(fd_t fd, void *address, uint64_t length, prot_t prot)
System call to map memory from a file.
Definition mmap.c:6
uint64_t munmap(void *address, uint64_t length)
System call to unmap mapped memory.
Definition munmap.c:6
@ PROT_READ
Memory can be read from.
Definition proc.h:172
@ PROT_WRITE
Memory can be written to.
Definition proc.h:173
#define NULL
Pointer error value.
Definition NULL.h:23
#define ERR
Integer error value.
Definition ERR.h:17
static fb_info_t info
Definition gop.c:41
uint32_t pixel_t
Definition pixel.h:11
#define SURFACE_SCREEN_RECT(surface)
Definition surface.h:37
__UINT64_TYPE__ uint64_t
Definition stdint.h:17
_PUBLIC int printf(const char *_RESTRICT format,...)
Definition printf.c:5
_PUBLIC void * malloc(size_t size)
Definition malloc.c:5
_PUBLIC void free(void *ptr)
Definition free.c:11
_PUBLIC char * strcpy(char *_RESTRICT s1, const char *_RESTRICT s2)
Definition strcpy.c:3
_PUBLIC void * memset(void *s, int c, size_t n)
Definition memset.c:4
char name[MAX_NAME]
Definition fb.h:44
client_t * client
Definition surface.h:24
list_entry_t clientEntry
Definition surface.h:23
pixel_t * buffer
Definition surface.h:27
fd_t shmem
Definition surface.h:26
surface_type_t type
Definition surface.h:31
uint32_t height
Definition surface.h:29
timer_t timer
Definition surface.h:32
uint32_t width
Definition surface.h:28
point_t pos
Definition surface.h:25
char name[MAX_NAME]
Definition surface.h:34
surface_id_t id
Definition surface.h:30
list_entry_t dwmEntry
Definition surface.h:22
surface_flags_t flags
Definition surface.h:33
timer_flags_t flags
Definition surface.h:15
clock_t timeout
Definition surface.h:16
clock_t deadline
Definition surface.h:17
surface_t * surface_new(client_t *client, const char *name, const point_t *point, uint64_t width, uint64_t height, surface_type_t type)
Definition surface.c:14
static surface_id_t newId
Definition surface.c:12
void surface_free(surface_t *surface)
Definition surface.c:57
void surface_get_info(surface_t *surface, surface_info_t *info)
Definition surface.c:63