summaryrefslogtreecommitdiff
path: root/src/gtkext
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2015-02-25 21:57:42 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2015-02-25 21:57:42 (GMT)
commit4724b73c5161140222cab3c61bb5b3d0c8dde360 (patch)
treed341f43bacdad465ddae8c8b6c076a573c53e43d /src/gtkext
parent9ff8702e5c51c7916e239caee13b974dccff6413 (diff)
Provided tweaks about positions when looking for address coordinates.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@480 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/gtkext')
-rw-r--r--src/gtkext/gtkbufferview.c50
-rw-r--r--src/gtkext/gtkviewpanel-int.h2
-rw-r--r--src/gtkext/gtkviewpanel.c10
-rw-r--r--src/gtkext/gtkviewpanel.h12
4 files changed, 60 insertions, 14 deletions
diff --git a/src/gtkext/gtkbufferview.c b/src/gtkext/gtkbufferview.c
index f179845..30cf075 100644
--- a/src/gtkext/gtkbufferview.c
+++ b/src/gtkext/gtkbufferview.c
@@ -59,7 +59,7 @@ static void gtk_buffer_view_compute_requested_size(GtkBufferView *, gint *, gint
static void gtk_buffer_view_compute_scroll_inc(GtkBufferView *, gint, GtkOrientation, gdouble *, gdouble *);
/* Indique la position d'affichage d'une adresse donnée. */
-static bool gtk_buffer_view_get_address_coordinates(const GtkBufferView *, const vmpa2t *, gint *, gint *);
+static bool gtk_buffer_view_get_address_coordinates(const GtkBufferView *, const vmpa2t *, gint *, gint *, ScrollPositionTweak);
/* Place en cache un rendu destiné à l'aperçu graphique rapide. */
static void gtk_buffer_view_cache_glance(GtkBufferView *, cairo_t *, const GtkAllocation *, double);
@@ -474,7 +474,7 @@ static gboolean gtk_buffer_view_key_press(GtkWidget *widget, GdkEventKey *event)
printf("ctrl ? %d -- keyval = %d -->> %d\n", ctrl, event->keyval, result);
- if (addr != NULL) gtk_view_panel_scroll_to_address(pview, addr);
+ if (addr != NULL) gtk_view_panel_scroll_to_address(pview, addr, SPT_RAW);
printf("\n");
@@ -552,10 +552,11 @@ static void gtk_buffer_view_compute_scroll_inc(GtkBufferView *view, gint size, G
/******************************************************************************
* *
-* Paramètres : view = composant GTK à consulter. *
-* addr = adresse à présenter à l'écran. *
-* x = position horizontale au sein du composant. [OUT] *
-* y = position verticale au sein du composant. [OUT] *
+* Paramètres : view = composant GTK à consulter. *
+* addr = adresse à présenter à l'écran. *
+* x = position horizontale au sein du composant. [OUT] *
+* y = position verticale au sein du composant. [OUT] *
+* tweak = adaptation finale à effectuer. *
* *
* Description : Indique la position d'affichage d'une adresse donnée. *
* *
@@ -565,9 +566,42 @@ static void gtk_buffer_view_compute_scroll_inc(GtkBufferView *view, gint size, G
* *
******************************************************************************/
-static bool gtk_buffer_view_get_address_coordinates(const GtkBufferView *view, const vmpa2t *addr, gint *x, gint *y)
+static bool gtk_buffer_view_get_address_coordinates(const GtkBufferView *view, const vmpa2t *addr, gint *x, gint *y, ScrollPositionTweak tweak)
{
- return g_buffer_view_get_address_coordinates(view->buffer_view, addr, x, y);
+ bool result; /* Bilan à remonter */
+ bool need_code; /* Recherche plus raffinée */
+ int height; /* Hauteur allouée */
+
+ need_code = (tweak == SPT_BOTTOM);
+
+ result = g_buffer_view_get_address_coordinates(view->buffer_view, addr, x, y, need_code);
+
+ if (result)
+ {
+ height = gtk_widget_get_allocated_height(GTK_WIDGET(view));
+
+ switch (tweak)
+ {
+ case SPT_RAW:
+ break;
+
+ case SPT_TOP:
+ break;
+
+ case SPT_CENTER:
+ *y -= (height / 2);
+ break;
+
+ case SPT_BOTTOM:
+ *y -= height;
+ *y += g_buffer_view_get_line_height(view->buffer_view);
+ break;
+
+ }
+
+ }
+
+ return result;
}
diff --git a/src/gtkext/gtkviewpanel-int.h b/src/gtkext/gtkviewpanel-int.h
index f33499d..90bd141 100644
--- a/src/gtkext/gtkviewpanel-int.h
+++ b/src/gtkext/gtkviewpanel-int.h
@@ -49,7 +49,7 @@ typedef void (* define_address_fc) (GtkViewPanel *, vmpa_t);
typedef void (* prepare_resize_fc) (GtkViewPanel *);
/* Indique la position d'affichage d'une adresse donnée. */
-typedef bool (* get_addr_coordinates_fc) (const GtkViewPanel *, const vmpa2t *, gint *, gint *);
+typedef bool (* get_addr_coordinates_fc) (const GtkViewPanel *, const vmpa2t *, gint *, gint *, ScrollPositionTweak);
/* Place en cache un rendu destiné à l'aperçu graphique rapide. */
typedef void (* cache_glance_fc) (GtkViewPanel *, cairo_t *, const GtkAllocation *, double);
diff --git a/src/gtkext/gtkviewpanel.c b/src/gtkext/gtkviewpanel.c
index 8e41fa1..40ae038 100644
--- a/src/gtkext/gtkviewpanel.c
+++ b/src/gtkext/gtkviewpanel.c
@@ -747,7 +747,7 @@ bool gtk_view_panel_contain_address(const GtkViewPanel *panel, vmpa_t addr)
gint dummy_x; /* Abscisse pour l'appel */
gint dummy_y; /* Ordonnée pour l'appel */
- return GTK_VIEW_PANEL_GET_CLASS(panel)->get_coordinates(panel, addr, &dummy_x, &dummy_y);
+ return GTK_VIEW_PANEL_GET_CLASS(panel)->get_coordinates(panel, addr, &dummy_x, &dummy_y, SPT_RAW);
}
@@ -756,6 +756,7 @@ bool gtk_view_panel_contain_address(const GtkViewPanel *panel, vmpa_t addr)
* *
* Paramètres : panel = composant GTK à manipuler. *
* addr = adresse à présenter à l'écran. *
+* tweak = adaptation finale à effectuer. *
* *
* Description : S'assure qu'une adresse donnée est visible à l'écran. *
* *
@@ -765,7 +766,7 @@ bool gtk_view_panel_contain_address(const GtkViewPanel *panel, vmpa_t addr)
* *
******************************************************************************/
-void gtk_view_panel_scroll_to_address(GtkViewPanel *panel, const vmpa2t *addr)
+void gtk_view_panel_scroll_to_address(GtkViewPanel *panel, const vmpa2t *addr, ScrollPositionTweak tweak)
{
gint x; /* Abscisse à garantir */
gint y; /* Ordonnée à garantir */
@@ -781,7 +782,7 @@ void gtk_view_panel_scroll_to_address(GtkViewPanel *panel, const vmpa2t *addr)
*/
- if (GTK_VIEW_PANEL_GET_CLASS(panel)->get_coordinates(panel, addr, &x, &y))
+ if (GTK_VIEW_PANEL_GET_CLASS(panel)->get_coordinates(panel, addr, &x, &y, tweak))
{
viewport = gtk_widget_get_parent(GTK_WIDGET(panel));
@@ -807,12 +808,13 @@ void gtk_view_panel_scroll_to_address(GtkViewPanel *panel, const vmpa2t *addr)
page_size = gtk_adjustment_get_page_size(adj);
value = gtk_adjustment_get_value(adj);
- if (y < value)
+ if (y < value || tweak != SPT_RAW)
gtk_adjustment_set_value(adj, y);
else if ((y + step_inc) > (value + page_size))
gtk_adjustment_set_value(adj, y + step_inc - page_size);
+
}
}
diff --git a/src/gtkext/gtkviewpanel.h b/src/gtkext/gtkviewpanel.h
index 95f2084..c733314 100644
--- a/src/gtkext/gtkviewpanel.h
+++ b/src/gtkext/gtkviewpanel.h
@@ -71,8 +71,18 @@ GLoadedBinary *gtk_view_panel_get_binary(const GtkViewPanel *);
/* Indique si la vue contient une addrese donnée. */
bool gtk_view_panel_contain_address(const GtkViewPanel *, vmpa_t);
+/* Adaptation d'une position sur une surface */
+typedef enum _ScrollPositionTweak
+{
+ SPT_RAW, /* Aucun ajustement */
+ SPT_TOP, /* Le plus haut possible */
+ SPT_CENTER, /* Au centre de la surface */
+ SPT_BOTTOM /* Le plus bas possible */
+
+} ScrollPositionTweak;
+
/* S'assure qu'une adresse donnée est visible à l'écran. */
-void gtk_view_panel_scroll_to_address(GtkViewPanel *, const vmpa2t *);
+void gtk_view_panel_scroll_to_address(GtkViewPanel *, const vmpa2t *, ScrollPositionTweak);
/* Place en cache un rendu destiné à l'aperçu graphique rapide. */
void gtk_view_panel_cache_glance(GtkViewPanel *, cairo_t *, const GtkAllocation *, double);