Hi Ken,

The cursor value which your code is calculating from insert mark is getting
updated in button-release-event.  So the syntax tokens can be identified in
button-release-event callback.

You can even try using below method to find the cursor position in
button-press-event itself.
1. Convert the x,y coordinates received in the button-press-event to buffer
coordindates.
2. Calculate the GtkTextIter from the buffer coordinates.

eg :
/* Button press callback */
{
    gtk_text_view_window_to_buffer_coords(text_view,
    gtk_text_view_get_window_type (GTK_TEXT_VIEW(text_view),
event->window),event->x, event->y, &x, &y);
    gtk_text_view_get_iter_at_location (GTK_TEXT_VIEW (text_view), &curr, x,
y);

    /* Identify if curr iter is associated with syntax token tag array */
    ...
    ...
}

regards ,
Sanny


On Sun, Feb 28, 2010 at 5:23 PM, Ken Resander <[email protected]> wrote:

>  I am trying to do a bit of syntax highlighting. I am using
> gtk_text_buffer_create_tag and gtk_text_buffer_insert_with_tags to
> syntax-highlight the intial text (from file). That works fine.
>
> The program needs to identify existing syntax tokens in order to do
> appropriate syntax checking should the user decide to go back and amend them
> and I am having problems with this.
>
>
> Find a token-tag from current position:
> [code]
> static int findtagfromcursor ( GtkTextBuffer * buf )
>    {
>    GtkTextMark * mark = gtk_text_buffer_get_insert (buf);
>    GtkTextIter curiter ;
>    gtk_text_buffer_get_iter_at_mark (buf, &curiter, mark);
>    int k = 0 ;
>    while ( k < NUMTOKENS )
>       {
>       if ( gtk_text_iter_has_tag ( &curiter , tags [ k ] ) )
>          {
>          return k ;
>          }
>       k++ ;
>       }
>    return -1 ;
>    }
> [/code]
>
> The tags array is set by calls to gtk_text_buffer_create_tag when the text
> is read in.
>
> Initialisation:
> [code]
>    GtkWidget * e = gtk_text_view_new ( ) ;
>    GtkTextBuffer * buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (e));
>    gtk_text_view_set_editable ( (GtkTextView *)e , true ) ;
>    g_signal_connect_after ( G_OBJECT (e) , "button-press-event" ,
>                       G_CALLBACK (buttonpresscb) , buf ) ;
> [/code]
>
> Skeleton callback:
> [code]
> static gboolean buttonpresscb ( GtkWidget * w, GdkEventButton *event, char
> * data )
>    {
>    GtkTextBuffer * buf = (GtkTextBuffer *)data ;
>    int tokenix = findtagfromcursor ( buf ) ;
>    if ( tokenix != -1 )
>       {
>       printf ( "MTOKEN %s(%d): \n"  tokenlkup [ tokenix ] , tokenix  ) ;
>       }
>    else
>       {
>       printf ( "MTOKEN %d: \n" , tokenix ) ;
>       }
>    return false;
>    }
> [/code]
>
> Textview text:
>  text text ... TOKEN2TEXT text text... TOKEN0TEXT text text ... TOKEN1TEXT
>
> 'text text...' is unadorned text.
> TOKEN0TEXT, TOKEN1TEXT, TOKEN2TEXT ... are categories of text associated
> with different visual attributes. The program identifies these with numbers
> 0,1,2 internally. When the user clicks on a token the program needs to
> identify the token.
>
> When I click TOKEN2TEXT the callback reports no-token (-1). Then when I
> click TOKEN0TEXT it reports the TOKEN2TEXT (2) and when I click TOKEN1TEXT
> it reports TOKEN0TEXT (0) and so on.
>
> I thought this is because buttonpresscb is called before the text handler
> that changes the current text position to the mouse-click position, so I
> changed the connect call to g_signal_connect_after ( G_OBJECT (e) , "but...
> ).
>
> That did not work. I received no buttonpress events at all.
>
> Why? I am totally stuck, so would be most grateful for advice.
>
>
> ------------------------------
>  New Email addresses available on Yahoo!
> <http://sg.rd.yahoo.com/aa/mail/domainchoice/mail/signature/*http://mail.promotions.yahoo.com/newdomains/aa/>
> Get the Email name you've always wanted on the new @ymail and @rocketmail.
> Hurry before someone else does!
>
> _______________________________________________
> gtk-list mailing list
> [email protected]
> http://mail.gnome.org/mailman/listinfo/gtk-list
>
>
_______________________________________________
gtk-list mailing list
[email protected]
http://mail.gnome.org/mailman/listinfo/gtk-list

Reply via email to