Re: How to bring up tooltip text for certain words in a GTK textview?



With the callback below the tooltip removes itself when the mouse leaves a word and pops up when I move to a different word (what I wanted) . It didn't with the previous bare-bone version.
Any idea why?

However, the callback is still called when the mouse moves. In this version
tracing also goes to the window title bar.

static gboolean querytooltipcb (GtkWidget * w,
                                gint x,  gint y,
                                gboolean    keyboard_mode,
                                GtkTooltip *tooltip,
                                gpointer data )
   {
  printf ( "querytooltip(%d): x=%d y=%d kbm=%d  tip=%d\n" ,
           counter , x , y , keyboard_mode ? 1 : 0, (int)tooltip ) ;
   char text [ 2000 ] ;
   int x1 ;
   int y1 ;
   GtkTextIter iter ;
   gtk_text_view_window_to_buffer_coords((GtkTextView *)w, GTK_TEXT_WINDOW_WIDGET,
                                         x , y , &x1 , &y1 );
   gtk_text_view_get_iter_at_location ( (GtkTextView *)w , &iter , x1 , y1 ) ;
   GtkTextIter startiter = iter ;
   GtkTextIter enditer = iter ;
   if ( gtk_text_iter_starts_word ( &iter ) )
      {
      gtk_text_iter_forward_word_end ( &enditer ) ;
      }
   else if ( gtk_text_iter_inside_word ( &iter ) )
      {
      gtk_text_iter_forward_word_end ( &enditer ) ;
      gtk_text_iter_backward_word_start ( &startiter ) ;
      }
   else if ( gtk_text_iter_ends_word ( &iter ) )
      {
      gtk_text_iter_backward_word_start ( &startiter ) ;
      }
   else
      {
      sprintf ( text , "Not in word, Hi #%d (%d,%d)\n" ,
                counter , x , y ) ;
      gtk_window_set_title (GTK_WINDOW (window), text );
      counter++;
      return false ;
      }
   GtkTextBuffer * buf = (GtkTextBuffer *)data ;
   TCHAR * word = gtk_text_buffer_get_text ( buf , &startiter , &enditer ,
                                             false ) ;
   gtk_tooltip_set_text ( tooltip, word );
   sprintf ( text , "Word=%s Hello #%d (%d,%d)\n" ,
             word , counter , x , y ) ;
   gtk_window_set_title (GTK_WINDOW (window), text );
  counter++;
   return TRUE ;
   }

Ken


--- On Thu, 20/5/10, Tadej Borovšak <tadeboro gmail com> wrote:

From: Tadej Borovšak <tadeboro gmail com>
Subject: Re: How to bring up tooltip text for certain words in a GTK textview?
To: "richard boaz" <ivor boaz gmail com>
Cc: "Ken Resander" <kresander yahoo com>, gtk-list gnome org
Date: Thursday, 20 May, 2010, 2:23 AM

Hi.

General flow is correct, but GTK+ does offer some functionality that
may come handy in your case. (I'm commenting in a rather strange
succession because Richard top-posted his reply).

> unless gtk is now providing direct access to tooltip style pop-ups, you must create it yourself

GTK+ does offer access to tooltips in various ways: you can simply set
text or markup; you can insert custom content into tooltip; or you can
create your own window and present it as tooltip.

> meaning that you must create and manage your own borderless top-level window

This is not needed anymore.

> whose location must be explicitly specified to be placed onto the screen
> calculation of the window location coordinates must access the root-window where to the tooltip is to be located on top of, and
> since you don't have access to the size of the WM's borders on the root window, a little "guessing" as to the WM's size must be taken into account

If you connect to GtkWidget::query-tooltip signal, coordinates are
already provided, so I think most of this stuff is not needed now.

>> A textview shows help text with many 'technical' words that users may not know or remember. I would like a tooltip text with a short explanation to pop up when a user hovers the cursor over a technical phrase. There is a lookup table from technical phrases to explanations. I am thinking about using the mouse move event to get x,y then getting the technical phrase from x,y, then looking up the explanation and outputting the tooltip text.

Don't use movement events to monitor your position. Simply set text
view's "has-tooltip" property to "TRUE" and connect handler to
"query-tooltip" signal. Use coordinates provided by callback to find
the word that cursor hovers over and then do the lookup. I think
things should be relatively simple.

Tadej


--
Tadej Borovšak
tadeboro.blogspot.com
tadeboro gmail com
tadej borovsak gmail com



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