static gboolean chat_text_view_event_cb (EmpathyChatTextView *view, GdkEventMotion *event, GtkTextTag *tag) { static GdkCursor *hand = NULL; static GdkCursor *beam = NULL; GtkTextWindowType type; GtkTextIter iter; GdkWindow *win; gint x, y, buf_x, buf_y; type = gtk_text_view_get_window_type (GTK_TEXT_VIEW (view), event->window); if (type != GTK_TEXT_WINDOW_TEXT) { return FALSE; } /* Get where the pointer really is. */ win = gtk_text_view_get_window (GTK_TEXT_VIEW (view), type); if (!win) { return FALSE; } gdk_window_get_pointer (win, &x, &y, NULL); /* Get the iter where the cursor is at */ gtk_text_view_window_to_buffer_coords (GTK_TEXT_VIEW (view), type, x, y, &buf_x, &buf_y); gtk_text_view_get_iter_at_location (GTK_TEXT_VIEW (view), &iter, buf_x, buf_y); if (gtk_text_iter_has_tag (&iter, tag)) { if (!hand) { hand = gdk_cursor_new (GDK_HAND2); beam = gdk_cursor_new (GDK_XTERM); } gdk_window_set_cursor (win, hand); } else { if (!beam) { beam = gdk_cursor_new (GDK_XTERM); } gdk_window_set_cursor (win, beam); } return FALSE; }
static gboolean cb_button_press_event(GtkWidget *view, GdkEventButton *event) { GtkTextIter iter, start, end; gint x, y; GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(view)); if ((event->button) == 3 && (event->type == GDK_BUTTON_PRESS)) { gtk_text_view_window_to_buffer_coords(GTK_TEXT_VIEW(view), gtk_text_view_get_window_type(GTK_TEXT_VIEW(view), event->window), (gint)event->x, (gint)event->y, &x, &y); gtk_text_view_get_iter_at_location(GTK_TEXT_VIEW(view), &iter, x, y); gtk_text_buffer_get_selection_bounds(buffer, &start, &end); if (!gtk_text_iter_in_range(&iter, &start, &end)) gtk_text_buffer_place_cursor(buffer, &iter); } return FALSE; }
static VALUE textview_get_window_type(VALUE self, VALUE gdkwin) { return GENUM2RVAL(gtk_text_view_get_window_type(_SELF(self), RVAL2GOBJ(gdkwin)), GTK_TYPE_TEXT_WINDOW_TYPE); }