summaryrefslogtreecommitdiff
path: root/src/gtkext/gtkbufferview.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gtkext/gtkbufferview.c')
-rw-r--r--src/gtkext/gtkbufferview.c186
1 files changed, 124 insertions, 62 deletions
diff --git a/src/gtkext/gtkbufferview.c b/src/gtkext/gtkbufferview.c
index 1a1f6f1..54c521e 100644
--- a/src/gtkext/gtkbufferview.c
+++ b/src/gtkext/gtkbufferview.c
@@ -48,7 +48,7 @@ static void gtk_buffer_view_dispose(GtkBufferView *);
static void gtk_buffer_view_finalize(GtkBufferView *);
/* Intègre le focus dans le rendu du composant. */
-static gboolean gtk_buffer_view_focus(GtkWidget *, GtkDirectionType);
+static gboolean gtk_buffer_view_focus(GtkWidget *, GdkEventFocus *);
/* Assure la gestion des clics de souris sur le composant. */
static gboolean gtk_buffer_view_button_press(GtkWidget *, GdkEventButton *);
@@ -82,6 +82,9 @@ static void gtk_buffer_view_cache_glance(GtkBufferView *, cairo_t *, const GtkAl
/* ------------------------------ ANIMATION DU CURSEUR ------------------------------ */
+/* Déplace le curseur à un emplacement défini. */
+static bool _gtk_buffer_view_move_caret_to(GtkBufferView *, gint, gint);
+
/* Déplace le curseur en effaçant son éventuelle position. */
static void gtk_buffer_view_relocate_caret(GtkBufferView *, const GdkRectangle *, const vmpa2t *);
@@ -127,7 +130,8 @@ static void gtk_buffer_view_class_init(GtkBufferViewClass *class)
object->dispose = (GObjectFinalizeFunc/* ! */)gtk_buffer_view_dispose;
object->finalize = (GObjectFinalizeFunc)gtk_buffer_view_finalize;
- widget_class->focus = gtk_buffer_view_focus;
+ widget_class->focus_in_event = gtk_buffer_view_focus;
+ widget_class->focus_out_event = gtk_buffer_view_focus;
widget_class->button_press_event = gtk_buffer_view_button_press;
widget_class->draw = gtk_buffer_view_draw;
widget_class->key_press_event = gtk_buffer_view_key_press;
@@ -147,6 +151,14 @@ static void gtk_buffer_view_class_init(GtkBufferViewClass *class)
g_cclosure_user_marshal_VOID__UINT64,
G_TYPE_NONE, 1, G_TYPE_UINT64);
+ g_signal_new("reach-limit",
+ GTK_TYPE_BUFFER_VIEW,
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET(GtkBufferViewClass, reach_limit),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__ENUM,
+ G_TYPE_NONE, 1, GTK_TYPE_SCROLL_TYPE);
+
}
@@ -213,7 +225,7 @@ static void gtk_buffer_view_finalize(GtkBufferView *view)
/******************************************************************************
* *
* Paramètres : widget = composant GTK visé par l'opération. *
-* dir = sens de l'opération : perte ou gain de focus. *
+* event = informations liées à l'événement. *
* *
* Description : Intègre le focus dans le rendu du composant. *
* *
@@ -223,13 +235,13 @@ static void gtk_buffer_view_finalize(GtkBufferView *view)
* *
******************************************************************************/
-static gboolean gtk_buffer_view_focus(GtkWidget *widget, GtkDirectionType direction)
+static gboolean gtk_buffer_view_focus(GtkWidget *widget, GdkEventFocus *event)
{
GtkBufferView *view; /* Autre version du composant */
gboolean has_focus; /* Etat courant */
view = GTK_BUFFER_VIEW(widget);
- has_focus = gtk_widget_is_focus(widget);
+ has_focus = event->in;
if (has_focus)
restart_caret_blinking(view);
@@ -265,16 +277,11 @@ static gboolean gtk_buffer_view_focus(GtkWidget *widget, GtkDirectionType direct
static gboolean gtk_buffer_view_button_press(GtkWidget *widget, GdkEventButton *event)
{
GtkBufferView *view; /* Autre version du composant */
- GtkViewPanel *pview; /* Autre version du composant */
gint real_x; /* Abscisse absolue réelle */
gint real_y; /* Ordonnée absolue réelle */
- size_t index; /* Indice de ligne de tampon */
GBufferLine *line; /* Ligne à la position courante*/
- const vmpa2t *addr; /* Position mémoire associée */
- GdkRectangle new; /* Nouvel emplacement calculé */
view = GTK_BUFFER_VIEW(widget);
- pview = GTK_VIEW_PANEL(widget);
gtk_widget_grab_focus(widget);
@@ -287,32 +294,17 @@ static gboolean gtk_buffer_view_button_press(GtkWidget *widget, GdkEventButton *
real_x, real_y);
-
- line = g_buffer_view_find_line_at(view->buffer_view, real_y, &index);
- if (line == NULL) return FALSE;
-
-
-
- printf(" [init ] %p - line = %p (y=%d)\n", view->buffer_view, line, real_y);
-
-
-
if (real_x < view->left_margin)
{
+ line = g_buffer_view_find_line_at(view->buffer_view, real_y, NULL);
+ if (line == NULL) return FALSE;
-
-
+ /* TODO */
printf("Border Line :: %p\n", line);
-
}
else
- {
- //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);
- addr = g_buffer_view_compute_caret_full(view->buffer_view, line, index, real_x, pview->display, &new);
- gtk_buffer_view_relocate_caret(view, &new, addr);
- }
+ _gtk_buffer_view_move_caret_to(view, real_x, real_y);
return FALSE;
@@ -472,77 +464,67 @@ static gboolean gtk_buffer_view_draw(GtkWidget *widget, cairo_t *cr)
static gboolean gtk_buffer_view_key_press(GtkWidget *widget, GdkEventKey *event)
{
gboolean result; /* Suites à renvoyer */
-
GtkBufferView *view; /* Autre version du composant */
GtkViewPanel *pview; /* Autre version du composant */
-
-
bool ctrl; /* Statut de la touche Contrôle*/
-
-
- GdkRectangle area;
-
- const vmpa2t *addr;
-
+ GdkScrollDirection dir; /* Direction du déplacement */
+ GdkRectangle area; /* Emplacement de curseur */
+ const vmpa2t *addr; /* Adresse du nouveau curseur */
result = FALSE;
-
-
view = GTK_BUFFER_VIEW(widget);
pview = GTK_VIEW_PANEL(widget);
-
- area = view->caret;
-
-
- ctrl = (event->state & GDK_CONTROL_MASK);
-
switch (event->keyval)
{
case GDK_KEY_Left:
- printf("LEFT\n");
- addr = g_buffer_view_move_caret(view->buffer_view, &area, ctrl, GDK_SCROLL_LEFT, pview->display);
- gtk_buffer_view_relocate_caret(view, &area, view->caret_addr);
+ dir = GDK_SCROLL_LEFT;
result = TRUE;
break;
case GDK_KEY_Up:
- printf("UP\n");
- addr = g_buffer_view_move_caret(view->buffer_view, &area, ctrl, GDK_SCROLL_UP, pview->display);
- gtk_buffer_view_relocate_caret(view, &area, view->caret_addr);
+ dir = GDK_SCROLL_UP;
result = TRUE;
break;
case GDK_KEY_Right:
- printf("RIGHT\n");
- addr = g_buffer_view_move_caret(view->buffer_view, &area, ctrl, GDK_SCROLL_RIGHT, pview->display);
- gtk_buffer_view_relocate_caret(view, &area, view->caret_addr);
+ dir = GDK_SCROLL_RIGHT;
result = TRUE;
break;
case GDK_KEY_Down:
- printf("DOWN\n");
- addr = g_buffer_view_move_caret(view->buffer_view, &area, ctrl, GDK_SCROLL_DOWN, pview->display);
- gtk_buffer_view_relocate_caret(view, &area, view->caret_addr);
+ dir = GDK_SCROLL_DOWN;
result = TRUE;
break;
default:
- addr = NULL;
break;
}
+ if (result)
+ {
+ area = view->caret;
+ ctrl = (event->state & GDK_CONTROL_MASK);
+
+ addr = g_buffer_view_move_caret(view->buffer_view, &area, ctrl, dir, pview->display);
+
+ if (addr != NULL)
+ {
+ gtk_buffer_view_relocate_caret(view, &area, addr);
+ gtk_view_panel_scroll_to_address(pview, addr, SPT_RAW);
+ }
+ else
+ g_signal_emit_by_name(view, "reach-limit", dir);
- printf("ctrl ? %d -- keyval = %d -->> %d\n", ctrl, event->keyval, result);
- if (addr != NULL) gtk_view_panel_scroll_to_address(pview, addr, SPT_RAW);
+ //if (addr == NULL) return FALSE;
- printf("\n");
+ }
return result;
@@ -815,6 +797,8 @@ void gtk_buffer_view_attach_buffer(GtkBufferView *view, GBufferView *buffer)
GBufferView *gtk_buffer_view_get_buffer(const GtkBufferView *view)
{
+ /* TODO : ref... */
+
return view->buffer_view;
}
@@ -862,6 +846,84 @@ void gtk_buffer_view_compute_relative_coords(GtkBufferView *view, gint *x, gint
/******************************************************************************
* *
* Paramètres : view = composant GTK à manipuler. *
+* x = abscisse proposée pour le nouvel emplacement. *
+* y = ordonnée proposée pour le nouvel emplacement. *
+* *
+* Description : Déplace le curseur à un emplacement défini. *
+* *
+* Retour : true si un traitement a été effectué, false sinon. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static bool _gtk_buffer_view_move_caret_to(GtkBufferView *view, gint x, gint y)
+{
+ size_t index; /* Indice de ligne de tampon */
+ GBufferLine *line; /* Ligne à la position courante*/
+ GtkViewPanel *pview; /* Autre version du composant */
+ const vmpa2t *addr; /* Position mémoire associée */
+ GdkRectangle new; /* Nouvel emplacement calculé */
+
+ if (x < view->left_margin) return false;
+
+ line = g_buffer_view_find_line_at(view->buffer_view, y, &index);
+ if (line == NULL) return false;
+
+ pview = GTK_VIEW_PANEL(view);
+
+ addr = g_buffer_view_compute_caret_full(view->buffer_view, line, index, x, pview->display, &new);
+
+ if (addr != NULL)
+ gtk_buffer_view_relocate_caret(view, &new, addr);
+
+ return (addr != NULL);
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : view = composant GTK à manipuler. *
+* beginning = précise le coin où se retrouvera le curseur. *
+* same_x = tente de conserver une même abscisse ou NULL ? *
+* *
+* Description : Déplace le curseur à un emplacement en extrémité. *
+* *
+* Retour : true si un traitement a été effectué, false sinon. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+bool gtk_buffer_view_move_caret_to(GtkBufferView *view, bool beginning, gint *same_x)
+{
+ bool result; /* Bilan à remonter */
+ gint x; /* Abscisse d'emplacement */
+ gint y; /* Ordonnée d'emplacement */
+
+ if (beginning)
+ {
+ x = same_x != NULL ? *same_x : view->left_margin * 2;
+ y = 0;
+ }
+ else
+ {
+ if (same_x != NULL) x = *same_x;
+ gtk_buffer_view_compute_requested_size(view, same_x != NULL ? NULL : &x, &y);
+ y--;
+ }
+
+ result = _gtk_buffer_view_move_caret_to(view, x, y);
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* 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. *
* *