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);	
 | |
| }
 | |
| 
 | |
| 
 |