Re: Problem identifying GtkTextTags for syntax highlighting

2010-03-01 Thread Sanny Chawla
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  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 * wrote:
>
>
> From: Sanny Chawla 
> Subject: Re: Problem identifying GtkTextTags for syntax highlighting
> To: "Ken Resander" 
> 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 buffe

Re: Problem identifying GtkTextTags for syntax highlighting

2010-02-28 Thread Sanny Chawla
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  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
>
>
___
gtk-list mailing list
gtk-list@gnome.org
http://mail.gnome.org/mailman/listinfo/gtk-list


Re: Avoid automatic navigation between GtkEntry widgets with arrows

2008-04-16 Thread sanny chawla
Felipe Monteiro de Carvalho wrote:
> Should I implement both, or either one or the other?
>   
Both.
___
gtk-list mailing list
gtk-list@gnome.org
http://mail.gnome.org/mailman/listinfo/gtk-list


Re: Avoid automatic navigation between GtkEntry widgets with arrows

2008-04-16 Thread sanny chawla
Listen to key press events of GtkEntry and for Up/Down events shift the 
focus to implemented widget.
Don't propagate Up/Down key press events to GtkEntry.

cheers,
Sanny

Felipe Monteiro de Carvalho wrote:
> Hello,
>
> I have a number of GtkEntry widgets in my form, and if I press the up
> and down key it navigates between them, according to the Tab order.
> But, I would like to supress this, only allowing Tab to change the
> focus to other widgets, because I want to implement a completion
> feature, and I don't want to use GtkEntryCompletetion, but rather my
> own mechanism.
>
> Any ideas how to achieve that?
>
> thanks,
>   
___
gtk-list mailing list
gtk-list@gnome.org
http://mail.gnome.org/mailman/listinfo/gtk-list