Browse code

Make old commandbuf (search string, etc) only a suggestion: reset commandbuf if key is not RIGHT/END/ENTER when showing the suggestion

Dario Rodriguez authored on 01/09/2021 18:43:41
Showing 1 changed files
... ...
@@ -51,6 +51,8 @@
51 51
 
52 52
 #define COLOR_QUERYBG "\xad\x92\x5e\xff"
53 53
 #define COLOR_QUERYFG "\xd0\xef\x4f\xff"
54
+#define COLOR_QUERYBGOLD "\x83\x75\x59\xff"
55
+#define COLOR_QUERYFGOLD "\xb1\xc5\x5e\xff"
54 56
 
55 57
 #define COLOR_WARNINGBG "\xba\x07\x07\xff"
56 58
 #define COLOR_WARNINGFG "\xe6\xdc\x5d\xff"
... ...
@@ -84,11 +86,14 @@ typedef struct re_t {
84 86
         int selactive;
85 87
         int sellinefrom,sellineto;
86 88
         int selcolfrom,selcolto;
89
+        int mouseselactive;
90
+        int sellinestart,selcolstart;
87 91
         long sizeselectbuf;
88 92
         long usedselectbuf;
89 93
         char *selectbuf;
90 94
         char *command;
91 95
         char commandbuf[COMMANDBUFSIZE];
96
+        int is_oldcommandbuf;
92 97
         char cachelastsearch[COMMANDBUFSIZE];
93 98
         char cachelastreplacewith[COMMANDBUFSIZE];
94 99
         question_t *question;
... ...
@@ -135,6 +140,7 @@ int re_sel_lincolisend(re_t *re, int line, int col);
135 140
 int re_selectbuf_resize(re_t *re,long size);
136 141
 int re_selectbuf_fill(re_t *re,long frompos,long size, int nadditionalspaces);
137 142
 int re_selectbuf_replace(re_t *re,char *newdata);
143
+int re_clipget(re_t *re);
138 144
 int re_addprint(re_t *re);
139 145
 int re_delprint(re_t *re, int nprint);
140 146
 int re_rtrim(re_t *re, long curpos, int *trimmed);
... ...
@@ -406,16 +412,29 @@ fprintf(stderr,"Resizing from %ix%i to %ix%i...\n",re->ui->w,re->ui->h,(int)even
406 412
                                         }
407 413
                                         break;
408 414
                                 case SDL_MOUSEBUTTONDOWN:
409
-                                        if(event.button.y>=re->y && event.button.x>=re->x) {
410
-                                                int newposx,newposy;
411
-                                                long tmppos;
412
-                                                newposx=(event.button.x-re->x)/re->ui->fontwidth;
413
-                                                newposy=(event.button.y-re->y)/re->ui->fontheight;
414
-                                                if(redata_linecol2pos(re->data, re->originline+newposy, re->origincol+newposx,&tmppos,NULL)==0) {
415
-                                                        re->curline=re->originline+newposy;
416
-                                                        re->curcol=re->origincol+newposx;
417
-                                                        re->headerdirty=1;
418
-                                                        re->contentsdirty=1;
415
+                                case SDL_MOUSEBUTTONUP:
416
+                                case SDL_MOUSEMOTION:
417
+                                        {
418
+#warning TODO
419
+                                                int mx,my;
420
+                                                mx=(event.type!=SDL_MOUSEMOTION)?event.button.x:event.motion.x;
421
+                                                my=(event.type!=SDL_MOUSEMOTION)?event.button.y:event.motion.y;
422
+                                                if(!(event.type==SDL_MOUSEMOTION && (re->mouseselactive==0 || my<re->y || mx<re->x))) {
423
+                                                        int newposx,newposy;
424
+                                                        long tmppos;
425
+                                                        if(event.type==SDL_MOUSEBUTTONDOWN && event.button.button==SDL_BUTTON_LEFT) {
426
+                                                                re->mouseselactive=1;
427
+                                                        } else if( event.type==SDL_MOUSEBUTTONUP && event.button.button==SDL_BUTTON_LEFT) {
428
+                                                                re->mouseselactive=0;
429
+                                                        }
430
+                                                        newposx=(mx-re->x)/re->ui->fontwidth;
431
+                                                        newposy=(my-re->y)/re->ui->fontheight;
432
+                                                        if(redata_linecol2pos(re->data, re->originline+newposy, re->origincol+newposx,&tmppos,NULL)==0) {
433
+                                                                re->curline=re->originline+newposy;
434
+                                                                re->curcol=re->origincol+newposx;
435
+                                                                re->headerdirty=1;
436
+                                                                re->contentsdirty=1;
437
+                                                        }
419 438
                                                 }
420 439
                                         }
421 440
                                         break;
... ...
@@ -1029,16 +1048,19 @@ re_processkey_commandwait(re_t *re, SDL_Event *event)
1029 1048
         if(re->command_first_key=='q' && event->key.keysym.sym==SDLK_l) {
1030 1049
                 re->command=COMMAND_GOTOLINE;
1031 1050
                 re->commandbuf[0]='\0';
1051
+                re->is_oldcommandbuf=0;
1032 1052
                 re->headerdirty=1;
1033 1053
         } else if(re->command_first_key=='q' && event->key.keysym.sym==SDLK_f) {
1034 1054
                 re->command=COMMAND_SEARCHFORWARD;
1035 1055
                 strncpy(re->commandbuf,re->cachelastsearch,sizeof(re->commandbuf));
1036 1056
                 re->commandbuf[sizeof(re->commandbuf)-1]='\0';
1057
+                re->is_oldcommandbuf=1;
1037 1058
                 re->headerdirty=1;
1038 1059
         } else if(re->command_first_key=='q' && event->key.keysym.sym==SDLK_a) {
1039 1060
                 re->command=COMMAND_REPLACEWHAT;
1040 1061
                 strncpy(re->commandbuf,re->cachelastsearch,sizeof(re->commandbuf));
1041 1062
                 re->commandbuf[sizeof(re->commandbuf)-1]='\0';
1063
+                re->is_oldcommandbuf=1;
1042 1064
                 re->headerdirty=1;
1043 1065
         } else if(re->command_first_key=='k' && event->key.keysym.sym==SDLK_q) {
1044 1066
                 if(redata_needs_saving(re->data)) {
... ...
@@ -1048,6 +1070,7 @@ re_processkey_commandwait(re_t *re, SDL_Event *event)
1048 1070
                         re->command=COMMAND_EXIT;
1049 1071
                         re->commandbuf[0]='\0';
1050 1072
                 }
1073
+                re->is_oldcommandbuf=0;
1051 1074
                 re->headerdirty=1;
1052 1075
         } else if(re->command_first_key=='k' && event->key.keysym.sym==SDLK_h) {
1053 1076
                 re_sel_toggle(re);
... ...
@@ -1154,6 +1177,10 @@ re_processkey_commanddata(re_t *re, SDL_Event *event)
1154 1177
                         re->ignorenkeys--;
1155 1178
                         return(0); /* this is an already processed key, ignore it */
1156 1179
                 }
1180
+                if(re->is_oldcommandbuf) {
1181
+                        re->commandbuf[0]='\0';
1182
+                        re->is_oldcommandbuf=0;
1183
+                }
1157 1184
                 len=strlen(event->text.text);
1158 1185
                 if((strlen(re->commandbuf)+len+1)>=sizeof(re->commandbuf))
1159 1186
                         return(-1); /* No space for text */
... ...
@@ -1172,12 +1199,24 @@ re_processkey_commanddata(re_t *re, SDL_Event *event)
1172 1199
         } else if(event->key.keysym.sym==SDLK_BACKSPACE && re->commandbuf[0]!='\0') {
1173 1200
                 int nchar;
1174 1201
                 char *ptr;
1202
+                if(re->is_oldcommandbuf) {
1203
+                        re->commandbuf[0]='\0';
1204
+                        re->is_oldcommandbuf=0;
1205
+                        re->headerdirty=1;
1206
+                        return(0);
1207
+                }
1175 1208
                 if((nchar=redata_generic_utf8len(re->commandbuf,strlen(re->commandbuf)))<=0)
1176 1209
                         return(-1); /* error parsing commandbuf */
1177 1210
                 if((ptr=redata_generic_utf8col(re->commandbuf,strlen(re->commandbuf),nchar-1))==NULL)
1178 1211
                         return(-1); /* error positioning in commandbuf */
1179 1212
                 *ptr='\0';
1180 1213
                 re->headerdirty=1;
1214
+        } else if(event->key.keysym.sym==SDLK_RIGHT || event->key.keysym.sym==SDLK_END) {
1215
+                if(re->is_oldcommandbuf) {
1216
+                        re->is_oldcommandbuf=0;
1217
+                        re->headerdirty=1;
1218
+                        return(0);
1219
+                }
1181 1220
         } else if(event->key.keysym.sym==SDLK_RETURN) {
1182 1221
                 re_processcommand(re);
1183 1222
         }
... ...
@@ -1691,6 +1730,14 @@ re_selectbuf_replace(re_t *re,char *newdata)
1691 1730
         return(0);
1692 1731
 }
1693 1732
 
1733
+int
1734
+re_clipget(re_t *re)
1735
+{
1736
+#warning TODO
1737
+        return(-1);
1738
+}
1739
+
1740
+
1694 1741
 int
1695 1742
 re_addprint(re_t *re)
1696 1743
 {
... ...
@@ -1908,9 +1955,19 @@ re_drawheader_command(re_t *re)
1908 1955
                    ,(q->nopts>3)?" 4.":"",(q->nopts>4)?(q->optsshort!=NULL)?q->optsshort[3]:q->opts[3]:""
1909 1956
                    ,re->commandbuf);
1910 1957
         } else {
1958
+                int commandlen;
1959
+                int commandbuflen;
1911 1960
                 reui_fill(re->ui,0,0,re->ui->w,re->ui->fontheight,COLOR_QUERYBG);
1912 1961
                 re->commandbuf[sizeof(re->commandbuf)-1]='\0';
1913
-                reui_printf(re->ui,0,0,COLOR_QUERYFG,"%s %s",re->command,re->commandbuf);
1962
+                commandlen=redata_generic_utf8len(re->command,strlen(re->command));
1963
+                reui_printf(re->ui,0,0,COLOR_QUERYFG,"%s",re->command);
1964
+                if(!(re->is_oldcommandbuf) || re->commandbuf[0]=='\0') {
1965
+                        reui_printf(re->ui,re->ui->fontwidth*(commandlen+1),0,COLOR_QUERYFG,"%s",re->commandbuf);
1966
+                } else {
1967
+                        commandbuflen=redata_generic_utf8len(re->commandbuf,strlen(re->commandbuf));
1968
+                        reui_fill(re->ui,re->ui->fontwidth*(commandlen+1)-re->ui->fontwidth/2,0,re->ui->fontwidth*(commandbuflen+1)+1,re->ui->fontheight,COLOR_QUERYBGOLD);
1969
+                        reui_printf(re->ui,re->ui->fontwidth*(commandlen+1),0,COLOR_QUERYFGOLD,"%s",re->commandbuf);
1970
+                }
1914 1971
         }
1915 1972
         re->headerdirty=0;
1916 1973
         re->ui->rendererdirty=1;