static gboolean idle_move_item (gpointer data) { BstCanvasSource *self = data; GnomeCanvasItem *item = GNOME_CANVAS_ITEM (self); GDK_THREADS_ENTER (); if (self->source && item->canvas) { SfiReal x, y; bse_proxy_get (self->source, "pos-x", &x, "pos-y", &y, NULL); x *= BST_CANVAS_SOURCE_PIXEL_SCALE; y *= -BST_CANVAS_SOURCE_PIXEL_SCALE; gnome_canvas_item_w2i (item, &x, &y); g_object_freeze_notify (G_OBJECT (self)); gnome_canvas_item_move (item, x, y); /* canvas notification bug workaround */ g_object_notify (self, "x"); g_object_notify (self, "y"); g_object_thaw_notify (G_OBJECT (self)); } self->idle_reposition = FALSE; g_object_unref (self); GDK_THREADS_LEAVE (); return FALSE; }
static void bst_canvas_link_update (BstCanvasLink *clink) { GnomeCanvasItem *item = GNOME_CANVAS_ITEM (clink); if (clink->line) { gdouble start_x = 0, start_y = 0, end_x = 10, end_y = 10; if (clink->ocsource) { bst_canvas_source_ochannel_pos (clink->ocsource, clink->ochannel, &start_x, &start_y); gnome_canvas_item_w2i (item, &start_x, &start_y); } if (clink->icsource) { bst_canvas_source_ichannel_pos (clink->icsource, clink->ichannel, &end_x, &end_y); gnome_canvas_item_w2i (item, &end_x, &end_y); } GnomeCanvasPoints *gpoints = gnome_canvas_points_new (2); gpoints->coords[0] = start_x; gpoints->coords[1] = start_y; gpoints->coords[2] = end_x; gpoints->coords[3] = end_y; g_object_set (clink->line, "points", gpoints, NULL); gnome_canvas_points_free (gpoints); } if (clink->tag_start) gnome_canvas_item_raise_to_top (clink->tag_start); if (clink->tag_end) gnome_canvas_item_raise_to_top (clink->tag_end); if (clink->ocsource && clink->icsource) gnome_canvas_item_keep_above (GNOME_CANVAS_ITEM (clink), GNOME_CANVAS_ITEM (clink->ocsource), GNOME_CANVAS_ITEM (clink->icsource)); bst_canvas_link_adjust_tags (clink); bst_canvas_link_adjust_arrow (clink); }
static gint zenity_move_clothes_event (GnomeCanvasItem *item, GdkEvent *event, gpointer data) { static double x, y; double new_x, new_y; static int dragging; double item_x, item_y; /* set item_[xy] to the event x,y position in the parent's * item-relative coordinates */ item_x = event->button.x; item_y = event->button.y; gnome_canvas_item_w2i (item->parent, &item_x, &item_y); switch (event->type) { case GDK_BUTTON_PRESS: x = item_x; y = item_y; gnome_canvas_item_ungrab (item, event->button.time); gnome_canvas_item_raise_to_top (item); dragging = TRUE; break; case GDK_MOTION_NOTIFY: if (dragging && (event->motion.state & GDK_BUTTON1_MASK)) { new_x = item_x; new_y = item_y; gnome_canvas_item_move (item, new_x - x, new_y - y); x = new_x; y = new_y; } break; case GDK_BUTTON_RELEASE: gnome_canvas_item_ungrab (item, event->button.time); dragging = FALSE; break; default: break; } return FALSE; }
/* Called for every event a node receives. Right now it's used to * set a message in the statusbar and launch the popup timeout */ static gint node_item_event (GnomeCanvasItem * item, GdkEvent * event, canvas_node_t * canvas_node) { gdouble item_x, item_y; const node_t *node = NULL; /* This is not used yet, but it will be. */ item_x = event->button.x; item_y = event->button.y; gnome_canvas_item_w2i (item->parent, &item_x, &item_y); switch (event->type) { case GDK_2BUTTON_PRESS: if (canvas_node) node = nodes_catalog_find(&canvas_node->canvas_node_id); if (node) { node_protocols_window_create( &canvas_node->canvas_node_id ); g_my_info ("Nodes: %d (shown %u)", nodes_catalog_size(), displayed_nodes); if (DEBUG_ENABLED) { gchar *msg = node_dump(node); g_my_debug("%s", msg); g_free(msg); } } break; default: break; } return FALSE; } /* node_item_event */
guint bst_canvas_source_ochannel_at (BstCanvasSource *csource, gdouble x, gdouble y) { guint channel = ~0; g_return_val_if_fail (BST_IS_CANVAS_SOURCE (csource), 0); gnome_canvas_item_w2i (GNOME_CANVAS_ITEM (csource), &x, &y); x -= OCHANNEL_X (csource); y -= OCHANNEL_Y (csource); if (x > 0 && x < CHANNEL_WIDTH (csource) && y > 0 && y < CHANNEL_HEIGHT (csource) && bse_source_n_ochannels (csource->source)) { y /= CHANNEL_HEIGHT (csource) / bse_source_n_ochannels (csource->source); channel = y; } return channel; }
static gboolean bst_canvas_source_event (GnomeCanvasItem *item, GdkEvent *event) { BstCanvasSource *csource = BST_CANVAS_SOURCE (item); gboolean handled = FALSE; switch (event->type) { case GDK_BUTTON_PRESS: if (!csource->in_move && event->button.button == 2) { GdkCursor *fleur = gdk_cursor_new (GDK_FLEUR); if (gnome_canvas_item_grab (item, GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK, fleur, event->button.time) == 0) { gdouble x = event->button.x, y = event->button.y; gnome_canvas_item_w2i (item, &x, &y); csource->move_dx = x; csource->move_dy = y; csource->in_move = TRUE; bse_item_group_undo (csource->source, "Move"); } gdk_cursor_destroy (fleur); handled = TRUE; } break; case GDK_MOTION_NOTIFY: if (csource->in_move) { gdouble x = event->motion.x, y = event->motion.y; gnome_canvas_item_w2i (item, &x, &y); gnome_canvas_item_move (item, x - csource->move_dx, y - csource->move_dy); GNOME_CANVAS_NOTIFY (item); handled = TRUE; } else { guint channel; const gchar *label = NULL, *prefix = NULL, *ident = NULL; /* set i/o channel hints */ channel = bst_canvas_source_ichannel_at (csource, event->motion.x, event->motion.y); if (channel != ~0) { label = bse_source_ichannel_label (csource->source, channel); ident = bse_source_ichannel_ident (csource->source, channel); prefix = _("Input"); } else { channel = bst_canvas_source_ochannel_at (csource, event->motion.x, event->motion.y); if (channel != ~0) { label = bse_source_ochannel_label (csource->source, channel); ident = bse_source_ochannel_ident (csource->source, channel); prefix = _("Output"); } } if (label) gxk_status_printf (GXK_STATUS_IDLE_HINT, _("(Hint)"), "%s[%s]: %s", prefix, ident, label); else gxk_status_set (GXK_STATUS_IDLE_HINT, NULL, NULL); } break; case GDK_BUTTON_RELEASE: if (event->button.button == 2 && csource->in_move) { bse_item_ungroup_undo (csource->source); csource->in_move = FALSE; gnome_canvas_item_ungrab (item, event->button.time); handled = TRUE; } break; default: break; } if (!handled && GNOME_CANVAS_ITEM_CLASS (bst_canvas_source_parent_class)->event) handled = GNOME_CANVAS_ITEM_CLASS (bst_canvas_source_parent_class)->event (item, event); return handled; }
static gboolean bst_canvas_link_event (GnomeCanvasItem *item, GdkEvent *event) { BstCanvasLink *clink = BST_CANVAS_LINK (item); gboolean handled = FALSE; switch (event->type) { case GDK_BUTTON_PRESS: if (event->button.button == 2) { GdkCursor *fleur; if (clink->ocsource) { clink->start_move_dx = event->button.x; clink->start_move_dy = event->button.y; gnome_canvas_item_w2i (GNOME_CANVAS_ITEM (clink->ocsource), &clink->start_move_dx, &clink->start_move_dy); } if (clink->icsource) { clink->end_move_dx = event->button.x; clink->end_move_dy = event->button.y; gnome_canvas_item_w2i (GNOME_CANVAS_ITEM (clink->icsource), &clink->end_move_dx, &clink->end_move_dy); } clink->in_move = TRUE; fleur = gdk_cursor_new (GDK_FLEUR); gnome_canvas_item_grab (item, GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK, fleur, event->button.time); gdk_cursor_destroy (fleur); handled = TRUE; } break; case GDK_MOTION_NOTIFY: if (clink->in_move && clink->ocsource) { gdouble x = event->motion.x, y = event->motion.y; gnome_canvas_item_w2i (GNOME_CANVAS_ITEM (clink->ocsource), &x, &y); gnome_canvas_item_move (GNOME_CANVAS_ITEM (clink->ocsource), x - clink->start_move_dx, y - clink->start_move_dy); GNOME_CANVAS_NOTIFY (clink->ocsource); handled = TRUE; } if (clink->in_move && clink->icsource) { gdouble x = event->motion.x, y = event->motion.y; gnome_canvas_item_w2i (GNOME_CANVAS_ITEM (clink->icsource), &x, &y); gnome_canvas_item_move (GNOME_CANVAS_ITEM (clink->icsource), x - clink->end_move_dx, y - clink->end_move_dy); GNOME_CANVAS_NOTIFY (clink->icsource); handled = TRUE; } break; case GDK_BUTTON_RELEASE: if (event->button.button == 2 && clink->in_move) { clink->in_move = FALSE; gnome_canvas_item_ungrab (item, event->button.time); handled = TRUE; } break; default: break; } if (!handled && GNOME_CANVAS_ITEM_CLASS (bst_canvas_link_parent_class)->event) handled |= GNOME_CANVAS_ITEM_CLASS (bst_canvas_link_parent_class)->event (item, event); return handled; }