Mon 14 Oct 23:06:38 CEST 2024
This commit is contained in:
parent
7c12d04cae
commit
a0708eb3b6
103
kernel/window.c
Normal file
103
kernel/window.c
Normal file
|
@ -0,0 +1,103 @@
|
|||
|
||||
#include "window.h"
|
||||
#include "graphics.h"
|
||||
#include "kmalloc.h"
|
||||
#include "string.h"
|
||||
|
||||
struct window {
|
||||
struct window *parent;
|
||||
struct graphics *graphics;
|
||||
struct event_queue *queue;
|
||||
int refcount;
|
||||
};
|
||||
|
||||
struct window window_root = {0};
|
||||
|
||||
struct window * window_create_root()
|
||||
{
|
||||
struct window *w = &window_root;
|
||||
w->parent = w;
|
||||
w->graphics = graphics_create_root();
|
||||
w->queue = event_queue_create_root();
|
||||
w->refcount = 1;
|
||||
return w;
|
||||
}
|
||||
|
||||
struct window * window_create( struct window *parent, int x, int y, int width, int height )
|
||||
{
|
||||
struct window *w = kmalloc(sizeof(*w));
|
||||
w->parent = parent;
|
||||
w->graphics = graphics_create(parent->graphics);
|
||||
graphics_clip(w->graphics,x,y,width,height);
|
||||
w->queue = event_queue_create();
|
||||
w->refcount = 1;
|
||||
w->parent->refcount++;
|
||||
return w;
|
||||
}
|
||||
|
||||
struct window * window_addref( struct window *w )
|
||||
{
|
||||
w->refcount++;
|
||||
return w;
|
||||
}
|
||||
|
||||
void window_delete( struct window *w )
|
||||
{
|
||||
if(!w) return;
|
||||
|
||||
if(w==&window_root) return;
|
||||
|
||||
w->refcount--;
|
||||
if(w->refcount==0) {
|
||||
graphics_delete(w->graphics);
|
||||
event_queue_delete(w->queue);
|
||||
window_delete(w->parent);
|
||||
kfree(w);
|
||||
}
|
||||
}
|
||||
|
||||
int window_width( struct window *w )
|
||||
{
|
||||
return graphics_width(w->graphics);
|
||||
}
|
||||
|
||||
int window_height( struct window *w )
|
||||
{
|
||||
return graphics_height(w->graphics);
|
||||
}
|
||||
|
||||
struct graphics * window_graphics( struct window *w )
|
||||
{
|
||||
return w->graphics;
|
||||
}
|
||||
|
||||
int window_post_events( struct window *w, struct event *e, int size )
|
||||
{
|
||||
int total = 0;
|
||||
|
||||
while(size>=sizeof(struct event)) {
|
||||
event_queue_post(w->queue,e);
|
||||
size -= sizeof(*e);
|
||||
e++;
|
||||
total += sizeof(*e);
|
||||
}
|
||||
|
||||
return total;
|
||||
}
|
||||
|
||||
int window_read_events( struct window *w, struct event *e, int size )
|
||||
{
|
||||
return event_queue_read(w->queue,e,size);
|
||||
}
|
||||
|
||||
int window_read_events_nonblock( struct window *w, struct event *e, int size )
|
||||
{
|
||||
return event_queue_read_nonblock(w->queue,e,size);
|
||||
}
|
||||
|
||||
int window_write_graphics( struct window *w, int *cmd, int size )
|
||||
{
|
||||
return graphics_write(w->graphics,cmd,size);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user