/* Compile with:
* $ gcc `pkg-config --cflags gtk4` `pkg-config --libs gtk4` -o click-released-test click-released-test.c
*/
#include <gtk/gtk.h>
static void
on_inner_widget_right_btn_pressed (GtkGestureClick *gesture,
int n_press,
double x,
double y,
GtkWidget *widget)
{
g_print ("on_inner_widget_right_btn_pressed() called\n");
}
static void
on_inner_widget_right_btn_released (GtkGestureClick *gesture,
int n_press,
double x,
double y,
GtkWidget *widget)
{
g_print ("on_inner_widget_right_btn_released() called\n");
gtk_gesture_set_state (GTK_GESTURE (gesture),
GTK_EVENT_SEQUENCE_CLAIMED);
}
static void
on_outer_widget_right_btn_released (GtkGestureClick *gesture,
int n_press,
double x,
double y,
GtkWidget *widget)
{
g_print ("on_outer_widget_right_btn_released() called\n");
}
static void
activate (GtkApplication *app,
gpointer user_data)
{
GtkWidget *window;
GtkWidget *outer;
GtkWidget *inner;
GtkGesture *gesture;
/* Add colored border via css for easily identifying widget*/
GtkCssProvider *provider = gtk_css_provider_new();
gtk_css_provider_load_from_data (provider,
".thin_gray_border {border:2px solid gray;}\n"
".thin_red_border {border:2px solid red;}",
-1);
gtk_style_context_add_provider_for_display (gdk_display_get_default(),
GTK_STYLE_PROVIDER(provider),
GTK_STYLE_PROVIDER_PRIORITY_USER);
window = gtk_application_window_new (app);
gtk_window_set_title (GTK_WINDOW (window), "Claim Right Button Click “released”");
gtk_window_set_default_size (GTK_WINDOW (window), 400, 400);
/* Use GtkGrid as outer widget */
outer = gtk_grid_new ();
gtk_grid_insert_row (GTK_GRID (outer), 0);
gtk_grid_insert_row (GTK_GRID (outer), 1);
gtk_grid_insert_column (GTK_GRID (outer), 0);
gtk_grid_insert_column (GTK_GRID (outer), 1);
gtk_style_context_add_class (gtk_widget_get_style_context(outer), "thin_gray_border");
/* Register for mouse right button click "released" event on outer widget*/
gesture = gtk_gesture_click_new ();
gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (gesture), 3);
g_signal_connect (gesture, "released",
G_CALLBACK (on_outer_widget_right_btn_released), outer);
gtk_widget_add_controller (outer, GTK_EVENT_CONTROLLER (gesture));
gtk_window_set_child (GTK_WINDOW (window), outer);
/* Use GtkLabel as inner widget */
inner = gtk_label_new ("Inner Widget");
gtk_style_context_add_class (gtk_widget_get_style_context (inner), "thin_red_border");
gtk_widget_set_size_request (inner, 100, 100);
/* Register for mouse right button click "pressed" and "released" events on inner widget*/
gesture = gtk_gesture_click_new ();
gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (gesture), 3);
g_signal_connect (gesture, "pressed",
G_CALLBACK (on_inner_widget_right_btn_pressed), inner);
g_signal_connect (gesture, "released",
G_CALLBACK (on_inner_widget_right_btn_released), inner);
gtk_widget_add_controller (inner, GTK_EVENT_CONTROLLER (gesture));
gtk_grid_attach (GTK_GRID (outer), inner, 0, 0, 1, 1);
gtk_widget_show (window);
}
int
main (int argc,
char **argv)
{
GtkApplication *app;
int status;
app = gtk_application_new ("org.gnome.discourse-4194", G_APPLICATION_FLAGS_NONE);
g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
status = g_application_run (G_APPLICATION (app), argc, argv);
g_object_unref (app);
return status;
}