summaryrefslogtreecommitdiff
path: root/sys/src/cmd/spred/spred.c
diff options
context:
space:
mode:
authoraiju <devnull@localhost>2014-07-30 15:57:14 +0200
committeraiju <devnull@localhost>2014-07-30 15:57:14 +0200
commit712fd30652d29dc9e936f11d7837d1cb079575fc (patch)
tree2915c820a5c05761f1d2ac4d525067f701aa474b /sys/src/cmd/spred/spred.c
parent555a05018b60b28bdfd6ada0310848c68fe20e48 (diff)
added sprite editor spred
Diffstat (limited to 'sys/src/cmd/spred/spred.c')
-rw-r--r--sys/src/cmd/spred/spred.c210
1 files changed, 210 insertions, 0 deletions
diff --git a/sys/src/cmd/spred/spred.c b/sys/src/cmd/spred/spred.c
new file mode 100644
index 000000000..08472c205
--- /dev/null
+++ b/sys/src/cmd/spred/spred.c
@@ -0,0 +1,210 @@
+#include <u.h>
+#include <libc.h>
+#include <bio.h>
+#include <thread.h>
+#include <draw.h>
+#include <mouse.h>
+#include <keyboard.h>
+#include <frame.h>
+#include <cursor.h>
+#include "dat.h"
+#include "fns.h"
+
+Mousectl *mc;
+Keyboardctl *kc;
+int quitok;
+
+enum {
+ ZEROX,
+ RESIZE,
+ CLOSE,
+ WRITE,
+ QUIT,
+ WIN
+};
+
+int
+quit(void)
+{
+ File *f;
+
+ if(!quitok)
+ for(f = flist.next; f != &flist; f = f->next)
+ if(f->change > 0){
+ cmdprint("?\n");
+ quitok = 1;
+ return 0;
+ }
+ return -1;
+}
+
+static char *
+menugen(int n)
+{
+ File *f;
+ static int mw;
+ static char buf[512];
+ int rc;
+ char *p;
+
+ switch(n){
+ case ZEROX: return "zerox";
+ case CLOSE: return "close";
+ case RESIZE: return "resize";
+ case WRITE: return "write";
+ case QUIT: return "quit";
+ }
+ if(n < WIN)
+ sysfatal("menugen: no string for n=%d", n);
+ n -= WIN;
+ if(n == 0){
+ mw = 0;
+ for(f = flist.next; f != &flist; f = f->next){
+ rc = filtitlelen(f);
+ if(rc > mw)
+ mw = rc;
+ }
+ return "~~spred~~";
+ }
+ for(f = flist.next; f != &flist; f = f->next)
+ if(--n == 0){
+ p = filtitle(f, buf, buf + sizeof(buf));
+ rc = mw - utflen(buf);
+ if(p + rc >= buf + sizeof(buf))
+ rc = buf + sizeof(buf) - p - 1;
+ memset(p, ' ', rc);
+ p[rc] = 0;
+ return buf;
+ }
+ return nil;
+
+}
+
+static int
+rmb(void)
+{
+ static Menu menu = {nil, menugen};
+ int n;
+ Win *w;
+ File *f;
+
+ if(actw != nil && actw->tab->rmb != nil && actw->tab->rmb(actw, mc) >= 0)
+ return 0;
+ n = menuhit(3, mc, &menu, nil);
+ if(n < 0)
+ return 0;
+ switch(n){
+ case ZEROX:
+ w = winsel(mc, 3);
+ if(w != nil)
+ winzerox(w, mc);
+ return 0;
+ case CLOSE:
+ w = winsel(mc, 3);
+ if(w != nil)
+ winclose(w);
+ return 0;
+ case RESIZE:
+ winresize(winsel(mc, 3), mc);
+ return 0;
+ case WRITE:
+ w = winsel(mc, 3);
+ if(w != nil)
+ winwrite(w, nil);
+ return 0;
+ case QUIT:
+ return quit();
+ }
+ if(n < WIN)
+ sysfatal("rmb: no action for n=%d", n);
+ if(n == 0){
+ setfocus(cmdw);
+ return 0;
+ }
+ n -= WIN;
+ for(f = flist.next; f != &flist; f = f->next)
+ if(--n == 0){
+ if(f->wins.wnext == &f->wins){
+ newwinsel(f->type, mc, f);
+ return 0;
+ }
+ for(w = f->wins.wnext; w != &f->wins && w != actw; w = w->wnext)
+ ;
+ if(w->wnext == &f->wins)
+ w = w->wnext;
+ setfocus(w->wnext);
+ return 0;
+ }
+ return 0;
+}
+
+static void
+loop(void)
+{
+ Rune r;
+ int n;
+
+ Alt a[] = {
+ {mc->c, &mc->Mouse, CHANRCV},
+ {kc->c, &r, CHANRCV},
+ {mc->resizec, &n, CHANRCV},
+ {nil, nil, CHANEND}
+ };
+
+ for(;;){
+ flushimage(display, 1);
+ switch(alt(a)){
+ case 0:
+ if((mc->buttons & 1) != 0)
+ winclick(mc);
+ if((mc->buttons & 2) != 0)
+ if(actw != nil && actw->tab->menu != nil)
+ actw->tab->menu(actw, mc);
+ if((mc->buttons & 4) != 0)
+ if(rmb() < 0)
+ return;
+ break;
+ case 1:
+ if(actw != nil && actw->tab->key != nil)
+ actw->tab->key(actw, r);
+ break;
+ case 2:
+ resize();
+ break;
+ }
+ }
+}
+
+void
+threadmain(int argc, char **argv)
+{
+ ARGBEGIN {
+ default:
+ ;
+ } ARGEND;
+
+ quotefmtinstall();
+ if(initdraw(nil, nil, nil) < 0)
+ sysfatal("initdraw: %r");
+ initwin();
+ mc = initmouse(nil, screen);
+ if(mc == nil)
+ sysfatal("initmouse: %r");
+ kc = initkeyboard(nil);
+ if(kc == nil)
+ sysfatal("initkeyboard: %r");
+ loop();
+ threadexitsall(nil);
+}
+
+Cursor crosscursor = {
+ {-7, -7},
+ {0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0,
+ 0x03, 0xC0, 0x03, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0xC0, 0x03, 0xC0,
+ 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, },
+ {0x00, 0x00, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80,
+ 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x7F, 0xFE,
+ 0x7F, 0xFE, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80,
+ 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x00, 0x00, }
+};