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;
}