diff options
Diffstat (limited to 'src/gtkext')
-rw-r--r-- | src/gtkext/gtkbufferview-int.h | 2 | ||||
-rw-r--r-- | src/gtkext/gtkbufferview.c | 41 | ||||
-rw-r--r-- | src/gtkext/gtkviewpanel-int.h | 4 | ||||
-rw-r--r-- | src/gtkext/gtkviewpanel.c | 37 | ||||
-rw-r--r-- | src/gtkext/gtkviewpanel.h | 3 |
5 files changed, 85 insertions, 2 deletions
diff --git a/src/gtkext/gtkbufferview-int.h b/src/gtkext/gtkbufferview-int.h index 4f82757..a6d937b 100644 --- a/src/gtkext/gtkbufferview-int.h +++ b/src/gtkext/gtkbufferview-int.h @@ -45,7 +45,7 @@ struct _GtkBufferView gint left_text; /* Début d'impression du code */ GdkRectangle caret; /* Emplacement du curseur */ - const vmpa2t *caret_addr; /* Position mémoire du curseur */ + const vmpa2t *caret_addr; /* Position mémoire du curseur */ /* FIXME : REMME */ guint caret_timer; /* Identifiant du chronomètre */ bool show_caret; /* Bascule entre les affichages*/ diff --git a/src/gtkext/gtkbufferview.c b/src/gtkext/gtkbufferview.c index 30cf075..c7c0267 100644 --- a/src/gtkext/gtkbufferview.c +++ b/src/gtkext/gtkbufferview.c @@ -61,6 +61,9 @@ static void gtk_buffer_view_compute_scroll_inc(GtkBufferView *, gint, GtkOrienta /* Indique la position d'affichage d'une adresse donnée. */ static bool gtk_buffer_view_get_address_coordinates(const GtkBufferView *, const vmpa2t *, gint *, gint *, ScrollPositionTweak); +/* Fournit des éléments liés à la position courante dans la vue. */ +static bool gtk_buffer_view_get_position(const GtkBufferView *, GBufferLine **, GBufferSegment **); + /* Place en cache un rendu destiné à l'aperçu graphique rapide. */ static void gtk_buffer_view_cache_glance(GtkBufferView *, cairo_t *, const GtkAllocation *, double); @@ -117,6 +120,7 @@ static void gtk_buffer_view_class_init(GtkBufferViewClass *class) panel_class->compute_size = (compute_requested_size)gtk_buffer_view_compute_requested_size; panel_class->compute_inc = (compute_scroll_inc)gtk_buffer_view_compute_scroll_inc; panel_class->get_coordinates = (get_addr_coordinates_fc)gtk_buffer_view_get_address_coordinates; + panel_class->get_position = (get_view_position_fc)gtk_buffer_view_get_position; g_signal_new("caret-moved", GTK_TYPE_BUFFER_VIEW, @@ -255,7 +259,8 @@ static gboolean gtk_buffer_view_button_press(GtkWidget *widget, GdkEventButton * } else { - addr = g_buffer_view_compute_caret(view->buffer_view, line, index, real_x, pview->display, &new); + //addr = g_buffer_view_compute_caret_old(view->buffer_view, line, index, real_x, pview->display, &new); + addr = g_buffer_view_compute_caret(view->buffer_view, real_x, real_y, pview->display, &new); gtk_buffer_view_relocate_caret(view, &new, addr); } @@ -608,6 +613,40 @@ static bool gtk_buffer_view_get_address_coordinates(const GtkBufferView *view, c /****************************************************************************** * * +* Paramètres : view = composant GTK à consulter. * +* line = ligne de tampon où se trouve le curseur. [OUT] * +* segment = eventuel segment de ligne actif. [OUT] * +* * +* Description : Fournit des éléments liés à la position courante dans la vue.* +* * +* Retour : Bilan de l'opération. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static bool gtk_buffer_view_get_position(const GtkBufferView *view, GBufferLine **line, GBufferSegment **segment) +{ + GBufferSegment *seg; /* Segment à récupérer */ + + /* Si aucune position n'est définie... */ + if (view->caret_addr == NULL) + return false; + + *line = g_buffer_view_find_line_and_segment_at(view->buffer_view, + (gint []){ view->caret.x }, view->caret.y, NULL, + GTK_VIEW_PANEL(view)->display, &seg); + + if (segment != NULL) + *segment = seg; + + return (line != NULL); + +} + + +/****************************************************************************** +* * * Paramètres : view = composant GTK à manipuler. * * cairo = assistant pour la création de rendus. * * area = taille de la surface réduite à disposition. * diff --git a/src/gtkext/gtkviewpanel-int.h b/src/gtkext/gtkviewpanel-int.h index 90bd141..220b253 100644 --- a/src/gtkext/gtkviewpanel-int.h +++ b/src/gtkext/gtkviewpanel-int.h @@ -51,6 +51,9 @@ 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 *, ScrollPositionTweak); +/* Fournit des éléments liés à la position courante dans la vue. */ +typedef bool (* get_view_position_fc) (const GtkViewPanel *, GBufferLine **, GBufferSegment **); + /* Place en cache un rendu destiné à l'aperçu graphique rapide. */ typedef void (* cache_glance_fc) (GtkViewPanel *, cairo_t *, const GtkAllocation *, double); @@ -87,6 +90,7 @@ struct _GtkViewPanelClass compute_requested_size compute_size; /* Calcul de la taille requise */ compute_scroll_inc compute_inc; /* Calcul des bonds */ get_addr_coordinates_fc get_coordinates;/* Conversion adresse <-> pos. */ + get_view_position_fc get_position; /* Indications sur la position */ }; diff --git a/src/gtkext/gtkviewpanel.c b/src/gtkext/gtkviewpanel.c index 40ae038..d434f1e 100644 --- a/src/gtkext/gtkviewpanel.c +++ b/src/gtkext/gtkviewpanel.c @@ -822,6 +822,43 @@ void gtk_view_panel_scroll_to_address(GtkViewPanel *panel, const vmpa2t *addr, S /****************************************************************************** * * +* Paramètres : panel = composant GTK à consulter. * +* line = ligne de tampon où se trouve le curseur. [OUT] * +* segment = eventuel segment de ligne actif. [OUT] * +* * +* Description : Fournit des éléments liés à la position courante dans la vue.* +* * +* Retour : Bilan de l'opération. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool gtk_view_panel_get_position(const GtkViewPanel *panel, GBufferLine **line, GBufferSegment **segment) +{ + bool result; /* Bilan de l'opération */ + + if (GTK_VIEW_PANEL_GET_CLASS(panel)->get_position == NULL) + return false; + + result = GTK_VIEW_PANEL_GET_CLASS(panel)->get_position(panel, line, segment); + + if (result) + { + g_object_ref(G_OBJECT(*line)); + + if (segment != NULL && *segment != NULL) + g_object_ref(G_OBJECT(*segment)); + + } + + return result; + +} + + +/****************************************************************************** +* * * Paramètres : panel = composant GTK à manipuler. * * cairo = assistant pour la création de rendus. * * area = taille de la surface réduite à disposition. * diff --git a/src/gtkext/gtkviewpanel.h b/src/gtkext/gtkviewpanel.h index c733314..080ad97 100644 --- a/src/gtkext/gtkviewpanel.h +++ b/src/gtkext/gtkviewpanel.h @@ -84,6 +84,9 @@ typedef enum _ScrollPositionTweak /* S'assure qu'une adresse donnée est visible à l'écran. */ void gtk_view_panel_scroll_to_address(GtkViewPanel *, const vmpa2t *, ScrollPositionTweak); +/* Fournit des éléments liés à la position courante dans la vue. */ +bool gtk_view_panel_get_position(const GtkViewPanel *, GBufferLine **, GBufferSegment **); + /* Place en cache un rendu destiné à l'aperçu graphique rapide. */ void gtk_view_panel_cache_glance(GtkViewPanel *, cairo_t *, const GtkAllocation *, double); |