qemacs-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemacs-commit] qemacs fractal.c


From: Charlie Gordon
Subject: [Qemacs-commit] qemacs fractal.c
Date: Fri, 28 Apr 2017 09:32:43 -0400 (EDT)

CVSROOT:        /sources/qemacs
Module name:    qemacs
Changes by:     Charlie Gordon <chqrlie>        17/04/28 09:32:43

Modified files:
        .              : fractal.c 

Log message:
        fractal: use buffer_mode_data instead of static structure for 
FractalState

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/qemacs/fractal.c?cvsroot=qemacs&r1=1.1&r2=1.2

Patches:
Index: fractal.c
===================================================================
RCS file: /sources/qemacs/qemacs/fractal.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- fractal.c   27 Apr 2017 23:04:10 -0000      1.1
+++ fractal.c   28 Apr 2017 13:32:43 -0000      1.2
@@ -322,6 +322,8 @@
 typedef struct FractalState FractalState;
 
 struct FractalState {
+    QEModeData base;
+
     int cols, rows;
     int maxiter;        /* maximum iteration number */
     int cb, nc;         /* color palette base and length */
@@ -346,8 +348,10 @@
     //" x=-1.78935604483808219844, y=0"
 };
 
-/* XXX: should be allocated as buffer mode data */
-static FractalState fractal_state;
+static inline FractalState *fractal_get_state(EditState *e, int status)
+{
+    return qe_get_buffer_mode_data(e->b, &fractal_mode, status ? e : NULL);
+}
 
 static void fractal_set_rotation(FractalState *ms, int rot) {
     ms->rot = rot;
@@ -461,19 +465,23 @@
 }
 
 static void do_fractal_refresh(EditState *s) {
-    FractalState *ms = &fractal_state;
+    FractalState *ms = fractal_get_state(s, 0);
+    if (ms) {
     ms->cols = s->cols;
     ms->rows = s->rows;
     do_fractal_draw(s, ms);
+    }
 }
 
 static void do_fractal_move(EditState *s, int deltax, int deltay) {
-    FractalState *ms = &fractal_state;
+    FractalState *ms = fractal_get_state(s, 1);
+    if (ms) {
     fnum_t dx = deltax * ms->scale / 40;
     fnum_t dy = deltay * ms->scale / 40;
     ms->x += dx * ms->m0 + dy * ms->m1;
     ms->y += dx * ms->m2 + dy * ms->m3;
     do_fractal_refresh(s);
+    }
 }
 
 static void do_fractal_move_x(EditState *s, int delta) {
@@ -485,40 +493,53 @@
 }
 
 static void do_fractal_zoom(EditState *s, int delta) {
-    FractalState *ms = &fractal_state;
+    FractalState *ms = fractal_get_state(s, 1);
+    if (ms) {
     fractal_set_zoom(ms, ms->zoom + delta);
     do_fractal_refresh(s);
+    }
 }
 
 static void do_fractal_rotate(EditState *s, int delta) {
-    FractalState *ms = &fractal_state;
+    FractalState *ms = fractal_get_state(s, 1);
+    if (ms) {
     fractal_set_rotation(ms, delta ? ms->rot + delta : 0);
     do_fractal_refresh(s);
+    }
 }
 
 static void do_fractal_iter(EditState *s, int delta) {
-    FractalState *ms = &fractal_state;
+    FractalState *ms = fractal_get_state(s, 1);
+    if (ms) {
     ms->maxiter += delta;
     do_fractal_refresh(s);
+    }
 }
 
 static void do_fractal_module(EditState *s, int delta) {
-    FractalState *ms = &fractal_state;
+    FractalState *ms = fractal_get_state(s, 1);
+    if (ms) {
     ms->bailout += delta;
     do_fractal_refresh(s);
+    }
 }
 
 static void do_fractal_set_parameters(EditState *s, const char *params) {
-    FractalState *ms = &fractal_state;
+    FractalState *ms = fractal_get_state(s, 1);
+    if (ms) {
     fractal_set_parameters(s, ms, params);
+    }
 }
 
 static void do_fractal_help(EditState *s)
 {
-    FractalState *ms = &fractal_state;
+    FractalState *ms = fractal_get_state(s, 1);
     EditBuffer *b;
     int w = 16;
 
+    if (ms == NULL)
+        return;
+
     b = new_help_buffer();
     if (!b)
         return;
@@ -555,9 +576,11 @@
 }
 
 static void fractal_display_hook(EditState *s) {
-    FractalState *ms = &fractal_state;
+    FractalState *ms = fractal_get_state(s, 0);
+    if (ms) {
     if (s->rows != ms->rows || s->cols != ms->cols)
         do_fractal_refresh(s);
+    }
 }
 
 static CmdDef fractal_commands[] = {
@@ -597,15 +620,28 @@
 
 static int fractal_mode_probe(ModeDef *mode, ModeProbeData *p)
 {
-    if (p->b->default_mode == &fractal_mode)
+    if (qe_get_buffer_mode_data(p->b, &fractal_mode, NULL))
         return 100;
     else
         return 0;
 }
 
+static int fractal_mode_init(EditState *e, EditBuffer *b, int flags)
+{
+    if (e) {
+        FractalState *ms;
+
+        if (!(ms = fractal_get_state(e, 0)))
+            return -1;
+
+        fractal_set_parameters(e, ms, fractal_default_parameters);
+        put_status(e, "fractal init");
+    }
+    return 0;
+}
+
 static void do_mandelbrot_test(EditState *s) {
     EditBuffer *b;
-    FractalState *ms = &fractal_state;
 
     if (!fractal_mode.name) {
         /* populate and register shell mode and commands */
@@ -613,8 +649,10 @@
         fractal_mode.name = "fractal";
         fractal_mode.mode_name = NULL;
         fractal_mode.mode_probe = fractal_mode_probe;
-        fractal_mode.default_wrap = WRAP_TRUNCATE;
+        fractal_mode.buffer_instance_size = sizeof(FractalState);
+        fractal_mode.mode_init = fractal_mode_init;
         fractal_mode.display_hook = fractal_display_hook;
+        fractal_mode.default_wrap = WRAP_TRUNCATE;
         qe_register_mode(&fractal_mode, MODEF_NOCMD | MODEF_VIEW);
         qe_register_cmd_table(fractal_commands, &fractal_mode);
     }
@@ -628,15 +666,10 @@
     if (!b)
         return;
 
-    if (!ms->maxiter) {
-        fractal_set_parameters(s, ms, fractal_default_parameters);
-    }
-
     b->default_mode = &fractal_mode;
     eb_set_charset(b, &charset_ucs2be, EOL_UNIX);
     do_delete_other_windows(s, 0);
     switch_to_buffer(s, b);
-    do_fractal_refresh(s);
 }
 
 static CmdDef fractal_global_commands[] = {



reply via email to

[Prev in Thread] Current Thread [Next in Thread]