shithub: da

Download patch

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;
         }
     }
--