LINUX.ORG.RU

gtk: GtkTextTag и курсор


0

0

В GtkTextBuffer загружен некоторый текст. Часть помечена с помощью GtkTextTag. Надо чтобы при наведении курсора мыши на этот помеченный текст, курсор изменялся (так как это происходит в браузере).

У GtkTextTag есть сигнал - "event", но он работает только если щёлкнуть мышкой. Можно ли как-нибудь сделать чтобы этот сигнал посылался и при наведении курсора на текст? Или может ещё как-то можно это сделать, не через "event"?

Кто-нибудь такое делал?

anonymous

Вообще-то это баг в gtk, я думаю. Вот я написал следующий тест. Если я
 его запускаю под отладчиком, или активно двигаю мышкой, то Hello world появляется. Но мышкой нужно двигать очень активно. А просто одно
событие почему-то не ловится. 

А если нужно быстро сделать что-то, то в gtk-demo есть пример hypertext, там показано, как повесив обработчик на "motion-notify" у 
текста можно менять курсор при наведении на tag.

/* Text Widget/Hypertext
 *
 * Usually, tags modify the appearance of text in the view, e.g. making it 
 * bold or colored or underlined. But tags are not restricted to appearance. 
 * They can also affect the behavior of mouse and key presses, as this demo 
 * shows.
 */

#include <gtk/gtk.h>

gboolean    on_tag_event     (GtkTextTag *texttag,
                              GObject *arg1,
                              GdkEvent *event,
                              GtkTextIter *arg2,
                              gpointer user_data) 
{
  g_message ("Hello world");
}

static void
fill_buffer (GtkTextBuffer * buffer)
{
  GtkTextIter iter;
  GtkTextTag *tag = NULL;
  
  tag = gtk_text_buffer_create_tag (buffer, NULL,
                                    "foreground", "blue",
	                            "underline", PANGO_UNDERLINE_SINGLE,
                                    NULL);
  g_signal_connect (G_OBJECT(tag), "event", G_CALLBACK(on_tag_event), NULL);

  gtk_text_buffer_set_text (buffer, "", 0);
  gtk_text_buffer_get_iter_at_offset (buffer, &iter, 0);
  
  gtk_text_buffer_insert (buffer, &iter, "Some text to show that simple ",
                          -1);
			  
  gtk_text_buffer_insert_with_tags (buffer, &iter, "hypertext", -1, tag, NULL);
  
  gtk_text_buffer_insert (buffer, &iter, " can easily be realized with ", -1);

  gtk_text_buffer_insert_with_tags (buffer, &iter, "tags", -1, tag, NULL);

  gtk_text_buffer_insert (buffer, &iter, ".", -1);
}


int
main (int argc, char *argv[])
{
  GtkWidget *window;

  GtkWidget *view;
  GtkWidget *sw;
  GtkTextBuffer *buffer;

  gtk_init (&argc, &argv);

  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  gtk_window_set_default_size (GTK_WINDOW (window), 450, 450);

  g_signal_connect (window, "destroy",
                    G_CALLBACK (gtk_widget_destroyed), &window);

  gtk_window_set_title (GTK_WINDOW (window), "Hypertext");
  gtk_container_set_border_width (GTK_CONTAINER (window), 0);

  view = gtk_text_view_new ();
  gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (view), GTK_WRAP_WORD);

  buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));
  fill_buffer (buffer);

  sw = gtk_scrolled_window_new (NULL, NULL);
  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
                                  GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);

  gtk_container_add (GTK_CONTAINER (window), sw);
  gtk_container_add (GTK_CONTAINER (sw), view);

  gtk_widget_show_all (window);

  gtk_main ();
}

anonymous
()
Ответ на: комментарий от anonymous

Ну вобщем да, это что-то вроде бага в Gtk, связанного именно с обработкой событий motion-notify. Дело в том, что для того, чтобы получать события о перемещении мыши, нужно при установленном флаге GDK_POINTER_MOTION_HINT вызывать постоянно gdk_window_get_pointer. Флаг в TextView установлен, а вот функцию никто вызывать не собирается.

То есть нужно делать, как в примере в gtk-demo.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.