summaryrefslogtreecommitdiff
path: root/video
diff options
context:
space:
mode:
Diffstat (limited to 'video')
-rw-r--r--video/compositor.c31
-rw-r--r--video/compositor.h4
2 files changed, 31 insertions, 4 deletions
diff --git a/video/compositor.c b/video/compositor.c
index d0d5bfa..5dca7bd 100644
--- a/video/compositor.c
+++ b/video/compositor.c
@@ -1,5 +1,6 @@
#include "compositor.h"
+#include "syscalls.h"
#include "kernel.h"
#include "kmalloc.h"
#include "log.h"
@@ -25,6 +26,7 @@ struct window
uint16_t height;
uint32_t color;
uint16_t active;
+ uint32_t pid;
struct pdirectory *vmem;
};
@@ -42,6 +44,8 @@ static uint16_t mouse_x=100;
static uint16_t mouse_y=100;
static uint16_t mouse_k;
+static bool skip_render;
+
static void put_pixel(int x,int y, uint32_t color)
{
vmem[y*vesa_width+x]=color;
@@ -49,11 +53,11 @@ static void put_pixel(int x,int y, uint32_t color)
static void put_win(struct window *win)
{
- struct pdirectory* mydir=x86_get_page_directory();
-
+ struct pdirectory* mydir;
if(win->vmem)
{
x86_cli();// do not reschedule us til ready!
+ mydir=x86_get_page_directory();
x86_set_page_directory(win->vmem);
}
@@ -179,7 +183,7 @@ void compositor_del_window(uint32_t addr)
}
}
-void compositor_add_window(uint32_t addr)
+void compositor_add_window(uint32_t addr,uint32_t pid)
{
klog("window added");
if (next_window>=MAX_WINDOWS)kpanic("max number of windows reached. increase MAX_WINDOWS");
@@ -198,6 +202,7 @@ void compositor_add_window(uint32_t addr)
windows[0].color=0xAAAA00AA;
windows[0].active=0;
windows[0].vmem=addr;
+ windows[0].pid=pid;
next_window++;
}
@@ -209,8 +214,16 @@ void compositor_init(uint16_t width, uint16_t height, uint16_t pitch)
klog("initialized composing window manager to %d x %d",width,height);
}
+void compositor_wake()
+{
+ skip_render=false;
+}
+
void compositor_swap_buffers()
{
+ if(skip_render)return;
+ skip_render=true;
+
static bool first=true;
// if(!first)return;
// klog("swap");
@@ -226,6 +239,18 @@ void compositor_swap_buffers()
memcpy(VMEM_FRAMEBUFFER,backbuffer,vesa_height*vesa_width*4);// TODO optimize? rects only too?
first=false;
}
+void compositor_kb_handle(char c)
+{
+ for(int i=0;i<MAX_WINDOWS;i++)
+ {
+ struct window *w=&windows[i];
+ if(w->active)
+ {
+// klog("writing [%c] to window with pid [%d]",c,w->pid);
+ fd_write(get_fd(w->pid,1),c);
+ }
+ }
+}
void compositor_mouse_handle(uint16_t x,uint16_t y, uint8_t key)
{
diff --git a/video/compositor.h b/video/compositor.h
index b8710b6..f109018 100644
--- a/video/compositor.h
+++ b/video/compositor.h
@@ -1,8 +1,10 @@
#include <stdint.h>
+void compositor_wake();
void compositor_init(uint16_t width, uint16_t height, uint16_t pitch);
void compositor_set_background(char *ppm_raw_filename);
void compositor_swap_buffers();
void compositor_mouse_handle(uint16_t x,uint16_t y, uint8_t key);
-void compositor_add_window(uint32_t addr);
+void compositor_kb_handle(char c);
+void compositor_add_window(uint32_t addr,uint32_t pid);
void compositor_del_window(uint32_t addr);