+static int read_events(struct context *ctx)
+{
+ SDL_Event event;
+ int wait = 1, ret, exit = 0, delayed_exit = 0;
+
+ while (!exit) {
+ if (wait) {
+ SDL_WaitEvent(&event);
+ wait = 0;
+ } else {
+ ret = SDL_PollEvent(&event);
+ if (!ret) {
+ wait = 1;
+ exit = delayed_exit;
+ }
+ }
+
+ switch (event.type) {
+ case SDL_KEYDOWN:
+ switch (event.key.keysym.sym) {
+ case SDLK_ESCAPE:
+ goto quit;
+ default:
+ break;
+ }
+ break;
+ case SDL_KEYUP:
+ switch (event.key.keysym.sym) {
+ default:
+ break;
+ }
+ break;
+ case SDL_MOUSEBUTTONDOWN:
+ if (event.button.button == 4) {
+ ctx->zoom *= 1.5;
+ exit++;
+ } else if (event.button.button == 5) {
+ ctx->zoom /= 1.5;
+ delayed_exit++;
+ } else {
+ ctx->scroll_enabled = 1;
+ }
+ break;
+ case SDL_MOUSEBUTTONUP:
+ ctx->scroll_enabled = 0;
+ exit++;
+ break;
+ case SDL_MOUSEMOTION:
+ if (!ctx->scroll_enabled)
+ break;
+
+ ctx->motion_x -= event.motion.xrel;
+ ctx->motion_y -= event.motion.yrel;
+ delayed_exit++;
+ break;
+ case SDL_VIDEORESIZE:
+ ctx->screen =
+ SDL_SetVideoMode(event.resize.w,
+ event.resize.h,
+ 32,
+ ctx->screen->flags);
+ exit++;
+ break;
+ case SDL_QUIT:
+ goto quit;
+ }
+ }
+
+ return 0;
+quit:
+ printf("\nExiting. Good bye!\n");
+ return 1;
+}
+
+static void loop(struct context *ctx)
+{
+ double aspect_ratio;
+
+ do {
+ aspect_ratio = ctx->screen->w / ctx->screen->h;
+ ctx->origo_x += ctx->motion_x / ctx->zoom / ctx->screen->w;
+ ctx->origo_y += ctx->motion_y / ctx->zoom / ctx->screen->h;
+ ctx->motion_x = ctx->motion_y = 0;
+
+ draw_mandelbrot(ctx->screen,
+ ctx->origo_x - aspect_ratio / ctx->zoom,
+ ctx->origo_x + aspect_ratio / ctx->zoom,
+ ctx->origo_y - 1 / ctx->zoom,
+ ctx->origo_y + 1 / ctx->zoom);
+ } while (!read_events(ctx));
+}
+