From 9441aee9dfb31332ffbfa64204b5e4466249d563 Mon Sep 17 00:00:00 2001 From: Cyrille Bagard Date: Sat, 14 Jul 2018 15:15:59 +0200 Subject: Deleted a few more references to concrete locations in buffer displays. --- src/glibext/gbinarycursor.c | 27 ++++++++++++++++++++++ src/glibext/glinecursor-int.h | 4 ++++ src/glibext/glinecursor.c | 23 +++++++++++++++++++ src/glibext/glinecursor.h | 4 ++++ src/gtkext/gtkbufferdisplay-int.h | 3 ++- src/gtkext/gtkbufferdisplay.c | 48 +++++++++++++++++++-------------------- 6 files changed, 84 insertions(+), 25 deletions(-) diff --git a/src/glibext/gbinarycursor.c b/src/glibext/gbinarycursor.c index 470022c..c614058 100644 --- a/src/glibext/gbinarycursor.c +++ b/src/glibext/gbinarycursor.c @@ -60,6 +60,9 @@ static void g_binary_cursor_finalize(GBinaryCursor *); /* Compare deux suivis d'emplacements. */ static int g_binary_cursor_compare(const GBinaryCursor *, const GBinaryCursor *); +/* Détermine si un suivi d'emplacement est valide ou non. */ +static bool g_binary_cursor_is_valid(const GBinaryCursor *); + /* Détermine le type du gestionnaire de largeurs associées aux lignes. */ @@ -91,6 +94,7 @@ static void g_binary_cursor_class_init(GBinaryCursorClass *class) line = G_LINE_CURSOR_CLASS(class); line->compare = (compare_cursor_fc)g_binary_cursor_compare; + line->is_valid = (is_cursor_valid_fc)g_binary_cursor_is_valid; } @@ -201,6 +205,29 @@ static int g_binary_cursor_compare(const GBinaryCursor *cursor, const GBinaryCur /****************************************************************************** * * +* Paramètres : cursor = suivi d'emplacement à consulter. * +* * +* Description : Détermine si un suivi d'emplacement est valide ou non. * +* * +* Retour : Bilan de validité. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static bool g_binary_cursor_is_valid(const GBinaryCursor *cursor) +{ + bool result; /* Bilan à renvoyer */ + + result = !is_invalid_vmpa(&cursor->addr); + + return result; + +} + + +/****************************************************************************** +* * * Paramètres : cursor = suivi de positions à mettre à jour. * * addr = emplacement dans le binaire visé. * * * diff --git a/src/glibext/glinecursor-int.h b/src/glibext/glinecursor-int.h index 26e5143..2c56331 100644 --- a/src/glibext/glinecursor-int.h +++ b/src/glibext/glinecursor-int.h @@ -32,6 +32,9 @@ /* Compare deux suivis d'emplacements. */ typedef int (* compare_cursor_fc) (const GLineCursor *, const GLineCursor *); +/* Détermine si un suivi d'emplacement est valide ou non. */ +typedef bool (* is_cursor_valid_fc) (const GLineCursor *); + /* Suivi de positions dans un panneau de chargement (instance) */ struct _GLineCursor @@ -46,6 +49,7 @@ struct _GLineCursorClass GObjectClass parent; /* A laisser en premier */ compare_cursor_fc compare; /* Comparaison d'emplacements */ + is_cursor_valid_fc is_valid; /* Certificat de validité */ }; diff --git a/src/glibext/glinecursor.c b/src/glibext/glinecursor.c index 52cadea..b4f5811 100644 --- a/src/glibext/glinecursor.c +++ b/src/glibext/glinecursor.c @@ -153,3 +153,26 @@ int g_line_cursor_compare(const GLineCursor *cursor, const GLineCursor *other) return result; } + + +/****************************************************************************** +* * +* Paramètres : cursor = suivi d'emplacement à consulter. * +* * +* Description : Détermine si un suivi d'emplacement est valide ou non. * +* * +* Retour : Bilan de validité. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool g_line_cursor_is_valid(const GLineCursor *cursor) +{ + bool result; /* Bilan à renvoyer */ + + result = G_LINE_CURSOR_GET_CLASS(cursor)->is_valid(cursor); + + return result; + +} diff --git a/src/glibext/glinecursor.h b/src/glibext/glinecursor.h index 58bee9c..823adca 100644 --- a/src/glibext/glinecursor.h +++ b/src/glibext/glinecursor.h @@ -26,6 +26,7 @@ #include +#include @@ -50,6 +51,9 @@ GType g_line_cursor_get_type(void); /* Compare deux suivis d'emplacements. */ int g_line_cursor_compare(const GLineCursor *, const GLineCursor *); +/* Détermine si un suivi d'emplacement est valide ou non. */ +bool g_line_cursor_is_valid(const GLineCursor *); + #endif /* _GLIBEXT_LINECURSOR_H */ diff --git a/src/gtkext/gtkbufferdisplay-int.h b/src/gtkext/gtkbufferdisplay-int.h index 2d1dbe3..9a5980f 100644 --- a/src/gtkext/gtkbufferdisplay-int.h +++ b/src/gtkext/gtkbufferdisplay-int.h @@ -43,8 +43,9 @@ struct _GtkBufferDisplay GBufferView *view; /* Vue sur le contenu affiché */ - cairo_rectangle_int_t caret; /* Emplacement du curseur */ + cairo_rectangle_int_t caret; /* Emplacement du curseur #1 */ vmpa2t caret_addr; /* Position mémoire du curseur */ + GLineCursor *cursor; /* Emplacement du curseur #2 */ guint caret_timer; /* Identifiant du chronomètre */ bool show_caret; /* Bascule entre les affichages*/ diff --git a/src/gtkext/gtkbufferdisplay.c b/src/gtkext/gtkbufferdisplay.c index 49167e8..c09a1fe 100644 --- a/src/gtkext/gtkbufferdisplay.c +++ b/src/gtkext/gtkbufferdisplay.c @@ -92,7 +92,7 @@ static void gtk_buffer_display_cache_glance(GtkBufferDisplay *, cairo_t *, const static bool _gtk_buffer_display_move_caret_to(GtkBufferDisplay *, gint, gint); /* Déplace le curseur en effaçant son éventuelle position. */ -static void gtk_buffer_display_relocate_caret(GtkBufferDisplay *, const cairo_rectangle_int_t *, const vmpa2t *); +static void gtk_buffer_display_relocate_caret(GtkBufferDisplay *, const cairo_rectangle_int_t *, GLineCursor *); /* Assure le clignotement du curseur à l'emplacement courant. */ static gboolean gtk_buffer_display_refresh_caret(GtkBufferDisplay *); @@ -186,7 +186,7 @@ static void gtk_buffer_display_class_init(GtkBufferDisplayClass *class) static void gtk_buffer_display_init(GtkBufferDisplay *display) { - init_vmpa(&display->caret_addr, VMPA_NO_PHYSICAL, VMPA_NO_VIRTUAL); + display->cursor = NULL; } @@ -427,7 +427,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 || is_invalid_vmpa(&display->caret_addr)) + if (!sel_line || display->cursor == NULL || !g_line_cursor_is_valid(display->cursor)) selected = NULL; else { @@ -523,10 +523,10 @@ static gboolean gtk_buffer_display_key_press(GtkWidget *widget, GdkEventKey *eve { //////////////////////// g_binary_cursor_get_info(G_BINARY_CURSOR(cursor), &addr); - g_object_unref(G_OBJECT(cursor)); + //g_object_unref(G_OBJECT(cursor)); //////////////////////// - gtk_buffer_display_relocate_caret(display, &area, &addr); + gtk_buffer_display_relocate_caret(display, &area, cursor); _gtk_display_panel_scroll_to_address(panel, &addr, SPT_RAW, false); } else @@ -747,7 +747,7 @@ GObject *gtk_buffer_display_get_active_object(const GtkBufferDisplay *display) GObject *result; /* Trouvaille à retourner */ /* Si aucune position n'est définie... */ - if (is_invalid_vmpa(&display->caret_addr)) + if (display->cursor == NULL || !g_line_cursor_is_valid(display->cursor)) result = NULL; else @@ -862,22 +862,13 @@ static bool _gtk_buffer_display_move_caret_to(GtkBufferDisplay *display, gint x, GtkDisplayPanel *panel; /* Autre version du composant */ cairo_rectangle_int_t new; /* Nouvel emplacement calculé */ GLineCursor *cursor; /* Emplacement de curseur */ - vmpa2t addr; /* Position mémoire associée */ panel = GTK_DISPLAY_PANEL(display); result = g_buffer_view_compute_caret_full(display->view, x, y, panel->display_options, &new, &cursor); - //////////////////////// if (result) - { - g_binary_cursor_get_info(G_BINARY_CURSOR(cursor), &addr); - g_object_unref(G_OBJECT(cursor)); - } - //////////////////////// - - if (result) - gtk_buffer_display_relocate_caret(display, &new, &addr); + gtk_buffer_display_relocate_caret(display, &new, cursor); return result; @@ -941,7 +932,7 @@ bool gtk_buffer_display_move_caret_to(GtkBufferDisplay *display, bool beginning, * * * Paramètres : display = composant GTK à manipuler. * * area = emplacement pour le dessin d'un curseur. * -* addr = position dans la mémoire représentée du curseur. * +* cursor = emplacement représenté dans un tampon interne. * * * * Description : Déplace le curseur en effaçant son éventuelle position. * * * @@ -951,13 +942,13 @@ bool gtk_buffer_display_move_caret_to(GtkBufferDisplay *display, bool beginning, * * ******************************************************************************/ -static void gtk_buffer_display_relocate_caret(GtkBufferDisplay *display, const cairo_rectangle_int_t *area, const vmpa2t *addr) +static void gtk_buffer_display_relocate_caret(GtkBufferDisplay *display, const cairo_rectangle_int_t *area, GLineCursor *cursor) { bool clear_old; /* Effacement chirurgical */ cairo_rectangle_int_t old_area; /* Mémorisation de l'ancien */ bool need_redraw; /* Besoin de rafraîchissement ?*/ - if (!is_invalid_vmpa(&display->caret_addr)) + if (display->cursor != NULL && g_line_cursor_is_valid(display->cursor)) { clear_old = true; old_area = display->caret; @@ -965,15 +956,24 @@ static void gtk_buffer_display_relocate_caret(GtkBufferDisplay *display, const c else clear_old = false; + if (display->cursor != NULL) + g_object_unref(G_OBJECT(display->cursor)); + display->caret = *area; - copy_vmpa(&display->caret_addr, addr); + display->cursor = cursor; + + ///////////////// + if (cursor != NULL) + g_binary_cursor_get_info(G_BINARY_CURSOR(cursor), &display->caret_addr); + ///////////////// + if (GTK_BUFFER_DISPLAY_GET_CLASS(display)->notify_caret != NULL) need_redraw = GTK_BUFFER_DISPLAY_GET_CLASS(display)->notify_caret(display, area); else need_redraw = false; - if (!is_invalid_vmpa(&display->caret_addr)) + if (display->cursor != NULL && g_line_cursor_is_valid(display->cursor)) gtk_buffer_display_restart_caret_blinking(display); if (need_redraw) @@ -1002,7 +1002,7 @@ static gboolean gtk_buffer_display_refresh_caret(GtkBufferDisplay *display) /* Bascule l'affichage */ display->show_caret = !display->show_caret; - assert(!is_invalid_vmpa(&display->caret_addr)); + assert(display->cursor != NULL && g_line_cursor_is_valid(display->cursor)); if (!display->show_caret) gtk_buffer_display_queue_draw_caret(display, &display->caret); @@ -1038,7 +1038,7 @@ static void gtk_buffer_display_restart_caret_blinking(GtkBufferDisplay *display) display->caret_timer = 0; } - if (!is_invalid_vmpa(&display->caret_addr)) + if (display->cursor != NULL && g_line_cursor_is_valid(display->cursor)) { settings = gtk_settings_get_default(); @@ -1127,7 +1127,7 @@ static void gtk_buffer_display_draw_caret(GtkBufferDisplay *display, cairo_t *cr GtkWidget *widget; /* Autre version du composant */ GdkRGBA *color; /* Couleur du curseur */ - if (!is_invalid_vmpa(&display->caret_addr) && display->show_caret) + if (display->cursor != NULL && g_line_cursor_is_valid(display->cursor) && display->show_caret) { area = display->caret; gtk_display_panel_compute_relative_coords(GTK_DISPLAY_PANEL(display), &area.x, &area.y); -- cgit v0.11.2-87-g4458