summaryrefslogtreecommitdiff
path: root/src/gtkext
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2019-03-18 09:00:20 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2019-03-18 09:00:55 (GMT)
commit43d57853c6f2c59197c7dc20ff61f3f2eacc2445 (patch)
tree3dcb5ad426c7e5d4159d95f7e9e5e80eef45bfe0 /src/gtkext
parentf65f83fd222d14934b527152899359327813128e (diff)
Exported graph views using Cairo.
Diffstat (limited to 'src/gtkext')
-rw-r--r--src/gtkext/gtkbufferdisplay.c25
-rw-r--r--src/gtkext/gtkdisplaypanel-int.h7
-rw-r--r--src/gtkext/gtkdisplaypanel.c29
-rw-r--r--src/gtkext/gtkdisplaypanel.h7
-rw-r--r--src/gtkext/gtkgraphdisplay.c63
-rw-r--r--src/gtkext/gtkgraphdisplay.h15
6 files changed, 128 insertions, 18 deletions
diff --git a/src/gtkext/gtkbufferdisplay.c b/src/gtkext/gtkbufferdisplay.c
index 0794dd4..01df570 100644
--- a/src/gtkext/gtkbufferdisplay.c
+++ b/src/gtkext/gtkbufferdisplay.c
@@ -382,6 +382,7 @@ static gboolean gtk_buffer_display_draw(GtkWidget *widget, cairo_t *cr)
GtkBufferDisplay *display; /* Autre version du composant */
GtkDisplayPanel *parent; /* Autre version du composant */
GdkWindow *window; /* Fenêtre à redessiner */
+ GtkAllocation allocation; /* Aire complète du composant */
cairo_region_t *region; /* Région visible à redessiner */
cairo_rectangle_int_t area; /* Surface correspondante */
GtkStyleContext *context; /* Contexte du thème actuel */
@@ -401,9 +402,22 @@ static gboolean gtk_buffer_display_draw(GtkWidget *widget, cairo_t *cr)
gtk_cairo_transform_to_window(cr, widget, window);
- region = gdk_window_get_clip_region(window);
- cairo_region_get_extents(region, &area);
- cairo_region_destroy(region);
+ if (parent->export)
+ {
+ gtk_widget_get_allocation(widget, &allocation);
+
+ area.x = 0;
+ area.y = 0;
+ area.width = allocation.width;
+ area.height = allocation.height;
+
+ }
+ else
+ {
+ region = gdk_window_get_clip_region(window);
+ cairo_region_get_extents(region, &area);
+ cairo_region_destroy(region);
+ }
context = gtk_widget_get_style_context(widget);
@@ -473,7 +487,7 @@ static gboolean gtk_buffer_display_draw(GtkWidget *widget, cairo_t *cr)
g_generic_config_get_value(get_main_configuration(), MPK_SELECTION_LINE, &sel_line);
sel_line &= gtk_widget_has_focus(widget);
- if (!sel_line || display->cursor == NULL || !g_line_cursor_is_valid(display->cursor))
+ if (!sel_line || display->cursor == NULL || !g_line_cursor_is_valid(display->cursor) || parent->export)
selected = NULL;
else
{
@@ -484,7 +498,8 @@ static gboolean gtk_buffer_display_draw(GtkWidget *widget, cairo_t *cr)
area.x -= virt_x;
virt_y += area.y;
- g_buffer_view_draw(display->view, cr, virt_y, &area, parent->options, &display->offsets, selected);
+ g_buffer_view_draw(display->view, cr, virt_y, &area, parent->options, &display->offsets,
+ selected, parent->export);
}
diff --git a/src/gtkext/gtkdisplaypanel-int.h b/src/gtkext/gtkdisplaypanel-int.h
index 62c990e..7be5616 100644
--- a/src/gtkext/gtkdisplaypanel-int.h
+++ b/src/gtkext/gtkdisplaypanel-int.h
@@ -71,6 +71,9 @@ typedef GLineCursor * (* get_cursor_fc) (const GtkDisplayPanel *);
/* Place en cache un rendu destiné à l'aperçu graphique rapide. */
typedef void (* cache_glance_fc) (GtkDisplayPanel *, cairo_t *, const GtkAllocation *, double);
+/* Marque ou non le composant pour une exportation prochaine. */
+typedef void (* prepare_export_fc) (GtkDisplayPanel *, bool);
+
/* Composant d'affichage générique (instance) */
@@ -89,6 +92,8 @@ struct _GtkDisplayPanel
GLoadedBinary *binary; /* Binaire à visualiser */
+ bool export; /* Exportation du rendu ? */
+
};
/* Composant d'affichage générique (classe) */
@@ -107,6 +112,8 @@ struct _GtkDisplayPanelClass
get_cursor_fc get_cursor; /* Fourniture d'une position */
cache_glance_fc cache_glance; /* Cache de la mignature */
+ prepare_export_fc prepare_export; /* Préparation d'exportation */
+
};
/* Propriétés propres au composant d'affichage */
diff --git a/src/gtkext/gtkdisplaypanel.c b/src/gtkext/gtkdisplaypanel.c
index 010d648..b32adfa 100644
--- a/src/gtkext/gtkdisplaypanel.c
+++ b/src/gtkext/gtkdisplaypanel.c
@@ -181,6 +181,8 @@ static void gtk_display_panel_init(GtkDisplayPanel *panel)
gtk_widget_set_has_window(GTK_WIDGET(panel), TRUE);
gtk_widget_set_can_focus(GTK_WIDGET(panel), TRUE);
+ panel->export = false;
+
}
@@ -756,6 +758,33 @@ void gtk_display_panel_show_border(GtkDisplayPanel *panel, bool show)
/******************************************************************************
* *
+* Paramètres : panel = composant GTK à mettre à jour. *
+* export = préparation d'une exportation complète du rendu ? *
+* *
+* Description : Marque ou non le composant pour une exportation prochaine. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void gtk_display_panel_prepare_export(GtkDisplayPanel *panel, bool export)
+{
+ GtkDisplayPanelClass *class; /* Classe associée au composant*/
+
+ panel->export = export;
+
+ class = GTK_DISPLAY_PANEL_GET_CLASS(panel);
+
+ if (class->prepare_export != NULL)
+ class->prepare_export(panel, export);
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : panel = composant GTK à venir consulter. *
* cr = contexte graphique associé à l'événement. *
* offset = décalage éventuel à appliquer. *
diff --git a/src/gtkext/gtkdisplaypanel.h b/src/gtkext/gtkdisplaypanel.h
index 954991c..937d41d 100644
--- a/src/gtkext/gtkdisplaypanel.h
+++ b/src/gtkext/gtkdisplaypanel.h
@@ -55,11 +55,8 @@ GType gtk_display_panel_get_type(void);
/* Définit si une bordure est à afficher. */
void gtk_display_panel_show_border(GtkDisplayPanel *, bool);
-/* Définit si les adresses doivent apparaître dans le rendu. */
-void gtk_display_panel_set_addresses_display(GtkDisplayPanel *, bool);
-
-/* Définit si le code doit apparaître dans le rendu. */
-void gtk_display_panel_set_code_display(GtkDisplayPanel *, bool);
+/* Marque ou non le composant pour une exportation prochaine. */
+void gtk_display_panel_prepare_export(GtkDisplayPanel *, bool);
/* Indique la position d'affichage d'un emplacement donné. */
bool gtk_display_panel_get_cursor_coordinates(const GtkDisplayPanel *, const GLineCursor *, gint *, gint *, ScrollPositionTweak);
diff --git a/src/gtkext/gtkgraphdisplay.c b/src/gtkext/gtkgraphdisplay.c
index fb89b2e..97bb4d3 100644
--- a/src/gtkext/gtkgraphdisplay.c
+++ b/src/gtkext/gtkgraphdisplay.c
@@ -146,6 +146,9 @@ static GLineCursor *gtk_graph_display_get_cursor(const GtkGraphDisplay *);
/* Place en cache un rendu destiné à l'aperçu graphique rapide. */
static void gtk_graph_display_cache_glance(GtkGraphDisplay *, cairo_t *, const GtkAllocation *, double);
+/* Marque ou non le composant pour une exportation prochaine. */
+static void gtk_graph_display_prepare_export(GtkGraphDisplay *, bool);
+
/* Supprime tout contenu de l'afficheur de code en graphique. */
static void gtk_graph_display_reset(GtkGraphDisplay *, bool);
@@ -202,6 +205,8 @@ static void gtk_graph_display_class_init(GtkGraphDisplayClass *class)
panel_class->get_cursor = (get_cursor_fc)gtk_graph_display_get_cursor;
panel_class->cache_glance = (cache_glance_fc)gtk_graph_display_cache_glance;
+ panel_class->prepare_export = (prepare_export_fc)gtk_graph_display_prepare_export;
+
}
@@ -465,15 +470,15 @@ static void gtk_graph_display_adjust_scroll_value(GtkGraphDisplay *display, GtkA
static gboolean gtk_graph_display_draw(GtkWidget *widget, cairo_t *cr, GtkGraphDisplay *display)
{
- size_t i; /* Boucle de parcours */
cairo_surface_t *pat_image; /* Fond du futur pinceau */
cairo_t *pat_cr; /* Pinceau pour le pinceau */
cairo_pattern_t *pattern; /* Patron de remplissage */
double degrees; /* Conversion en degrés */
+ size_t i; /* Boucle de parcours */
/* Eventuel fond pour la zone de compression */
- if (display->may_collapsing)
+ if (display->may_collapsing && !GTK_DISPLAY_PANEL(display)->export)
{
/* Préparation du pinceau */
@@ -1158,6 +1163,35 @@ static void gtk_graph_display_cache_glance(GtkGraphDisplay *display, cairo_t *cr
/******************************************************************************
* *
+* Paramètres : display = composant GTK à mettre à jour. *
+* export = préparation d'une exportation complète du rendu ? *
+* *
+* Description : Marque ou non le composant pour une exportation prochaine. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void gtk_graph_display_prepare_export(GtkGraphDisplay *display, bool export)
+{
+ void prepare_child_export(GtkWidget *child, gpointer unused)
+ {
+ if (!GTK_IS_BUFFER_DISPLAY(child))
+ return;
+
+ gtk_display_panel_prepare_export(GTK_DISPLAY_PANEL(child), export);
+
+ }
+
+ gtk_container_foreach(GTK_CONTAINER(display->support), (GtkCallback)prepare_child_export, NULL);
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : - *
* *
* Description : Crée un nouveau composant pour l'affichage en graphique. *
@@ -1177,6 +1211,31 @@ GtkWidget *gtk_graph_display_new(void)
/******************************************************************************
* *
+* Paramètres : display = composant GTK à consulter. *
+* *
+* Description : Fournit le support utilisé pour le rendu graphique. *
+* *
+* Retour : Composant GTK de support. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+GtkWidget *gtk_graph_display_get_support(GtkGraphDisplay *display)
+{
+ GtkWidget *result; /* Instance à retourner */
+
+ result = display->support;
+
+ g_object_ref(G_OBJECT(result));
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : display = composant GTK à mettre à jour. *
* widget = composant GTK à insérer. *
* x = abscisse du point d'insertion. *
diff --git a/src/gtkext/gtkgraphdisplay.h b/src/gtkext/gtkgraphdisplay.h
index e1ff00b..78008a1 100644
--- a/src/gtkext/gtkgraphdisplay.h
+++ b/src/gtkext/gtkgraphdisplay.h
@@ -32,12 +32,12 @@
-#define GTK_TYPE_GRAPH_DISPLAY (gtk_graph_display_get_type())
-#define GTK_GRAPH_DISPLAY(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GTK_TYPE_GRAPH_DISPLAY, GtkGraphDisplay))
-#define GTK_GRAPH_DISPLAY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GTK_TYPE_GRAPH_DISPLAY, GtkGraphDisplayClass))
-#define GTK_IS_GRAPH_DISPLAY(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GTK_TYPE_GRAPH_DISPLAY))
-#define GTK_IS_GRAPH_DISPLAY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GTK_TYPE_GRAPH_DISPLAY))
-#define GTK_GRAPH_DISPLAY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GTK_TYPE_GRAPH_DISPLAY, GtkGraphDisplayClass))
+#define GTK_TYPE_GRAPH_DISPLAY (gtk_graph_display_get_type())
+#define GTK_GRAPH_DISPLAY(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GTK_TYPE_GRAPH_DISPLAY, GtkGraphDisplay))
+#define GTK_GRAPH_DISPLAY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GTK_TYPE_GRAPH_DISPLAY, GtkGraphDisplayClass))
+#define GTK_IS_GRAPH_DISPLAY(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GTK_TYPE_GRAPH_DISPLAY))
+#define GTK_IS_GRAPH_DISPLAY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GTK_TYPE_GRAPH_DISPLAY))
+#define GTK_GRAPH_DISPLAY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GTK_TYPE_GRAPH_DISPLAY, GtkGraphDisplayClass))
/* Composant d'affichage sous forme graphique (instance) */
@@ -53,6 +53,9 @@ GType gtk_graph_display_get_type(void);
/* Crée un nouveau composant pour l'affichage en graphique. */
GtkWidget *gtk_graph_display_new(void);
+/* Fournit le support utilisé pour le rendu graphique. */
+GtkWidget *gtk_graph_display_get_support(GtkGraphDisplay *);
+
/* Place une vue sous forme de bloc dans le graphique. */
void gtk_graph_display_put(GtkGraphDisplay *, GtkWidget *, const GtkAllocation *);