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