Browse code

Implement window resizizing

Dario Rodriguez authored on 08/10/2020 19:52:50
Showing 3 changed files
... ...
@@ -69,7 +69,7 @@ reui_init()
69 69
         if((ui->win=SDL_CreateWindow(
70 70
               DEFAULTTITLEPREFIX,
71 71
               SDL_WINDOWPOS_UNDEFINED,SDL_WINDOWPOS_UNDEFINED,
72
-              ui->w,ui->h,0))==NULL
72
+              ui->w,ui->h,SDL_WINDOW_RESIZABLE))==NULL
73 73
           || (ui->renderer=SDL_CreateRenderer(ui->win,-1,
74 74
               SDL_RENDERER_ACCELERATED|SDL_RENDERER_PRESENTVSYNC))==NULL
75 75
           || (ui->scr=SDL_CreateTexture(ui->renderer,SDL_PIXELFORMAT_ARGB8888,
... ...
@@ -117,6 +117,24 @@ reui_title(reui_t *ui, char *titlefilename)
117 117
         return(0);
118 118
 }
119 119
 
120
+int
121
+reui_resize(reui_t *ui, int w, int h)
122
+{
123
+        SDL_Texture *newscr;
124
+        if(ui==NULL || w<=0 || h<=0)
125
+                return(-1);
126
+        if(ui->w==w && ui->h==h)
127
+                return(0); /* nothing to do */
128
+        if((newscr=SDL_CreateTexture(ui->renderer,SDL_PIXELFORMAT_ARGB8888,
129
+              SDL_TEXTUREACCESS_STREAMING,w,h))==NULL)
130
+                return(-1); /* couldn't create texture */
131
+        if(ui->scr!=NULL)
132
+                SDL_DestroyTexture(ui->scr),ui->scr=NULL;
133
+        ui->scr=newscr;
134
+        ui->h=h;
135
+        ui->w=w;
136
+        return(0);
137
+}
120 138
 
121 139
 int
122 140
 reui_fill(reui_t *ui, int x, int y, int w, int h, char *rgba)
... ...
@@ -1,5 +1,5 @@
1 1
 /*
2
- * re_ui.c
2
+ * re_ui.h
3 3
  *
4 4
  * A programmers editor
5 5
  *
... ...
@@ -35,10 +35,12 @@ reui_t *reui_init();
35 35
 void reui_free(reui_t *ui);
36 36
 
37 37
 int reui_title(reui_t *ui, char *titlefilename);
38
+int reui_resize(reui_t *ui, int w, int h);
38 39
 int reui_fill(reui_t *ui, int x, int y, int w, int h, char *rgba);
39 40
 int reui_scr2renderer(reui_t *ui, int x, int y, int w, int h);
40 41
 int reui_present(reui_t *ui);
41 42
 
43
+
42 44
 int reui_write(reui_t *ui, int x, int y, char *rgba, char *str, int nchar);
43 45
 #ifdef __GNUC__
44 46
 int reui_printf(reui_t *ui, int x, int y, char *rgba, char *format, ...) __attribute__ ((format (printf, 5, 6)));
... ...
@@ -72,6 +72,7 @@ static void sighandler_sigpipe(int num);
72 72
 
73 73
 re_t *re_init(void);
74 74
 void re_free(re_t *re);
75
+int re_setuidata(re_t *re);
75 76
 
76 77
 int re_setfilename(re_t *re, char *filename);
77 78
 int re_processkey_editing(re_t *re, SDL_Event *event);
... ...
@@ -125,9 +126,7 @@ main(int argc, char *argv[])
125 126
                 return(2);
126 127
         }
127 128
         reui_scr2renderer(re->ui,0,0,re->ui->w,re->ui->h);
128
-        re->x=0,re->y=re->ui->fontheight,re->w=re->ui->w,re->h=re->ui->h-re->y;
129
-        re->maxrow=re->h/re->ui->fontheight-1;
130
-        re->maxcol=re->w/re->ui->fontwidth-1;
129
+        re_setuidata(re);
131 130
         re->headerdirty=1;
132 131
         re->contentsdirty=1;
133 132
         flag_had_events=0;
... ...
@@ -150,7 +149,6 @@ fprintf(stderr,"QUESTION INIT: %s: %s\n",re->question->title,re->question->body)
150 149
                                         re->flag_newfile=1;
151 150
                                 else
152 151
                                         re->flag_newfile=0;
153
-#warning XXX TODO: NO PARECE FUNCIONAR EL PLUGIN_UNSAVED (pregunta pero no carga los cambios)
154 152
                                 re->originline=re->origincol=0;
155 153
                                 re->curline=re->curcol=0;
156 154
                                 re->cursorpos=0;
... ...
@@ -179,8 +177,12 @@ fprintf(stderr,"REDRAW Header (command)\n");
179 177
                 }
180 178
                 if(re->contentsdirty)
181 179
                         re_drawcontents(re);
182
-                if(re->ui->rendererdirty)
180
+                if(re->ui->rendererdirty) {
181
+#if 0
182
+fprintf(stderr,"RENDER\n");
183
+#endif
183 184
                         reui_present(re->ui);
185
+                }
184 186
                 sselect_wait(ssel,(flag_had_events)?10:100);
185 187
                 flag_had_events=(flag_had_events>0)?flag_had_events-1:0;
186 188
                 SDL_PumpEvents();
... ...
@@ -201,8 +203,41 @@ fprintf(stderr,"REDRAW Header (command)\n");
201 203
                                                 re_processkey_commanddata(re,&event);
202 204
                                         break;
203 205
                                 case SDL_WINDOWEVENT:
206
+#if 0
207
+fprintf(stderr,"WINDOWEVENT: %s(%li) data1:%li data2:%li\n",
208
+(event.window.event==SDL_WINDOWEVENT_NONE)?"NONE":
209
+(event.window.event==SDL_WINDOWEVENT_SHOWN)?"SHOWN":
210
+(event.window.event==SDL_WINDOWEVENT_HIDDEN)?"HIDDEN":
211
+(event.window.event==SDL_WINDOWEVENT_EXPOSED)?"EXPOSED":
212
+(event.window.event==SDL_WINDOWEVENT_MOVED)?"MOVED":
213
+(event.window.event==SDL_WINDOWEVENT_RESIZED)?"RESIZED":
214
+(event.window.event==SDL_WINDOWEVENT_SIZE_CHANGED)?"SIZE_CHANGED":
215
+(event.window.event==SDL_WINDOWEVENT_MINIMIZED)?"MINIMIZED":
216
+(event.window.event==SDL_WINDOWEVENT_MAXIMIZED)?"MAXIMIZED":
217
+(event.window.event==SDL_WINDOWEVENT_RESTORED)?"RESTORED":
218
+(event.window.event==SDL_WINDOWEVENT_FOCUS_GAINED)?"FOCUS_GAINED":
219
+(event.window.event==SDL_WINDOWEVENT_FOCUS_LOST)?"FOCUS_LOST":
220
+(event.window.event==SDL_WINDOWEVENT_CLOSE)?"CLOSE":
221
+(event.window.event==SDL_WINDOWEVENT_TAKE_FOCUS)?"TAKE_FOCUS":
222
+"UNKNOWN",
223
+(long) event.window.event,(long)event.window.data1,(long)event.window.data2);
224
+#endif
204 225
                                         if(event.window.event==SDL_WINDOWEVENT_SHOWN
205 226
                                           || event.window.event==SDL_WINDOWEVENT_EXPOSED) {
227
+                                                re->headerdirty=1;
228
+                                                re->contentsdirty=1;
229
+                                                re->ui->rendererdirty=1;
230
+                                        } else if((event.window.event==SDL_WINDOWEVENT_RESIZED
231
+                                          || event.window.event==SDL_WINDOWEVENT_SIZE_CHANGED)
232
+                                          && (event.window.data1!=re->ui->w || event.window.data2!=re->ui->h)) {
233
+#if 0
234
+fprintf(stderr,"Resizing from %ix%i to %ix%i...\n",re->ui->w,re->ui->h,(int)event.window.data1,(int)event.window.data2);
235
+#endif
236
+                                                reui_resize(re->ui,event.window.data1,event.window.data2);
237
+
238
+                                                re_setuidata(re);
239
+                                                re->headerdirty=1;
240
+                                                re->contentsdirty=1;
206 241
                                                 re->ui->rendererdirty=1;
207 242
                                         }
208 243
                                         break;
... ...
@@ -280,6 +315,23 @@ re_free(re_t *re)
280 315
         return;
281 316
 }
282 317
 
318
+int
319
+re_setuidata(re_t *re)
320
+{
321
+        if(re==NULL)
322
+                return(-1);
323
+        re->x=0,re->y=re->ui->fontheight,re->w=re->ui->w,re->h=re->ui->h-re->y;
324
+        re->maxrow=re->h/re->ui->fontheight-1;
325
+        re->maxcol=re->w/re->ui->fontwidth-1;
326
+        if(re->curline>=(re->originline+re->maxrow)) {
327
+                re->originline=re->curline-re->maxrow;
328
+                re->originline=(re->originline<0)?0:re->originline;
329
+        }
330
+        re->origincol=(re->curcol>(re->maxcol-COLFORCESCROLL))?(re->curcol-(re->maxcol-COLFORCESCROLL)):0;
331
+        return(0);
332
+}
333
+
334
+
283 335
 int
284 336
 re_setfilename(re_t *re, char *filename)
285 337
 {
... ...
@@ -755,8 +807,8 @@ re_moveleftright(re_t *re, int totalinc)
755 807
                         re->origincol=re->origincol*COLFORCESCROLL;
756 808
                         re->origincol=(re->origincol<0)?0:re->origincol;
757 809
                 }
758
-                if(re->curcol>(re->origincol+re->maxrow-COLFORCESCROLL)) {
759
-                        re->origincol=re->curcol+COLFORCESCROLL-re->maxrow-(re->curcol%COLFORCESCROLL);
810
+                if(re->curcol>(re->origincol+re->maxcol-COLFORCESCROLL)) {
811
+                        re->origincol=re->curcol+COLFORCESCROLL-re->maxcol-(re->curcol%COLFORCESCROLL);
760 812
                         re->origincol=(re->origincol<0)?0:re->origincol;
761 813
                 }
762 814
         }