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