/* Recomputes the bounding box of an icon text item */ static void recompute_bounding_box (GnomeIconTextItem *iti) { GnomeCanvasItem *item; double x1, y1, x2, y2; int width_c, height_c; int width_w, height_w; int max_width_w; item = GNOME_CANVAS_ITEM (iti); width_c = iti->_priv->layout_width + 2 * MARGIN_X; height_c = iti->_priv->layout_height + 2 * MARGIN_Y; width_w = ROUND (width_c / item->canvas->pixels_per_unit); height_w = ROUND (height_c / item->canvas->pixels_per_unit); max_width_w = ROUND (iti->width / item->canvas->pixels_per_unit); x1 = iti->x; y1 = iti->y; gnome_canvas_item_i2w (item, &x1, &y1); x1 += ROUND ((max_width_w - width_w) / 2); x2 = x1 + width_w; y2 = y1 + height_w; gnome_canvas_w2c_d (item->canvas, x1, y1, &item->x1, &item->y1); gnome_canvas_w2c_d (item->canvas, x2, y2, &item->x2, &item->y2); }
static gint sp_canvas_arena_event (SPCanvasItem *item, GdkEvent *event) { SPCanvasArena *arena; NRArenaItem *new_arena; gint ret; /* fixme: This sucks, we have to handle enter/leave notifiers */ arena = SP_CANVAS_ARENA (item); ret = FALSE; switch (event->type) { case GDK_ENTER_NOTIFY: if (!arena->cursor) { if (arena->active) { g_warning ("Cursor entered to arena with already active item"); nr_object_unref ((NRObject *) arena->active); } arena->cursor = TRUE; #if 0 gnome_canvas_w2c_d (item->canvas, event->crossing.x, event->crossing.y, &arena->cx, &arena->cy); #else arena->cx = event->crossing.x; arena->cy = event->crossing.y; #endif /* fixme: Not sure abut this, but seems the right thing (Lauris) */ nr_arena_item_invoke_update (arena->root, NULL, &arena->gc, NR_ARENA_ITEM_STATE_PICK, NR_ARENA_ITEM_STATE_NONE); arena->active = nr_arena_item_invoke_pick (arena->root, arena->cx, arena->cy, nr_arena_global_delta, arena->sticky); if (arena->active) nr_object_ref ((NRObject *) arena->active); ret = sp_canvas_arena_send_event (arena, event); } break; case GDK_LEAVE_NOTIFY: if (arena->cursor) { ret = sp_canvas_arena_send_event (arena, event); if (arena->active) nr_object_unref ((NRObject *) arena->active); arena->active = NULL; arena->cursor = FALSE; } break; case GDK_MOTION_NOTIFY: #if 0 gnome_canvas_w2c_d (item->canvas, event->motion.x, event->motion.y, &arena->cx, &arena->cy); #else arena->cx = event->motion.x; arena->cy = event->motion.y; #endif /* fixme: Not sure abut this, but seems the right thing (Lauris) */ nr_arena_item_invoke_update (arena->root, NULL, &arena->gc, NR_ARENA_ITEM_STATE_PICK, NR_ARENA_ITEM_STATE_NONE); new_arena = nr_arena_item_invoke_pick (arena->root, arena->cx, arena->cy, nr_arena_global_delta, arena->sticky); if (new_arena != arena->active) { GdkEventCrossing ec; ec.window = event->motion.window; ec.send_event = event->motion.send_event; ec.subwindow = event->motion.window; ec.time = event->motion.time; ec.x = event->motion.x; ec.y = event->motion.y; /* fixme: */ if (arena->active) { ec.type = GDK_LEAVE_NOTIFY; ret = sp_canvas_arena_send_event (arena, (GdkEvent *) &ec); } if (arena->active) nr_object_unref ((NRObject *) arena->active); arena->active = new_arena; if (arena->active) nr_object_ref ((NRObject *) arena->active); if (arena->active) { ec.type = GDK_ENTER_NOTIFY; ret = sp_canvas_arena_send_event (arena, (GdkEvent *) &ec); } } ret = sp_canvas_arena_send_event (arena, event); break; default: /* Just send event */ ret = sp_canvas_arena_send_event (arena, event); break; } return ret; }
static gboolean gnome_icon_text_item_event (GnomeCanvasItem *item, GdkEvent *event) { GnomeIconTextItem *iti; GnomeIconTextItemPrivate *priv; int idx; double cx, cy; iti = GNOME_ICON_TEXT_ITEM (item); priv = iti->_priv; switch (event->type) { case GDK_KEY_PRESS: if (!iti->editing) { break; } switch(event->key.keyval) { /* Pass these events back to parent */ case GDK_Escape: case GDK_Return: case GDK_KP_Enter: return FALSE; /* Handle up and down arrow keys. GdkEntry does not know * how to handle multi line items */ case GDK_Up: case GDK_Down: iti_handle_arrow_key_event(iti, event); break; default: /* Check for control key operations */ if (event->key.state & GDK_CONTROL_MASK) { return FALSE; } /* Handle any events that reach us */ gtk_widget_event (GTK_WIDGET (priv->entry), event); break; } /* Update text item to reflect changes */ update_pango_layout (iti); priv->need_text_update = TRUE; gnome_canvas_item_request_update (item); return TRUE; case GDK_BUTTON_PRESS: if (!iti->editing) { break; } if (event->button.button == 1) { gnome_canvas_w2c_d (item->canvas, event->button.x, event->button.y, &cx, &cy); idx = get_layout_index (iti, (cx - item->x1) + MARGIN_X, (cy - item->y1) + MARGIN_Y); iti_start_selecting (iti, idx, event->button.time); } return TRUE; case GDK_MOTION_NOTIFY: if (!priv->selecting) break; gtk_widget_event (GTK_WIDGET (priv->entry), event); gnome_canvas_w2c_d (item->canvas, event->button.x, event->button.y, &cx, &cy); idx = get_layout_index (iti, floor ((cx - (item->x1 + MARGIN_X)) + .5), floor ((cy - (item->y1 + MARGIN_Y)) + .5)); iti_selection_motion (iti, idx); return TRUE; case GDK_BUTTON_RELEASE: if (priv->selecting && event->button.button == 1) iti_stop_selecting (iti, event->button.time); else break; return TRUE; default: break; } return FALSE; }