diff options
Diffstat (limited to 'src/gtkext')
-rw-r--r-- | src/gtkext/gtkblockview.c | 36 | ||||
-rw-r--r-- | src/gtkext/gtkbufferview-int.h | 6 | ||||
-rw-r--r-- | src/gtkext/gtkbufferview.c | 81 |
3 files changed, 114 insertions, 9 deletions
diff --git a/src/gtkext/gtkblockview.c b/src/gtkext/gtkblockview.c index 2584405..1c7ba43 100644 --- a/src/gtkext/gtkblockview.c +++ b/src/gtkext/gtkblockview.c @@ -52,6 +52,9 @@ static void gtk_block_view_class_init(GtkBlockViewClass *); /* Procède à l'initialisation de l'afficheur de bloc assembleur. */ static void gtk_block_view_init(GtkBlockView *); +/* Réagit à un déplacement de curseur. */ +static bool gtk_block_view_notify_caret_relocation(GtkBlockView *, const GdkRectangle *, const vmpa2t *); + /* Assure la gestion des clics de souris sur le composant. */ static gboolean gtk_block_view_button_press_event(GtkBlockView *, GdkEventButton *, gpointer); @@ -87,11 +90,15 @@ G_DEFINE_TYPE(GtkBlockView, gtk_block_view, GTK_TYPE_BUFFER_VIEW) static void gtk_block_view_class_init(GtkBlockViewClass *class) { GtkViewPanelClass *panel_class; /* Classe parente */ + GtkBufferViewClass *buffer_class; /* Classe supérieure */ panel_class = GTK_VIEW_PANEL_CLASS(class); + buffer_class = GTK_BUFFER_VIEW_CLASS(class); panel_class->attach = (attach_binary_fc)gtk_block_view_attach_binary; + buffer_class->notify_caret = (notify_caret_relocation_fc)gtk_block_view_notify_caret_relocation; + } @@ -109,8 +116,35 @@ static void gtk_block_view_class_init(GtkBlockViewClass *class) static void gtk_block_view_init(GtkBlockView *view) { + + + /* g_signal_connect(G_OBJECT(view), "button_press_event", G_CALLBACK(gtk_block_view_button_press_event), NULL); + */ + + +} + + +/****************************************************************************** +* * +* Paramètres : view = composant GTK à manipuler. * +* area = emplacement pour le dessin d'un curseur. * +* addr = position dans la mémoire représentée du curseur. * +* * +* Description : Réagit à un déplacement de curseur. * +* * +* Retour : true si un changement a été opéré. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static bool gtk_block_view_notify_caret_relocation(GtkBlockView *view, const GdkRectangle *area, const vmpa2t *addr) +{ + return g_buffer_view_highlight_segments(GTK_BUFFER_VIEW(view)->buffer_view, area->x, area->y, + GTK_VIEW_PANEL(view)->display); } @@ -174,7 +208,7 @@ static gboolean gtk_block_view_button_press_event(GtkBlockView *view, GdkEventBu gtk_buffer_view_compute_real_coord(bview, &real_x, &real_y); - g_buffer_view_highlight_segments(gtk_buffer_view_get_buffer(bview), real_x, real_y); + g_buffer_view_highlight_segments(gtk_buffer_view_get_buffer(bview), real_x, real_y, NULL); diff --git a/src/gtkext/gtkbufferview-int.h b/src/gtkext/gtkbufferview-int.h index a6d937b..e8e11a0 100644 --- a/src/gtkext/gtkbufferview-int.h +++ b/src/gtkext/gtkbufferview-int.h @@ -32,6 +32,10 @@ +/* Réagit à un déplacement de curseur. */ +typedef bool (* notify_caret_relocation_fc) (GtkBufferView *, const GdkRectangle *, const vmpa2t *); + + /* Composant d'affichage de tampon de lignes (instance) */ struct _GtkBufferView { @@ -56,6 +60,8 @@ struct _GtkBufferViewClass { GtkViewPanelClass parent; /* A laisser en premier */ + notify_caret_relocation_fc notify_caret;/* Accompagne un déplacement */ + /* Signaux */ void (* caret_moved) (GtkBufferView *, const vmpa2t *); diff --git a/src/gtkext/gtkbufferview.c b/src/gtkext/gtkbufferview.c index 1c2c7a9..1a1f6f1 100644 --- a/src/gtkext/gtkbufferview.c +++ b/src/gtkext/gtkbufferview.c @@ -41,6 +41,12 @@ static void gtk_buffer_view_class_init(GtkBufferViewClass *); /* Procède à l'initialisation de l'afficheur de tampons. */ static void gtk_buffer_view_init(GtkBufferView *); +/* Supprime toutes les références externes. */ +static void gtk_buffer_view_dispose(GtkBufferView *); + +/* Procède à la libération totale de la mémoire. */ +static void gtk_buffer_view_finalize(GtkBufferView *); + /* Intègre le focus dans le rendu du composant. */ static gboolean gtk_buffer_view_focus(GtkWidget *, GtkDirectionType); @@ -110,12 +116,17 @@ G_DEFINE_TYPE(GtkBufferView, gtk_buffer_view, GTK_TYPE_VIEW_PANEL) static void gtk_buffer_view_class_init(GtkBufferViewClass *class) { + GObjectClass *object; /* Autre version de la classe */ GtkWidgetClass *widget_class; /* Classe version Widget */ GtkViewPanelClass *panel_class; /* Classe parente */ + object = G_OBJECT_CLASS(class); widget_class = GTK_WIDGET_CLASS(class); panel_class = GTK_VIEW_PANEL_CLASS(class); + object->dispose = (GObjectFinalizeFunc/* ! */)gtk_buffer_view_dispose; + object->finalize = (GObjectFinalizeFunc)gtk_buffer_view_finalize; + widget_class->focus = gtk_buffer_view_focus; widget_class->button_press_event = gtk_buffer_view_button_press; widget_class->draw = gtk_buffer_view_draw; @@ -163,6 +174,44 @@ static void gtk_buffer_view_init(GtkBufferView *view) /****************************************************************************** * * +* Paramètres : view = instance d'objet GLib à traiter. * +* * +* Description : Supprime toutes les références externes. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void gtk_buffer_view_dispose(GtkBufferView *view) +{ + G_OBJECT_CLASS(gtk_buffer_view_parent_class)->dispose(G_OBJECT(view)); + +} + + +/****************************************************************************** +* * +* Paramètres : view = instance d'objet GLib à traiter. * +* * +* Description : Procède à la libération totale de la mémoire. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void gtk_buffer_view_finalize(GtkBufferView *view) +{ + G_OBJECT_CLASS(gtk_buffer_view_parent_class)->finalize(G_OBJECT(view)); + +} + + +/****************************************************************************** +* * * Paramètres : widget = composant GTK visé par l'opération. * * dir = sens de l'opération : perte ou gain de focus. * * * @@ -826,21 +875,37 @@ void gtk_buffer_view_compute_relative_coords(GtkBufferView *view, gint *x, gint static void gtk_buffer_view_relocate_caret(GtkBufferView *view, const GdkRectangle *area, const vmpa2t *addr) { + bool clear_old; /* Effacement chirurgical */ + GdkRectangle old_area; /* Mémorisation de l'ancien */ + bool need_redraw; /* Besoin de rafraîchissement ?*/ + if (view->caret_addr != NULL) { - gtk_buffer_view_compute_relative_coords(view, &view->caret.x, &view->caret.y); + clear_old = true; + old_area = view->caret; + } + else + clear_old = false; + + view->caret = *area; + view->caret_addr = addr; - /* - gtk_widget_queue_draw_area(GTK_WIDGET(view), view->caret.x, view->caret.y, - view->caret.width, view->caret.height); - */ + if (GTK_BUFFER_VIEW_GET_CLASS(view)->notify_caret != NULL) + need_redraw = GTK_BUFFER_VIEW_GET_CLASS(view)->notify_caret(view, area, addr); + else + need_redraw = false; + if (need_redraw) gtk_widget_queue_draw(GTK_WIDGET(view)); - } + else if (clear_old) + { + gtk_buffer_view_compute_relative_coords(view, &old_area.x, &old_area.y); - view->caret = *area; - view->caret_addr = addr; + gtk_widget_queue_draw_area(GTK_WIDGET(view), old_area.x, old_area.y, + old_area.width, old_area.height); + + } restart_caret_blinking(view); |