+static gboolean
+button_press_event_cb (GtkWidget *widget,
+ GdkEventButton *event,
+ struct psppire_output_view *view)
+{
+ view->buttontime = event->time;
+ clear_selection (view);
+ set_copy_action (view, TRUE);
+ gtk_widget_set_state_flags (widget, GTK_STATE_FLAG_SELECTED, FALSE);
+ gtk_widget_queue_draw (widget);
+ return FALSE; /* Forward Event -> off_item will trigger */
+}
+
+static void
+drag_data_get_cb (GtkWidget *widget, GdkDragContext *context,
+ GtkSelectionData *selection_data,
+ guint target_type, guint time,
+ struct psppire_output_view *view)
+{
+ view->selected_item = find_selected_item (view);
+ clipboard_get_cb (NULL, selection_data, target_type, view);
+}
+
+static void
+create_drawing_area (struct psppire_output_view *view,
+ GtkWidget *drawing_area, struct xr_fsm *r,
+ int tw, int th, const struct output_item *item)
+{
+ g_object_set_data_full (G_OBJECT (drawing_area),
+ "fsm", r, free_fsm);
+ g_signal_connect (drawing_area, "button-press-event",
+ G_CALLBACK (button_press_event_cb), view);
+ gtk_widget_add_events (drawing_area, GDK_BUTTON_PRESS_MASK);
+
+ { /* Drag and Drop */
+ GtkTargetList *tl = build_target_list (item);
+ g_assert (tl);
+ gtk_drag_source_set (drawing_area, GDK_BUTTON1_MASK, NULL, 0, GDK_ACTION_COPY);
+ gtk_drag_source_set_target_list (drawing_area, tl);
+ gtk_target_list_unref (tl);
+ g_signal_connect (drawing_area, "drag-data-get",
+ G_CALLBACK (drag_data_get_cb), view);
+ }
+ GtkStyleContext *context = gtk_widget_get_style_context (drawing_area);
+ gtk_style_context_add_class (context,
+ GTK_STYLE_CLASS_VIEW);