ref: 9c7d5576c074bd7b9d0fe8a249df31da2df31c9e
parent: cec6a8217fa2ae90a72226959e215b663c88bc41
author: sirjofri <sirjofri@sirjofri.de>
date: Mon May 13 13:24:30 EDT 2024
trying to get it work with libcontrol input works, just drawing doesn't work for some reason
--- a/mkfile
+++ b/mkfile
@@ -1,6 +1,6 @@
</$objtype/mkfile
-CFLAGS=$CFLAGS -p -I/sys/include/npe -D__plan9__ -D__${objtype}__ -DNO_TGMATH_H -I. -D__plan9_keep_main__
+CFLAGS=$CFLAGS -p -I/sys/include/npe -D__plan9__ -D__${objtype}__ -DNO_TGMATH_H -I. # -D__plan9_keep_main__
TARG=\
blackbox\
--- a/plan9.c
+++ b/plan9.c
@@ -1,6 +1,9 @@
#include <npe.h>
+#include <thread.h>
#include <draw.h>
-#include <event.h>
+#include <mouse.h>
+#include <keyboard.h>
+#include <control.h>
#undef PI
#include "puzzles.h"
@@ -17,6 +20,10 @@
int ncolors;
Point ZP;
int topbarh;
+ Controlset *cs;
+ Channel *c;
+ int showframe;
+ Rectangle rect;
};
frontend *fe;
@@ -82,7 +89,7 @@
static void p9_draw_text(void *handle, int x, int y, int fonttype, int fontsize, int align, int color, const char *text)
{
frontend *fe = (frontend*)handle;
- string(fe->image, addpt(fe->ZP, Pt(x, y)), fe->colors[color], ZP, font, text);
+ string(fe->image, Pt(x, y), fe->colors[color], ZP, font, text);
}
static void
@@ -89,7 +96,7 @@
p9_draw_rect(void *handle, int x, int y, int w, int h, int color)
{
frontend *fe = (frontend*)handle;
- draw(fe->image, rectaddpt(Rect(x, y, x+w, y+h), fe->ZP), fe->colors[color], nil, ZP);
+ draw(fe->image, Rect(x, y, x+w, y+h), fe->colors[color], nil, ZP);
}
static void
@@ -96,7 +103,7 @@
p9_draw_line(void *handle, int x1, int y1, int x2, int y2, int color)
{
frontend *fe = (frontend*)handle;
- line(fe->image, addpt(fe->ZP, Pt(x1, y1)), addpt(fe->ZP, Pt(x2, y2)), Endsquare, Endsquare, 1, fe->colors[color], ZP);
+ line(fe->image, Pt(x1, y1), Pt(x2, y2), Endsquare, Endsquare, 1, fe->colors[color], ZP);
}
static void
@@ -103,7 +110,7 @@
p9_draw_thick_line(void *handle, float thickness, float x1, float y1, float x2, float y2, int color)
{
frontend *fe = (frontend*)handle;
- line(fe->image, addpt(fe->ZP, Pt(x1, y1)), addpt(fe->ZP, Pt(x2, y2)), Endsquare, Endsquare, thickness, fe->colors[color], ZP);
+ line(fe->image, Pt(x1, y1), Pt(x2, y2), Endsquare, Endsquare, thickness, fe->colors[color], ZP);
}
static void
@@ -114,14 +121,14 @@
points = malloc(npoints * sizeof(Point));
for (int i = 0; i < npoints; i++) {
- points[i].x = coords[i*2+0] + fe->ZP.x;
- points[i].y = coords[i*2+1] + fe->ZP.y;
+ points[i].x = coords[i*2+0];
+ points[i].y = coords[i*2+1];
}
if (fillcolor > 0)
- fillpoly(fe->image, points, npoints, 0, fe->colors[fillcolor], fe->ZP);
+ fillpoly(fe->image, points, npoints, 0, fe->colors[fillcolor], ZP);
if (outlinecolor > 0)
- poly(fe->image, points, npoints, Endsquare, Endsquare, 1, fe->colors[outlinecolor], fe->ZP);
+ poly(fe->image, points, npoints, Endsquare, Endsquare, 1, fe->colors[outlinecolor], ZP);
free(points);
}
@@ -130,7 +137,7 @@
p9_draw_circle(void *handle, int cx, int cy, int radius, int fillcolor, int outlinecolor)
{
frontend *fe = (frontend*)handle;
- Point c = addpt(fe->ZP, Pt(cx, cy));
+ Point c = Pt(cx, cy);
fillellipse(fe->image, c, radius, radius, fe->colors[fillcolor], ZP);
ellipse(fe->image, c, radius, radius, 0, fe->colors[outlinecolor], ZP);
}
@@ -158,6 +165,8 @@
static void
p9_end_draw(void *handle)
{
+ frontend* fe = (frontend*)handle;
+ chanprint(fe->cs->ctl, "c_game image frame");
}
static void
@@ -164,6 +173,10 @@
p9_status_bar(void *handle, const char *text)
{
frontend *fe = (frontend*)handle;
+
+ chanprint(fe->cs->ctl, "l_status value %q", text);
+
+ return;
draw(fe->image, Rect(fe->ZP.x+10, fe->image->r.max.y-20, fe->image->r.max.x, fe->image->r.max.y), fe->background, nil, ZP);
string(fe->image, Pt(fe->ZP.x+10, fe->image->r.max.y-20), display->black, ZP, font, text);
}
@@ -234,8 +247,55 @@
}
void
-initfe(frontend *fe)
+initui(Controlset *cs, Channel *c)
{
+ Control *b_game, *b_settings, *c_game, *c_settings, *stackmain, *menu;
+ Control *l_status;
+ Point p;
+
+ menu = createrow(cs, "rowmain");
+ chanprint(cs->ctl, "rowmain border 1");
+
+ stackmain = createstack(cs, "stackmain");
+ chanprint(cs->ctl, "stackmain border 1");
+ controlwire(stackmain, "event", c);
+
+ b_game = createtextbutton(cs, "b_game");
+ p = stringsize(font, "game");
+ chanprint(cs->ctl, "b_game border 1");
+ chanprint(cs->ctl, "b_game align center");
+ chanprint(cs->ctl, "b_game text game");
+ chanprint(cs->ctl, "b_game image i_white");
+ chanprint(cs->ctl, "b_game light i_black");
+ chanprint(cs->ctl, "b_game size %d %d 100 %d", p.x, p.y, p.y);
+ c_game = createbox(cs, "c_game");
+ chanprint(cs->ctl, "c_game image frame");
+ chanprint(cs->ctl, "c_game border 1");
+ controlwire(c_game, "event", c);
+ controlwire(b_game, "event", c);
+
+ b_settings = createtextbutton(cs, "b_settings");
+ p = stringsize(font, "settings");
+ chanprint(cs->ctl, "b_settings text settings");
+ chanprint(cs->ctl, "b_settings border 1");
+ chanprint(cs->ctl, "b_settings size %d %d 100 %d", p.x, p.y, p.y);
+ c_settings = createcolumn(cs, "c_settings");
+ controlwire(c_settings, "event", c);
+ controlwire(b_settings, "event", c);
+
+ l_status = createlabel(cs, "l_status");
+
+ chanprint(cs->ctl, "stackmain add c_game c_settings");
+ chanprint(cs->ctl, "rowmain add b_game\nrowmain add b_settings");
+
+ activate(b_game);
+ activate(b_settings);
+ activate(c_game);
+}
+
+void
+initfe(frontend *fe, Channel *c)
+{
float *colors;
int ncolors;
int r, g, b;
@@ -243,7 +303,7 @@
float bgcol[3];
fe->topbarh = 20;
- fe->image = screen;
+ fe->image = allocimage(display, screen->r, screen->chan, 0, 0);
fe->ZP = screen->r.min;
fe->ZP.y += fe->topbarh;
@@ -259,6 +319,15 @@
fe->colors[i] = allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, rgb2col(r, g, b));
}
free(colors);
+
+ fe->cs = newcontrolset(fe->image, nil, nil, nil);
+ fe->cs->clicktotype = 1;
+ fe->c = c;
+ ctldeletequits = 1;
+ namectlimage(fe->image, "frame");
+ namectlimage(display->black, "i_black");
+ namectlimage(display->white, "i_white");
+ initui(fe->cs, fe->c);
}
void
@@ -272,45 +341,44 @@
}
void
-redrawui(void)
+resizecontrolset(Controlset *cs)
{
- Point to = fe->ZP;
- to.x = fe->image->r.max.x;
- line(fe->image, fe->ZP, to, Endsquare, Endsquare, 0, display->black, ZP);
-}
-
-void
-eresized(int new)
-{
- if (new && getwindow(display, Refnone) < 0) {
- sysfatal("can't reattach to window: %r");
+ Rectangle rmenu, rarea, sarea;
+ Control *ctl;
+
+ if (getwindow(display, Refnone) < 0) {
+ sysfatal("resize failed: %r");
}
- fe->image = screen;
- fe->ZP = screen->r.min;
- fe->ZP.y += fe->topbarh;
+ rmenu = screen->r;
+ rmenu.max.y = rmenu.min.y + 16;
+ rarea = screen->r;
+ rarea.min.y = rmenu.min.y + 16;
+ rarea.max.y = rarea.max.y - 16;
+ sarea = screen->r;
+ sarea.min.y = sarea.max.y - 16;
+
+ if (fe->image) {
+ freeimage(fe->image);
+ fe->image = nil;
+ }
+ fe->image = allocimage(display, screen->r, screen->chan, 0, 0);
+ fe->rect = rarea;
draw(screen, screen->r, fe->background, nil, ZP);
resize();
midend_redraw(fe->me);
- redrawui();
+
+ chanprint(cs->ctl, "rowmain rect %R\nrowmain show", rmenu);
+ chanprint(cs->ctl, "c_game rect %R\nc_settings rect %R", rarea, rarea);
+ chanprint(cs->ctl, "stackmain rect %R\nstackmain show", rarea);
+ chanprint(cs->ctl, "stackmain reveal %d", fe->showframe);
+ chanprint(cs->ctl, "l_status rect %R\nl_status show", sarea);
+
+ ctl = controlcalled("c_game");
+ fe->ZP = ctl->rect.min;
}
void
-keyboardev(int c, Event *ev)
-{
- switch (c) {
- case 'q':
- case 127: /* DEL */
- exits(nil);
- break;
- default:
- if (c >= 0 && midend_process_key(fe->me, 0, 0, c) == PKR_QUIT) {
- exits(nil);
- }
- }
-}
-
-void
printoptions(config_item *c)
{
char *t;
@@ -391,30 +459,35 @@
}
void
-hittopbar(int x, int buttons)
+showframe(int frame)
{
- if (buttons&1) {
- print("left mouse\n");
- } else
- if (buttons&2) {
- print("middle mouse\n");
- } else
- if (buttons&4) {
- print("right mouse\n");
- } else /* no button at all */
- return;
- print("pos: %d\n", x);
+ fe->showframe = frame;
+ chanprint(fe->cs->ctl, "stackmain reveal %d", frame);
}
+int
+keyev(int k)
+{
+ switch (k) {
+ case 'q':
+ case 127:
+ return 1; /* return 1 to quit */
+ default:
+ if (k >= 0 && midend_process_key(fe->me, 0, 0, k) == PKR_QUIT)
+ return 1;
+ }
+ return 0;
+}
+
void
-main(int argc, char **argv)
+threadmain(int argc, char **argv)
{
- Event ev;
- int e;
- int x, y;
- char *s;
+ int x, y, n;
+ long l;
+ char *s, *args[6];
int doprintoptions = 0;
char *wintitle;
+ Channel *c;
config_item *cfg;
int changedprefs = 0;
@@ -453,30 +526,48 @@
sysfatal("initdraw failed: %r");
}
- initfe(fe);
+ initcontrols();
+
+ c = chancreate(sizeof(char*), 0);
+ initfe(fe, c);
midend_new_game(fe->me);
- einit(Emouse|Ekeyboard);
- eresized(0);
+ resizecontrolset(fe->cs);
for (;;) {
- switch (event(&ev)) {
- case Emouse:
- x = ev.mouse.xy.x - fe->ZP.x;
- y = ev.mouse.xy.y - fe->ZP.y;
- if (y < fe->topbarh) {
- hittopbar(x, ev.mouse.buttons);
- }
- if (ev.mouse.buttons&1) {
- midend_process_key(fe->me, x, y, LEFT_BUTTON);
+ s = recvp(fe->c);
+ n = tokenize(s, args, nelem(args));
+
+ if (strcmp(args[0], "c_settings:") == 0) {
+ print("c_settings event: %s\n", args[1]);
+ } else
+ if (strcmp(args[0], "c_game:") == 0) {
+ if (strcmp(args[1], "mouse") == 0) {
+ x = atoi(args[2]+1) - fe->ZP.x; /* ignore '[' */
+ y = atoi(args[3]) - fe->ZP.y;
+ n = atoi(args[4]);
+ if (n&1)
+ midend_process_key(fe->me, x, y, LEFT_BUTTON);
+ if (n&2)
+ midend_process_key(fe->me, x, y, MIDDLE_BUTTON);
+ if (n&4)
+ midend_process_key(fe->me, x, y, RIGHT_BUTTON);
} else
- if (ev.mouse.buttons&2) {
- midend_process_key(fe->me, x, y, MIDDLE_BUTTON);
+ if (strcmp(args[1], "key") == 0) {
+ l = strtol(args[2], nil, 0);
+ if (keyev(l))
+ break;
} else
- if (ev.mouse.buttons&4) {
- midend_process_key(fe->me, x, y, RIGHT_BUTTON);
- }
- case Ekeyboard:
- keyboardev(ev.kbdc, &ev);
- }
+ print("c_game event: %s\n", args[1]);
+ } else
+ if (strcmp(args[0], "b_game:") == 0) {
+ print("b_game pressed\n");
+ showframe(0);
+ } else
+ if (strcmp(args[0], "b_settings:") == 0) {
+ print("b_settings pressed\n");
+ showframe(1);
+ } else
+ print("event from %s: %s\n", args[0], args[1]);
}
+ threadexitsall(nil);
}