"mark_set" callback fires 3 or 4 times when using arrow keys/mouse in textview?



All,

I am using using the 'mark_set' signal to update the row:col values within my GtkTextBuffer. I have a simple setup with the textview inside a scrolled window inside a window:

  window
    scrolled window
      textview

I use a structure to hold the various persistent values for my application, for example:

    typedef struct {
        GtkWidget *window;
        GtkWidget *view;
        GtkTextBuffer *buffer;
        GtkWidget *entry;
        GtkTextMark *cursor;
        gint line;    /* line number   */
        gint col;     /* column number */
        gint indent;
        gint indentlevel;
        gint tabsz;
        gint winwidth;
        gint winheight;
        gboolean overwrite;
    } context;

All I am trying to do is update the current 'line' and 'col' values in the instance of the struct used with my application ('app'). Within my main window create function I initialize the values for 'context app;', create the window, scrolled window and textview, and connect the 'mark_set' signal to my 'on_mark_set' callback, passing the instance of the struct as the data to the callback:

    g_signal_connect (app->buffer, "mark_set",
                      G_CALLBACK (on_mark_set), app);

  The 'on_mark_set' callback (with g_print for debug purposes):

    void on_mark_set (GtkTextBuffer *buffer, context *app)
    {
        GtkTextIter iter;

        app->cursor = gtk_text_buffer_get_insert (buffer);

        gtk_text_buffer_get_iter_at_mark (buffer, &iter, app->cursor);

        app->line = gtk_text_iter_get_line (&iter);
        app->col = gtk_text_iter_get_line_offset (&iter);

        g_print (" line: %3d col: %d\n", app->line + 1, app->col + 1);
    }

The values for 'app->line' and 'app->col' are correctly set (only once) following each keypress where input is being provided to the buffer. e.g. inputting 'abc' into the textview results in:

$ ./bin/text_view_fn
 line:   1 col: 2
 line:   1 col: 3
 line:   1 col: 4

However, when I use the arrow keys to move the input cursor or use the mouse to reposition it, the callback tripple-fires or quadruple-fires. e.g. pressing the left-arrow to backup one position results in the following:

 line:   1 col: 3
 line:   1 col: 3
 line:   1 col: 3

or repositioning by clicking the mouse at the beginning results in a quadruple-fire of the callback:

 line:   1 col: 1
 line:   1 col: 1
 line:   1 col: 1
 line:   1 col: 1

How can I limit the the execution of the 'on_mark_set' callback to a single call regardless of whether there is data being entered or if cursor is being moved with the arrow-keys or mouse? Any help will be greatly appreciated.


--
David C. Rankin, J.D.,P.E.


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]