Hi Sanny

Many thanks, I didn't know about the notify:: technique to find out about 
changes of properties. I have read the manual several times, but must have 
missed it. Is it there?

It returns a notification, but it is lagging one behind in the same way as 
button-press and key-press. I also tried using g_signal_connect_after for mouse 
as well as keyboard, but the result was the same.

I tried it with event-after too filtering on GDK_PROPERTY_NOTIFY, but did not 
get it.

Regards
Ken



--- On Mon, 1/3/10, Sanny Chawla <sanny.cha...@gmail.com> wrote:

From: Sanny Chawla <sanny.cha...@gmail.com>
Subject: Re: Problem identifying GtkTextTags for syntax highlighting
To: "Ken Resander" <kresan...@yahoo.com>
Cc: gtk-list@gnome.org
Date: Monday, 1 March, 2010, 6:41 PM

Hi Ken, 

I am not sure if event-after would be a clean approach. 

However , following way for getting notified for any event which results in 
cursor-position change for text buffer will be useful. This will be called only 
if the cursor-position property is updated. 



g_signal_connect (buffer, "notify::cursor-position",
                  G_CALLBACK (gtk_text_view_notify_cursor_position),
                  view);

/*callback method*/
void
gtk_text_view_notify_cursor_position(GtkTextBuffer *buffer, GParamSpec 
*pspec,gpointer user_data)


{
 /*calculate cursor position using insert mark*/
 ....
}

regards ,
Sanny 



On Mon, Mar 1, 2010 at 2:33 PM, Ken Resander <kresan...@yahoo.com> wrote:




Hi Sanny,

Many thanks!

Both your suggestions work fine for getting current cursor position by mouse 
clicks.

I am collecting the key values via key-press-event, but so does the text 
default handler, so the problem is still present for key navigation. However, I 
could make it work by using the key-release event instead. Lucky!


  
My fumbles also took me to the mark-set signal of GtkTextBuffer. This signal is 
emitted when text marks change. It works for both mouse and keyboard. However, 
a single mouse click produces four events, for example the following when I 
click  keyword 'while': 



findtag ret 28 iter 153571352 mark insert
markset MTOKEN Keyword(4)
findtag ret 29 iter 153572264 mark selection_bound
markset MTOKEN Keyword(4)
findtag ret 30 iter 153580256 mark (null)
markset MTOKEN Keyword(4)


findtag
 ret 31 iter 153580720 mark (null)
markset MTOKEN Keyword(4)

The first insert mark is the one I want so I can filter out the others. The 
last two are unnamed and I don't know what they are.

However, when I drag the mouse from letter h to letter l in the 'while' keyword 
I get the following avalanche of about 70 events:



findtag ret 32 iter 153571408 mark insert
markset MTOKEN Keyword(4)
findtag ret 33 iter 153571352 mark selection_bound
markset MTOKEN Keyword(4)
findtag ret 34 iter 153576792 mark (null)
markset MTOKEN Keyword(4)


findtag ret 35 iter 152410200 mark (null)
markset MTOKEN Keyword(4)
findtag ret 36 iter 153571464 mark insert
markset MTOKEN Keyword(4)
findtag ret 37 iter 153571872 mark (null)
markset MTOKEN Keyword(4)


findtag ret 38 iter 153572688 mark (null)
markset MTOKEN Keyword(4)
findtag ret 39 iter 153577664 mark (null)
markset MTOKEN Keyword(4)
findtag ret 40 iter
 153573152 mark (null)
markset MTOKEN Keyword(4)
findtag ret 41 iter 153578128 mark insert
markset MTOKEN Keyword(4)
findtag ret 42 iter 153576976 mark (null)
markset MTOKEN Keyword(4)
findtag ret 43 iter 153580552 mark insert


markset MTOKEN Keyword(4)
findtag ret 44 iter 152410624 mark (null)
.....

and when I resize the screen I get hundreds of events for a 10-line test text. 
For a normal program there would many thousands of these unwanted events. The 
mark-set would work, but I feel uneasy about it.



I also discovered and tried the GtkWidget signal event-efter. It worked.

Initialise:
[code]
   g_signal_connect ( G_OBJECT (e) , "event-after" ,
                      G_CALLBACK (eventaftercb) , buf ) ;


[/code]

with callback:
[code]
static gboolean eventaftercb (GtkWidget
 * w, GdkEvent * ev, gpointer user_data )
   {
   if ( (ev->type == GDK_BUTTON_PRESS) )
      {
      printf ( "%d BTNpress\n" , (int)ev->type ) ;
      return buttonpresscb (  w, (GdkEventButton *)ev , (char *)user_data ) ;


      }
   else if ( (ev->type == GDK_KEY_PRESS) )
      {
      printf ( "%d keyPress\n" , (int)ev->type ) ;
      return keypresscb (  w, (GdkEventKey *)ev , (char *)user_data ) ;
      }


   return true ;
   }
[/code]

Need to test all this a bit more, but as of now, I prefer the event-after 
method.

Would be grateful for comments. 

Ken




--- On Mon, 1/3/10, Sanny Chawla
 <sanny.cha...@gmail.com> wrote:

From: Sanny Chawla <sanny.cha...@gmail.com>


Subject: Re: Problem identifying GtkTextTags for syntax highlighting
To: "Ken Resander" <kresan...@yahoo.com>
Cc: gtk-list@gnome.org


Date: Monday, 1 March, 2010, 2:22 AM

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 <kresan...@yahoo.com> 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!  

Get the Email name you've always wanted on the new @ymail and @rocketmail.

Hurry before someone else does!
_______________________________________________

gtk-list mailing list

gtk-list@gnome.org

http://mail.gnome.org/mailman/listinfo/gtk-list






        Get your new Email address!  

Grab the Email name you've always wanted before someone else does!
_______________________________________________

gtk-list mailing list

gtk-list@gnome.org

http://mail.gnome.org/mailman/listinfo/gtk-list







      Get your preferred Email name!
Now you can @ymail.com and @rocketmail.com. 
http://mail.promotions.yahoo.com/newdomains/aa/
_______________________________________________
gtk-list mailing list
gtk-list@gnome.org
http://mail.gnome.org/mailman/listinfo/gtk-list

Reply via email to