I can't use motion::enter popup popover

	GtkWidget* label   = gtk_label_new( "\uf028" );
	GtkWidget* popover = gtk_popover_new();
	gtk_widget_insert_before( popover, label, NULL );

	GtkWidget* scale = gtk_scale_new( GTK_ORIENTATION_VERTICAL, NULL );
	gtk_popover_set_child( ( gpointer )popover, scale );

	gtk_range_set_range( ( gpointer )scale, 0.0, 1.0 );
	gtk_widget_set_size_request( ( gpointer )scale, -1, 180 );
	gtk_popover_set_position( ( gpointer )popover, GTK_POS_TOP );

	GtkEventController* motion = gtk_event_controller_motion_new();
	gtk_widget_add_controller( ( gpointer )label, motion );
    // popup Gtkpopover triggers motion::lever & motion::enter 
	g_signal_connect_swapped( motion, "enter", G_CALLBACK( gtk_popover_popup ), popover );
	// g_signal_connect_swapped( motion, "leave", G_CALLBACK( gtk_popover_popdown ), popover );

	GtkGesture* click_event = gtk_gesture_click_new();
	gtk_widget_add_controller( ( gpointer )label, ( gpointer )click_event );
	g_signal_connect( click_event, "released", G_CALLBACK( _lx_music_volume_toggle ), NULL );
	// g_signal_connect_swapped( click_event, "released", G_CALLBACK( _gtk_popover_popup ), popover );

This is a bug, related to foucs.

I have a GtkEntry which by default gets focus after starting the program. But I don’t want to. So I switch focus using gtk_root_set_focus( gtk_widget_get_root( ( gpointer )window ), ( gpointer )window ); .

But this causes motion::enter to not make GtkPopover pop up correctly.
When popup is called, it gets a size of 0x0+0+0. At this time, the GtkPopover cannot be closed by any mouse event or keyboard event, and the esc key is also invalid.

I’m surprised

motion::enter triggers the popup correctly as long as I set focus for i GtkEntry in my project.
But when I write the minimal instance, everything is completely different. GtkPopover doesn’t pop up correctly anyway

#include <gtk/gtk.h>

static void _gtk_popover_popup( GtkWidget* widget )
{
	g_message( "%s: %d", __FUNCTION__, gtk_widget_get_visible( widget ) );

	gtk_popover_popup( ( gpointer )widget );
}

int main( int argc, char** argv )
{
	gtk_init();

	GtkWidget* win = gtk_window_new();
	gtk_window_set_default_size( GTK_WINDOW( win ), 640, 480 );

	GtkWidget* main_box = gtk_box_new( GTK_ORIENTATION_VERTICAL, 0 );
	gtk_window_set_child( ( gpointer )win, main_box );

	gtk_box_append( ( gpointer )main_box, gtk_entry_new() );

	gtk_root_set_focus( gtk_widget_get_root( ( gpointer )win ), ( gpointer )win);

	GtkWidget* label   = gtk_label_new( "@@@@@@@@@@" );
	GtkWidget* popover = gtk_popover_new();
	gtk_widget_insert_before( popover, label, NULL );
	gtk_box_append( ( gpointer )main_box, label );

	GtkWidget* scale = gtk_scale_new( GTK_ORIENTATION_VERTICAL, NULL );
	gtk_popover_set_child( ( gpointer )popover, scale );

	gtk_range_set_range( ( gpointer )scale, 0.0, 1.0 );
	gtk_widget_set_size_request( ( gpointer )scale, -1, 180 );
	gtk_widget_set_size_request( ( gpointer )popover, -1, 180 );
	gtk_popover_set_position( ( gpointer )popover, GTK_POS_TOP );

	GtkEventController* motion = gtk_event_controller_motion_new();
	gtk_widget_add_controller( ( gpointer )label, motion );
	g_signal_connect_swapped( motion, "enter", G_CALLBACK( _gtk_popover_popup ), popover );
	g_signal_connect_swapped( motion, "motion", G_CALLBACK( g_print ), "motion:::::" );

	GtkGesture* click_event = gtk_gesture_click_new();
	gtk_widget_add_controller( ( gpointer )label, ( gpointer )click_event );
	g_signal_connect_swapped( click_event, "released", G_CALLBACK( gtk_popover_popup ), popover );

	gtk_window_present( ( gpointer )win );

	while ( TRUE )
		g_main_context_iteration( NULL, TRUE );

	return 0;
}

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.