ref: cc9f77d9164026cadceff38e977439c516453743
dir: /bez.c/
#include <u.h>
#include <libc.h>
#include <thread.h>
#include <draw.h>
#include <mouse.h>
#include <keyboard.h>
// 7c bez.c && 7l -o bez bez.7
#define GRIDSIZE 50
//Channel* ptchan;
Mousectl* mctl;
Keyboardctl* kctl;
Rectangle
getgridrect(void)
{
Rectangle grid;
Point size, origin;
int shortxy, sqsize, cellsize;
origin = screen->r.min;
size = Pt(Dx(screen->r), Dy(screen->r));
shortxy = (size.x >= size.y) ? size.y : size.x;
sqsize = shortxy - (shortxy % GRIDSIZE);
cellsize = sqsize / GRIDSIZE;
grid.min.x = origin.x + (size.x - sqsize) / 2;
grid.min.y = origin.y + (size.y - sqsize) / 2;
grid.max.x = grid.min.x + (cellsize * GRIDSIZE);
grid.max.y = grid.min.y + (cellsize * GRIDSIZE);
return grid;
}
void
redraw(void)
{
Rectangle gridrect, R1;
Point P1, P2;
int cellsize, i;
int ctlpts [GRIDSIZE * GRIDSIZE + 1];
memset(ctlpts, 0, GRIDSIZE * GRIDSIZE * sizeof(int));
// ctlpts[0] is starting point of linked list.
gridrect = getgridrect();
cellsize = (gridrect.max.x - gridrect.min.x) / GRIDSIZE;
//Draw Grid
draw(screen, screen->r, display->black, nil, ZP);
for(i = 1; i < GRIDSIZE; i++){
P1.x = gridrect.min.x + i * cellsize;
P1.y = gridrect.min.y;
P2.x = gridrect.min.x + i * cellsize;
P2.y = gridrect.max.y;
line(screen, P1, P2, 0, 0, 0.1, display->white, ZP);
P1.x = gridrect.min.x;
P1.y = gridrect.min.y + i * cellsize;
P2.x = gridrect.max.x;
P2.y = gridrect.min.y + i * cellsize;
line(screen, P1, P2, 0, 0, 0.1, display->white, ZP);
}
for (i = 1; i < GRIDSIZE * GRIDSIZE +1; i++){
if (ctlpts[i] == 1){
R1.min.x = gridrect.min.x + ((i - 1) % GRIDSIZE) * cellsize;
R1.min.y = gridrect.min.y + ((i - 1) / GRIDSIZE) * cellsize;
R1.max.x = R1.min.x + cellsize;
R1.max.y = R1.min.y + cellsize;
draw(screen, R1, display->white, nil, ZP);
}
}
flushimage(display, 1);
}
void
terminate(void)
{
closekeyboard(kctl);
closemouse(mctl);
closedisplay(display);
threadexitsall(nil);
}
void
resizethread(void* arg)
{
redraw();
Mousectl*mctl = arg;
for(;;){
recvul(mctl->resizec);
if(getwindow(display, Refnone) < 0)
sysfatal("getwindow: %r");
redraw();
}
}
void
keyboardthread(void* arg)
{
Keyboardctl *kctl = arg;
Rune r;
for(;;){
recv(kctl->c, &r);
switch(r){
case Kdel:
case Kesc:
case 'q' :
terminate();
break;
}
}
}
void
mousethread(void* arg)
{
Mousectl*mctl = arg;
Mouse m;
for(;;){
recv(mctl->c, &m);
if(m.buttons){
// if mpos inside rect {gridrectmin , gridrectmax}
// divide mpos.x by gridsize and mpos.y by gridsize
}
}
}
void
threadmain(int, char*argv[])
{
Mouse m;
mctl = initmouse("/dev/mouse", nil);
if(mctl == nil)
sysfatal("initmouse: %r");
kctl = initkeyboard("/dev/cons");
if(kctl == nil)
sysfatal("initkeyboard: %r");
if(initdraw(nil, nil, argv[0]) < 0)
sysfatal("initdraw: %r");
// ptchannel = chancreate(GRIDSIZE * GRIDSIZE + 1 * sizeof(int), 0);
threadcreate(resizethread, mctl, 8*1024);
threadcreate(mousethread, mctl, 8*1024);
threadcreate(keyboardthread, kctl, 8*1024);
// for(;;){
// recv(ptchan)
// }
threadexits(nil);
}