static void drawing_area_hierarchy_changed (GtkWidget *widget, GtkWidget *previous_toplevel) { DrawingArea *area = (DrawingArea *) widget; GSimpleActionGroup *action_group; GSimpleAction *action; GtkWidget *toplevel; gint i; if (previous_toplevel && area->pad_controller) { gtk_widget_remove_controller (previous_toplevel, GTK_EVENT_CONTROLLER (area->pad_controller)); area->pad_controller = NULL; } toplevel = gtk_widget_get_toplevel (GTK_WIDGET (area)); if (!GTK_IS_WINDOW (toplevel)) return; action_group = g_simple_action_group_new (); area->pad_controller = gtk_pad_controller_new (G_ACTION_GROUP (action_group), NULL); for (i = 0; i < G_N_ELEMENTS (pad_actions); i++) { if (pad_actions[i].type == GTK_PAD_ACTION_BUTTON) { action = g_simple_action_new (pad_actions[i].action_name, NULL); g_object_set_data (G_OBJECT (action), "color", (gpointer) pad_colors[i]); g_signal_connect (action, "activate", G_CALLBACK (on_pad_button_activate), area); } else { action = g_simple_action_new_stateful (pad_actions[i].action_name, G_VARIANT_TYPE_DOUBLE, NULL); g_signal_connect (action, "activate", G_CALLBACK (on_pad_knob_change), area); } g_action_map_add_action (G_ACTION_MAP (action_group), G_ACTION (action)); g_object_unref (action); } gtk_pad_controller_set_action_entries (area->pad_controller, pad_actions, G_N_ELEMENTS (pad_actions)); gtk_widget_add_controller (toplevel, GTK_EVENT_CONTROLLER (area->pad_controller)); }
static void gtk_app_chooser_widget_init (GtkAppChooserWidget *self) { GtkTreeSelection *selection; GtkTreeModel *sort; GtkGesture *gesture; self->priv = gtk_app_chooser_widget_get_instance_private (self); gtk_widget_set_has_surface (GTK_WIDGET (self), FALSE); gtk_widget_init_template (GTK_WIDGET (self)); /* Various parts of the GtkTreeView code need custom code to setup, mostly * because we lack signals to connect to, or properties to set. */ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (self->priv->program_list)); gtk_tree_selection_set_select_function (selection, gtk_app_chooser_selection_func, self, NULL); sort = gtk_tree_view_get_model (GTK_TREE_VIEW (self->priv->program_list)); gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (sort), COLUMN_NAME, GTK_SORT_ASCENDING); gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE (sort), COLUMN_NAME, gtk_app_chooser_sort_func, self, NULL); gtk_tree_view_set_search_column (GTK_TREE_VIEW (self->priv->program_list), COLUMN_NAME); gtk_tree_view_set_search_equal_func (GTK_TREE_VIEW (self->priv->program_list), gtk_app_chooser_search_equal_func, NULL, NULL); gtk_tree_view_column_set_cell_data_func (self->priv->column, self->priv->secondary_padding, padding_cell_renderer_func, NULL, NULL); self->priv->monitor = g_app_info_monitor_get (); g_signal_connect (self->priv->monitor, "changed", G_CALLBACK (app_info_changed), self); gesture = gtk_gesture_multi_press_new (); gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (gesture), GDK_BUTTON_SECONDARY); g_signal_connect (gesture, "pressed", G_CALLBACK (gtk_app_chooser_row_pressed_cb), self); gtk_widget_add_controller (self->priv->program_list, GTK_EVENT_CONTROLLER (gesture)); }
static void drawing_area_init (DrawingArea *area) { GtkGesture *gesture; gtk_widget_set_has_surface (GTK_WIDGET (area), FALSE); gesture = gtk_gesture_stylus_new (); g_signal_connect (gesture, "down", G_CALLBACK (stylus_gesture_down), area); g_signal_connect (gesture, "motion", G_CALLBACK (stylus_gesture_motion), area); gtk_widget_add_controller (GTK_WIDGET (area), GTK_EVENT_CONTROLLER (gesture)); area->draw_color = (GdkRGBA) { 0, 0, 0, 1 }; }
GtkWidget * do_drawingarea (GtkWidget *do_widget) { GtkWidget *frame; GtkWidget *vbox; GtkWidget *da; GtkWidget *label; GtkGesture *drag; if (!window) { window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_display (GTK_WINDOW (window), gtk_widget_get_display (do_widget)); gtk_window_set_title (GTK_WINDOW (window), "Drawing Area"); g_signal_connect (window, "destroy", G_CALLBACK (close_window), NULL); vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 8); g_object_set (vbox, "margin", 16, NULL); gtk_container_add (GTK_CONTAINER (window), vbox); /* * Create the checkerboard area */ label = gtk_label_new (NULL); gtk_label_set_markup (GTK_LABEL (label), "<u>Checkerboard pattern</u>"); gtk_container_add (GTK_CONTAINER (vbox), label); frame = gtk_frame_new (NULL); gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN); gtk_widget_set_vexpand (frame, TRUE); gtk_container_add (GTK_CONTAINER (vbox), frame); da = gtk_drawing_area_new (); gtk_drawing_area_set_content_width (GTK_DRAWING_AREA (da), 100); gtk_drawing_area_set_content_height (GTK_DRAWING_AREA (da), 100); gtk_drawing_area_set_draw_func (GTK_DRAWING_AREA (da), checkerboard_draw, NULL, NULL); gtk_container_add (GTK_CONTAINER (frame), da); /* * Create the scribble area */ label = gtk_label_new (NULL); gtk_label_set_markup (GTK_LABEL (label), "<u>Scribble area</u>"); gtk_container_add (GTK_CONTAINER (vbox), label); frame = gtk_frame_new (NULL); gtk_widget_set_vexpand (frame, TRUE); gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN); gtk_container_add (GTK_CONTAINER (vbox), frame); da = gtk_drawing_area_new (); gtk_drawing_area_set_content_width (GTK_DRAWING_AREA (da), 100); gtk_drawing_area_set_content_height (GTK_DRAWING_AREA (da), 100); gtk_drawing_area_set_draw_func (GTK_DRAWING_AREA (da), scribble_draw, NULL, NULL); gtk_container_add (GTK_CONTAINER (frame), da); g_signal_connect (da, "size-allocate", G_CALLBACK (scribble_size_allocate), NULL); drag = gtk_gesture_drag_new (); gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (drag), GDK_BUTTON_PRIMARY); gtk_widget_add_controller (da, GTK_EVENT_CONTROLLER (drag)); g_signal_connect (drag, "drag-begin", G_CALLBACK (drag_begin), da); g_signal_connect (drag, "drag-update", G_CALLBACK (drag_update), da); g_signal_connect (drag, "drag-end", G_CALLBACK (drag_end), da); } if (!gtk_widget_get_visible (window)) gtk_widget_show (window); else gtk_widget_destroy (window); return window; }
GtkWidget * do_clipboard (GtkWidget *do_widget) { if (!window) { GtkWidget *vbox, *hbox; GtkWidget *label; GtkWidget *entry, *button; GtkWidget *image; GtkGesture *gesture; window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_display (GTK_WINDOW (window), gtk_widget_get_display (do_widget)); gtk_window_set_title (GTK_WINDOW (window), "Clipboard"); g_signal_connect (window, "destroy", G_CALLBACK (gtk_widget_destroyed), &window); vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); g_object_set (vbox, "margin", 8, NULL); gtk_container_add (GTK_CONTAINER (window), vbox); label = gtk_label_new ("\"Copy\" will copy the text\nin the entry to the clipboard"); gtk_container_add (GTK_CONTAINER (vbox), label); hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 4); g_object_set (hbox, "margin", 8, NULL); gtk_container_add (GTK_CONTAINER (vbox), hbox); /* Create the first entry */ entry = gtk_entry_new (); gtk_container_add (GTK_CONTAINER (hbox), entry); /* Create the button */ button = gtk_button_new_with_mnemonic (_("_Copy")); gtk_container_add (GTK_CONTAINER (hbox), button); g_signal_connect (button, "clicked", G_CALLBACK (copy_button_clicked), entry); label = gtk_label_new ("\"Paste\" will paste the text from the clipboard to the entry"); gtk_container_add (GTK_CONTAINER (vbox), label); hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 4); g_object_set (hbox, "margin", 8, NULL); gtk_container_add (GTK_CONTAINER (vbox), hbox); /* Create the second entry */ entry = gtk_entry_new (); gtk_container_add (GTK_CONTAINER (hbox), entry); /* Create the button */ button = gtk_button_new_with_mnemonic (_("_Paste")); gtk_container_add (GTK_CONTAINER (hbox), button); g_signal_connect (button, "clicked", G_CALLBACK (paste_button_clicked), entry); label = gtk_label_new ("Images can be transferred via the clipboard, too"); gtk_container_add (GTK_CONTAINER (vbox), label); hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 4); g_object_set (hbox, "margin", 8, NULL); gtk_container_add (GTK_CONTAINER (vbox), hbox); /* Create the first image */ image = gtk_image_new_from_icon_name ("dialog-warning"); gtk_container_add (GTK_CONTAINER (hbox), image); /* make image a drag source */ gtk_drag_source_set (image, GDK_BUTTON1_MASK, NULL, GDK_ACTION_COPY); gtk_drag_source_add_image_targets (image); g_signal_connect (image, "drag-begin", G_CALLBACK (drag_begin), image); g_signal_connect (image, "drag-data-get", G_CALLBACK (drag_data_get), image); /* accept drops on image */ gtk_drag_dest_set (image, GTK_DEST_DEFAULT_ALL, NULL, GDK_ACTION_COPY); gtk_drag_dest_add_image_targets (image); g_signal_connect (image, "drag-data-received", G_CALLBACK (drag_data_received), image); /* context menu on image */ gesture = gtk_gesture_multi_press_new (); gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (gesture), GDK_BUTTON_SECONDARY); g_signal_connect (gesture, "pressed", G_CALLBACK (pressed_cb), image); gtk_widget_add_controller (image, GTK_EVENT_CONTROLLER (gesture)); /* Create the second image */ image = gtk_image_new_from_icon_name ("process-stop"); gtk_container_add (GTK_CONTAINER (hbox), image); /* make image a drag source */ gtk_drag_source_set (image, GDK_BUTTON1_MASK, NULL, GDK_ACTION_COPY); gtk_drag_source_add_image_targets (image); g_signal_connect (image, "drag-begin", G_CALLBACK (drag_begin), image); g_signal_connect (image, "drag-data-get", G_CALLBACK (drag_data_get), image); /* accept drops on image */ gtk_drag_dest_set (image, GTK_DEST_DEFAULT_ALL, NULL, GDK_ACTION_COPY); gtk_drag_dest_add_image_targets (image); g_signal_connect (image, "drag-data-received", G_CALLBACK (drag_data_received), image); /* context menu on image */ gesture = gtk_gesture_multi_press_new (); gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (gesture), GDK_BUTTON_SECONDARY); g_signal_connect (gesture, "pressed", G_CALLBACK (pressed_cb), image); gtk_widget_add_controller (image, GTK_EVENT_CONTROLLER (gesture)); } if (!gtk_widget_get_visible (window)) gtk_widget_show (window); else gtk_widget_destroy (window); return window; }