ref: 2b2adc8413a26671959e21d0d0bdce209ec71f5b
parent: 3de441d073ce1ea4d1d6f16c11f6dc788726c605
author: glenda <glenda@krsna>
date: Wed Aug 20 11:17:37 EDT 2025
better-mouse
--- a/da.c
+++ b/da.c
@@ -4,7 +4,6 @@
#include <event.h>
#include <keyboard.h>
#include <bio.h>
-#include <ctype.h>
#define CONFIG_FILE "/usr/glenda/da/da.conf"
#define DEFAULT_CTL_FILE "/usr/glenda/da/da.ctl"
@@ -79,7 +78,7 @@
Rectangle r;
int type;
int selected;
- ulong color;
+ int color_idx;
};
typedef struct BoxType BoxType;
@@ -86,6 +85,7 @@
struct BoxType {
char *name;
void (*draw)(Box*, Image*);
+ int default_color;
};
typedef struct Canvas Canvas;
@@ -149,7 +149,7 @@
Image *cbg;
Config config;
Canvas canvas;
-
+void enterfnm(int sm, int dp);
void save_da(char *file);
void load_da(char *file);
void redraw(void);
@@ -226,8 +226,8 @@
};
BoxType boxtypes[] = {
- [T_BOX] = {"box", draw_box},
- [T_BIGBOX] = {"bigbox", draw_bigbox},
+ [T_BOX] = {"box", draw_box, 9},
+ [T_BIGBOX] = {"bigbox", draw_box, 7},
};
InputMode input_modes[] = {
@@ -236,7 +236,7 @@
norm_key,
norm_mouse,
draw_nol,
- "0-F: Colors H:Emoji h:cycle S:ave O:pen g:rid r:eload-cfg "
+ "| 0-F: Colors H:Emoji h:cycle S:ave O:pen g:rid r:eload-cfg "
},
[1] = {
"filename",
@@ -320,7 +320,7 @@
Bprint(b, "box %d\n", i);
Bprint(b, " pos %d %d\n", box->pos.x, box->pos.y);
Bprint(b, " type %d\n", box->type);
- Bprint(b, " color %08lux\n", box->color);
+ Bprint(b, " color %08lux\n", palette[box->color_idx]);
}
Bterm(b);
@@ -371,6 +371,7 @@
box->pos.y = atoi(fields[2]);
box->r = Rect(box->pos.x, box->pos.y,
box->pos.x + config.box_width, box->pos.y + config.box_height);
+
} else if(nf >= 2 && strcmp(fields[0], "type") == 0){
int type = atoi(fields[1]);
if (type >= 0 && type < MAXBOXTYPES) {
@@ -384,7 +385,15 @@
}
}
} else if(nf >= 2 && strcmp(fields[0], "color") == 0){
- canvas.boxes[canvas.nboxes-1].color = strtoul(fields[1], nil, 16);
+ ulong loaded_color = strtoul(fields[1], nil, 16);
+ int color_idx = 0;
+ for(int i = 0; i < 16; i++) {
+ if (palette[i] == loaded_color) {
+ color_idx = i;
+ break;
+ }
+ }
+ canvas.boxes[canvas.nboxes-1].color_idx = color_idx;
}
}
@@ -633,7 +642,7 @@
if(idx >= 0 && idx < 16) {
canvas.current_color = idx;
if(canvas.selected >= 0 && canvas.selected < canvas.nboxes) {
- canvas.boxes[canvas.selected].color = palette[idx];
+ canvas.boxes[canvas.selected].color_idx = idx;
}
canvas.needredraw = 1;
}
@@ -677,7 +686,7 @@
b->pos = p;
b->type = canvas.next_box_type;
- b->color = palette[canvas.current_color];
+ b->color_idx = canvas.current_color;
if(b->type == T_BIGBOX) {
b->r = Rect(p.x, p.y,
@@ -707,18 +716,8 @@
void
draw_box(Box *b, Image *dst)
{
- Image *bg = colors[8]; // default color
+ Image *bg = colors[b->color_idx];
- if(b->color != 0) {
- int i;
- for(i = 0; i < 16; i++) {
- if(palette[i] == b->color) {
- bg = colors[i];
- break;
- }
- }
- }
-
if(b->selected)
bg = boxselected;
@@ -726,27 +725,6 @@
}
void
-draw_bigbox(Box *b, Image *dst)
-{
- Image *bg = colors[4];
-
- if(b->color != 0) {
- int i;
- for(i = 0; i < 16; i++) {
- if(palette[i] == b->color) {
- bg = colors[i];
- break;
- }
- }
- }
-
- if(b->selected)
- bg = boxselected;
-
- draw(dst, b->r, bg, nil, ZP);
-}
-
-void
drawgrid(Image *dst)
{
int x, y;
@@ -829,8 +807,8 @@
char buf[256];
InputMode *mode = &input_modes[canvas.current_mode];
- snprint(buf, sizeof(buf), "Color: %d | Selected: %d | Mode: %s | Boxes: %d | %s",
- canvas.current_color, canvas.selected, mode->name, canvas.nboxes, mode->status);
+ snprint(buf, sizeof(buf), "Color: %d Type: %d Selected: %d Mode: %s Boxes: %d %s",
+ canvas.current_color, canvas.next_box_type, canvas.selected, mode->name, canvas.nboxes, mode->status);
string(screen, Pt(screen->r.min.x + config.status_margin,
screen->r.max.y - config.status_height),
@@ -945,50 +923,28 @@
}
void
-cmd_save(void)
+enterfnm(int sm, int dp)
{
- canvas.current_mode = 1;
- canvas.fnkey = 1;
- canvas.save_mode = 1;
- strcpy(canvas.fnbuf, config.default_save_path);
- canvas.fnpos = strlen(canvas.fnbuf);
- canvas.needredraw = 1;
-}
+ canvas.current_mode = 1;
+ canvas.fnkey = 1;
+ canvas.save_mode = sm;
-void
-cmd_save_as(void)
-{
- canvas.current_mode = 1;
- canvas.fnkey = 1;
- canvas.save_mode = 1;
- canvas.fnbuf[0] = '\0';
- canvas.fnpos = 0;
- canvas.needredraw = 1;
+ if (dp) {
+ strcpy(canvas.fnbuf, config.default_save_path);
+ canvas.fnpos = strlen(canvas.fnbuf);
+ } else {
+ canvas.fnbuf[0] = '\0';
+ canvas.fnpos = 0;
+ }
+ canvas.needredraw = 1;
}
-void
-cmd_open(void)
-{
- canvas.current_mode = 1;
- canvas.fnkey = 1;
- canvas.save_mode = 2;
- strcpy(canvas.fnbuf, config.default_save_path);
- canvas.fnpos = strlen(canvas.fnbuf);
- canvas.needredraw = 1;
-}
+void cmd_save(void) { enterfnm(1, 1); }
+void cmd_save_as(void) { enterfnm(1, 0); }
+void cmd_open(void) { enterfnm(2, 1); }
+void cmd_open_file(void) { enterfnm(2, 0); }
void
-cmd_open_file(void)
-{
- canvas.current_mode = 1;
- canvas.fnkey = 1;
- canvas.save_mode = 2;
- canvas.fnbuf[0] = '\0';
- canvas.fnpos = 0;
- canvas.needredraw = 1;
-}
-
-void
cmd_toggle_grid(void)
{
canvas.gridsnap = !canvas.gridsnap;
@@ -1096,13 +1052,17 @@
void
norm_mouse(Mouse m)
{
- int i;
-
+ int i, j;
if(m.buttons & 1){
- i = addbox(m.xy);
- if(i >= 0){
- canvas.selected = i;
- canvas.needredraw = 1;
+ j = boxat(m.xy);
+ if(j >= 0){
+ return;
+ } else {
+ i = addbox(m.xy);
+ if(i >= 0){
+ canvas.selected = i;
+ canvas.needredraw = 1;
+ }
}
}
@@ -1111,10 +1071,9 @@
if(i >= 0){
canvas.selected = i;
Box *box = &canvas.boxes[i];
-
int width = (box->type == T_BIGBOX) ? config.bigbox_width : config.box_width;
int height = (box->type == T_BIGBOX) ? config.bigbox_height : config.box_height;
-
+ box->selected = 1;
while(m.buttons & 2){
box->pos = subpt(m.xy, Pt(width/2, height/2));
if(canvas.gridsnap){
@@ -1126,6 +1085,7 @@
redraw();
m = emouse();
}
+ box->selected = 0;
canvas.needredraw = 1;
}
}
--
⑨