diff options
Diffstat (limited to 'src/gtkext/gtkbufferview.c')
-rw-r--r-- | src/gtkext/gtkbufferview.c | 227 |
1 files changed, 64 insertions, 163 deletions
diff --git a/src/gtkext/gtkbufferview.c b/src/gtkext/gtkbufferview.c index 032fcf9..8e1a9c7 100644 --- a/src/gtkext/gtkbufferview.c +++ b/src/gtkext/gtkbufferview.c @@ -46,21 +46,15 @@ static gboolean gtk_buffer_view_focus(GtkWidget *, GtkDirectionType); /* Assure la gestion des clics de souris sur le composant. */ static gboolean gtk_buffer_view_button_press(GtkWidget *, GdkEventButton *); -/* Fournit la hauteur de composant requise pour un plein rendu. */ -static void gtk_buffer_view_get_preferred_height(GtkWidget *, gint *, gint *); - -/* Fournit la largeur de composant requise pour un plein rendu. */ -static void gtk_buffer_view_get_preferred_width(GtkWidget *, gint *, gint *); - -/* S'adapte à la surface concédée par le composant parent. */ -static void gtk_buffer_view_size_allocate(GtkWidget *, GtkAllocation *); - /* Met à jour l'affichage de la visualisation de code buffer. */ static gboolean gtk_buffer_view_draw(GtkWidget *, cairo_t *); /* Prend en compte une frappe de touche sur le composant. */ static gboolean gtk_buffer_view_key_press(GtkWidget *, GdkEventKey *); +/* Indique les dimensions de travail du composant d'affichage. */ +static void gtk_buffer_view_compute_requested_size(GtkBufferView *, gint *, gint *); + /* Indique la position d'affichage d'une adresse donnée. */ static bool gtk_buffer_view_get_address_coordinates(const GtkBufferView *, const vmpa2t *, gint *, gint *); @@ -104,17 +98,18 @@ G_DEFINE_TYPE(GtkBufferView, gtk_buffer_view, GTK_TYPE_VIEW_PANEL) static void gtk_buffer_view_class_init(GtkBufferViewClass *class) { GtkWidgetClass *widget_class; /* Classe version Widget */ + GtkViewPanelClass *panel_class; /* Classe parente */ widget_class = GTK_WIDGET_CLASS(class); + panel_class = GTK_VIEW_PANEL_CLASS(class); widget_class->focus = gtk_buffer_view_focus; widget_class->button_press_event = gtk_buffer_view_button_press; - widget_class->get_preferred_height = gtk_buffer_view_get_preferred_height; - widget_class->get_preferred_width = gtk_buffer_view_get_preferred_width; - widget_class->size_allocate = gtk_buffer_view_size_allocate; widget_class->draw = gtk_buffer_view_draw; widget_class->key_press_event = gtk_buffer_view_key_press; + panel_class->compute_size = (compute_requested_size)gtk_buffer_view_compute_requested_size; + g_signal_new("caret-moved", GTK_TYPE_BUFFER_VIEW, G_SIGNAL_RUN_LAST, @@ -325,145 +320,6 @@ void gtk_buffer_view_compute_real_coord(GtkBufferView *view, gint *x, gint *y) /****************************************************************************** * * -* Paramètres : widget = composant GTK à consulter. * -* minimal = taille minimale. [OUT] * -* natural = taille idéale. [OUT] * -* * -* Description : Fournit la hauteur de composant requise pour un plein rendu. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void gtk_buffer_view_get_preferred_height(GtkWidget *widget, gint *minimal, gint *natural) -{ - GtkBufferView *view; /* Autre version du composant */ - - view = GTK_BUFFER_VIEW(widget); - - if (view->buffer_view != NULL) - *minimal = g_buffer_view_get_height(view->buffer_view); - else - *minimal = 0; - - *natural = *minimal; - -} - - -/****************************************************************************** -* * -* Paramètres : widget = composant GTK à consulter. * -* minimal = taille minimale. [OUT] * -* natural = taille idéale. [OUT] * -* * -* Description : Fournit la largeur de composant requise pour un plein rendu. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void gtk_buffer_view_get_preferred_width(GtkWidget *widget, gint *minimal, gint *natural) -{ - GtkBufferView *view; /* Autre version du composant */ - - view = GTK_BUFFER_VIEW(widget); - - if (view->buffer_view != NULL) - *minimal = g_buffer_view_get_width(view->buffer_view, - *GTK_VIEW_PANEL(view)->display_phys, - *GTK_VIEW_PANEL(view)->display_addr, - *GTK_VIEW_PANEL(view)->display_code); - else - *minimal = 0; - - *natural = *minimal; - -} - - -/****************************************************************************** -* * -* Paramètres : view = composant GTK à mettre à jour. * -* allocation = étendue accordée à la vue. * -* * -* Description : S'adapte à la surface concédée par le composant parent. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void gtk_buffer_view_size_allocate(GtkWidget *widget, GtkAllocation *allocation) -{ - GtkViewPanel *panel; /* Autre version du composant */ - GtkBufferView *view; /* Encore une autre version */ - gint width; /* Largeur de l'objet actuelle */ - gint height; /* Hauteur de l'objet actuelle */ - GtkAllocation valloc; /* Surface utilisable */ - gboolean changed; /* Changement de valeur ? */ - - /* Mise à jour GTK */ - - gtk_widget_set_allocation(widget, allocation); - - if (gtk_widget_get_realized(widget)) - gdk_window_move_resize(gtk_widget_get_window(widget), - allocation->x, allocation->y, - allocation->width, allocation->height); - - panel = GTK_VIEW_PANEL(widget); - - if (panel->hadjustment == NULL || panel->vadjustment == NULL) - return; - - view = GTK_BUFFER_VIEW(widget); - - width = g_buffer_view_get_width(view->buffer_view, *panel->display_phys, *panel->display_addr, *panel->display_code); - height = g_buffer_view_get_height(view->buffer_view); - - gtk_view_panel_compute_allocation(panel, &valloc); - - /* Défilement horizontal */ - - gtk_adjustment_set_page_size(panel->hadjustment, valloc.width); - gtk_adjustment_set_step_increment(panel->hadjustment, valloc.width * 0.1); - gtk_adjustment_set_page_increment(panel->hadjustment, valloc.width * 0.9); - - gtk_adjustment_set_upper(panel->hadjustment, MAX(width, valloc.width)); - - gtk_view_panel_reclamp_adjustment(panel->hadjustment, &changed); - - gtk_adjustment_changed(panel->hadjustment); - - if (changed) - gtk_adjustment_value_changed(panel->hadjustment); - - /* Défilement vertical */ - - gtk_adjustment_set_page_size(panel->vadjustment, valloc.height); - gtk_adjustment_set_step_increment(panel->vadjustment, view->line_height); - gtk_adjustment_set_page_increment(panel->vadjustment, view->line_height * 10.0); - - gtk_adjustment_set_upper(panel->vadjustment, MAX(height, valloc.height)); - - gtk_view_panel_reclamp_adjustment(panel->vadjustment, &changed); - - gtk_adjustment_changed(panel->vadjustment); - - if (changed) - gtk_adjustment_value_changed(panel->vadjustment); - -} - - -/****************************************************************************** -* * * Paramètres : widget = composant GTK à redessiner. * * cr = contexte graphique associé à l'événement. * * * @@ -479,38 +335,38 @@ static gboolean gtk_buffer_view_draw(GtkWidget *widget, cairo_t *cr) { GtkBufferView *view; /* Autre version du composant */ GtkViewPanel *pview; /* Autre version du composant */ + GdkWindow *window; /* Fenêtre à redessiner */ cairo_region_t *region; /* Région visible à redessiner */ cairo_rectangle_int_t area; /* Surface correspondante */ + GtkStyleContext *context; /* Contexte du thème actuel */ gint fake_x; /* Abscisse virtuelle */ gint fake_y; /* Ordonnée virtuelle */ - GtkStyleContext *context; /* Contexte du thème actuel */ - GdkRGBA color; /* Couleur du curseur */ view = GTK_BUFFER_VIEW(widget); widget = GTK_WIDGET(view); pview = GTK_VIEW_PANEL(widget); - region = gdk_window_get_visible_region(gtk_widget_get_window(widget)); + window = gtk_widget_get_window(widget); + + cairo_save(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); - fake_x = 0; - fake_y = 0; - gtk_buffer_view_compute_fake_coord(view, &fake_x, &fake_y); - /* Dessin de la marge gauche */ context = gtk_widget_get_style_context(widget); gtk_style_context_save(context); + gtk_style_context_add_class(context, GTK_STYLE_CLASS_TROUGH); - gtk_style_context_get_color(context, GTK_STATE_FLAG_BACKDROP | GTK_STATE_FLAG_DIR_LTR, &color); - gtk_style_context_restore(context); - cairo_set_source_rgb(cr, color.red, color.green, color.blue); + gtk_render_background (context, cr, 0, area.y, view->left_margin, 300000); + gtk_render_frame (context, cr, 0, area.y - 10, view->left_margin, area.height + 20); - cairo_rectangle(cr, fake_x, area.y, view->left_margin, area.y + area.height); - cairo_fill(cr); + gtk_style_context_restore(context); /* Eventuelle bordure globale */ @@ -519,9 +375,18 @@ static gboolean gtk_buffer_view_draw(GtkWidget *widget, cairo_t *cr) /* Impression du désassemblage */ if (view->buffer_view != NULL) + { + fake_x = 0; + fake_y = 0; + gtk_buffer_view_compute_fake_coord(view, &fake_x, &fake_y); + g_buffer_view_draw(view->buffer_view, cr, fake_x, fake_y, &area, *pview->display_phys, *pview->display_addr, *pview->display_code); + } + + cairo_restore(cr); + return TRUE; } @@ -574,6 +439,42 @@ static gboolean gtk_buffer_view_key_press(GtkWidget *widget, GdkEventKey *event) } + + + +/****************************************************************************** +* * +* Paramètres : view = composant GTK à consulter. * +* width = largeur requise à renseigner ou NULL. [OUT] * +* height = hauteur requise à renseigner ou NULL. [OUT] * +* * +* Description : Indique les dimensions de travail du composant d'affichage. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void gtk_buffer_view_compute_requested_size(GtkBufferView *view, gint *width, gint *height) +{ + if (width != NULL && view->buffer_view != NULL) + *width = g_buffer_view_get_width(view->buffer_view, + *GTK_VIEW_PANEL(view)->display_phys, + *GTK_VIEW_PANEL(view)->display_addr, + *GTK_VIEW_PANEL(view)->display_code); + + if (height != NULL && view->buffer_view != NULL) + *height = g_buffer_view_get_height(view->buffer_view); + +} + + + + + + + /****************************************************************************** * * * Paramètres : view = composant GTK à consulter. * |