static gboolean create_textbox_event (Sheet *sheet, GdkEvent *event) { switch (event->type) { case GDK_3BUTTON_PRESS: case GDK_2BUTTON_PRESS: return TRUE; case GDK_BUTTON_PRESS: if (event->button.button == 4 || event->button.button == 5) return FALSE; if (event->button.button == 1) { if (sheet->state == SHEET_STATE_TEXTBOX_WAIT) sheet->state = SHEET_STATE_TEXTBOX_START; return TRUE; } else return FALSE; case GDK_BUTTON_RELEASE: if (event->button.button == 4 || event->button.button == 5) return FALSE; if (sheet->state == SHEET_STATE_TEXTBOX_START) { Textbox *textbox; Coords pos; sheet->state = SHEET_STATE_NONE; sheet_get_pointer (sheet, &pos.x, &pos.y); textbox = textbox_new (NULL); textbox_set_text (textbox, _ ("Label")); item_data_set_pos (ITEM_DATA (textbox), &pos); schematic_add_item (schematic_view_get_schematic_from_sheet (sheet), ITEM_DATA (textbox)); schematic_view_reset_tool (schematic_view_get_schematicview_from_sheet (sheet)); g_signal_handlers_disconnect_by_func (G_OBJECT (sheet), G_CALLBACK (create_textbox_event), sheet); } return TRUE; default: return FALSE; } return TRUE; }
int sheet_event_callback (GtkWidget *widget, GdkEvent *event, Sheet *sheet) { switch (event->type) { case GDK_3BUTTON_PRESS: // We don't not care about triple clicks on the sheet. return FALSE; case GDK_2BUTTON_PRESS: // The sheet does not care about double clicks, but invoke the // canvas event handler and see if an item picks up the event. if ((*GTK_WIDGET_CLASS (sheet->priv->sheet_parent_class) ->button_press_event) (widget, (GdkEventButton *)event)) return TRUE; else return FALSE; case GDK_BUTTON_PRESS: // If we are in the middle of something else, don't interfere // with that. if (sheet->state != SHEET_STATE_NONE) { return FALSE; } if ((* GTK_WIDGET_CLASS (sheet->priv->sheet_parent_class) ->button_press_event) (widget, (GdkEventButton *) event)) { return TRUE; } if (event->button.button == 3) { run_context_menu ( schematic_view_get_schematicview_from_sheet (sheet), (GdkEventButton *) event); return TRUE; } if (event->button.button == 1) { if (!(event->button.state & GDK_SHIFT_MASK)) sheet_select_all (sheet, FALSE); rubberband_start (sheet, event); return TRUE; } break; case GDK_BUTTON_RELEASE: if (event->button.button == 4 || event->button.button == 5) return TRUE; if (event->button.button == 1 && sheet->priv->rubberband_info->state == RUBBERBAND_ACTIVE) { rubberband_finish (sheet, event); return TRUE; } if (GTK_WIDGET_CLASS (sheet->priv->sheet_parent_class)->button_release_event != NULL) { return GTK_WIDGET_CLASS (sheet->priv->sheet_parent_class) ->button_release_event (widget, (GdkEventButton *) event); } break; case GDK_SCROLL: if (((GdkEventScroll *)event)->direction == GDK_SCROLL_UP) { double zoom; sheet_get_zoom (sheet, &zoom); if (zoom < ZOOM_MAX) sheet_change_zoom (sheet, 1.1); } else if (((GdkEventScroll *)event)->direction == GDK_SCROLL_DOWN) { double zoom; sheet_get_zoom (sheet, &zoom); if (zoom > ZOOM_MIN) sheet_change_zoom (sheet, 0.9); } break; case GDK_MOTION_NOTIFY: if (sheet->priv->rubberband_info->state == RUBBERBAND_ACTIVE) { rubberband_update (sheet, event); return TRUE; } if (GTK_WIDGET_CLASS (sheet->priv->sheet_parent_class) ->motion_notify_event != NULL) { return GTK_WIDGET_CLASS (sheet->priv->sheet_parent_class) ->motion_notify_event (widget, (GdkEventMotion *) event); } case GDK_ENTER_NOTIFY: GTK_WIDGET_CLASS (sheet->priv->sheet_parent_class) ->enter_notify_event (widget, (GdkEventCrossing *) event); case GDK_KEY_PRESS: switch (event->key.keyval) { case GDK_KEY_R: case GDK_KEY_r: if (sheet->state == SHEET_STATE_NONE) sheet_rotate_selection (sheet); break; case GDK_KEY_Home: case GDK_KEY_End: break; case GDK_KEY_Left: if (event->key.state & GDK_MOD1_MASK) sheet_scroll_pixel (sheet, -20, 0); break; case GDK_KEY_Up: if (event->key.state & GDK_MOD1_MASK) sheet_scroll_pixel (sheet, 0, -20); break; case GDK_KEY_Right: if (event->key.state & GDK_MOD1_MASK) sheet_scroll_pixel (sheet, 20, 0); break; case GDK_KEY_Down: if (event->key.state & GDK_MOD1_MASK) sheet_scroll_pixel (sheet, 0, 20); break; case GDK_KEY_Page_Up: if (event->key.state & GDK_MOD1_MASK) sheet_scroll_pixel (sheet, 0, -120); break; case GDK_KEY_Page_Down: if (event->key.state & GDK_MOD1_MASK) sheet_scroll_pixel (sheet, 0, 120); break; case GDK_KEY_Escape: g_signal_emit_by_name (G_OBJECT (sheet), "cancel"); break; case GDK_KEY_Delete: sheet_delete_selection (sheet); break; default: return FALSE; } default: return FALSE; } return TRUE; }