Mon 14 Oct 23:14:00 CEST 2024
This commit is contained in:
		
							parent
							
								
									1f9c65a8ab
								
							
						
					
					
						commit
						943be0eb57
					
				
							
								
								
									
										180
									
								
								library/nwindow.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										180
									
								
								library/nwindow.c
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,180 @@ | ||||||
|  | 
 | ||||||
|  | #include "kernel/gfxstream.h" | ||||||
|  | #include "kernel/types.h" | ||||||
|  | #include "kernel/events.h" | ||||||
|  | #include "library/nwindow.h" | ||||||
|  | #include "library/syscalls.h" | ||||||
|  | 
 | ||||||
|  | #include "library/string.h" | ||||||
|  | #include "library/malloc.h" | ||||||
|  | #include "library/stdio.h" | ||||||
|  | 
 | ||||||
|  | struct nwindow { | ||||||
|  | 	int fd; | ||||||
|  | 	int x, y; | ||||||
|  | 	int width, height; | ||||||
|  | 	struct { | ||||||
|  | 		int *buffer; | ||||||
|  | 		int length; | ||||||
|  | 		int index; | ||||||
|  | 	} graphics; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | struct nwindow * nw_create_fd( int fd ) | ||||||
|  | { | ||||||
|  | 	struct nwindow *w = malloc(sizeof(*w)); | ||||||
|  | 	w->fd = fd; | ||||||
|  | 	w->x = 0; | ||||||
|  | 	w->y = 0; | ||||||
|  | 	w->graphics.buffer = malloc(PAGE_SIZE); | ||||||
|  | 	w->graphics.length = PAGE_SIZE; | ||||||
|  | 	w->graphics.index = 0; | ||||||
|  | 
 | ||||||
|  | 	int dims[2]; | ||||||
|  | 	syscall_object_size(fd,dims,2); | ||||||
|  | 	w->width = dims[0]; | ||||||
|  | 	w->height = dims[1]; | ||||||
|  | 
 | ||||||
|  | 	return w; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | struct nwindow * nw_create_default() | ||||||
|  | { | ||||||
|  | 	return nw_create_fd(KNO_STDWIN); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | struct nwindow * nw_create_child( struct nwindow *parent, int x, int y, int width, int height ) | ||||||
|  | { | ||||||
|  | 	int fd = syscall_open_window(parent->fd,x,y,width,height); | ||||||
|  | 	struct nwindow *nw = nw_create_fd(fd); | ||||||
|  | 	nw->x = x; | ||||||
|  | 	nw->y = y; | ||||||
|  | 	nw->width = width; | ||||||
|  | 	nw->height = height; | ||||||
|  | 	return nw; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int nw_width( struct nwindow *nw ) | ||||||
|  | { | ||||||
|  | 	return nw->width; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int nw_height( struct nwindow *nw ) | ||||||
|  | { | ||||||
|  | 	return nw->height; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int nw_next_event( struct nwindow *nw, struct event *e ) | ||||||
|  | { | ||||||
|  | 	int r = syscall_object_read(nw->fd,e,sizeof(*e),0); | ||||||
|  | 	return r>0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int nw_read_events( struct nwindow *nw, struct event *e, int count, int blocking ) | ||||||
|  | { | ||||||
|  | 	int r = syscall_object_read(nw->fd,e,sizeof(*e)*count,blocking==0 ? KERNEL_IO_NONBLOCK : 0); | ||||||
|  | 	return r>0 ? r : 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int nw_post_events( struct nwindow *nw, const struct event *e, int count ) | ||||||
|  | { | ||||||
|  | 	return syscall_object_write(nw->fd,e,sizeof(*e)*count,KERNEL_IO_POST); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | char nw_getchar( struct nwindow *nw, int blocking ) | ||||||
|  | { | ||||||
|  | 	struct event e; | ||||||
|  | 	while(1) { | ||||||
|  | 		int r = nw_read_events(nw,&e,sizeof(e),blocking); | ||||||
|  | 		if(r<=0) return 0; | ||||||
|  | 		if(e.type==EVENT_KEY_DOWN) { | ||||||
|  | 			return e.code; | ||||||
|  |        		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int nw_fd( struct nwindow *w ) | ||||||
|  | { | ||||||
|  | 	return w->fd; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void nw_draw3( struct nwindow *nw, int t, int a0, int a1, int a2 ) | ||||||
|  | { | ||||||
|  | 	if(nw->graphics.length-nw->graphics.index<4) { | ||||||
|  | 		nw_flush(nw); | ||||||
|  | 	} | ||||||
|  | 	int *p = &nw->graphics.buffer[nw->graphics.index]; | ||||||
|  | 	*p++ = t; | ||||||
|  | 	*p++ = a0; | ||||||
|  | 	*p++ = a1; | ||||||
|  | 	*p++ = a2; | ||||||
|  | 	nw->graphics.index += 4; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void nw_draw4( struct nwindow *nw, int t, int a0, int a1, int a2, int a3 ) | ||||||
|  | { | ||||||
|  | 	if(nw->graphics.length-nw->graphics.index<5) { | ||||||
|  | 		nw_flush(nw); | ||||||
|  | 	} | ||||||
|  | 	int *p = &nw->graphics.buffer[nw->graphics.index]; | ||||||
|  | 	*p++ = t; | ||||||
|  | 	*p++ = a0; | ||||||
|  | 	*p++ = a1; | ||||||
|  | 	*p++ = a2; | ||||||
|  | 	*p++ = a3; | ||||||
|  | 	nw->graphics.index += 5; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void nw_flush( struct nwindow *nw ) | ||||||
|  | { | ||||||
|  | 	syscall_object_write(nw->fd, nw->graphics.buffer, nw->graphics.index, 0); | ||||||
|  | 	nw->graphics.index = 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void nw_fgcolor( struct nwindow *nw, int r, int g, int b) | ||||||
|  | { | ||||||
|  | 	nw_draw3(nw,GRAPHICS_FGCOLOR, r, g, b); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void nw_bgcolor( struct nwindow *nw, int r, int g, int b) | ||||||
|  | { | ||||||
|  | 	nw_draw3(nw,GRAPHICS_BGCOLOR, r, g, b); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void nw_rect( struct nwindow *nw, int x, int y, int w, int h) | ||||||
|  | { | ||||||
|  | 	nw_draw4(nw,GRAPHICS_RECT, x, y, w, h); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void nw_clear( struct nwindow *nw, int x, int y, int w, int h) | ||||||
|  | { | ||||||
|  | 	nw_draw4(nw,GRAPHICS_CLEAR, x, y, w, h); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void nw_line( struct nwindow *nw, int x, int y, int w, int h) | ||||||
|  | { | ||||||
|  | 	nw_draw4(nw,GRAPHICS_LINE, x, y, w, h); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void nw_string( struct nwindow *nw, int x, int y, const char *s ) | ||||||
|  | { | ||||||
|  | 	int length = strlen(s); | ||||||
|  | 
 | ||||||
|  | 	if(nw->graphics.length-nw->graphics.index < (length+4) ) { | ||||||
|  | 		nw_flush(nw); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	int *p = &nw->graphics.buffer[nw->graphics.index]; | ||||||
|  | 	*p++ = GRAPHICS_TEXT; | ||||||
|  | 	*p++ = x; | ||||||
|  | 	*p++ = y; | ||||||
|  | 	*p++ = length; | ||||||
|  | 
 | ||||||
|  | 	int i; | ||||||
|  | 	for(i=0;i<length;i++) { | ||||||
|  | 		*p++ = s[i]; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	nw->graphics.index += 4 + length; | ||||||
|  | } | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user