104 lines
1.9 KiB
C
104 lines
1.9 KiB
C
|
|
#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);
|
|
}
|
|
|
|
|