BUG: hit detection in gnome canvas text items
- From: Jeremy Henty <jeremy chaos org uk>
- To: GTK users <gtk-list gnome org>
- Subject: BUG: hit detection in gnome canvas text items
- Date: Wed, 18 Feb 2004 20:26:45 +0000
It seems that hit detection for gnome canvas text items only works
when the anchor is north-west. I am attaching a demo that creates a
text items for each possible anchor and configures them to turn blue
when the pointer is over them. A little mouse wiggling determines
that the sensitive parts of the text widgets are: all of "North-West"
(as it should be), the right half of "North", the bottom half of
"West" and the bottom-right quarter of "Center". The other five text
items are only sensitive along certain parts of their borders. Unless
I am missing something this surely cannot be right.
Details:
gtk+-2.2.4
libart_lgpl_2.3.16
libgnomecanvas-2.4.0
Regards,
Jeremy
#include <stdio.h>
#include <gtk/gtk.h>
#include <libgnomecanvas/libgnomecanvas.h>
static void window_initialize(GtkWidget*);
static void canvas_initialize(GtkWidget*);
int
main(int argc,char **argv)
{
GtkWidget *window, *canvas;
gtk_init(&argc,&argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
window_initialize(window);
canvas = gnome_canvas_new();
canvas_initialize(canvas);
gtk_container_add(GTK_CONTAINER(window),canvas);
gtk_widget_show_all(window);
gtk_main();
return 0;
}
static void
window_destroy_handler(void)
{
gtk_main_quit();
}
static void
window_initialize(GtkWidget* window)
{
gtk_window_set_title(GTK_WINDOW(window),"Hot Text");
g_signal_connect(window,"destroy",window_destroy_handler,(gpointer)NULL);
}
#define CANVAS_ITEM_COUNT 9
typedef struct {
const char *text;
double y;
double x;
GtkAnchorType anchor;
} canvas_item_spec_t;
static const canvas_item_spec_t
canvas_item_specs[];
static void
canvas_item_event_handler(GnomeCanvasItem *text_item,
GdkEvent *event,
const char *text
)
{
printf("text: %s\n",text);
switch (event->type)
{
case GDK_LEAVE_NOTIFY:
g_object_set(text_item,
"fill_color","black",
0);
break;
case GDK_ENTER_NOTIFY:
g_object_set(text_item,
"fill_color","blue",
0);
break;
default:
break;
}
}
static void
canvas_initialize(GtkWidget* canvas)
{
GnomeCanvasGroup *canvas_root;
int i;
canvas_root = gnome_canvas_root(GNOME_CANVAS(canvas));
for (i=0;i<CANVAS_ITEM_COUNT;i++)
{
GnomeCanvasItem *text_item;
const canvas_item_spec_t *canvas_item_spec;
canvas_item_spec = &canvas_item_specs[i];
text_item = gnome_canvas_item_new(canvas_root,
GNOME_TYPE_CANVAS_TEXT,
"font", "Sans 20",
"fill_color", "black",
"text", canvas_item_spec->text,
"x", canvas_item_spec->x,
"y", canvas_item_spec->y,
"anchor", canvas_item_spec->anchor,
0);
g_signal_connect(G_OBJECT(text_item),"event",
G_CALLBACK(canvas_item_event_handler),
(gpointer)(canvas_item_spec->text)
);
}
}
#define west (0.0)
#define middle (200.0)
#define east (400.0)
#define north (0.0)
#define center (50.0)
#define south (100.0)
static const canvas_item_spec_t
canvas_item_specs[CANVAS_ITEM_COUNT] = {
{ "South-East", south, east, GTK_ANCHOR_SE, },
{ "South", south, middle, GTK_ANCHOR_S, },
{ "South-West", south, west, GTK_ANCHOR_SW, },
{ "East", center, east, GTK_ANCHOR_E , },
{ "Center", center, middle, GTK_ANCHOR_CENTER, },
{ "West", center, west, GTK_ANCHOR_W, },
{ "North-East", north, east, GTK_ANCHOR_NE, },
{ "North", north, middle, GTK_ANCHOR_N, },
{ "North-West", north, west, GTK_ANCHOR_NW, },
};
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]