diff --git a/eeshow/Makefile b/eeshow/Makefile index 97d93a8..a049a8b 100644 --- a/eeshow/Makefile +++ b/eeshow/Makefile @@ -12,16 +12,19 @@ NAME = eeshow OBJS = main.o sch-parse.o sch-render.o lib-parse.o lib-render.o \ + gui.o \ file.o git-file.o \ style.o fig.o record.o cro.o diff.o gfx.o dwg.o text.o misc.o CFLAGS = -g -Wall -Wextra -Wno-unused-parameter -Wshadow \ -Wmissing-prototypes -Wmissing-declarations \ `pkg-config --cflags cairo` \ - `pkg-config --cflags libgit2` + `pkg-config --cflags libgit2` \ + `pkg-config --cflags gtk+-3.0` LDLIBS = -lm \ - `pkg-config --libs cairo` \ - `pkg-config --libs libgit2` + `pkg-config --libs cairo` \ + `pkg-config --libs libgit2` \ + `pkg-config --libs gtk+-3.0` include ../common/Makefile.c-common diff --git a/eeshow/cro.c b/eeshow/cro.c index daf5e10..2fb2f4f 100644 --- a/eeshow/cro.c +++ b/eeshow/cro.c @@ -456,6 +456,31 @@ void cro_img_write(void *ctx, const char *name) } +void cro_canvas_end(void *ctx) +{ + struct cro_ctx *cc = ctx; + int w, h; + + end_common(cc, &w, &h); +} + + +void cro_canvas_draw(struct cro_ctx *cc, cairo_t *cr) +{ + set_color(cr, COLOR_WHITE); + cairo_paint(cr); + + cairo_select_font_face(cr, "Helvetica", CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_BOLD); + + cairo_set_line_width(cr, 2); + cairo_set_line_cap(cr, CAIRO_LINE_CAP_ROUND); + + cc->cr = cr; + record_replay(&cc->record); +} + + /* ----- Operations -------------------------------------------------------- */ diff --git a/eeshow/cro.h b/eeshow/cro.h index 3595da8..ae4dc8c 100644 --- a/eeshow/cro.h +++ b/eeshow/cro.h @@ -16,16 +16,25 @@ #include +#include + #include "gfx.h" +struct cro_ctx; + + extern const struct gfx_ops cro_png_ops; extern const struct gfx_ops cro_pdf_ops; #define cro_img_ops cro_png_ops /* just don't call cro_img_ops.end */ +#define cro_canvas_ops cro_png_ops /* just don't call cro_canvas_ops.end */ uint32_t *cro_img_end(void *ctx, int *w, int *h, int *stride); void cro_img_write(void *ctx, const char *name); +void cro_canvas_end(void *ctx); +void cro_canvas_draw(struct cro_ctx *cc, cairo_t *cr); + #endif /* !CRO_H */ diff --git a/eeshow/gui.c b/eeshow/gui.c new file mode 100644 index 0000000..ec36c2e --- /dev/null +++ b/eeshow/gui.c @@ -0,0 +1,86 @@ +/* + * gui.c - GUI for eeshow + * + * Written 2016 by Werner Almesberger + * Copyright 2016 by Werner Almesberger + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + */ + +/* + * Resources: + * + * http://zetcode.com/gfx/cairo/cairobackends/ + * https://developer.gnome.org/gtk3/stable/gtk-migrating-2-to-3.html + */ + +#include + +#include "cro.h" +#include "gfx.h" +#include "sch.h" +#include "gui.h" + + +struct gui_ctx { + const struct sch_ctx *sch; + struct cro_ctx *gfx_ctx; +} gui_ctx; + + +static gboolean on_draw_event(GtkWidget *widget, cairo_t *cr, + gpointer user_data) +{ + const struct gui_ctx *ctx = user_data; + + cro_canvas_draw(ctx->gfx_ctx, cr); + + return FALSE; +} + + +static void render(struct gui_ctx *ctx) +{ + char *argv[] = { "gui", NULL }; + + gfx_init(&cro_canvas_ops, 1, argv); + sch_render(ctx->sch->sheets); + cro_canvas_end(gfx_ctx); + ctx->gfx_ctx = gfx_ctx; + // gfx_end(); +} + + +int gui(struct sch_ctx *sch) +{ + GtkWidget *window; + GtkWidget *da; + struct gui_ctx ctx = { + .sch = sch, + }; + + render(&ctx); + + window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + + da = gtk_drawing_area_new(); + gtk_container_add(GTK_CONTAINER(window), da); + + g_signal_connect(G_OBJECT(da), "draw", + G_CALLBACK(on_draw_event), &ctx); + g_signal_connect(window, "destroy", + G_CALLBACK(gtk_main_quit), NULL); + + gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); + gtk_window_set_default_size(GTK_WINDOW(window), 400, 90); + gtk_window_set_title(GTK_WINDOW(window), "GTK window"); + + gtk_widget_show_all(window); + + gtk_main(); + + return 0; +} diff --git a/eeshow/gui.h b/eeshow/gui.h new file mode 100644 index 0000000..891cbb4 --- /dev/null +++ b/eeshow/gui.h @@ -0,0 +1,21 @@ +/* + * gui.h - GUI for eeshow + * + * Written 2016 by Werner Almesberger + * Copyright 2016 by Werner Almesberger + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + */ + +#ifndef GUI_H +#define GUI_H + +#include "sch.h" + + +int gui(struct sch_ctx *sch); + +#endif /* !GUI_H */ diff --git a/eeshow/main.c b/eeshow/main.c index af323ba..aaddbdf 100644 --- a/eeshow/main.c +++ b/eeshow/main.c @@ -17,6 +17,8 @@ #include #include +#include + #include "util.h" #include "fig.h" #include "cro.h" @@ -25,6 +27,7 @@ #include "file.h" #include "lib.h" #include "sch.h" +#include "gui.h" #include "main.h" @@ -43,7 +46,7 @@ void usage(const char *name) { fprintf(stderr, "usage: %s [-r] [-v ...] [[rev:]file.lib ...] [rev:]file.sch\n" -" %*s-- driver_spec\n" +" %*s[-- driver_spec]\n" " %s [-v ...] -C [rev:]file\n" "\n" " rev git revision\n" @@ -77,7 +80,7 @@ void usage(const char *name) } -int main(int argc, char *const *argv) +int main(int argc, char **argv) { struct lib lib; struct sch_ctx sch_ctx; @@ -86,13 +89,18 @@ int main(int argc, char *const *argv) const char *cat = NULL; char c; int arg, dashdash; + bool have_dashdash = 0; int gfx_argc; char **gfx_argv; const struct gfx_ops **ops = ops_list; + gtk_init(&argc, &argv); + for (dashdash = 1; dashdash != argc; dashdash++) - if (!strcmp(argv[dashdash], "--")) + if (!strcmp(argv[dashdash], "--")) { + have_dashdash = 1; break; + } while ((c = getopt(dashdash, argv, "rvC:")) != EOF) switch (c) { @@ -158,6 +166,9 @@ found: sch_parse(&sch_ctx, &sch_file, &lib); file_close(&sch_file); + if (!have_dashdash) + return gui(&sch_ctx); + gfx_init(*ops, gfx_argc, gfx_argv); if (recurse) { const struct sheet *sheet;