ref: 07469015a833ea56db430aed28f004e205549360
dir: /city.c/
#include <u.h>
#include <libc.h>
#include <thread.h>
#include <draw.h>
#include <mouse.h>
#include <keyboard.h>
#include "dat.h"
#include "fns.h"
Mousectl *mc;
Keyboardctl *kc;
static int tdiv;
static Channel *tmc;
void *
emalloc(ulong n)
{
void *p;
if((p = mallocz(n, 1)) == nil)
sysfatal("emalloc: %r");
setmalloctag(p, getcallerpc(&n));
return p;
}
int
max(int a, int b)
{
return a > b ? a : b;
}
int
min(int a, int b)
{
return a < b ? a : b;
}
static void
timeproc(void *)
{
tdiv = 1000 / AnimHz;
for(;;){
sleep(tdiv);
nbsendul(tmc, 0);
}
}
void
threadmain(int argc, char **argv)
{
uint b, bo;
Rune r;
Mouse mo;
Point p;
ARGBEGIN{
}ARGEND
init();
initdrw();
if((kc = initkeyboard(nil)) == nil)
sysfatal("initkeyboard: %r");
if((mc = initmouse(nil, screen)) == nil)
sysfatal("initmouse: %r");
if((tmc = chancreate(sizeof(ulong), 0)) == nil)
sysfatal("chancreate: %r");
if(proccreate(timeproc, nil, 8192) < 0)
sysfatal("init: %r");
readfs();
resetdraw();
startsim();
mo.xy = EP;
memset(&mo, 0, sizeof mo);
bo = 0;
enum{
Aresize,
Amouse,
Akbd,
Aanim,
};
Alt a[] = {
{mc->resizec, nil, CHANRCV},
{mc->c, &mc->Mouse, CHANRCV},
{kc->c, &r, CHANRCV},
{tmc, nil, CHANRCV},
{nil, nil, CHANEND}
};
for(;;){
switch(alt(a)){
case Aresize:
if(getwindow(display, Refnone) < 0)
sysfatal("resize failed: %r");
mo = mc->Mouse;
resetdraw();
break;
/* FIXME: clean up */
case Amouse:
if(eqpt(mo.xy, EP))
mo = mc->Mouse;
b = mc->buttons;
p = s2p(mc->xy);
if(eqpt(p, EP) || b == 0){
//if(b != 0)
// deselect();
mo = mc->Mouse;
bo = b;
break;
}
if((b & (1<<0|1<<2)) != 0
&& (b & (1<<0|1<<2) != (bo & (1<<0|1<<2)))){
mouseselect(p);
updatedraw(1);
}
if((mc->buttons & 1<<2) != 0
&& (b & 1<<2) != (bo & 1<<2)){
actionmenu(p);
updatedraw(1);
}
mo = mc->Mouse;
bo = mo.buttons;
break;
case Akbd:
switch(r){
case Kdel:
case 'q': threadexitsall(nil);
case ' ': paused ^= 1; break;
case '+':
case '=':
if(scale < 16){
scale++;
resetdraw();
}
break;
case '-':
if(scale > 1){
scale--;
resetdraw();
}
break;
}
break;
case Aanim:
updatedraw(0);
break;
}
}
}