diff --git a/demos/gtk-demo/search_entry.c b/demos/gtk-demo/search_entry.c index c234481052..3519a2534c 100644 --- a/demos/gtk-demo/search_entry.c +++ b/demos/gtk-demo/search_entry.c @@ -8,8 +8,8 @@ #include static GtkWidget *window = NULL; -static GtkWidget *menu = NULL; static GtkWidget *notebook = NULL; +static GSimpleActionGroup *actions = NULL; static guint search_progress_id = 0; static guint finish_search_id = 0; @@ -83,69 +83,42 @@ stop_search (GtkButton *button, } static void -clear_entry (GtkEntry *entry) +clear_entry (GSimpleAction *action, + GVariant *parameter, + gpointer user_data) { - gtk_editable_set_text (GTK_EDITABLE (entry), ""); + GtkEditable *editable = user_data; + + gtk_editable_set_text (editable, ""); } static void -search_by_name (GtkWidget *item, - GtkEntry *entry) +set_search_by (GSimpleAction *action, + GVariant *value, + gpointer user_data) { - gtk_entry_set_icon_tooltip_text (entry, - GTK_ENTRY_ICON_PRIMARY, - "Search by name\n" - "Click here to change the search type"); - gtk_entry_set_placeholder_text (entry, "name"); -} + GtkEntry *entry = user_data; + const char *term; -static void -search_by_description (GtkWidget *item, - GtkEntry *entry) -{ + term = g_variant_get_string (value, NULL); - gtk_entry_set_icon_tooltip_text (entry, - GTK_ENTRY_ICON_PRIMARY, - "Search by description\n" - "Click here to change the search type"); - gtk_entry_set_placeholder_text (entry, "description"); -} + g_simple_action_set_state (action, value); -static void -search_by_file (GtkWidget *item, - GtkEntry *entry) -{ - gtk_entry_set_icon_tooltip_text (entry, - GTK_ENTRY_ICON_PRIMARY, - "Search by file name\n" - "Click here to change the search type"); - gtk_entry_set_placeholder_text (entry, "file name"); -} - -GtkWidget * -create_search_menu (GtkWidget *entry) -{ - GtkWidget *menu; - GtkWidget *item; - - menu = gtk_menu_new (); - - item = gtk_menu_item_new_with_mnemonic ("Search by _name"); - g_signal_connect (item, "activate", - G_CALLBACK (search_by_name), entry); - gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); - - item = gtk_menu_item_new_with_mnemonic ("Search by _description"); - g_signal_connect (item, "activate", - G_CALLBACK (search_by_description), entry); - gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); - - item = gtk_menu_item_new_with_mnemonic ("Search by _file name"); - g_signal_connect (item, "activate", - G_CALLBACK (search_by_file), entry); - gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); - - return menu; + if (g_str_equal (term, "name")) + { + gtk_entry_set_icon_tooltip_text (entry, GTK_ENTRY_ICON_PRIMARY, "Search by name"); + gtk_entry_set_placeholder_text (entry, "name"); + } + else if (g_str_equal (term, "description")) + { + gtk_entry_set_icon_tooltip_text (entry, GTK_ENTRY_ICON_PRIMARY, "Search by description"); + gtk_entry_set_placeholder_text (entry, "description"); + } + else if (g_str_equal (term, "filename")) + { + gtk_entry_set_icon_tooltip_text (entry, GTK_ENTRY_ICON_PRIMARY, "Search by file name"); + gtk_entry_set_placeholder_text (entry, "file name"); + } } static void @@ -154,7 +127,28 @@ icon_press_cb (GtkEntry *entry, gpointer data) { if (position == GTK_ENTRY_ICON_PRIMARY) - gtk_menu_popup_at_pointer (GTK_MENU (menu), NULL); + { + GAction *action; + GVariant *state; + GVariant *new_state; + const char *s; + + action = g_action_map_lookup_action (G_ACTION_MAP (actions), "search-by"); + state = g_action_get_state (action); + s = g_variant_get_string (state, NULL); + + if (g_str_equal (s, "name")) + new_state = g_variant_new_string ("description"); + else if (g_str_equal (s, "description")) + new_state = g_variant_new_string ("filename"); + else if (g_str_equal (s, "filename")) + new_state = g_variant_new_string ("name"); + else + g_assert_not_reached (); + + g_action_change_state (action, new_state); + g_variant_unref (state); + } } static void @@ -165,7 +159,6 @@ activate_cb (GtkEntry *entry, return; start_search (button, entry); - } static void @@ -187,32 +180,62 @@ search_entry_destroyed (GtkWidget *widget) } static void -entry_populate_popup (GtkEntry *entry, - GtkMenu *menu, - gpointer user_data) +text_changed (GObject *object, + GParamSpec *pspec, + gpointer data) { - GtkWidget *item; - GtkWidget *search_menu; + GtkEntry *entry = GTK_ENTRY (object); + GActionMap *actions = data; + GAction *action; gboolean has_text; has_text = gtk_entry_get_text_length (entry) > 0; - item = gtk_separator_menu_item_new (); - gtk_widget_show (item); - gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + action = g_action_map_lookup_action (actions, "clear"); + g_simple_action_set_enabled (G_SIMPLE_ACTION (action), has_text); +} - item = gtk_menu_item_new_with_mnemonic ("C_lear"); - gtk_widget_show (item); - g_signal_connect_swapped (item, "activate", - G_CALLBACK (clear_entry), entry); - gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); - gtk_widget_set_sensitive (item, has_text); +static GMenuModel * +create_search_menu_model (void) +{ + GMenu *menu = g_menu_new (); + g_menu_append (menu, _("Name"), "search.search-by::name"); + g_menu_append (menu, _("Description"), "search.search-by::description"); + g_menu_append (menu, _("File Name"), "search.search-by::filename"); - search_menu = create_search_menu (GTK_WIDGET (entry)); - item = gtk_menu_item_new_with_label ("Search by"); - gtk_widget_show (item); - gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), search_menu); - gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + return G_MENU_MODEL (menu); +} + +static void +entry_add_to_context_menu (GtkEntry *entry) +{ + GMenu *menu; + GActionEntry entries[] = { + { "clear", clear_entry, NULL, NULL, NULL }, + { "search-by", NULL, "s", "'name'", set_search_by } + }; + GMenuModel *submenu; + GMenuItem *item; + + actions = g_simple_action_group_new (); + g_action_map_add_action_entries (G_ACTION_MAP (actions), entries, G_N_ELEMENTS(entries), entry); + gtk_widget_insert_action_group (GTK_WIDGET (entry), "search", G_ACTION_GROUP (actions)); + + menu = g_menu_new (); + item = g_menu_item_new (_("C_lear"), "search.clear"); + g_menu_item_set_attribute (item, "touch-icon", "s", "edit-clear-symbolic"); + g_menu_append_item (G_MENU (menu), item); + g_object_unref (item); + + submenu = create_search_menu_model (); + g_menu_append_submenu (menu, _("Search By"), submenu); + g_object_unref (submenu); + + gtk_entry_set_extra_menu (entry, G_MENU_MODEL (menu)); + + g_object_unref (menu); + + g_signal_connect (entry, "notify::text", G_CALLBACK (text_changed), actions); } GtkWidget * @@ -271,29 +294,25 @@ do_search_entry (GtkWidget *do_widget) gtk_widget_show (cancel_button); /* Set up the search icon */ - search_by_name (NULL, GTK_ENTRY (entry)); + GVariant *value = g_variant_ref_sink (g_variant_new_string ("name")); + set_search_by (NULL, value, entry); + g_variant_unref (value); - /* Set up the clear icon */ - g_signal_connect (entry, "icon-press", - G_CALLBACK (icon_press_cb), NULL); - g_signal_connect (entry, "activate", - G_CALLBACK (activate_cb), NULL); + gtk_entry_set_icon_activatable (GTK_ENTRY (entry), GTK_ENTRY_ICON_PRIMARY, TRUE); + gtk_entry_set_icon_sensitive (GTK_ENTRY (entry), GTK_ENTRY_ICON_PRIMARY, TRUE); - /* Create the menu */ - menu = create_search_menu (entry); - gtk_menu_attach_to_widget (GTK_MENU (menu), entry, NULL); + g_signal_connect (entry, "icon-press", G_CALLBACK (icon_press_cb), NULL); + g_signal_connect (entry, "activate", G_CALLBACK (activate_cb), NULL); /* add accessible alternatives for icon functionality */ - g_object_set (entry, "populate-all", TRUE, NULL); - g_signal_connect (entry, "populate-popup", - G_CALLBACK (entry_populate_popup), NULL); + entry_add_to_context_menu (GTK_ENTRY (entry)); } if (!gtk_widget_get_visible (window)) gtk_widget_show (window); else { - gtk_widget_destroy (menu); + g_clear_object (&actions); gtk_widget_destroy (window); } diff --git a/demos/widget-factory/widget-factory.c b/demos/widget-factory/widget-factory.c index 678d5f5f1c..662eb0241b 100644 --- a/demos/widget-factory/widget-factory.c +++ b/demos/widget-factory/widget-factory.c @@ -1303,96 +1303,113 @@ page_combo_separator_func (GtkTreeModel *model, } static void -activate_item (GtkWidget *item, GtkTextView *tv) +toggle_format (GSimpleAction *action, + GVariant *value, + gpointer user_data) { - const gchar *tag; + GtkTextView *text_view = user_data; GtkTextIter start, end; - gboolean active; + const char *name; - g_object_get (item, "active", &active, NULL); - tag = (const gchar *)g_object_get_data (G_OBJECT (item), "tag"); - gtk_text_buffer_get_selection_bounds (gtk_text_view_get_buffer (tv), &start, &end); - if (active) - gtk_text_buffer_apply_tag_by_name (gtk_text_view_get_buffer (tv), tag, &start, &end); + name = g_action_get_name (G_ACTION (action)); + + g_simple_action_set_state (action, value); + + gtk_text_buffer_get_selection_bounds (gtk_text_view_get_buffer (text_view), &start, &end); + if (g_variant_get_boolean (value)) + gtk_text_buffer_apply_tag_by_name (gtk_text_view_get_buffer (text_view), name, &start, &end); else - gtk_text_buffer_remove_tag_by_name (gtk_text_view_get_buffer (tv), tag, &start, &end); + gtk_text_buffer_remove_tag_by_name (gtk_text_view_get_buffer (text_view), name, &start, &end); } -static void -add_item (GtkTextView *tv, - GtkWidget *popup, - const gchar *text, - const gchar *tag, - gboolean set) -{ - GtkWidget *item, *label; - - if (GTK_IS_MENU (popup)) - { - item = gtk_check_menu_item_new (); - gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), set); - g_signal_connect (item, "toggled", G_CALLBACK (activate_item), tv); - } - else - { - item = gtk_check_button_new (); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (item), set); - gtk_widget_set_focus_on_click (item, FALSE); - g_signal_connect (item, "clicked", G_CALLBACK (activate_item), tv); - } - - label = gtk_label_new (""); - gtk_label_set_xalign (GTK_LABEL (label), 0); - gtk_label_set_markup (GTK_LABEL (label), text); - gtk_widget_show (label); - gtk_container_add (GTK_CONTAINER (item), label); - g_object_set_data (G_OBJECT (item), "tag", (gpointer)tag); - gtk_widget_show (item); - gtk_container_add (GTK_CONTAINER (popup), item); -} +static GActionGroup *actions; static void -populate_popup (GtkTextView *tv, - GtkWidget *popup) +text_changed (GtkTextBuffer *buffer) { - gboolean has_selection; - GtkWidget *item; - GtkTextIter start, end, iter; + GAction *bold; + GAction *italic; + GAction *underline; + GtkTextIter iter; GtkTextTagTable *tags; - GtkTextTag *bold, *italic, *underline; + GtkTextTag *bold_tag, *italic_tag, *underline_tag; gboolean all_bold, all_italic, all_underline; + GtkTextIter start, end; + gboolean has_selection; - has_selection = gtk_text_buffer_get_selection_bounds (gtk_text_view_get_buffer (tv), &start, &end); + bold = g_action_map_lookup_action (G_ACTION_MAP (actions), "bold"); + italic = g_action_map_lookup_action (G_ACTION_MAP (actions), "italic"); + underline = g_action_map_lookup_action (G_ACTION_MAP (actions), "underline"); + has_selection = gtk_text_buffer_get_selection_bounds (buffer, &start, &end); + g_simple_action_set_enabled (G_SIMPLE_ACTION (bold), has_selection); + g_simple_action_set_enabled (G_SIMPLE_ACTION (italic), has_selection); + g_simple_action_set_enabled (G_SIMPLE_ACTION (underline), has_selection); if (!has_selection) return; - tags = gtk_text_buffer_get_tag_table (gtk_text_view_get_buffer (tv)); - bold = gtk_text_tag_table_lookup (tags, "bold"); - italic = gtk_text_tag_table_lookup (tags, "italic"); - underline = gtk_text_tag_table_lookup (tags, "underline"); + tags = gtk_text_buffer_get_tag_table (buffer); + bold_tag = gtk_text_tag_table_lookup (tags, "bold"); + italic_tag = gtk_text_tag_table_lookup (tags, "italic"); + underline_tag = gtk_text_tag_table_lookup (tags, "underline"); all_bold = TRUE; all_italic = TRUE; all_underline = TRUE; gtk_text_iter_assign (&iter, &start); while (!gtk_text_iter_equal (&iter, &end)) { - all_bold &= gtk_text_iter_has_tag (&iter, bold); - all_italic &= gtk_text_iter_has_tag (&iter, italic); - all_underline &= gtk_text_iter_has_tag (&iter, underline); + all_bold &= gtk_text_iter_has_tag (&iter, bold_tag); + all_italic &= gtk_text_iter_has_tag (&iter, italic_tag); + all_underline &= gtk_text_iter_has_tag (&iter, underline_tag); gtk_text_iter_forward_char (&iter); } - if (GTK_IS_MENU (popup)) - { - item = gtk_separator_menu_item_new (); - gtk_widget_show (item); - gtk_container_add (GTK_CONTAINER (popup), item); - } + g_simple_action_set_state (G_SIMPLE_ACTION (bold), g_variant_new_boolean (all_bold)); + g_simple_action_set_state (G_SIMPLE_ACTION (italic), g_variant_new_boolean (all_italic)); + g_simple_action_set_state (G_SIMPLE_ACTION (underline), g_variant_new_boolean (all_underline)); +} - add_item (tv, popup, "Bold", "bold", all_bold); - add_item (tv, popup, "Italics", "italic", all_italic); - add_item (tv, popup, "Underline", "underline", all_underline); +static void +text_view_add_to_context_menu (GtkTextView *text_view) +{ + GMenu *menu; + GActionEntry entries[] = { + { "bold", NULL, NULL, "false", toggle_format }, + { "italic", NULL, NULL, "false", toggle_format }, + { "underline", NULL, NULL, "false", toggle_format }, + }; + GMenuItem *item; + GAction *action; + + actions = G_ACTION_GROUP (g_simple_action_group_new ()); + g_action_map_add_action_entries (G_ACTION_MAP (actions), entries, G_N_ELEMENTS (entries), text_view); + + action = g_action_map_lookup_action (G_ACTION_MAP (actions), "bold"); + g_simple_action_set_enabled (G_SIMPLE_ACTION (action), FALSE); + action = g_action_map_lookup_action (G_ACTION_MAP (actions), "italic"); + g_simple_action_set_enabled (G_SIMPLE_ACTION (action), FALSE); + action = g_action_map_lookup_action (G_ACTION_MAP (actions), "underline"); + g_simple_action_set_enabled (G_SIMPLE_ACTION (action), FALSE); + + gtk_widget_insert_action_group (GTK_WIDGET (text_view), "format", G_ACTION_GROUP (actions)); + + menu = g_menu_new (); + item = g_menu_item_new (_("Bold"), "format.bold"); + g_menu_item_set_attribute (item, "touch-icon", "s", "format-text-bold-symbolic"); + g_menu_append_item (G_MENU (menu), item); + g_object_unref (item); + item = g_menu_item_new (_("Italics"), "format.italic"); + g_menu_item_set_attribute (item, "touch-icon", "s", "format-text-italic-symbolic"); + g_menu_append_item (G_MENU (menu), item); + g_object_unref (item); + item = g_menu_item_new (_("Underline"), "format.underline"); + g_menu_item_set_attribute (item, "touch-icon", "s", "format-text-underline-symbolic"); + g_menu_append_item (G_MENU (menu), item); + + gtk_text_view_set_extra_menu (text_view, G_MENU_MODEL (menu)); + + g_signal_connect (gtk_text_view_get_buffer (text_view), "changed", G_CALLBACK (text_changed), NULL); + g_signal_connect (gtk_text_view_get_buffer (text_view), "mark-set", G_CALLBACK (text_changed), NULL); } static void @@ -1877,8 +1894,7 @@ activate (GApplication *app) g_object_set_data (G_OBJECT (widget), "osd", widget2); widget = (GtkWidget *)gtk_builder_get_object (builder, "textview1"); - g_signal_connect (widget, "populate-popup", - G_CALLBACK (populate_popup), NULL); + text_view_add_to_context_menu (GTK_TEXT_VIEW (widget)); widget = (GtkWidget *)gtk_builder_get_object (builder, "open_popover"); widget2 = (GtkWidget *)gtk_builder_get_object (builder, "open_popover_entry"); diff --git a/demos/widget-factory/widget-factory.ui b/demos/widget-factory/widget-factory.ui index f4292d5a1e..110e62e1a1 100644 --- a/demos/widget-factory/widget-factory.ui +++ b/demos/widget-factory/widget-factory.ui @@ -1207,7 +1207,6 @@ Suspendisse feugiat quam quis dolor accumsan cursus. 2 10 10 - 1 diff --git a/docs/reference/gtk/gtk4-sections.txt b/docs/reference/gtk/gtk4-sections.txt index 5efb6214c5..4d072641da 100644 --- a/docs/reference/gtk/gtk4-sections.txt +++ b/docs/reference/gtk/gtk4-sections.txt @@ -893,6 +893,8 @@ gtk_text_get_attributes gtk_text_set_tabs gtk_text_get_tabs gtk_text_grab_focus_without_selecting +gtk_text_set_extra_menu +gtk_text_get_extra_menu gtk_text_get_type @@ -963,6 +965,8 @@ GtkInputHints gtk_entry_set_input_hints gtk_entry_get_input_hints gtk_entry_grab_focus_without_selecting +gtk_entry_set_extra_menu +gtk_entry_get_extra_menu GTK_ENTRY @@ -985,6 +989,8 @@ GtkPasswordEntry gtk_password_entry_new gtk_password_entry_set_show_peek_icon gtk_password_entry_get_show_peek_icon +gtk_password_entry_set_extra_menu +gtk_password_entry_get_extra_menu gtk_password_entry_get_type @@ -1713,6 +1719,9 @@ gtk_label_set_single_line_mode gtk_label_get_current_uri gtk_label_set_track_visited_links gtk_label_get_track_visited_links +gtk_label_set_extra_menu +gtk_label_get_extra_menu + GTK_LABEL GTK_IS_LABEL @@ -3089,6 +3098,9 @@ gtk_text_view_set_input_hints gtk_text_view_get_input_hints gtk_text_view_set_monospace gtk_text_view_get_monospace +gtk_text_view_set_extra_menu +gtk_text_view_get_extra_menu + GTK_TEXT_VIEW_PRIORITY_VALIDATE GTK_TEXT_VIEW diff --git a/gtk/gtkcellrenderertext.c b/gtk/gtkcellrenderertext.c index 18a81940fc..a3b09a89b1 100644 --- a/gtk/gtkcellrenderertext.c +++ b/gtk/gtkcellrenderertext.c @@ -205,7 +205,6 @@ struct _GtkCellRendererTextPrivate guint align_set : 1; gulong focus_out_id; - gulong populate_popup_id; gulong entry_menu_popdown_timeout; }; @@ -1778,12 +1777,6 @@ gtk_cell_renderer_text_editing_done (GtkCellEditable *entry, priv->focus_out_id = 0; } - if (priv->populate_popup_id > 0) - { - g_signal_handler_disconnect (entry, priv->populate_popup_id); - priv->populate_popup_id = 0; - } - if (priv->entry_menu_popdown_timeout) { g_source_remove (priv->entry_menu_popdown_timeout); @@ -1804,70 +1797,14 @@ gtk_cell_renderer_text_editing_done (GtkCellEditable *entry, g_signal_emit (data, text_cell_renderer_signals[EDITED], 0, path, new_text); } -static gboolean -popdown_timeout (gpointer data) -{ - GtkCellRendererText *celltext = GTK_CELL_RENDERER_TEXT (data); - GtkCellRendererTextPrivate *priv = gtk_cell_renderer_text_get_instance_private (celltext); - - priv->entry_menu_popdown_timeout = 0; - - if (!gtk_widget_has_focus (priv->entry)) - gtk_cell_renderer_text_editing_done (GTK_CELL_EDITABLE (priv->entry), data); - - return FALSE; -} - -static void -gtk_cell_renderer_text_popup_unmap (GtkMenu *menu, - gpointer data) -{ - GtkCellRendererText *celltext = GTK_CELL_RENDERER_TEXT (data); - GtkCellRendererTextPrivate *priv = gtk_cell_renderer_text_get_instance_private (celltext); - - priv->in_entry_menu = FALSE; - - if (priv->entry_menu_popdown_timeout) - return; - - priv->entry_menu_popdown_timeout = g_timeout_add (500, popdown_timeout, data); - g_source_set_name_by_id (priv->entry_menu_popdown_timeout, "[gtk] popdown_timeout"); -} - -static void -gtk_cell_renderer_text_populate_popup (GtkEntry *entry, - GtkMenu *menu, - gpointer data) -{ - GtkCellRendererText *celltext = GTK_CELL_RENDERER_TEXT (data); - GtkCellRendererTextPrivate *priv = gtk_cell_renderer_text_get_instance_private (celltext); - - if (priv->entry_menu_popdown_timeout) - { - g_source_remove (priv->entry_menu_popdown_timeout); - priv->entry_menu_popdown_timeout = 0; - } - - priv->in_entry_menu = TRUE; - - g_signal_connect (menu, "unmap", - G_CALLBACK (gtk_cell_renderer_text_popup_unmap), data); -} - static void gtk_cell_renderer_text_focus_changed (GtkWidget *entry, GParamSpec *pspec, gpointer data) { - GtkCellRendererText *celltext = GTK_CELL_RENDERER_TEXT (data); - GtkCellRendererTextPrivate *priv = gtk_cell_renderer_text_get_instance_private (celltext); - if (gtk_widget_has_focus (entry)) return; - if (priv->in_entry_menu) - return; - g_object_set (entry, "editing-canceled", TRUE, NULL); @@ -1921,11 +1858,6 @@ gtk_cell_renderer_text_start_editing (GtkCellRenderer *cell, priv->focus_out_id = g_signal_connect_after (priv->entry, "notify::has-focus", G_CALLBACK (gtk_cell_renderer_text_focus_changed), celltext); - priv->populate_popup_id = - g_signal_connect (priv->entry, "populate-popup", - G_CALLBACK (gtk_cell_renderer_text_populate_popup), - celltext); - gtk_widget_show (priv->entry); return GTK_CELL_EDITABLE (priv->entry); diff --git a/gtk/gtkcolorchooserwidget.c b/gtk/gtkcolorchooserwidget.c index b2cfdac794..4172eb296b 100644 --- a/gtk/gtkcolorchooserwidget.c +++ b/gtk/gtkcolorchooserwidget.c @@ -90,6 +90,8 @@ struct _GtkColorChooserWidgetPrivate gboolean has_default_palette; GSettings *settings; + + GActionMap *context_actions; }; enum @@ -134,31 +136,6 @@ select_swatch (GtkColorChooserWidget *cc, g_object_notify (G_OBJECT (cc), "rgba"); } -static void -swatch_activate (GtkColorSwatch *swatch, - GtkColorChooserWidget *cc) -{ - GdkRGBA color; - - gtk_color_swatch_get_rgba (swatch, &color); - _gtk_color_chooser_color_activated (GTK_COLOR_CHOOSER (cc), &color); -} - -static void -swatch_customize (GtkColorSwatch *swatch, - GtkColorChooserWidget *cc) -{ - GtkColorChooserWidgetPrivate *priv = gtk_color_chooser_widget_get_instance_private (cc); - GdkRGBA color; - - gtk_color_swatch_get_rgba (swatch, &color); - gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER (priv->editor), &color); - - gtk_widget_hide (priv->palette); - gtk_widget_show (priv->editor); - g_object_notify (G_OBJECT (cc), "show-editor"); -} - static void swatch_selected (GtkColorSwatch *swatch, GtkStateFlags previous, @@ -176,31 +153,14 @@ static void connect_swatch_signals (GtkWidget *p, gpointer data) { - g_signal_connect (p, "activate", G_CALLBACK (swatch_activate), data); - g_signal_connect (p, "customize", G_CALLBACK (swatch_customize), data); g_signal_connect (p, "state-flags-changed", G_CALLBACK (swatch_selected), data); } -static void -button_activate (GtkColorSwatch *swatch, - GtkColorChooserWidget *cc) -{ - GtkColorChooserWidgetPrivate *priv = gtk_color_chooser_widget_get_instance_private (cc); - /* somewhat random, makes the hairline nicely visible */ - GdkRGBA color = { 0.75, 0.25, 0.25, 1.0 }; - - gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER (priv->editor), &color); - - gtk_widget_hide (priv->palette); - gtk_widget_show (priv->editor); - g_object_notify (G_OBJECT (cc), "show-editor"); -} - static void connect_button_signals (GtkWidget *p, gpointer data) { - g_signal_connect (p, "activate", G_CALLBACK (button_activate), data); +// g_signal_connect (p, "activate", G_CALLBACK (button_activate), data); } static void @@ -532,6 +492,57 @@ add_default_palette (GtkColorChooserWidget *cc) priv->has_default_palette = TRUE; } +static void +customize_color (GSimpleAction *action, + GVariant *parameter, + gpointer user_data) +{ + GtkColorChooserWidget *cc = user_data; + GtkColorChooserWidgetPrivate *priv = gtk_color_chooser_widget_get_instance_private (cc); + GdkRGBA color; + + g_variant_get (parameter, "(dddd)", &color.red, &color.green, &color.blue, &color.alpha); + + gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER (priv->editor), &color); + + gtk_widget_hide (priv->palette); + gtk_widget_show (priv->editor); + g_object_notify (G_OBJECT (cc), "show-editor"); +} + +static void +select_color (GSimpleAction *action, + GVariant *parameter, + gpointer user_data) +{ + GtkColorChooserWidget *cc = user_data; + GdkRGBA color; + + g_variant_get (parameter, "(dddd)", &color.red, &color.green, &color.blue, &color.alpha); + + _gtk_color_chooser_color_activated (GTK_COLOR_CHOOSER (cc), &color); +} + +static void +gtk_color_chooser_widget_add_context_actions (GtkColorChooserWidget *cc) +{ + GtkColorChooserWidgetPrivate *priv = gtk_color_chooser_widget_get_instance_private (cc); + + GActionEntry entries[] = { + { "select", select_color, "(dddd)", NULL, NULL }, + { "customize", customize_color, "(dddd)", NULL, NULL }, + }; + + GSimpleActionGroup *actions = g_simple_action_group_new (); + + priv->context_actions = G_ACTION_MAP (actions); + + g_action_map_add_action_entries (G_ACTION_MAP (actions), entries, G_N_ELEMENTS (entries), cc); + + gtk_widget_insert_action_group (GTK_WIDGET (cc), "color", G_ACTION_GROUP (actions)); +} + + static void gtk_color_chooser_widget_init (GtkColorChooserWidget *cc) { @@ -623,6 +634,8 @@ gtk_color_chooser_widget_init (GtkColorChooserWidget *cc) priv->size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); gtk_size_group_add_widget (priv->size_group, priv->palette); gtk_size_group_add_widget (priv->size_group, box); + + gtk_color_chooser_widget_add_context_actions (cc); } /* GObject implementation {{{1 */ diff --git a/gtk/gtkcolorswatch.c b/gtk/gtkcolorswatch.c index a5d3f52499..6932fa2413 100644 --- a/gtk/gtkcolorswatch.c +++ b/gtk/gtkcolorswatch.c @@ -33,7 +33,7 @@ #include "gtkintl.h" #include "gtkmain.h" #include "gtkmodelbutton.h" -#include "gtkpopover.h" +#include "gtkpopovermenu.h" #include "gtkprivate.h" #include "gtksnapshot.h" #include "gtkstylecontextprivate.h" @@ -76,16 +76,6 @@ enum PROP_HAS_MENU }; -enum -{ - ACTIVATE, - CUSTOMIZE, - LAST_SIGNAL -}; - -static guint signals[LAST_SIGNAL]; - - G_DEFINE_TYPE_WITH_PRIVATE (GtkColorSwatch, gtk_color_swatch, GTK_TYPE_WIDGET) #define INTENSITY(r, g, b) ((r) * 0.30 + (g) * 0.59 + (b) * 0.11) @@ -231,6 +221,32 @@ swatch_drag_data_received (GtkWidget *widget, gtk_color_swatch_set_rgba (GTK_COLOR_SWATCH (widget), &color); } +static void +activate_color (GtkColorSwatch *swatch) +{ + GtkColorSwatchPrivate *priv = gtk_color_swatch_get_instance_private (swatch); + gtk_widget_activate_action (GTK_WIDGET (swatch), + "color.select", + g_variant_new ("(dddd)", + priv->color.red, + priv->color.green, + priv->color.blue, + priv->color.alpha)); +} + +static void +customize_color (GtkColorSwatch *swatch) +{ + GtkColorSwatchPrivate *priv = gtk_color_swatch_get_instance_private (swatch); + gtk_widget_activate_action (GTK_WIDGET (swatch), + "color.customize", + g_variant_new ("(dddd)", + priv->color.red, + priv->color.green, + priv->color.blue, + priv->color.alpha)); +} + static gboolean key_controller_key_pressed (GtkEventControllerKey *controller, guint keyval, @@ -252,40 +268,51 @@ key_controller_key_pressed (GtkEventControllerKey *controller, (gtk_widget_get_state_flags (widget) & GTK_STATE_FLAG_SELECTED) == 0) gtk_widget_set_state_flags (widget, GTK_STATE_FLAG_SELECTED, FALSE); else - g_signal_emit (swatch, signals[ACTIVATE], 0); + customize_color (swatch); + return TRUE; } return FALSE; } -static void -emit_customize (GtkColorSwatch *swatch) +static GMenuModel * +gtk_color_swatch_get_menu_model (GtkColorSwatch *swatch) { - g_signal_emit (swatch, signals[CUSTOMIZE], 0); + GtkColorSwatchPrivate *priv = gtk_color_swatch_get_instance_private (swatch); + GMenu *menu, *section; + GMenuItem *item; + + menu = g_menu_new (); + + section = g_menu_new (); + item = g_menu_item_new (_("Customize"), NULL); + g_menu_item_set_action_and_target_value (item, "color.customize", + g_variant_new ("(dddd)", + priv->color.red, + priv->color.green, + priv->color.blue, + priv->color.alpha)); + + g_menu_append_item (section, item); + g_menu_append_section (menu, NULL, G_MENU_MODEL (section)); + g_object_unref (item); + g_object_unref (section); + + return G_MENU_MODEL (menu); } static void do_popup (GtkColorSwatch *swatch) { GtkColorSwatchPrivate *priv = gtk_color_swatch_get_instance_private (swatch); + GMenuModel *model; - if (priv->popover == NULL) - { - GtkWidget *box; - GtkWidget *item; + g_clear_pointer (&priv->popover, gtk_widget_unparent); - priv->popover = gtk_popover_new (GTK_WIDGET (swatch)); - box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); - gtk_container_add (GTK_CONTAINER (priv->popover), box); - g_object_set (box, "margin", 10, NULL); - item = g_object_new (GTK_TYPE_MODEL_BUTTON, - "text", _("C_ustomize"), - NULL); - g_signal_connect_swapped (item, "clicked", - G_CALLBACK (emit_customize), swatch); - gtk_container_add (GTK_CONTAINER (box), item); - } + model = gtk_color_swatch_get_menu_model (swatch); + priv->popover = gtk_popover_menu_new_from_model (GTK_WIDGET (swatch), model); + g_object_unref (model); gtk_popover_popup (GTK_POPOVER (priv->popover)); } @@ -300,7 +327,7 @@ swatch_primary_action (GtkColorSwatch *swatch) flags = gtk_widget_get_state_flags (widget); if (!priv->has_color) { - g_signal_emit (swatch, signals[ACTIVATE], 0); + customize_color (swatch); return TRUE; } else if (priv->selectable && @@ -340,7 +367,7 @@ tap_action (GtkGestureClick *gesture, if (n_press == 1) swatch_primary_action (swatch); else if (n_press > 1) - g_signal_emit (swatch, signals[ACTIVATE], 0); + activate_color (swatch); } else if (button == GDK_BUTTON_SECONDARY) { @@ -505,7 +532,7 @@ swatch_dispose (GObject *object) GtkColorSwatch *swatch = GTK_COLOR_SWATCH (object); GtkColorSwatchPrivate *priv = gtk_color_swatch_get_instance_private (swatch); - g_clear_pointer (&priv->popover, gtk_widget_destroy); + g_clear_pointer (&priv->popover, gtk_widget_unparent); G_OBJECT_CLASS (gtk_color_swatch_parent_class)->dispose (object); } @@ -530,20 +557,6 @@ gtk_color_swatch_class_init (GtkColorSwatchClass *class) widget_class->size_allocate = swatch_size_allocate; widget_class->state_flags_changed = swatch_state_flags_changed; - signals[ACTIVATE] = - g_signal_new (I_("activate"), - GTK_TYPE_COLOR_SWATCH, - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (GtkColorSwatchClass, activate), - NULL, NULL, NULL, G_TYPE_NONE, 0); - - signals[CUSTOMIZE] = - g_signal_new (I_("customize"), - GTK_TYPE_COLOR_SWATCH, - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (GtkColorSwatchClass, customize), - NULL, NULL, NULL, G_TYPE_NONE, 0); - g_object_class_install_property (object_class, PROP_RGBA, g_param_spec_boxed ("rgba", P_("RGBA Color"), P_("Color as RGBA"), GDK_TYPE_RGBA, GTK_PARAM_READWRITE)); @@ -569,6 +582,10 @@ gtk_color_swatch_init (GtkColorSwatch *swatch) priv->use_alpha = TRUE; priv->selectable = TRUE; priv->has_menu = TRUE; + priv->color.red = 0.75; + priv->color.green = 0.25; + priv->color.blue = 0.25; + priv->color.alpha = 1.0; gtk_widget_set_can_focus (GTK_WIDGET (swatch), TRUE); gtk_widget_set_overflow (GTK_WIDGET (swatch), GTK_OVERFLOW_HIDDEN); diff --git a/gtk/gtkentry.c b/gtk/gtkentry.c index e1cf3131f0..878cfee2f3 100644 --- a/gtk/gtkentry.c +++ b/gtk/gtkentry.c @@ -222,8 +222,8 @@ enum { PROP_INPUT_PURPOSE, PROP_INPUT_HINTS, PROP_ATTRIBUTES, - PROP_POPULATE_ALL, PROP_TABS, + PROP_EXTRA_MENU, PROP_SHOW_EMOJI_ICON, PROP_ENABLE_EMOJI_COMPLETION, PROP_EDITING_CANCELED, @@ -798,19 +798,6 @@ gtk_entry_class_init (GtkEntryClass *class) PANGO_TYPE_ATTR_LIST, GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY); - /** - * GtkEntry:populate-all: - * - * If :populate-all is %TRUE, the #GtkEntry::populate-popup - * signal is also emitted for touch popups. - */ - entry_props[PROP_POPULATE_ALL] = - g_param_spec_boolean ("populate-all", - P_("Populate all"), - P_("Whether to emit ::populate-popup for touch popups"), - FALSE, - GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY); - /** * GtkEntry::tabs: * @@ -836,6 +823,19 @@ gtk_entry_class_init (GtkEntryClass *class) FALSE, GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY); + /** + * GtkEntry:extra-menu: + * + * A menu model whose contents will be appended to + * the context menu. + */ + entry_props[PROP_EXTRA_MENU] = + g_param_spec_object ("extra-menu", + P_("Extra menu"), + P_("Model menu to append to the context menu"), + G_TYPE_MENU_MODEL, + GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY); + entry_props[PROP_ENABLE_EMOJI_COMPLETION] = g_param_spec_boolean ("enable-emoji-completion", P_("Enable Emoji completion"), @@ -944,7 +944,6 @@ gtk_entry_set_property (GObject *object, case PROP_INPUT_PURPOSE: case PROP_INPUT_HINTS: case PROP_ATTRIBUTES: - case PROP_POPULATE_ALL: case PROP_TABS: case PROP_ENABLE_EMOJI_COMPLETION: g_object_set_property (G_OBJECT (priv->text), pspec->name, value); @@ -1062,6 +1061,10 @@ gtk_entry_set_property (GObject *object, set_show_emoji_icon (entry, g_value_get_boolean (value)); break; + case PROP_EXTRA_MENU: + gtk_entry_set_extra_menu (entry, g_value_get_object (value)); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -1096,7 +1099,6 @@ gtk_entry_get_property (GObject *object, case PROP_INPUT_PURPOSE: case PROP_INPUT_HINTS: case PROP_ATTRIBUTES: - case PROP_POPULATE_ALL: case PROP_TABS: case PROP_ENABLE_EMOJI_COMPLETION: g_object_get_property (G_OBJECT (priv->text), pspec->name, value); @@ -1219,6 +1221,10 @@ gtk_entry_get_property (GObject *object, g_value_set_boolean (value, priv->show_emoji_icon); break; + case PROP_EXTRA_MENU: + g_value_set_object (value, gtk_entry_get_extra_menu (entry)); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -3471,6 +3477,8 @@ set_show_emoji_icon (GtkEntry *entry, gboolean value) { GtkEntryPrivate *priv = gtk_entry_get_instance_private (entry); + GActionGroup *actions; + GAction *action; if (priv->show_emoji_icon == value) return; @@ -3512,6 +3520,12 @@ set_show_emoji_icon (GtkEntry *entry, g_object_notify_by_pspec (G_OBJECT (entry), entry_props[PROP_SHOW_EMOJI_ICON]); gtk_widget_queue_resize (GTK_WIDGET (entry)); + + actions = gtk_widget_get_action_group (priv->text, "context"); + action = g_action_map_lookup_action (G_ACTION_MAP (actions), "insert-emoji"); + g_simple_action_set_enabled (G_SIMPLE_ACTION (action), + priv->show_emoji_icon || + (gtk_entry_get_input_hints (entry) & GTK_INPUT_HINT_NO_EMOJI) == 0); } GtkEventController * @@ -3529,3 +3543,42 @@ gtk_entry_get_text_widget (GtkEntry *entry) return GTK_TEXT (priv->text); } + +/** + * gtk_entry_set_extra_menu: + * @entry: a #GtkEntry + * @model: (allow-none): a #GMenuModel + * + * Sets a menu model to add when constructing + * the context menu for @entry. + */ +void +gtk_entry_set_extra_menu (GtkEntry *entry, + GMenuModel *model) +{ + GtkEntryPrivate *priv = gtk_entry_get_instance_private (entry); + + g_return_if_fail (GTK_IS_ENTRY (entry)); + + gtk_text_set_extra_menu (GTK_TEXT (priv->text), model); + + g_object_notify_by_pspec (G_OBJECT (entry), entry_props[PROP_EXTRA_MENU]); +} + +/** + * gtk_entry_get_extra_menu: + * @self: a #GtkText + * + * Gets the menu model set with gtk_entry_set_extra_menu(). + * + * Returns: (transfer none): (nullable): the menu model + */ +GMenuModel * +gtk_entry_get_extra_menu (GtkEntry *entry) +{ + GtkEntryPrivate *priv = gtk_entry_get_instance_private (entry); + + g_return_val_if_fail (GTK_IS_ENTRY (entry), NULL); + + return gtk_text_get_extra_menu (GTK_TEXT (priv->text)); +} diff --git a/gtk/gtkentry.h b/gtk/gtkentry.h index 1048382271..b71c4d3ac6 100644 --- a/gtk/gtkentry.h +++ b/gtk/gtkentry.h @@ -77,9 +77,6 @@ struct _GtkEntry /** * GtkEntryClass: * @parent_class: The parent class. - * @populate_popup: Class handler for the #GtkEntry::populate-popup signal. If - * non-%NULL, this will be called to add additional entries to the context - * menu when it is displayed. * @activate: Class handler for the #GtkEntry::activate signal. The default * implementation activates the gtk.activate-default action. * @move_cursor: Class handler for the #GtkEntry::move-cursor signal. The @@ -310,6 +307,12 @@ PangoTabArray *gtk_entry_get_tabs (GtkEntry GDK_AVAILABLE_IN_ALL void gtk_entry_grab_focus_without_selecting (GtkEntry *entry); +GDK_AVAILABLE_IN_ALL +void gtk_entry_set_extra_menu (GtkEntry *entry, + GMenuModel *model); +GDK_AVAILABLE_IN_ALL +GMenuModel * gtk_entry_get_extra_menu (GtkEntry *entry); + G_END_DECLS #endif /* __GTK_ENTRY_H__ */ diff --git a/gtk/gtklabel.c b/gtk/gtklabel.c index ffc6d05e6e..6bc134edc2 100644 --- a/gtk/gtklabel.c +++ b/gtk/gtklabel.c @@ -55,6 +55,8 @@ #include "gtktypebuiltins.h" #include "gtkwidgetprivate.h" #include "gtkwindow.h" +#include "gtkpopovermenu.h" +#include "gtknative.h" #include "a11y/gtklabelaccessibleprivate.h" @@ -269,9 +271,6 @@ struct _GtkLabelClass gboolean extend_selection); void (* copy_clipboard) (GtkLabel *label); - void (* populate_popup) (GtkLabel *label, - GtkMenu *menu); - gboolean (*activate_link) (GtkLabel *label, const gchar *uri); }; @@ -286,6 +285,10 @@ struct _GtkLabelPrivate PangoAttrList *markup_attrs; PangoLayout *layout; + GActionMap *context_actions; + GtkWidget *popup_menu; + GMenuModel *extra_menu; + gchar *label; gchar *text; @@ -355,12 +358,12 @@ struct _GtkLabelSelectionInfo { gint selection_anchor; gint selection_end; - GtkWidget *popup_menu; GtkCssNode *selection_node; GdkContentProvider *provider; GList *links; GtkLabelLink *active_link; + GtkLabelLink *context_link; GtkGesture *drag_gesture; GtkGesture *click_gesture; @@ -378,7 +381,6 @@ struct _GtkLabelSelectionInfo enum { MOVE_CURSOR, COPY_CLIPBOARD, - POPULATE_POPUP, ACTIVATE_LINK, ACTIVATE_CURRENT_LINK, LAST_SIGNAL @@ -407,6 +409,7 @@ enum { PROP_LINES, PROP_XALIGN, PROP_YALIGN, + PROP_EXTRA_MENU, NUM_PROPERTIES }; @@ -444,7 +447,6 @@ static gboolean gtk_label_focus (GtkWidget *widget, static void gtk_label_realize (GtkWidget *widget); static void gtk_label_unrealize (GtkWidget *widget); -static void gtk_label_unmap (GtkWidget *widget); static void gtk_label_motion (GtkEventControllerMotion *controller, double x, @@ -483,6 +485,9 @@ static void gtk_label_recalculate (GtkLabel *label); static void gtk_label_root (GtkWidget *widget); static void gtk_label_unroot (GtkWidget *widget); static gboolean gtk_label_popup_menu (GtkWidget *widget); +static void gtk_label_do_popup (GtkLabel *label, + double x, + double y); static void gtk_label_set_selectable_hint (GtkLabel *label); static void gtk_label_ensure_select_info (GtkLabel *label); @@ -536,8 +541,6 @@ static void gtk_label_move_cursor (GtkLabel *label, gboolean extend_selection); static void gtk_label_copy_clipboard (GtkLabel *label); static void gtk_label_select_all (GtkLabel *label); -static void gtk_label_do_popup (GtkLabel *label, - const GdkEvent *event); static gint gtk_label_move_forward_word (GtkLabel *label, gint start); static gint gtk_label_move_backward_word (GtkLabel *label, @@ -572,6 +575,9 @@ static void gtk_label_drag_gesture_update (GtkGestureDrag *gesture, gdouble offset_y, GtkLabel *label); +static void gtk_label_add_context_actions (GtkLabel *label); +static void gtk_label_update_clipboard_actions (GtkLabel *label); + static GtkSizeRequestMode gtk_label_get_request_mode (GtkWidget *widget); static void gtk_label_measure (GtkWidget *widget, GtkOrientation orientation, @@ -581,6 +587,8 @@ static void gtk_label_measure (GtkWidget *widget, int *minimum_baseline, int *natural_baseline); + + static GtkBuildableIface *buildable_parent_iface = NULL; G_DEFINE_TYPE_WITH_CODE (GtkLabel, gtk_label, GTK_TYPE_WIDGET, @@ -630,13 +638,12 @@ gtk_label_class_init (GtkLabelClass *class) widget_class->snapshot = gtk_label_snapshot; widget_class->realize = gtk_label_realize; widget_class->unrealize = gtk_label_unrealize; - widget_class->unmap = gtk_label_unmap; widget_class->root = gtk_label_root; widget_class->unroot = gtk_label_unroot; widget_class->mnemonic_activate = gtk_label_mnemonic_activate; + widget_class->popup_menu = gtk_label_popup_menu; widget_class->drag_data_get = gtk_label_drag_data_get; widget_class->grab_focus = gtk_label_grab_focus; - widget_class->popup_menu = gtk_label_popup_menu; widget_class->focus = gtk_label_focus; widget_class->get_request_mode = gtk_label_get_request_mode; widget_class->measure = gtk_label_measure; @@ -701,28 +708,6 @@ gtk_label_class_init (GtkLabelClass *class) NULL, G_TYPE_NONE, 0); - /** - * GtkLabel::populate-popup: - * @label: The label on which the signal is emitted - * @menu: the menu that is being populated - * - * The ::populate-popup signal gets emitted before showing the - * context menu of the label. Note that only selectable labels - * have context menus. - * - * If you need to add items to the context menu, connect - * to this signal and append your menuitems to the @menu. - */ - signals[POPULATE_POPUP] = - g_signal_new (I_("populate-popup"), - G_OBJECT_CLASS_TYPE (gobject_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (GtkLabelClass, populate_popup), - NULL, NULL, - NULL, - G_TYPE_NONE, 1, - GTK_TYPE_MENU); - /** * GtkLabel::activate-current-link: * @label: The label on which the signal was emitted @@ -1019,6 +1004,19 @@ gtk_label_class_init (GtkLabelClass *class) -1, GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY); + /** + * GtkLabel:extra-menu: + * + * A menu model whose contents will be appended to + * the context menu. + */ + label_props[PROP_EXTRA_MENU] = + g_param_spec_object ("extra-menu", + P_("Extra menu"), + P_("Menu model to append to the context menu"), + G_TYPE_MENU_MODEL, + GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY); + g_object_class_install_properties (gobject_class, NUM_PROPERTIES, label_props); /* @@ -1211,6 +1209,9 @@ gtk_label_set_property (GObject *object, case PROP_YALIGN: gtk_label_set_yalign (label, g_value_get_float (value)); break; + case PROP_EXTRA_MENU: + gtk_label_set_extra_menu (label, g_value_get_object (value)); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -1288,6 +1289,9 @@ gtk_label_get_property (GObject *object, case PROP_YALIGN: g_value_set_float (value, gtk_label_get_yalign (label)); break; + case PROP_EXTRA_MENU: + g_value_set_object (value, gtk_label_get_extra_menu (label)); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -1326,6 +1330,8 @@ gtk_label_init (GtkLabel *label) priv->mnemonic_window = NULL; priv->mnemonics_visible = TRUE; + + gtk_label_add_context_actions (label); } @@ -3199,6 +3205,10 @@ gtk_label_finalize (GObject *object) gtk_label_clear_links (label); g_free (priv->select_info); + g_clear_object (&priv->context_actions); + g_clear_pointer (&priv->popup_menu, gtk_widget_unparent); + g_clear_object (&priv->extra_menu); + G_OBJECT_CLASS (gtk_label_parent_class)->finalize (object); } @@ -3681,6 +3691,9 @@ gtk_label_size_allocate (GtkWidget *widget, else pango_layout_set_width (priv->layout, -1); } + + if (priv->popup_menu) + gtk_native_check_resize (GTK_NATIVE (priv->popup_menu)); } static void @@ -4115,24 +4128,6 @@ gtk_label_unrealize (GtkWidget *widget) GTK_WIDGET_CLASS (gtk_label_parent_class)->unrealize (widget); } -static void -gtk_label_unmap (GtkWidget *widget) -{ - GtkLabel *label = GTK_LABEL (widget); - GtkLabelPrivate *priv = gtk_label_get_instance_private (label); - - if (priv->select_info) - { - if (priv->select_info->popup_menu) - { - gtk_widget_destroy (priv->select_info->popup_menu); - priv->select_info->popup_menu = NULL; - } - } - - GTK_WIDGET_CLASS (gtk_label_parent_class)->unmap (widget); -} - static gboolean get_layout_index (GtkLabel *label, gint x, @@ -4471,7 +4466,7 @@ gtk_label_click_gesture_pressed (GtkGestureClick *gesture, { info->link_clicked = 1; update_link_state (label); - gtk_label_do_popup (label, event); + gtk_label_do_popup (label, widget_x, widget_y); return; } else if (button == GDK_BUTTON_PRIMARY) @@ -4494,7 +4489,7 @@ gtk_label_click_gesture_pressed (GtkGestureClick *gesture, info->select_words = FALSE; if (gdk_event_triggers_context_menu (event)) - gtk_label_do_popup (label, event); + gtk_label_do_popup (label, widget_x, widget_y); else if (button == GDK_BUTTON_PRIMARY) { if (!gtk_widget_has_focus (widget)) @@ -5972,167 +5967,220 @@ gtk_label_select_all (GtkLabel *label) gtk_label_select_region_index (label, 0, strlen (priv->text)); } -/* Quick hack of a popup menu - */ static void -activate_cb (GtkWidget *menuitem, - GtkLabel *label) +open_link_activated (GSimpleAction *action, + GVariant *parameter, + gpointer user_data) { - const gchar *signal = g_object_get_qdata (G_OBJECT (menuitem), quark_gtk_signal); - g_signal_emit_by_name (label, signal); -} - -static void -append_action_signal (GtkLabel *label, - GtkWidget *menu, - const gchar *text, - const gchar *signal, - gboolean sensitive) -{ - GtkWidget *menuitem = gtk_menu_item_new_with_mnemonic (text); - - g_object_set_qdata (G_OBJECT (menuitem), quark_gtk_signal, (char *)signal); - g_signal_connect (menuitem, "activate", - G_CALLBACK (activate_cb), label); - - gtk_widget_set_sensitive (menuitem, sensitive); - - gtk_widget_show (menuitem); - gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); -} - -static void -popup_menu_detach (GtkWidget *attach_widget, - GtkMenu *menu) -{ - GtkLabel *label = GTK_LABEL (attach_widget); + GtkLabel *label = GTK_LABEL (user_data); GtkLabelPrivate *priv = gtk_label_get_instance_private (label); + GtkLabelLink *link = priv->select_info->context_link; + + if (link) + emit_activate_link (label, link); +} + +static void +copy_link_activated (GSimpleAction *action, + GVariant *parameter, + gpointer user_data) +{ + GtkLabel *label = GTK_LABEL (user_data); + GtkLabelPrivate *priv = gtk_label_get_instance_private (label); + GtkLabelLink *link = priv->select_info->context_link; + + if (link) + { + GdkClipboard *clipboard; + + clipboard = gtk_widget_get_clipboard (GTK_WIDGET (label)); + gdk_clipboard_set_text (clipboard, link->uri); + } +} + +static void +copy_clipboard_activated (GSimpleAction *action, + GVariant *parameter, + gpointer user_data) +{ + g_signal_emit_by_name (user_data, "copy-clipboard"); +} + +static void +select_all_activated (GSimpleAction *action, + GVariant *parameter, + gpointer user_data) +{ + gtk_label_select_all (GTK_LABEL (user_data)); +} + +static void +gtk_label_update_clipboard_actions (GtkLabel *label) +{ + GtkLabelPrivate *priv = gtk_label_get_instance_private (label); + gboolean have_selection = FALSE; + GAction *action; if (priv->select_info) - priv->select_info->popup_menu = NULL; + have_selection = priv->select_info->selection_anchor != priv->select_info->selection_end; + + action = g_action_map_lookup_action (priv->context_actions, "copy-clipboard"); + g_simple_action_set_enabled (G_SIMPLE_ACTION (action), have_selection); + action = g_action_map_lookup_action (priv->context_actions, "select-all"); + g_simple_action_set_enabled (G_SIMPLE_ACTION (action), gtk_label_get_selectable (label)); } static void -open_link_activate_cb (GtkMenuItem *menuitem, - GtkLabel *label) +gtk_label_update_link_actions (GtkLabel *label) { + GtkLabelPrivate *priv = gtk_label_get_instance_private (label); + gboolean have_selection = FALSE; + GAction *action; GtkLabelLink *link; - link = g_object_get_qdata (G_OBJECT (menuitem), quark_link); - emit_activate_link (label, link); + have_selection = priv->select_info->selection_anchor != priv->select_info->selection_end; + if (priv->select_info->link_clicked) + link = priv->select_info->active_link; + else + link = gtk_label_get_focus_link (label); + + action = g_action_map_lookup_action (priv->context_actions, "open-link"); + g_simple_action_set_enabled (G_SIMPLE_ACTION (action), !have_selection && link); + action = g_action_map_lookup_action (priv->context_actions, "copy-link"); + g_simple_action_set_enabled (G_SIMPLE_ACTION (action), !have_selection && link); } static void -copy_link_activate_cb (GtkMenuItem *menuitem, - GtkLabel *label) +gtk_label_add_context_actions (GtkLabel *label) { - GtkLabelLink *link; - GdkClipboard *clipboard; + GtkLabelPrivate *priv = gtk_label_get_instance_private (label); - link = g_object_get_qdata (G_OBJECT (menuitem), quark_link); - clipboard = gtk_widget_get_clipboard (GTK_WIDGET (label)); - gdk_clipboard_set_text (clipboard, link->uri); + GActionEntry entries[] = { + { "cut-clipboard", NULL, NULL, NULL, NULL }, + { "copy-clipboard", copy_clipboard_activated, NULL, NULL, NULL }, + { "paste-clipboard", NULL, NULL, NULL, NULL }, + { "delete-selection", NULL, NULL, NULL, NULL }, + { "select-all", select_all_activated, NULL, NULL, NULL }, + { "open-link", open_link_activated, NULL, NULL, NULL }, + { "copy-link", copy_link_activated, NULL, NULL, NULL }, + }; + + GSimpleActionGroup *actions = g_simple_action_group_new (); + GAction *action; + + priv->context_actions = G_ACTION_MAP (actions); + + g_action_map_add_action_entries (G_ACTION_MAP (actions), entries, G_N_ELEMENTS (entries), label); + + action = g_action_map_lookup_action (G_ACTION_MAP (actions), "cut-clipboard"); + g_simple_action_set_enabled (G_SIMPLE_ACTION (action), FALSE); + action = g_action_map_lookup_action (G_ACTION_MAP (actions), "copy-clipboard"); + g_simple_action_set_enabled (G_SIMPLE_ACTION (action), FALSE); + action = g_action_map_lookup_action (G_ACTION_MAP (actions), "paste-clipboard"); + g_simple_action_set_enabled (G_SIMPLE_ACTION (action), FALSE); + action = g_action_map_lookup_action (G_ACTION_MAP (actions), "delete-selection"); + g_simple_action_set_enabled (G_SIMPLE_ACTION (action), FALSE); + action = g_action_map_lookup_action (G_ACTION_MAP (actions), "select-all"); + g_simple_action_set_enabled (G_SIMPLE_ACTION (action), FALSE); + action = g_action_map_lookup_action (G_ACTION_MAP (actions), "open-link"); + g_simple_action_set_enabled (G_SIMPLE_ACTION (action), FALSE); + action = g_action_map_lookup_action (G_ACTION_MAP (actions), "copy-link"); + g_simple_action_set_enabled (G_SIMPLE_ACTION (action), FALSE); + + gtk_widget_insert_action_group (GTK_WIDGET (label), "context", G_ACTION_GROUP (actions)); +} + +static GMenuModel * +gtk_label_get_menu_model (GtkLabel *label) +{ + GtkLabelPrivate *priv = gtk_label_get_instance_private (label); + GMenu *menu, *section; + GMenuItem *item; + + menu = g_menu_new (); + + section = g_menu_new (); + g_menu_append (section, _("Cu_t"), "context.cut-clipboard"); + g_menu_append (section, _("_Copy"), "context.copy-clipboard"); + g_menu_append (section, _("_Paste"), "context.paste-clipboard"); + g_menu_append (section, _("_Delete"), "context.delete-selection"); + g_menu_append_section (menu, NULL, G_MENU_MODEL (section)); + g_object_unref (section); + + section = g_menu_new (); + g_menu_append (section, _("Select _All"), "context.select-all"); + g_menu_append_section (menu, NULL, G_MENU_MODEL (section)); + g_object_unref (section); + + section = g_menu_new (); + item = g_menu_item_new (_("_Open Link"), "context.open-link"); + g_menu_item_set_attribute (item, "hidden-when", "s", "action-disabled"); + g_menu_append_item (section, item); + g_object_unref (item); + item = g_menu_item_new (_("Copy _Link Address"), "context.copy-link"); + g_menu_item_set_attribute (item, "hidden-when", "s", "action-disabled"); + g_menu_append_item (section, item); + g_object_unref (item); + g_menu_append_section (menu, NULL, G_MENU_MODEL (section)); + g_object_unref (section); + + if (priv->extra_menu) + g_menu_append_section (menu, NULL, priv->extra_menu); + + return G_MENU_MODEL (menu); +} + +static void +gtk_label_do_popup (GtkLabel *label, + double x, + double y) +{ + GtkLabelPrivate *priv = gtk_label_get_instance_private (label); + + gtk_label_update_clipboard_actions (label); + gtk_label_update_link_actions (label); + + if (!priv->popup_menu) + { + GMenuModel *model; + + model = gtk_label_get_menu_model (label); + priv->popup_menu = gtk_popover_menu_new_from_model (GTK_WIDGET (label), model); + gtk_popover_set_position (GTK_POPOVER (priv->popup_menu), GTK_POS_BOTTOM); + + gtk_popover_set_has_arrow (GTK_POPOVER (priv->popup_menu), FALSE); + gtk_widget_set_halign (priv->popup_menu, GTK_ALIGN_START); + + g_object_unref (model); + } + + if (x != -1 && y != -1) + { + GdkRectangle rect = { x, y, 1, 1 }; + gtk_popover_set_pointing_to (GTK_POPOVER (priv->popup_menu), &rect); + } + else + gtk_popover_set_pointing_to (GTK_POPOVER (priv->popup_menu), NULL); + + gtk_popover_popup (GTK_POPOVER (priv->popup_menu)); } static gboolean gtk_label_popup_menu (GtkWidget *widget) { - gtk_label_do_popup (GTK_LABEL (widget), NULL); - - return TRUE; -} - -static void -gtk_label_do_popup (GtkLabel *label, - const GdkEvent *event) -{ + GtkLabel *label = GTK_LABEL (widget); GtkLabelPrivate *priv = gtk_label_get_instance_private (label); - GtkWidget *menuitem; - GtkWidget *menu; - gboolean have_selection; - GtkLabelLink *link; if (!priv->select_info) - return; + return FALSE; - if (priv->select_info->popup_menu) - gtk_widget_destroy (priv->select_info->popup_menu); - - priv->select_info->popup_menu = menu = gtk_menu_new (); - gtk_style_context_add_class (gtk_widget_get_style_context (menu), - GTK_STYLE_CLASS_CONTEXT_MENU); - - gtk_menu_attach_to_widget (GTK_MENU (menu), GTK_WIDGET (label), popup_menu_detach); - - have_selection = - priv->select_info->selection_anchor != priv->select_info->selection_end; - - if (event) - { - if (priv->select_info->link_clicked) - link = priv->select_info->active_link; - else - link = NULL; - } + if (priv->select_info->link_clicked) + priv->select_info->context_link = priv->select_info->active_link; else - link = gtk_label_get_focus_link (label); + priv->select_info->context_link = gtk_label_get_focus_link (label); - if (!have_selection && link) - { - /* Open Link */ - menuitem = gtk_menu_item_new_with_mnemonic (_("_Open Link")); - g_object_set_qdata (G_OBJECT (menuitem), quark_link, link); - gtk_widget_show (menuitem); - gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); - - g_signal_connect (G_OBJECT (menuitem), "activate", - G_CALLBACK (open_link_activate_cb), label); - - /* Copy Link Address */ - menuitem = gtk_menu_item_new_with_mnemonic (_("Copy _Link Address")); - g_object_set_qdata (G_OBJECT (menuitem), quark_link, link); - gtk_widget_show (menuitem); - gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); - - g_signal_connect (G_OBJECT (menuitem), "activate", - G_CALLBACK (copy_link_activate_cb), label); - } - else - { - append_action_signal (label, menu, _("Cu_t"), "cut-clipboard", FALSE); - append_action_signal (label, menu, _("_Copy"), "copy-clipboard", have_selection); - append_action_signal (label, menu, _("_Paste"), "paste-clipboard", FALSE); - - menuitem = gtk_menu_item_new_with_mnemonic (_("_Delete")); - gtk_widget_set_sensitive (menuitem, FALSE); - gtk_widget_show (menuitem); - gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); - - menuitem = gtk_separator_menu_item_new (); - gtk_widget_show (menuitem); - gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); - - menuitem = gtk_menu_item_new_with_mnemonic (_("Select _All")); - g_signal_connect_swapped (menuitem, "activate", - G_CALLBACK (gtk_label_select_all), label); - gtk_widget_show (menuitem); - gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); - } - - g_signal_emit (label, signals[POPULATE_POPUP], 0, menu); - - if (event && gdk_event_triggers_context_menu (event)) - gtk_menu_popup_at_pointer (GTK_MENU (menu), event); - else - { - gtk_menu_popup_at_widget (GTK_MENU (menu), - GTK_WIDGET (label), - GDK_GRAVITY_SOUTH, - GDK_GRAVITY_NORTH_WEST, - event); - - gtk_menu_shell_select_first (GTK_MENU_SHELL (menu), FALSE); - } + gtk_label_do_popup (label, -1, -1); + return TRUE; } static void @@ -6646,3 +6694,44 @@ gtk_label_get_yalign (GtkLabel *label) return priv->yalign; } + +/** + * gtk_label_set_extra_menu: + * @label: a #GtkLabel + * @model: (allow-none): a #GMenuModel + * + * Sets a menu model to add when constructing + * the context menu for @label. + */ +void +gtk_label_set_extra_menu (GtkLabel *label, + GMenuModel *model) +{ + GtkLabelPrivate *priv = gtk_label_get_instance_private (label); + + g_return_if_fail (GTK_IS_LABEL (label)); + + if (g_set_object (&priv->extra_menu, model)) + { + g_clear_pointer (&priv->popup_menu, gtk_widget_unparent); + g_object_notify_by_pspec (G_OBJECT (label), label_props[PROP_EXTRA_MENU]); + } +} + +/** + * gtk_label_get_extra_menu: + * @label: a #GtkLabel + * + * Gets the menu model set with gtk_label_set_extra_menu(). + * + * Returns: (transfer none): (nullable): the menu model + */ +GMenuModel * +gtk_label_get_extra_menu (GtkLabel *label) +{ + GtkLabelPrivate *priv = gtk_label_get_instance_private (label); + + g_return_val_if_fail (GTK_IS_LABEL (label), NULL); + + return priv->extra_menu; +} diff --git a/gtk/gtklabel.h b/gtk/gtklabel.h index 6ccc389b73..c2b8bfe8e4 100644 --- a/gtk/gtklabel.h +++ b/gtk/gtklabel.h @@ -176,6 +176,13 @@ void gtk_label_set_yalign (GtkLabel *label, GDK_AVAILABLE_IN_ALL gfloat gtk_label_get_yalign (GtkLabel *label); +GDK_AVAILABLE_IN_ALL +void gtk_label_set_extra_menu (GtkLabel *label, + GMenuModel *model); +GDK_AVAILABLE_IN_ALL +GMenuModel * gtk_label_get_extra_menu (GtkLabel *label); + + G_DEFINE_AUTOPTR_CLEANUP_FUNC(GtkLabel, g_object_unref) G_END_DECLS diff --git a/gtk/gtklinkbutton.c b/gtk/gtklinkbutton.c index f867b63c91..7c68d9380f 100644 --- a/gtk/gtklinkbutton.c +++ b/gtk/gtklinkbutton.c @@ -60,8 +60,7 @@ #include "gtklabel.h" #include "gtkmain.h" #include "gtkmarshalers.h" -#include "gtkmenu.h" -#include "gtkmenuitem.h" +#include "gtkpopovermenu.h" #include "gtkprivate.h" #include "gtkshow.h" #include "gtksizerequest.h" @@ -97,6 +96,7 @@ struct _GtkLinkButtonPrivate gboolean visited; + GActionMap *context_actions; GtkWidget *popup_menu; }; @@ -223,6 +223,43 @@ gtk_link_button_class_init (GtkLinkButtonClass *klass) gtk_widget_class_set_css_name (widget_class, I_("button")); } +static void copy_activate_cb (GSimpleAction *action, + GVariant *parameter, + gpointer user_data); + +static void +gtk_link_button_add_context_actions (GtkLinkButton *link_button) +{ + GtkLinkButtonPrivate *priv = gtk_link_button_get_instance_private (link_button); + + GActionEntry entries[] = { + { "copy-clipboard", copy_activate_cb, NULL, NULL, NULL }, + }; + + GSimpleActionGroup *actions = g_simple_action_group_new (); + + priv->context_actions = G_ACTION_MAP (actions); + + g_action_map_add_action_entries (G_ACTION_MAP (actions), entries, G_N_ELEMENTS (entries), link_button); + + gtk_widget_insert_action_group (GTK_WIDGET (link_button), "context", G_ACTION_GROUP (actions)); +} + +static GMenuModel * +gtk_link_button_get_menu_model (void) +{ + GMenu *menu, *section; + + menu = g_menu_new (); + + section = g_menu_new (); + g_menu_append (section, _("_Copy URL"), "context.copy-clipboard"); + g_menu_append_section (menu, NULL, G_MENU_MODEL (section)); + g_object_unref (section); + + return G_MENU_MODEL (menu); +} + static void gtk_link_button_init (GtkLinkButton *link_button) { @@ -261,6 +298,7 @@ gtk_link_button_init (GtkLinkButton *link_button) gtk_style_context_add_class (context, "link"); gtk_widget_set_cursor_from_name (GTK_WIDGET (link_button), "pointer"); + gtk_link_button_add_context_actions (link_button); } static void @@ -270,7 +308,10 @@ gtk_link_button_finalize (GObject *object) GtkLinkButtonPrivate *priv = gtk_link_button_get_instance_private (link_button); g_free (priv->uri); - + + g_clear_object (&priv->context_actions); + g_clear_pointer (&priv->popup_menu, gtk_widget_unparent); + G_OBJECT_CLASS (gtk_link_button_parent_class)->finalize (object); } @@ -320,19 +361,11 @@ gtk_link_button_set_property (GObject *object, } static void -popup_menu_detach (GtkWidget *attach_widget, - GtkMenu *menu) -{ - GtkLinkButton *link_button = GTK_LINK_BUTTON (attach_widget); - GtkLinkButtonPrivate *priv = gtk_link_button_get_instance_private (link_button); - - priv->popup_menu = NULL; -} - -static void -copy_activate_cb (GtkWidget *widget, - GtkLinkButton *link_button) +copy_activate_cb (GSimpleAction *action, + GVariant *parameter, + gpointer user_data) { + GtkLinkButton *link_button = user_data; GtkLinkButtonPrivate *priv = gtk_link_button_get_instance_private (link_button); gdk_clipboard_set_text (gtk_widget_get_clipboard (GTK_WIDGET (link_button)), @@ -340,45 +373,35 @@ copy_activate_cb (GtkWidget *widget, } static void -gtk_link_button_do_popup (GtkLinkButton *link_button, - const GdkEvent *event) +gtk_link_button_do_popup (GtkLinkButton *link_button, + double x, + double y) { GtkLinkButtonPrivate *priv = gtk_link_button_get_instance_private (link_button); - if (gtk_widget_get_realized (GTK_WIDGET (link_button))) + if (!priv->popup_menu) { - GtkWidget *menu_item; + GMenuModel *model; - if (priv->popup_menu) - gtk_widget_destroy (priv->popup_menu); + model = gtk_link_button_get_menu_model (); + priv->popup_menu = gtk_popover_menu_new_from_model (GTK_WIDGET (link_button), model); + gtk_popover_set_position (GTK_POPOVER (priv->popup_menu), GTK_POS_BOTTOM); - priv->popup_menu = gtk_menu_new (); - gtk_style_context_add_class (gtk_widget_get_style_context (priv->popup_menu), - GTK_STYLE_CLASS_CONTEXT_MENU); + gtk_popover_set_has_arrow (GTK_POPOVER (priv->popup_menu), FALSE); + gtk_widget_set_halign (priv->popup_menu, GTK_ALIGN_START); - gtk_menu_attach_to_widget (GTK_MENU (priv->popup_menu), - GTK_WIDGET (link_button), - popup_menu_detach); - - menu_item = gtk_menu_item_new_with_mnemonic (_("Copy URL")); - g_signal_connect (menu_item, "activate", - G_CALLBACK (copy_activate_cb), link_button); - gtk_widget_show (menu_item); - gtk_menu_shell_append (GTK_MENU_SHELL (priv->popup_menu), menu_item); - - if (event && gdk_event_triggers_context_menu (event)) - gtk_menu_popup_at_pointer (GTK_MENU (priv->popup_menu), event); - else - { - gtk_menu_popup_at_widget (GTK_MENU (priv->popup_menu), - GTK_WIDGET (link_button), - GDK_GRAVITY_SOUTH, - GDK_GRAVITY_NORTH_WEST, - event); - - gtk_menu_shell_select_first (GTK_MENU_SHELL (priv->popup_menu), FALSE); - } + g_object_unref (model); } + + if (x != -1 && y != -1) + { + GdkRectangle rect = { x, y, 1, 1 }; + gtk_popover_set_pointing_to (GTK_POPOVER (priv->popup_menu), &rect); + } + else + gtk_popover_set_pointing_to (GTK_POPOVER (priv->popup_menu), NULL); + + gtk_popover_popup (GTK_POPOVER (priv->popup_menu)); } static void @@ -399,7 +422,7 @@ gtk_link_button_pressed_cb (GtkGestureClick *gesture, if (gdk_event_triggers_context_menu (event) && priv->uri != NULL) { - gtk_link_button_do_popup (link_button, event); + gtk_link_button_do_popup (link_button, x, y); gtk_gesture_set_state (GTK_GESTURE (gesture), GTK_EVENT_SEQUENCE_CLAIMED); } else @@ -445,9 +468,8 @@ gtk_link_button_clicked (GtkButton *button) static gboolean gtk_link_button_popup_menu (GtkWidget *widget) { - gtk_link_button_do_popup (GTK_LINK_BUTTON (widget), NULL); - - return TRUE; + gtk_link_button_do_popup (GTK_LINK_BUTTON (widget), -1, -1); + return TRUE; } static void diff --git a/gtk/gtkpasswordentry.c b/gtk/gtkpasswordentry.c index ddf31467ba..ef0651600c 100644 --- a/gtk/gtkpasswordentry.c +++ b/gtk/gtkpasswordentry.c @@ -58,6 +58,7 @@ typedef struct { GtkWidget *icon; GtkWidget *peek_icon; GdkKeymap *keymap; + GMenuModel *extra_menu; } GtkPasswordEntryPrivate; struct _GtkPasswordEntryClass @@ -69,6 +70,7 @@ enum { PROP_PLACEHOLDER_TEXT = 1, PROP_ACTIVATES_DEFAULT, PROP_SHOW_PEEK_ICON, + PROP_EXTRA_MENU, NUM_PROPERTIES }; @@ -105,7 +107,7 @@ focus_changed (GtkWidget *widget) if (priv->keymap) keymap_state_changed (priv->keymap, widget); } - + static void gtk_password_entry_toggle_peek (GtkPasswordEntry *entry) { @@ -125,27 +127,6 @@ gtk_password_entry_toggle_peek (GtkPasswordEntry *entry) } } -static void -populate_popup (GtkText *text, - GtkWidget *popup, - GtkPasswordEntry *entry) -{ - GtkPasswordEntryPrivate *priv = gtk_password_entry_get_instance_private (entry); - - if (priv->peek_icon != NULL) - { - GtkWidget *item; - - item = gtk_check_menu_item_new_with_mnemonic (_("_Show text")); - gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), - gtk_text_get_visibility (text)); - g_signal_connect_swapped (item, "activate", - G_CALLBACK (gtk_password_entry_toggle_peek), entry); - gtk_widget_show (item); - gtk_menu_shell_append (GTK_MENU_SHELL (popup), item); - } -} - static void gtk_password_entry_init (GtkPasswordEntry *entry) { @@ -156,7 +137,6 @@ gtk_password_entry_init (GtkPasswordEntry *entry) gtk_widget_set_parent (priv->entry, GTK_WIDGET (entry)); gtk_editable_init_delegate (GTK_EDITABLE (entry)); g_signal_connect_swapped (priv->entry, "notify::has-focus", G_CALLBACK (focus_changed), entry); - g_signal_connect (priv->entry, "populate-popup", G_CALLBACK (populate_popup), entry); priv->icon = gtk_image_new_from_icon_name ("caps-lock-symbolic"); gtk_widget_set_tooltip_text (priv->icon, _("Caps Lock is on")); @@ -165,6 +145,8 @@ gtk_password_entry_init (GtkPasswordEntry *entry) gtk_widget_set_parent (priv->icon, GTK_WIDGET (entry)); gtk_style_context_add_class (gtk_widget_get_style_context (GTK_WIDGET (entry)), I_("password")); + + gtk_password_entry_set_extra_menu (entry, NULL); } static void @@ -195,6 +177,7 @@ gtk_password_entry_dispose (GObject *object) g_clear_pointer (&priv->entry, gtk_widget_unparent); g_clear_pointer (&priv->icon, gtk_widget_unparent); g_clear_pointer (&priv->peek_icon, gtk_widget_unparent); + g_clear_object (&priv->extra_menu); G_OBJECT_CLASS (gtk_password_entry_parent_class)->dispose (object); } @@ -235,6 +218,10 @@ gtk_password_entry_set_property (GObject *object, gtk_password_entry_set_show_peek_icon (entry, g_value_get_boolean (value)); break; + case PROP_EXTRA_MENU: + gtk_password_entry_set_extra_menu (entry, g_value_get_object (value)); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -267,6 +254,10 @@ gtk_password_entry_get_property (GObject *object, g_value_set_boolean (value, gtk_password_entry_get_show_peek_icon (entry)); break; + case PROP_EXTRA_MENU: + g_value_set_object (value, priv->extra_menu); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -389,7 +380,6 @@ gtk_password_entry_class_init (GtkPasswordEntryClass *klass) widget_class->get_accessible = gtk_password_entry_get_accessible; widget_class->grab_focus = gtk_password_entry_grab_focus; widget_class->mnemonic_activate = gtk_password_entry_mnemonic_activate; - props[PROP_PLACEHOLDER_TEXT] = g_param_spec_string ("placeholder-text", P_("Placeholder text"), @@ -411,6 +401,19 @@ gtk_password_entry_class_init (GtkPasswordEntryClass *klass) FALSE, GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY); + /** + * GtkPasswordEntry:extra-menu: + * + * A menu model whose contents will be appended to + * the context menu. + */ + props[PROP_EXTRA_MENU] = + g_param_spec_object ("extra-menu", + P_("Extra menu"), + P_("Model menu to append to the context menu"), + G_TYPE_MENU_MODEL, + GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY); + g_object_class_install_properties (object_class, NUM_PROPERTIES, props); gtk_editable_install_properties (object_class, NUM_PROPERTIES); @@ -509,3 +512,64 @@ gtk_password_entry_get_show_peek_icon (GtkPasswordEntry *entry) return priv->peek_icon != NULL; } + +/** + * gtk_password_entry_set_extra_menu: + * @entry: a #GtkPasswordEntry + * @model: (allow-none): a #GMenuModel + * + * Sets a menu model to add when constructing + * the context menu for @entry. + */ +void +gtk_password_entry_set_extra_menu (GtkPasswordEntry *entry, + GMenuModel *model) +{ + GtkPasswordEntryPrivate *priv = gtk_password_entry_get_instance_private (entry); + GMenu *menu; + GMenu *section; + GMenuItem *item; + + g_return_if_fail (GTK_IS_PASSWORD_ENTRY (entry)); + + if (!g_set_object (&priv->extra_menu, model)) + return; + + menu = g_menu_new (); + + section = g_menu_new (); + item = g_menu_item_new (_("_Show Text"), "context.toggle-visibility"); + g_menu_item_set_attribute (item, "touch-icon", "s", "eye-not-looking-symbolic"); + g_menu_append_item (section, item); + g_object_unref (item); + + g_menu_append_section (menu, NULL, G_MENU_MODEL (section)); + g_object_unref (section); + + if (model) + g_menu_append_section (menu, NULL, model); + + gtk_text_set_extra_menu (GTK_TEXT (priv->entry), G_MENU_MODEL (menu)); + + g_object_unref (menu); + + g_object_notify_by_pspec (G_OBJECT (entry), props[PROP_EXTRA_MENU]); +} + +/** + * gtk_password_entry_get_extra_menu: + * @self: a #GtkText + * + * Gets the menu model set with gtk_password_entry_set_extra_menu(). + * + * Returns: (transfer none): (nullable): the menu model + */ +GMenuModel * +gtk_password_entry_get_extra_menu (GtkPasswordEntry *entry) +{ + GtkPasswordEntryPrivate *priv = gtk_password_entry_get_instance_private (entry); + + g_return_val_if_fail (GTK_IS_PASSWORD_ENTRY (entry), NULL); + + return priv->extra_menu; +} diff --git a/gtk/gtkpasswordentry.h b/gtk/gtkpasswordentry.h index 3e1bc82099..171b1bd7f3 100644 --- a/gtk/gtkpasswordentry.h +++ b/gtk/gtkpasswordentry.h @@ -53,6 +53,12 @@ void gtk_password_entry_set_show_peek_icon (GtkPasswordEntry *entry, GDK_AVAILABLE_IN_ALL gboolean gtk_password_entry_get_show_peek_icon (GtkPasswordEntry *entry); +GDK_AVAILABLE_IN_ALL +void gtk_password_entry_set_extra_menu (GtkPasswordEntry *entry, + GMenuModel *model); +GDK_AVAILABLE_IN_ALL +GMenuModel * gtk_password_entry_get_extra_menu (GtkPasswordEntry *entry); + G_END_DECLS #endif /* __GTK_PASSWORD_ENTRY_H__ */ diff --git a/gtk/gtkplacessidebar.c b/gtk/gtkplacessidebar.c index ddddbe0f49..ca88963440 100644 --- a/gtk/gtkplacessidebar.c +++ b/gtk/gtkplacessidebar.c @@ -228,7 +228,6 @@ struct _GtkPlacesSidebarClass { enum { OPEN_LOCATION, - POPULATE_POPUP, SHOW_ERROR_MESSAGE, SHOW_ENTER_LOCATION, DRAG_ACTION_REQUESTED, @@ -251,7 +250,6 @@ enum { PROP_SHOW_STARRED_LOCATION, PROP_LOCAL_ONLY, PROP_SHOW_OTHER_LOCATIONS, - PROP_POPULATE_ALL, NUM_PROPERTIES }; @@ -3663,33 +3661,6 @@ create_row_popover (GtkPlacesSidebar *sidebar, /* Update everything! */ check_popover_sensitivity (row, &data); - - if (sidebar->populate_all) - { - gchar *uri; - GVolume *volume; - GFile *file; - - g_object_get (row, - "uri", &uri, - "volume", &volume, - NULL); - - if (uri) - file = g_file_new_for_uri (uri); - else - file = NULL; - - g_signal_emit (sidebar, places_sidebar_signals[POPULATE_POPUP], 0, - box, file, volume); - - if (file) - g_object_unref (file); - - g_free (uri); - if (volume) - g_object_unref (volume); - } } static void @@ -4235,14 +4206,6 @@ gtk_places_sidebar_set_property (GObject *obj, gtk_places_sidebar_set_local_only (sidebar, g_value_get_boolean (value)); break; - case PROP_POPULATE_ALL: - if (sidebar->populate_all != g_value_get_boolean (value)) - { - sidebar->populate_all = g_value_get_boolean (value); - g_object_notify_by_pspec (obj, pspec); - } - break; - default: G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, property_id, pspec); break; @@ -4295,10 +4258,6 @@ gtk_places_sidebar_get_property (GObject *obj, g_value_set_boolean (value, gtk_places_sidebar_get_local_only (sidebar)); break; - case PROP_POPULATE_ALL: - g_value_set_boolean (value, sidebar->populate_all); - break; - default: G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, property_id, pspec); break; @@ -4496,53 +4455,6 @@ gtk_places_sidebar_class_init (GtkPlacesSidebarClass *class) G_TYPE_OBJECT, GTK_TYPE_PLACES_OPEN_FLAGS); - /* - * GtkPlacesSidebar::populate-popup: - * @sidebar: the object which received the signal. - * @container: (type Gtk.Widget): a #GtkMenu or another #GtkContainer - * @selected_item: (type Gio.File) (nullable): #GFile with the item to which - * the popup should refer, or %NULL in the case of a @selected_volume. - * @selected_volume: (type Gio.Volume) (nullable): #GVolume if the selected - * item is a volume, or %NULL if it is a file. - * - * The places sidebar emits this signal when the user invokes a contextual - * popup on one of its items. In the signal handler, the application may - * add extra items to the menu as appropriate. For example, a file manager - * may want to add a "Properties" command to the menu. - * - * It is not necessary to store the @selected_item for each menu item; - * during their callbacks, the application can use gtk_places_sidebar_get_location() - * to get the file to which the item refers. - * - * The @selected_item argument may be %NULL in case the selection refers to - * a volume. In this case, @selected_volume will be non-%NULL. In this case, - * the calling application will have to g_object_ref() the @selected_volume and - * keep it around to use it in the callback. - * - * The @container and all its contents are destroyed after the user - * dismisses the popup. The popup is re-created (and thus, this signal is - * emitted) every time the user activates the contextual menu. - * - * Before 3.18, the @container always was a #GtkMenu, and you were expected - * to add your items as #GtkMenuItems. The popup may be implemented - * as a #GtkPopover, in which case @container will be something else, e.g. a - * #GtkBox, to which you may add #GtkModelButtons or other widgets, such as - * #GtkEntries, #GtkSpinButtons, etc. If your application can deal with this - * situation, you can set #GtkPlacesSidebar::populate-all to %TRUE to request - * that this signal is emitted for populating popovers as well. - */ - places_sidebar_signals [POPULATE_POPUP] = - g_signal_new (I_("populate-popup"), - G_OBJECT_CLASS_TYPE (gobject_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (GtkPlacesSidebarClass, populate_popup), - NULL, NULL, - _gtk_marshal_VOID__OBJECT_OBJECT_OBJECT, - G_TYPE_NONE, 3, - GTK_TYPE_WIDGET, - G_TYPE_FILE, - G_TYPE_VOLUME); - /* * GtkPlacesSidebar::show-error-message: * @sidebar: the object which received the signal. @@ -4802,20 +4714,6 @@ gtk_places_sidebar_class_init (GtkPlacesSidebarClass *class) FALSE, GTK_PARAM_READWRITE); - - /* - * GtkPlacesSidebar:populate-all: - * - * If :populate-all is %TRUE, the #GtkPlacesSidebar::populate-popup signal - * is also emitted for popovers. - */ - properties[PROP_POPULATE_ALL] = - g_param_spec_boolean (I_("populate-all"), - P_("Populate all"), - P_("Whether to emit ::populate-popup for popups that are not menus"), - FALSE, - G_PARAM_READWRITE); - g_object_class_install_properties (gobject_class, NUM_PROPERTIES, properties); gtk_widget_class_set_css_name (widget_class, I_("placessidebar")); @@ -4954,10 +4852,7 @@ gtk_places_sidebar_set_location (GtkPlacesSidebar *sidebar, * been called with a location that is not among the sidebar’s list of places to * show. * - * You can use this function to get the selection in the @sidebar. Also, if you - * connect to the #GtkPlacesSidebar::populate-popup signal, you can use this - * function to get the location that is being referred to during the callbacks - * for your menu items. + * You can use this function to get the selection in the @sidebar. * * Returns: (nullable) (transfer full): a #GFile with the selected location, or * %NULL if nothing is visually selected. diff --git a/gtk/gtktext.c b/gtk/gtktext.c index f89b8555f4..94e9cab270 100644 --- a/gtk/gtktext.c +++ b/gtk/gtktext.c @@ -23,6 +23,7 @@ #include "gtktextprivate.h" +#include "gtkactionable.h" #include "gtkadjustment.h" #include "gtkbindings.h" #include "gtkbox.h" @@ -51,7 +52,7 @@ #include "gtkmenu.h" #include "gtkmenuitem.h" #include "gtkpango.h" -#include "gtkpopover.h" +#include "gtkpopovermenu.h" #include "gtkprivate.h" #include "gtkseparatormenuitem.h" #include "gtkselection.h" @@ -145,7 +146,6 @@ struct _GtkTextPrivate { GtkEntryBuffer *buffer; GtkIMContext *im_context; - GtkWidget *popup_menu; int text_baseline; @@ -174,6 +174,10 @@ struct _GtkTextPrivate GtkCssNode *block_cursor_node; GtkCssNode *undershoot_node[2]; + GActionMap *context_actions; + GtkWidget *popup_menu; + GMenuModel *extra_menu; + float xalign; int ascent; /* font ascent in pango units */ @@ -233,7 +237,6 @@ struct _GtkTextPasswordHint enum { ACTIVATE, - POPULATE_POPUP, MOVE_CURSOR, INSERT_AT_CURSOR, DELETE_FROM_CURSOR, @@ -263,10 +266,10 @@ enum { PROP_INPUT_PURPOSE, PROP_INPUT_HINTS, PROP_ATTRIBUTES, - PROP_POPULATE_ALL, PROP_TABS, PROP_ENABLE_EMOJI_COMPLETION, PROP_PROPAGATE_TEXT_WIDTH, + PROP_EXTRA_MENU, NUM_PROPERTIES }; @@ -383,6 +386,7 @@ static void gtk_text_set_alignment (GtkText *self, /* Default signal handlers */ +static GMenuModel *gtk_text_get_menu_model (GtkText *self); static gboolean gtk_text_popup_menu (GtkWidget *widget); static void gtk_text_move_cursor (GtkText *self, GtkMovementStep step, @@ -512,8 +516,6 @@ static void gtk_text_paste (GtkText *self, GdkClipboard *clipboard); static void gtk_text_update_primary_selection (GtkText *self); static void gtk_text_schedule_im_reset (GtkText *self); -static void gtk_text_do_popup (GtkText *self, - const GdkEvent *event); static gboolean gtk_text_mnemonic_activate (GtkWidget *widget, gboolean group_cycling); static void gtk_text_check_cursor_blink (GtkText *self); @@ -540,6 +542,10 @@ static void begin_change (GtkText *self); static void end_change (GtkText *self); static void emit_changed (GtkText *self); +static void gtk_text_add_context_actions (GtkText *self); +static void gtk_text_update_clipboard_actions (GtkText *self); +static void gtk_text_update_emoji_action (GtkText *self); + /* GtkTextContent implementation */ @@ -859,20 +865,7 @@ gtk_text_class_init (GtkTextClass *class) GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY); /** - * GtkText:populate-all: - * - * If :populate-all is %TRUE, the #GtkText::populate-popup - * signal is also emitted for touch popups. - */ - text_props[PROP_POPULATE_ALL] = - g_param_spec_boolean ("populate-all", - P_("Populate all"), - P_("Whether to emit ::populate-popup for touch popups"), - FALSE, - GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY); - - /** - * GtkText::tabs: + * GtkText:tabs: * * A list of tabstops to apply to the text of the self. */ @@ -904,38 +897,23 @@ gtk_text_class_init (GtkTextClass *class) FALSE, GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY); + /** + * GtkText:extra-menu: + * + * A menu model whose contents will be appended to + * the context menu. + */ + text_props[PROP_EXTRA_MENU] = + g_param_spec_object ("extra-menu", + P_("Extra menu"), + P_("Menu model to append to the context menu"), + G_TYPE_MENU_MODEL, + GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY); + g_object_class_install_properties (gobject_class, NUM_PROPERTIES, text_props); gtk_editable_install_properties (gobject_class, NUM_PROPERTIES); - /** - * GtkText::populate-popup: - * @self: The self on which the signal is emitted - * @widget: the container that is being populated - * - * The ::populate-popup signal gets emitted before showing the - * context menu of the self. - * - * If you need to add items to the context menu, connect - * to this signal and append your items to the @widget, which - * will be a #GtkMenu in this case. - * - * If #GtkText:populate-all is %TRUE, this signal will - * also be emitted to populate touch popups. In this case, - * @widget will be a different container, e.g. a #GtkToolbar. - * The signal handler should not make assumptions about the - * type of @widget. - */ - signals[POPULATE_POPUP] = - g_signal_new (I_("populate-popup"), - G_OBJECT_CLASS_TYPE (gobject_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (GtkTextClass, populate_popup), - NULL, NULL, - NULL, - G_TYPE_NONE, 1, - GTK_TYPE_WIDGET); - /* Action signals */ /** @@ -1505,14 +1483,6 @@ gtk_text_set_property (GObject *object, gtk_text_set_attributes (self, g_value_get_boxed (value)); break; - case PROP_POPULATE_ALL: - if (priv->populate_all != g_value_get_boolean (value)) - { - priv->populate_all = g_value_get_boolean (value); - g_object_notify_by_pspec (object, pspec); - } - break; - case PROP_TABS: gtk_text_set_tabs (self, g_value_get_boxed (value)); break; @@ -1530,6 +1500,10 @@ gtk_text_set_property (GObject *object, } break; + case PROP_EXTRA_MENU: + gtk_text_set_extra_menu (self, g_value_get_object (value)); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -1633,10 +1607,6 @@ gtk_text_get_property (GObject *object, g_value_set_boxed (value, priv->attrs); break; - case PROP_POPULATE_ALL: - g_value_set_boolean (value, priv->populate_all); - break; - case PROP_TABS: g_value_set_boxed (value, priv->tabs); break; @@ -1649,6 +1619,10 @@ gtk_text_get_property (GObject *object, g_value_set_boolean (value, priv->propagate_text_width); break; + case PROP_EXTRA_MENU: + g_value_set_object (value, priv->extra_menu); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -1746,6 +1720,7 @@ gtk_text_init (GtkText *self) } set_text_cursor (GTK_WIDGET (self)); + gtk_text_add_context_actions (self); } static void @@ -1791,6 +1766,10 @@ gtk_text_dispose (GObject *object) keymap = gdk_display_get_keymap (gtk_widget_get_display (GTK_WIDGET (object))); g_signal_handlers_disconnect_by_func (keymap, keymap_direction_changed, self); + g_clear_object (&priv->context_actions); + g_clear_pointer (&priv->popup_menu, gtk_widget_unparent); + g_clear_object (&priv->extra_menu); + G_OBJECT_CLASS (gtk_text_parent_class)->dispose (object); } @@ -2056,12 +2035,6 @@ gtk_text_unrealize (GtkWidget *widget) if (gdk_clipboard_get_content (clipboard) == priv->selection_content) gdk_clipboard_set_content (clipboard, NULL); - if (priv->popup_menu) - { - gtk_widget_destroy (priv->popup_menu); - priv->popup_menu = NULL; - } - GTK_WIDGET_CLASS (gtk_text_parent_class)->unrealize (widget); } @@ -2200,6 +2173,9 @@ gtk_text_size_allocate (GtkWidget *widget, if (priv->magnifier_popover) gtk_native_check_resize (GTK_NATIVE (priv->magnifier_popover)); + + if (priv->popup_menu) + gtk_native_check_resize (GTK_NATIVE (priv->popup_menu)); } static void @@ -2448,6 +2424,40 @@ gesture_get_current_point_in_layout (GtkGestureSingle *gesture, *y = py - ty; } +static void +gtk_text_do_popup (GtkText *self, + double x, + double y) +{ + GtkTextPrivate *priv = gtk_text_get_instance_private (self); + + gtk_text_update_clipboard_actions (self); + + if (!priv->popup_menu) + { + GMenuModel *model; + + model = gtk_text_get_menu_model (self); + priv->popup_menu = gtk_popover_menu_new_from_model (GTK_WIDGET (self), model); + gtk_popover_set_position (GTK_POPOVER (priv->popup_menu), GTK_POS_BOTTOM); + + gtk_popover_set_has_arrow (GTK_POPOVER (priv->popup_menu), FALSE); + gtk_widget_set_halign (priv->popup_menu, GTK_ALIGN_START); + + g_object_unref (model); + } + + if (x != -1 && y != -1) + { + GdkRectangle rect = { x, y, 1, 1 }; + gtk_popover_set_pointing_to (GTK_POPOVER (priv->popup_menu), &rect); + } + else + gtk_popover_set_pointing_to (GTK_POPOVER (priv->popup_menu), NULL); + + gtk_popover_popup (GTK_POPOVER (priv->popup_menu)); +} + static void gtk_text_click_gesture_pressed (GtkGestureClick *gesture, int n_press, @@ -2483,7 +2493,7 @@ gtk_text_click_gesture_pressed (GtkGestureClick *gesture, if (gdk_event_triggers_context_menu (event)) { - gtk_text_do_popup (self, event); + gtk_text_do_popup (self, x, y); } else if (n_press == 1 && button == GDK_BUTTON_MIDDLE && get_middle_click_paste (self)) @@ -5251,10 +5261,15 @@ gtk_text_set_visibility (GtkText *self, if (priv->visible != visible) { + GAction *action; + priv->visible = visible; g_object_notify (G_OBJECT (self), "visibility"); gtk_text_recompute (self); + + action = g_action_map_lookup_action (priv->context_actions, "toggle-visibility"); + g_simple_action_set_state (G_SIMPLE_ACTION (action), g_variant_new_boolean (visible)); } } @@ -5590,18 +5605,213 @@ gtk_text_set_alignment (GtkText *self, } } -/* Quick hack of a popup menu - */ static void -activate_cb (GtkWidget *menuitem, - GtkText *self) +hide_selection_bubble (GtkText *self) { - const char *signal; + GtkTextPrivate *priv = gtk_text_get_instance_private (self); - signal = g_object_get_qdata (G_OBJECT (menuitem), quark_gtk_signal); - g_signal_emit_by_name (self, signal); + if (priv->selection_bubble && gtk_widget_get_visible (priv->selection_bubble)) + gtk_widget_hide (priv->selection_bubble); } +static void +cut_clipboard_activated (GSimpleAction *action, + GVariant *parameter, + gpointer user_data) +{ + g_signal_emit_by_name (user_data, "cut-clipboard"); + hide_selection_bubble (GTK_TEXT (user_data)); +} + +static void +copy_clipboard_activated (GSimpleAction *action, + GVariant *parameter, + gpointer user_data) +{ + g_signal_emit_by_name (user_data, "copy-clipboard"); + hide_selection_bubble (GTK_TEXT (user_data)); +} + +static void +paste_clipboard_activated (GSimpleAction *action, + GVariant *parameter, + gpointer user_data) +{ + g_signal_emit_by_name (user_data, "paste-clipboard"); + hide_selection_bubble (GTK_TEXT (user_data)); +} + +static void +delete_selection_activated (GSimpleAction *action, + GVariant *parameter, + gpointer user_data) +{ + gtk_text_delete_cb (GTK_TEXT (user_data)); + hide_selection_bubble (GTK_TEXT (user_data)); +} + +static void +select_all_activated (GSimpleAction *action, + GVariant *parameter, + gpointer user_data) +{ + gtk_text_select_all (GTK_TEXT (user_data)); +} + +static void +insert_emoji_activated (GSimpleAction *action, + GVariant *parameter, + gpointer user_data) +{ + gtk_text_insert_emoji (GTK_TEXT (user_data)); + hide_selection_bubble (GTK_TEXT (user_data)); +} + +static void +toggle_visibility (GSimpleAction *action, + GVariant *parameter, + gpointer user_data) +{ + GtkText *text = GTK_TEXT (user_data); + gtk_text_set_visibility (text, !gtk_text_get_visibility (text)); +} + +static void +gtk_text_add_context_actions (GtkText *self) +{ + GtkTextPrivate *priv = gtk_text_get_instance_private (self); + + GActionEntry entries[] = { + { "cut-clipboard", cut_clipboard_activated, NULL, NULL, NULL }, + { "copy-clipboard", copy_clipboard_activated, NULL, NULL, NULL }, + { "paste-clipboard", paste_clipboard_activated, NULL, NULL, NULL }, + { "delete-selection", delete_selection_activated, NULL, NULL, NULL }, + { "select-all", select_all_activated, NULL, NULL, NULL }, + { "insert-emoji", insert_emoji_activated, NULL, NULL, NULL }, + { "toggle-visibility", toggle_visibility, NULL, "true", NULL }, + }; + + GSimpleActionGroup *actions = g_simple_action_group_new (); + GAction *action; + + priv->context_actions = G_ACTION_MAP (actions); + + g_action_map_add_action_entries (G_ACTION_MAP (actions), entries, G_N_ELEMENTS (entries), self); + + action = g_action_map_lookup_action (G_ACTION_MAP (actions), "cut-clipboard"); + g_simple_action_set_enabled (G_SIMPLE_ACTION (action), FALSE); + action = g_action_map_lookup_action (G_ACTION_MAP (actions), "copy-clipboard"); + g_simple_action_set_enabled (G_SIMPLE_ACTION (action), FALSE); + action = g_action_map_lookup_action (G_ACTION_MAP (actions), "paste-clipboard"); + g_simple_action_set_enabled (G_SIMPLE_ACTION (action), FALSE); + action = g_action_map_lookup_action (G_ACTION_MAP (actions), "delete-selection"); + g_simple_action_set_enabled (G_SIMPLE_ACTION (action), FALSE); + action = g_action_map_lookup_action (G_ACTION_MAP (actions), "select-all"); + g_simple_action_set_enabled (G_SIMPLE_ACTION (action), FALSE); + action = g_action_map_lookup_action (G_ACTION_MAP (actions), "insert-emoji"); + g_simple_action_set_enabled (G_SIMPLE_ACTION (action), FALSE); + + gtk_widget_insert_action_group (GTK_WIDGET (self), "context", G_ACTION_GROUP (actions)); +} + +static void +gtk_text_update_clipboard_actions (GtkText *self) + { + GtkTextPrivate *priv = gtk_text_get_instance_private (self); + DisplayMode mode; + GdkClipboard *clipboard; + gboolean has_clipboard; + GAction *action; + + clipboard = gtk_widget_get_clipboard (GTK_WIDGET (self)); + has_clipboard = gdk_content_formats_contain_gtype (gdk_clipboard_get_formats (clipboard), G_TYPE_STRING); + mode = gtk_text_get_display_mode (self); + + action = g_action_map_lookup_action (priv->context_actions, "cut-clipboard"); + g_simple_action_set_enabled (G_SIMPLE_ACTION (action), + mode == DISPLAY_NORMAL && + priv->editable && + priv->current_pos != priv->selection_bound); + + action = g_action_map_lookup_action (priv->context_actions, "copy-clipboard"); + g_simple_action_set_enabled (G_SIMPLE_ACTION (action), + mode == DISPLAY_NORMAL && + priv->current_pos != priv->selection_bound); + + action = g_action_map_lookup_action (priv->context_actions, "paste-clipboard"); + g_simple_action_set_enabled (G_SIMPLE_ACTION (action), + priv->editable && has_clipboard); + + action = g_action_map_lookup_action (priv->context_actions, "delete-selection"); + g_simple_action_set_enabled (G_SIMPLE_ACTION (action), + priv->editable && + priv->current_pos != priv->selection_bound); + + action = g_action_map_lookup_action (priv->context_actions, "select-all"); + g_simple_action_set_enabled (G_SIMPLE_ACTION (action), + priv->buffer && (gtk_entry_buffer_get_length (priv->buffer) > 0)); +} + +static void +gtk_text_update_emoji_action (GtkText *self) +{ + GtkTextPrivate *priv = gtk_text_get_instance_private (self); + GAction *action; + + action = g_action_map_lookup_action (priv->context_actions, "insert-emoji"); + g_simple_action_set_enabled (G_SIMPLE_ACTION (action), + (gtk_text_get_input_hints (self) & GTK_INPUT_HINT_NO_EMOJI) == 0); +} + +static GMenuModel * +gtk_text_get_menu_model (GtkText *self) +{ + GtkTextPrivate *priv = gtk_text_get_instance_private (self); + GMenu *menu, *section; + GMenuItem *item; + + menu = g_menu_new (); + + section = g_menu_new (); + item = g_menu_item_new (_("Cu_t"), "context.cut-clipboard"); + g_menu_item_set_attribute (item, "touch-icon", "s", "edit-cut-symbolic"); + g_menu_append_item (section, item); + g_object_unref (item); + item = g_menu_item_new (_("_Copy"), "context.copy-clipboard"); + g_menu_item_set_attribute (item, "touch-icon", "s", "edit-copy-symbolic"); + g_menu_append_item (section, item); + g_object_unref (item); + item = g_menu_item_new (_("_Paste"), "context.paste-clipboard"); + g_menu_item_set_attribute (item, "touch-icon", "s", "edit-paste-symbolic"); + g_menu_append_item (section, item); + g_object_unref (item); + item = g_menu_item_new (_("_Delete"), "context.delete-selection"); + g_menu_item_set_attribute (item, "touch-icon", "s", "edit-delete-symbolic"); + g_menu_append_item (section, item); + g_object_unref (item); + g_menu_append_section (menu, NULL, G_MENU_MODEL (section)); + g_object_unref (section); + + section = g_menu_new (); + + item = g_menu_item_new (_("Select _All"), "context.select-all"); + g_menu_item_set_attribute (item, "touch-icon", "s", "edit-select-all-symbolic"); + g_menu_append_item (section, item); + g_object_unref (item); + + item = g_menu_item_new ( _("Insert _Emoji"), "context.insert-emoji"); + g_menu_item_set_attribute (item, "hidden-when", "s", "action-disabled"); + g_menu_item_set_attribute (item, "touch-icon", "s", "face-smile-symbolic"); + g_menu_append_item (section, item); + g_object_unref (item); + g_menu_append_section (menu, NULL, G_MENU_MODEL (section)); + g_object_unref (section); + + if (priv->extra_menu) + g_menu_append_section (menu, NULL, priv->extra_menu); + + return G_MENU_MODEL (menu); +} static gboolean gtk_text_mnemonic_activate (GtkWidget *widget, @@ -5611,132 +5821,11 @@ gtk_text_mnemonic_activate (GtkWidget *widget, return GDK_EVENT_STOP; } -static void -append_action_signal (GtkText *self, - GtkWidget *menu, - const char *label, - const char *signal, - gboolean sensitive) -{ - GtkWidget *menuitem = gtk_menu_item_new_with_mnemonic (label); - - g_object_set_qdata (G_OBJECT (menuitem), quark_gtk_signal, (char *)signal); - g_signal_connect (menuitem, "activate", - G_CALLBACK (activate_cb), self); - - gtk_widget_set_sensitive (menuitem, sensitive); - - gtk_widget_show (menuitem); - gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); -} - -static void -popup_menu_detach (GtkWidget *attach_widget, - GtkMenu *menu) -{ - GtkText *self_attach = GTK_TEXT (attach_widget); - GtkTextPrivate *priv_attach = gtk_text_get_instance_private (self_attach); - - priv_attach->popup_menu = NULL; -} - -static void -gtk_text_do_popup (GtkText *self, - const GdkEvent *event) -{ - GtkTextPrivate *priv = gtk_text_get_instance_private (self); - GdkEvent *trigger_event; - - /* In order to know what entries we should make sensitive, we - * ask for the current targets of the clipboard, and when - * we get them, then we actually pop up the menu. - */ - trigger_event = event ? gdk_event_copy (event) : gtk_get_current_event (); - - if (gtk_widget_get_realized (GTK_WIDGET (self))) - { - DisplayMode mode; - gboolean clipboard_contains_text; - GtkWidget *menu; - GtkWidget *menuitem; - - clipboard_contains_text = gdk_content_formats_contain_gtype (gdk_clipboard_get_formats (gtk_widget_get_clipboard (GTK_WIDGET (self))), - G_TYPE_STRING); - if (priv->popup_menu) - gtk_widget_destroy (priv->popup_menu); - - priv->popup_menu = menu = gtk_menu_new (); - gtk_style_context_add_class (gtk_widget_get_style_context (menu), - GTK_STYLE_CLASS_CONTEXT_MENU); - - gtk_menu_attach_to_widget (GTK_MENU (menu), GTK_WIDGET (self), popup_menu_detach); - - mode = gtk_text_get_display_mode (self); - append_action_signal (self, menu, _("Cu_t"), "cut-clipboard", - priv->editable && mode == DISPLAY_NORMAL && - priv->current_pos != priv->selection_bound); - - append_action_signal (self, menu, _("_Copy"), "copy-clipboard", - mode == DISPLAY_NORMAL && - priv->current_pos != priv->selection_bound); - - append_action_signal (self, menu, _("_Paste"), "paste-clipboard", - priv->editable && clipboard_contains_text); - - menuitem = gtk_menu_item_new_with_mnemonic (_("_Delete")); - gtk_widget_set_sensitive (menuitem, priv->editable && priv->current_pos != priv->selection_bound); - g_signal_connect_swapped (menuitem, "activate", - G_CALLBACK (gtk_text_delete_cb), self); - gtk_widget_show (menuitem); - gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); - - menuitem = gtk_separator_menu_item_new (); - gtk_widget_show (menuitem); - gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); - - menuitem = gtk_menu_item_new_with_mnemonic (_("Select _All")); - gtk_widget_set_sensitive (menuitem, gtk_entry_buffer_get_length (priv->buffer) > 0); - g_signal_connect_swapped (menuitem, "activate", - G_CALLBACK (gtk_text_select_all), self); - gtk_widget_show (menuitem); - gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); - - if ((gtk_text_get_input_hints (self) & GTK_INPUT_HINT_NO_EMOJI) == 0) - { - menuitem = gtk_menu_item_new_with_mnemonic (_("Insert _Emoji")); - gtk_widget_set_sensitive (menuitem, - mode == DISPLAY_NORMAL && - priv->editable); - g_signal_connect_swapped (menuitem, "activate", - G_CALLBACK (gtk_text_insert_emoji), self); - gtk_widget_show (menuitem); - gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); - } - - g_signal_emit (self, signals[POPULATE_POPUP], 0, menu); - - if (trigger_event && gdk_event_triggers_context_menu (trigger_event)) - gtk_menu_popup_at_pointer (GTK_MENU (menu), trigger_event); - else - { - gtk_menu_popup_at_widget (GTK_MENU (menu), - GTK_WIDGET (self), - GDK_GRAVITY_SOUTH_EAST, - GDK_GRAVITY_NORTH_WEST, - trigger_event); - - gtk_menu_shell_select_first (GTK_MENU_SHELL (menu), FALSE); - } - } - - g_clear_object (&trigger_event); -} - static gboolean gtk_text_popup_menu (GtkWidget *widget) { - gtk_text_do_popup (GTK_TEXT (widget), NULL); - return GDK_EVENT_STOP; + gtk_text_do_popup (GTK_TEXT (widget), -1, -1); + return TRUE; } static void @@ -5766,40 +5855,56 @@ show_or_hide_handles (GtkWidget *popover, } static void -activate_bubble_cb (GtkWidget *item, - GtkText *self) +append_bubble_item (GtkText *self, + GtkWidget *toolbar, + GMenuModel *model, + int index) { GtkTextPrivate *priv = gtk_text_get_instance_private (self); - const char *signal; - - signal = g_object_get_qdata (G_OBJECT (item), quark_gtk_signal); - gtk_widget_hide (priv->selection_bubble); - if (strcmp (signal, "select-all") == 0) - gtk_text_select_all (self); - else - g_signal_emit_by_name (self, signal); -} - -static void -append_bubble_action (GtkText *self, - GtkWidget *toolbar, - const char *label, - const char *icon_name, - const char *signal, - gboolean sensitive) -{ GtkWidget *item, *image; + GVariant *att; + const char *icon_name; + const char *action_name; + GAction *action; + GMenuModel *link; + + link = g_menu_model_get_item_link (model, index, "section"); + if (link) + { + int i; + for (i = 0; i < g_menu_model_get_n_items (link); i++) + append_bubble_item (self, toolbar, link, i); + g_object_unref (link); + return; + } + + att = g_menu_model_get_item_attribute_value (model, index, "touch-icon", G_VARIANT_TYPE_STRING); + if (att == NULL) + return; + + icon_name = g_variant_get_string (att, NULL); + g_variant_unref (att); + + att = g_menu_model_get_item_attribute_value (model, index, "action", G_VARIANT_TYPE_STRING); + if (att == NULL) + return; + action_name = g_variant_get_string (att, NULL); + g_variant_unref (att); + + if (g_str_has_prefix (action_name, "context.")) + { + action = g_action_map_lookup_action (priv->context_actions, action_name + strlen ("context.")); + if (action && !g_action_get_enabled (action)) + return; + } item = gtk_button_new (); gtk_widget_set_focus_on_click (item, FALSE); image = gtk_image_new_from_icon_name (icon_name); gtk_widget_show (image); gtk_container_add (GTK_CONTAINER (item), image); - gtk_widget_set_tooltip_text (item, label); gtk_style_context_add_class (gtk_widget_get_style_context (item), "image-button"); - g_object_set_qdata (G_OBJECT (item), quark_gtk_signal, (char *)signal); - g_signal_connect (item, "clicked", G_CALLBACK (activate_bubble_cb), self); - gtk_widget_set_sensitive (GTK_WIDGET (item), sensitive); + gtk_actionable_set_action_name (GTK_ACTIONABLE (item), action_name); gtk_widget_show (GTK_WIDGET (item)); gtk_container_add (GTK_CONTAINER (toolbar), item); } @@ -5811,21 +5916,19 @@ gtk_text_selection_bubble_popup_show (gpointer user_data) GtkTextPrivate *priv = gtk_text_get_instance_private (self); cairo_rectangle_int_t rect; GtkAllocation allocation; - int start_x, end_x; gboolean has_selection; - gboolean has_clipboard; - gboolean all_selected; - DisplayMode mode; + int start_x, end_x; GtkWidget *box; GtkWidget *toolbar; - int length; GtkAllocation text_allocation; + GMenuModel *model; + int i; + + gtk_text_update_clipboard_actions (self); gtk_text_get_text_allocation (self, &text_allocation); has_selection = priv->selection_bound != priv->current_pos; - length = gtk_entry_buffer_get_length (get_buffer (self)); - all_selected = (priv->selection_bound == 0) && (priv->current_pos == length); if (!has_selection && !priv->editable) { @@ -5851,24 +5954,12 @@ gtk_text_selection_bubble_popup_show (gpointer user_data) gtk_container_add (GTK_CONTAINER (priv->selection_bubble), box); gtk_container_add (GTK_CONTAINER (box), toolbar); - has_clipboard = gdk_content_formats_contain_gtype (gdk_clipboard_get_formats (gtk_widget_get_clipboard (GTK_WIDGET (self))), - G_TYPE_STRING); - mode = gtk_text_get_display_mode (self); + model = gtk_text_get_menu_model (self); - if (priv->editable && has_selection && mode == DISPLAY_NORMAL) - append_bubble_action (self, toolbar, _("Select all"), "edit-select-all-symbolic", "select-all", !all_selected); + for (i = 0; i < g_menu_model_get_n_items (model); i++) + append_bubble_item (self, toolbar, model, i); - if (priv->editable && has_selection && mode == DISPLAY_NORMAL) - append_bubble_action (self, toolbar, _("Cut"), "edit-cut-symbolic", "cut-clipboard", TRUE); - - if (has_selection && mode == DISPLAY_NORMAL) - append_bubble_action (self, toolbar, _("Copy"), "edit-copy-symbolic", "copy-clipboard", TRUE); - - if (priv->editable) - append_bubble_action (self, toolbar, _("Paste"), "edit-paste-symbolic", "paste-clipboard", has_clipboard); - - if (priv->populate_all) - g_signal_emit (self, signals[POPULATE_POPUP], 0, box); + g_object_unref (model); gtk_widget_get_allocation (GTK_WIDGET (self), &allocation); @@ -5944,7 +6035,7 @@ gtk_text_drag_begin (GtkWidget *widget, text = _gtk_text_get_selected_text (self); - if (text) + if (self) { int *ranges, n_ranges; GdkPaintable *paintable; @@ -6492,6 +6583,7 @@ gtk_text_set_input_hints (GtkText *self, NULL); g_object_notify_by_pspec (G_OBJECT (self), text_props[PROP_INPUT_HINTS]); + gtk_text_update_emoji_action (self); } } @@ -6686,3 +6778,45 @@ gtk_text_get_key_controller (GtkText *self) return priv->key_controller; } + +/** + * gtk_text_set_extra_menu: + * @self: a #GtkText + * @model: (allow-none): a #GMenuModel + * + * Sets a menu model to add when constructing + * the context menu for @self. + */ +void +gtk_text_set_extra_menu (GtkText *self, + GMenuModel *model) +{ + GtkTextPrivate *priv = gtk_text_get_instance_private (self); + + g_return_if_fail (GTK_IS_TEXT (self)); + + if (g_set_object (&priv->extra_menu, model)) + { + g_clear_pointer (&priv->popup_menu, gtk_widget_unparent); + + g_object_notify_by_pspec (G_OBJECT (self), text_props[PROP_EXTRA_MENU]); + } +} + +/** + * gtk_text_get_extra_menu: + * @self: a #GtkText + * + * Gets the menu model set with gtk_text_set_extra_menu(). + * + * Returns: (transfer none): (nullable): the menu model + */ +GMenuModel * +gtk_text_get_extra_menu (GtkText *self) +{ + GtkTextPrivate *priv = gtk_text_get_instance_private (self); + + g_return_val_if_fail (GTK_IS_TEXT (self), NULL); + + return priv->extra_menu; +} diff --git a/gtk/gtktext.h b/gtk/gtktext.h index 9907daee9d..025fdd3d89 100644 --- a/gtk/gtktext.h +++ b/gtk/gtktext.h @@ -134,6 +134,12 @@ PangoTabArray * gtk_text_get_tabs (GtkText *self); GDK_AVAILABLE_IN_ALL void gtk_text_grab_focus_without_selecting (GtkText *self); +GDK_AVAILABLE_IN_ALL +void gtk_text_set_extra_menu (GtkText *self, + GMenuModel *model); +GDK_AVAILABLE_IN_ALL +GMenuModel * gtk_text_get_extra_menu (GtkText *self); + G_END_DECLS #endif /* __GTK_TEXT_H__ */ diff --git a/gtk/gtktextprivate.h b/gtk/gtktextprivate.h index ec1d0af6d2..daeed71bce 100644 --- a/gtk/gtktextprivate.h +++ b/gtk/gtktextprivate.h @@ -34,9 +34,6 @@ typedef struct _GtkTextClass GtkTextClass; /* * GtkTextClass: * @parent_class: The parent class. - * @populate_popup: Class handler for the #GtkText::populate-popup signal. If - * non-%NULL, this will be called to add additional entries to the context - * menu when it is displayed. * @activate: Class handler for the #GtkText::activate signal. The default * implementation activates the gtk.activate-default action. * @move_cursor: Class handler for the #GtkText::move-cursor signal. The @@ -70,10 +67,6 @@ struct _GtkTextClass { GtkWidgetClass parent_class; - /* Hook to customize right-click popup */ - void (* populate_popup) (GtkText *self, - GtkWidget *popup); - /* Action signals */ void (* activate) (GtkText *self); diff --git a/gtk/gtktextview.c b/gtk/gtktextview.c index 6e87b25f23..ce5cfad17c 100644 --- a/gtk/gtktextview.c +++ b/gtk/gtktextview.c @@ -58,6 +58,8 @@ #include "gtkemojichooser.h" #include "gtkpango.h" #include "gtknative.h" +#include "gtkwidgetprivate.h" +#include "gtkactionmuxerprivate.h" #include "a11y/gtktextviewaccessibleprivate.h" @@ -180,6 +182,8 @@ struct _GtkTextViewPrivate GtkAdjustment *hadjustment; GtkAdjustment *vadjustment; + GActionMap *context_actions; + /* X offset between widget coordinates and buffer coordinates * taking left_padding in account */ @@ -219,6 +223,7 @@ struct _GtkTextViewPrivate GtkIMContext *im_context; GtkWidget *popup_menu; + GMenuModel *extra_menu; GSList *children; @@ -273,7 +278,6 @@ struct _GtkTextViewPrivate guint vscroll_policy : 1; guint cursor_handle_dragged : 1; guint selection_handle_dragged : 1; - guint populate_all : 1; }; struct _GtkTextPendingScroll @@ -294,7 +298,6 @@ typedef enum enum { - POPULATE_POPUP, MOVE_CURSOR, PAGE_HORIZONTALLY, SET_ANCHOR, @@ -340,8 +343,8 @@ enum PROP_VSCROLL_POLICY, PROP_INPUT_PURPOSE, PROP_INPUT_HINTS, - PROP_POPULATE_ALL, - PROP_MONOSPACE + PROP_MONOSPACE, + PROP_EXTRA_MENU }; static GQuark quark_text_selection_data = 0; @@ -443,7 +446,6 @@ static void gtk_text_view_drag_data_received (GtkWidget *widget, GtkSelectionData *selection_data); static gboolean gtk_text_view_popup_menu (GtkWidget *widget); - static void gtk_text_view_move_cursor (GtkTextView *text_view, GtkMovementStep step, gint count, @@ -593,6 +595,10 @@ static void extend_selection (GtkTextView *text_view, GtkTextIter *start, GtkTextIter *end); +static void gtk_text_view_add_context_actions (GtkTextView *text_view); +static void gtk_text_view_update_clipboard_actions (GtkTextView *text_view); +static void gtk_text_view_update_emoji_action (GtkTextView *text_view); + /* FIXME probably need the focus methods. */ @@ -958,22 +964,9 @@ gtk_text_view_class_init (GtkTextViewClass *klass) GTK_INPUT_HINT_NONE, GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY)); - /** - * GtkTextView:populate-all: - * - * If :populate-all is %TRUE, the #GtkTextView::populate-popup - * signal is also emitted for touch popups. - */ - g_object_class_install_property (gobject_class, - PROP_POPULATE_ALL, - g_param_spec_boolean ("populate-all", - P_("Populate all"), - P_("Whether to emit ::populate-popup for touch popups"), - FALSE, - GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY)); /** - * GtkTextview:monospace: + * GtkTextView:monospace: * * If %TRUE, set the %GTK_STYLE_CLASS_MONOSPACE style class on the * text view to indicate that a monospace font is desired. @@ -986,7 +979,13 @@ gtk_text_view_class_init (GtkTextViewClass *klass) FALSE, GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY)); - + g_object_class_install_property (gobject_class, + PROP_EXTRA_MENU, + g_param_spec_object ("extra-menu", + P_("Extra menu"), + P_("Menu model to append to the context menu"), + G_TYPE_MENU_MODEL, + GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY)); /* GtkScrollable interface */ g_object_class_override_property (gobject_class, PROP_HADJUSTMENT, "hadjustment"); @@ -1244,36 +1243,6 @@ gtk_text_view_class_init (GtkTextViewClass *klass) NULL, G_TYPE_NONE, 0); - /** - * GtkTextView::populate-popup: - * @text_view: The text view on which the signal is emitted - * @popup: the container that is being populated - * - * The ::populate-popup signal gets emitted before showing the - * context menu of the text view. - * - * If you need to add items to the context menu, connect - * to this signal and append your items to the @popup, which - * will be a #GtkMenu in this case. - * - * If #GtkTextView:populate-all is %TRUE, this signal will - * also be emitted to populate touch popups. In this case, - * @popup will be a different container, e.g. a #GtkToolbar. - * - * The signal handler should not make assumptions about the - * type of @widget, but check whether @popup is a #GtkMenu - * or #GtkToolbar or another kind of container. - */ - signals[POPULATE_POPUP] = - g_signal_new (I_("populate-popup"), - G_OBJECT_CLASS_TYPE (gobject_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (GtkTextViewClass, populate_popup), - NULL, NULL, - NULL, - G_TYPE_NONE, 1, - GTK_TYPE_WIDGET); - /** * GtkTextView::select-all: * @text_view: the object which received the signal @@ -1725,6 +1694,8 @@ gtk_text_view_init (GtkTextView *text_view) gtk_css_node_get_state (priv->text_window->css_node) & ~GTK_STATE_FLAG_DROP_ACTIVE); gtk_css_node_set_visible (priv->selection_node, FALSE); g_object_unref (priv->selection_node); + + gtk_text_view_add_context_actions (text_view); } GtkCssNode * @@ -3645,6 +3616,10 @@ gtk_text_view_finalize (GObject *object) g_free (priv->im_module); + g_clear_pointer (&priv->popup_menu, gtk_widget_unparent); + g_clear_object (&priv->context_actions); + g_clear_object (&priv->extra_menu); + G_OBJECT_CLASS (gtk_text_view_parent_class)->finalize (object); } @@ -3767,17 +3742,14 @@ gtk_text_view_set_property (GObject *object, gtk_text_view_set_input_hints (text_view, g_value_get_flags (value)); break; - case PROP_POPULATE_ALL: - if (text_view->priv->populate_all != g_value_get_boolean (value)) - { - text_view->priv->populate_all = g_value_get_boolean (value); - g_object_notify_by_pspec (object, pspec); - } - break; case PROP_MONOSPACE: gtk_text_view_set_monospace (text_view, g_value_get_boolean (value)); break; + case PROP_EXTRA_MENU: + gtk_text_view_set_extra_menu (text_view, g_value_get_object (value)); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -3890,14 +3862,14 @@ gtk_text_view_get_property (GObject *object, g_value_set_flags (value, gtk_text_view_get_input_hints (text_view)); break; - case PROP_POPULATE_ALL: - g_value_set_boolean (value, priv->populate_all); - break; - case PROP_MONOSPACE: g_value_set_boolean (value, gtk_text_view_get_monospace (text_view)); break; + case PROP_EXTRA_MENU: + g_value_set_object (value, gtk_text_view_get_extra_menu (text_view)); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -4191,6 +4163,9 @@ gtk_text_view_size_allocate (GtkWidget *widget, if (priv->magnifier_popover) gtk_native_check_resize (GTK_NATIVE (priv->magnifier_popover)); + + if (priv->popup_menu) + gtk_native_check_resize (GTK_NATIVE (priv->popup_menu)); } static void @@ -4500,11 +4475,7 @@ gtk_text_view_unrealize (GtkWidget *widget) gtk_text_view_remove_validate_idles (text_view); - if (priv->popup_menu) - { - gtk_widget_destroy (priv->popup_menu); - priv->popup_menu = NULL; - } + g_clear_pointer (&priv->popup_menu, gtk_widget_unparent); gtk_im_context_set_client_widget (priv->im_context, NULL); @@ -8458,35 +8429,40 @@ gtk_text_view_set_virtual_cursor_pos (GtkTextView *text_view, text_view->priv->virtual_cursor_y = (y == -1) ? pos.y + pos.height / 2 : y; } -/* Quick hack of a popup menu - */ static void -activate_cb (GtkWidget *menuitem, - GtkTextView *text_view) +hide_selection_bubble (GtkTextView *text_view) { - const gchar *signal; + GtkTextViewPrivate *priv = text_view->priv; - signal = g_object_get_qdata (G_OBJECT (menuitem), quark_gtk_signal); - g_signal_emit_by_name (text_view, signal); + if (priv->selection_bubble && gtk_widget_get_visible (priv->selection_bubble)) + gtk_widget_hide (priv->selection_bubble); } static void -append_action_signal (GtkTextView *text_view, - GtkWidget *menu, - const gchar *label, - const gchar *signal, - gboolean sensitive) +cut_clipboard_activated (GSimpleAction *action, + GVariant *parameter, + gpointer user_data) { - GtkWidget *menuitem = gtk_menu_item_new_with_mnemonic (label); + g_signal_emit_by_name (user_data, "cut-clipboard"); + hide_selection_bubble (GTK_TEXT_VIEW (user_data)); +} - g_object_set_qdata (G_OBJECT (menuitem), quark_gtk_signal, (char *)signal); - g_signal_connect (menuitem, "activate", - G_CALLBACK (activate_cb), text_view); +static void +copy_clipboard_activated (GSimpleAction *action, + GVariant *parameter, + gpointer user_data) +{ + g_signal_emit_by_name (user_data, "copy-clipboard"); + hide_selection_bubble (GTK_TEXT_VIEW (user_data)); +} - gtk_widget_set_sensitive (menuitem, sensitive); - - gtk_widget_show (menuitem); - gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); +static void +paste_clipboard_activated (GSimpleAction *action, + GVariant *parameter, + gpointer user_data) +{ + g_signal_emit_by_name (user_data, "paste-clipboard"); + hide_selection_bubble (GTK_TEXT_VIEW (user_data)); } static void @@ -8512,24 +8488,32 @@ gtk_text_view_select_all (GtkWidget *widget, } static void -select_all_cb (GtkWidget *menuitem, - GtkTextView *text_view) +select_all_activated (GSimpleAction *action, + GVariant *parameter, + gpointer user_data) { + GtkTextView *text_view = user_data; + gtk_text_view_select_all (GTK_WIDGET (text_view), TRUE); } static void -delete_cb (GtkTextView *text_view) +delete_selection_activated (GSimpleAction *action, + GVariant *parameter, + gpointer user_data) { + GtkTextView *text_view = user_data; + gtk_text_buffer_delete_selection (get_buffer (text_view), TRUE, text_view->priv->editable); } static void -popup_menu_detach (GtkWidget *attach_widget, - GtkMenu *menu) +insert_emoji_activated (GSimpleAction *action, + GVariant *parameter, + gpointer user_data) { - GTK_TEXT_VIEW (attach_widget)->priv->popup_menu = NULL; + gtk_text_view_insert_emoji (GTK_TEXT_VIEW (user_data)); } static gboolean @@ -8550,6 +8534,147 @@ range_contains_editable_text (const GtkTextIter *start, return FALSE; } +static void +gtk_text_view_add_context_actions (GtkTextView *text_view) +{ + GtkTextViewPrivate *priv = text_view->priv; + + GActionEntry entries[] = { + { "cut-clipboard", cut_clipboard_activated, NULL, NULL, NULL }, + { "copy-clipboard", copy_clipboard_activated, NULL, NULL, NULL }, + { "paste-clipboard", paste_clipboard_activated, NULL, NULL, NULL }, + { "delete-selection", delete_selection_activated, NULL, NULL, NULL }, + { "select-all", select_all_activated, NULL, NULL, NULL }, + { "insert-emoji", insert_emoji_activated, NULL, NULL, NULL }, + }; + + GSimpleActionGroup *actions = g_simple_action_group_new (); + GAction *action; + + priv->context_actions = G_ACTION_MAP (actions); + + g_action_map_add_action_entries (G_ACTION_MAP (actions), entries, G_N_ELEMENTS (entries), text_view); + + action = g_action_map_lookup_action (G_ACTION_MAP (actions), "cut-clipboard"); + g_simple_action_set_enabled (G_SIMPLE_ACTION (action), FALSE); + action = g_action_map_lookup_action (G_ACTION_MAP (actions), "copy-clipboard"); + g_simple_action_set_enabled (G_SIMPLE_ACTION (action), FALSE); + action = g_action_map_lookup_action (G_ACTION_MAP (actions), "paste-clipboard"); + g_simple_action_set_enabled (G_SIMPLE_ACTION (action), FALSE); + action = g_action_map_lookup_action (G_ACTION_MAP (actions), "delete-selection"); + g_simple_action_set_enabled (G_SIMPLE_ACTION (action), FALSE); + action = g_action_map_lookup_action (G_ACTION_MAP (actions), "select-all"); + g_simple_action_set_enabled (G_SIMPLE_ACTION (action), FALSE); + action = g_action_map_lookup_action (G_ACTION_MAP (actions), "insert-emoji"); + g_simple_action_set_enabled (G_SIMPLE_ACTION (action), FALSE); + + gtk_widget_insert_action_group (GTK_WIDGET (text_view), "context", G_ACTION_GROUP (actions)); +} + +static void +gtk_text_view_update_clipboard_actions (GtkTextView *text_view) +{ + GtkTextViewPrivate *priv = text_view->priv; + GdkClipboard *clipboard; + gboolean have_selection; + gboolean can_paste, can_insert; + GAction *action; + GtkTextIter iter, sel_start, sel_end; + + clipboard = gtk_widget_get_clipboard (GTK_WIDGET (text_view)); + can_paste = gdk_content_formats_contain_gtype (gdk_clipboard_get_formats (clipboard), G_TYPE_STRING); + + have_selection = gtk_text_buffer_get_selection_bounds (get_buffer (text_view), + &sel_start, &sel_end); + + gtk_text_buffer_get_iter_at_mark (get_buffer (text_view), + &iter, + gtk_text_buffer_get_insert (get_buffer (text_view))); + + can_insert = gtk_text_iter_can_insert (&iter, priv->editable); + + action = g_action_map_lookup_action (priv->context_actions, "cut-clipboard"); + g_simple_action_set_enabled (G_SIMPLE_ACTION (action), + have_selection && + range_contains_editable_text (&sel_start, &sel_end, priv->editable)); + + action = g_action_map_lookup_action (priv->context_actions, "copy-clipboard"); + g_simple_action_set_enabled (G_SIMPLE_ACTION (action), have_selection); + + action = g_action_map_lookup_action (priv->context_actions, "paste-clipboard"); + g_simple_action_set_enabled (G_SIMPLE_ACTION (action), can_insert && can_paste); + + action = g_action_map_lookup_action (priv->context_actions, "delete-selection"); + g_simple_action_set_enabled (G_SIMPLE_ACTION (action), + have_selection && + range_contains_editable_text (&sel_start, &sel_end, priv->editable)); + + action = g_action_map_lookup_action (priv->context_actions, "select-all"); + g_simple_action_set_enabled (G_SIMPLE_ACTION (action), + gtk_text_buffer_get_char_count (priv->buffer) > 0); +} + +static void +gtk_text_view_update_emoji_action (GtkTextView *text_view) +{ + GtkTextViewPrivate *priv = text_view->priv; + GAction *action; + + action = g_action_map_lookup_action (priv->context_actions, "insert-emoji"); + g_simple_action_set_enabled (G_SIMPLE_ACTION (action), + (gtk_text_view_get_input_hints (text_view) & GTK_INPUT_HINT_NO_EMOJI) == 0); +} + +static GMenuModel * +gtk_text_view_get_menu_model (GtkTextView *text_view) +{ + GtkTextViewPrivate *priv = text_view->priv; + GMenu *menu, *section; + GMenuItem *item; + + menu = g_menu_new (); + + section = g_menu_new (); + item = g_menu_item_new (_("Cu_t"), "context.cut-clipboard"); + g_menu_item_set_attribute (item, "touch-icon", "s", "edit-cut-symbolic"); + g_menu_append_item (section, item); + g_object_unref (item); + item = g_menu_item_new (_("_Copy"), "context.copy-clipboard"); + g_menu_item_set_attribute (item, "touch-icon", "s", "edit-copy-symbolic"); + g_menu_append_item (section, item); + g_object_unref (item); + item = g_menu_item_new (_("_Paste"), "context.paste-clipboard"); + g_menu_item_set_attribute (item, "touch-icon", "s", "edit-paste-symbolic"); + g_menu_append_item (section, item); + g_object_unref (item); + item = g_menu_item_new (_("_Delete"), "context.delete-selection"); + g_menu_item_set_attribute (item, "touch-icon", "s", "edit-delete-symbolic"); + g_menu_append_item (section, item); + g_object_unref (item); + g_menu_append_section (menu, NULL, G_MENU_MODEL (section)); + g_object_unref (section); + + section = g_menu_new (); + + item = g_menu_item_new (_("Select _All"), "context.select-all"); + g_menu_item_set_attribute (item, "touch-icon", "s", "edit-select-all-symbolic"); + g_menu_append_item (section, item); + g_object_unref (item); + + item = g_menu_item_new ( _("Insert _Emoji"), "context.insert-emoji"); + g_menu_item_set_attribute (item, "hidden-when", "s", "action-disabled"); + g_menu_item_set_attribute (item, "touch-icon", "s", "face-smile-symbolic"); + g_menu_append_item (section, item); + g_object_unref (item); + g_menu_append_section (menu, NULL, G_MENU_MODEL (section)); + g_object_unref (section); + + if (priv->extra_menu) + g_menu_append_section (menu, NULL, priv->extra_menu); + + return G_MENU_MODEL (menu); +} + static void gtk_text_view_do_popup (GtkTextView *text_view, const GdkEvent *event) @@ -8557,134 +8682,95 @@ gtk_text_view_do_popup (GtkTextView *text_view, GtkTextViewPrivate *priv = text_view->priv; GdkEvent *trigger_event; + if (!gtk_widget_get_realized (GTK_WIDGET (text_view))) + return; + if (event) trigger_event = gdk_event_copy (event); else trigger_event = gtk_get_current_event (); - if (gtk_widget_get_realized (GTK_WIDGET (text_view))) + gtk_text_view_update_clipboard_actions (text_view); + + if (!priv->popup_menu) + { + GMenuModel *model; + + model = gtk_text_view_get_menu_model (text_view); + priv->popup_menu = gtk_popover_menu_new_from_model (GTK_WIDGET (text_view), model); + gtk_popover_set_position (GTK_POPOVER (priv->popup_menu), GTK_POS_BOTTOM); + + gtk_popover_set_has_arrow (GTK_POPOVER (priv->popup_menu), FALSE); + gtk_widget_set_halign (priv->popup_menu, GTK_ALIGN_START); + + g_object_unref (model); + } + + if (trigger_event && gdk_event_triggers_context_menu (trigger_event)) + { + GdkDevice *device; + GdkRectangle rect = { 0, 0, 1, 1 }; + + device = gdk_event_get_device (trigger_event); + + if (device && gdk_device_get_source (device) == GDK_SOURCE_KEYBOARD) + device = gdk_device_get_associated_device (device); + + if (device) + { + GdkSurface *surface; + double px, py; + + surface = gtk_native_get_surface (gtk_widget_get_native (GTK_WIDGET (text_view))); + gdk_surface_get_device_position (surface, device, &px, &py, NULL); + rect.x = round (px); + rect.y = round (py); + + gtk_widget_translate_coordinates (GTK_WIDGET (gtk_widget_get_native (GTK_WIDGET (text_view))), + GTK_WIDGET (text_view), + rect.x, rect.y, + &rect.x, &rect.y); + } + + gtk_popover_set_pointing_to (GTK_POPOVER (priv->popup_menu), &rect); + } + else { - GtkWidget *menuitem; - gboolean have_selection; - gboolean can_insert, can_paste; GtkTextIter iter; - GtkTextIter sel_start, sel_end; GdkRectangle iter_location; GdkRectangle visible_rect; gboolean is_visible; - if (priv->popup_menu) - gtk_widget_destroy (priv->popup_menu); + gtk_text_view_get_iter_location (text_view, &iter, &iter_location); + gtk_text_view_get_visible_rect (text_view, &visible_rect); - priv->popup_menu = gtk_menu_new (); - gtk_style_context_add_class (gtk_widget_get_style_context (priv->popup_menu), - GTK_STYLE_CLASS_CONTEXT_MENU); + is_visible = (iter_location.x + iter_location.width > visible_rect.x && + iter_location.x < visible_rect.x + visible_rect.width && + iter_location.y + iter_location.height > visible_rect.y && + iter_location.y < visible_rect.y + visible_rect.height); - gtk_menu_attach_to_widget (GTK_MENU (priv->popup_menu), - GTK_WIDGET (text_view), - popup_menu_detach); - - have_selection = gtk_text_buffer_get_selection_bounds (get_buffer (text_view), - &sel_start, &sel_end); - - gtk_text_buffer_get_iter_at_mark (get_buffer (text_view), - &iter, - gtk_text_buffer_get_insert (get_buffer (text_view))); - - can_insert = gtk_text_iter_can_insert (&iter, priv->editable); - can_paste = gdk_content_formats_contain_gtype (gdk_clipboard_get_formats (gtk_widget_get_clipboard (GTK_WIDGET (text_view))), - GTK_TYPE_TEXT_BUFFER); - - append_action_signal (text_view, priv->popup_menu, _("Cu_t"), "cut-clipboard", - have_selection && - range_contains_editable_text (&sel_start, &sel_end, - priv->editable)); - append_action_signal (text_view, priv->popup_menu, _("_Copy"), "copy-clipboard", - have_selection); - append_action_signal (text_view, priv->popup_menu, _("_Paste"), "paste-clipboard", - can_insert && can_paste); - - menuitem = gtk_menu_item_new_with_mnemonic (_("_Delete")); - gtk_widget_set_sensitive (menuitem, - have_selection && - range_contains_editable_text (&sel_start, &sel_end, - priv->editable)); - g_signal_connect_swapped (menuitem, "activate", - G_CALLBACK (delete_cb), text_view); - gtk_widget_show (menuitem); - gtk_menu_shell_append (GTK_MENU_SHELL (priv->popup_menu), menuitem); - - menuitem = gtk_separator_menu_item_new (); - gtk_widget_show (menuitem); - gtk_menu_shell_append (GTK_MENU_SHELL (priv->popup_menu), menuitem); - - menuitem = gtk_menu_item_new_with_mnemonic (_("Select _All")); - gtk_widget_set_sensitive (menuitem, - gtk_text_buffer_get_char_count (priv->buffer) > 0); - g_signal_connect (menuitem, "activate", - G_CALLBACK (select_all_cb), text_view); - gtk_widget_show (menuitem); - gtk_menu_shell_append (GTK_MENU_SHELL (priv->popup_menu), menuitem); - - if ((gtk_text_view_get_input_hints (text_view) & GTK_INPUT_HINT_NO_EMOJI) == 0) + if (is_visible) { - menuitem = gtk_menu_item_new_with_mnemonic (_("Insert _Emoji")); - gtk_widget_set_sensitive (menuitem, can_insert); - g_signal_connect_swapped (menuitem, "activate", - G_CALLBACK (gtk_text_view_insert_emoji), text_view); - gtk_widget_show (menuitem); - gtk_menu_shell_append (GTK_MENU_SHELL (priv->popup_menu), menuitem); - } + gtk_text_view_buffer_to_surface_coords (text_view, + GTK_TEXT_WINDOW_WIDGET, + iter_location.x, + iter_location.y, + &iter_location.x, + &iter_location.y); - g_signal_emit (text_view, signals[POPULATE_POPUP], - 0, priv->popup_menu); - - if (trigger_event && gdk_event_triggers_context_menu (trigger_event)) - gtk_menu_popup_at_pointer (GTK_MENU (priv->popup_menu), trigger_event); - else - { - gtk_text_view_get_iter_location (text_view, &iter, &iter_location); - gtk_text_view_get_visible_rect (text_view, &visible_rect); - - is_visible = (iter_location.x + iter_location.width > visible_rect.x && - iter_location.x < visible_rect.x + visible_rect.width && - iter_location.y + iter_location.height > visible_rect.y && - iter_location.y < visible_rect.y + visible_rect.height); - - if (is_visible) - { - gtk_text_view_buffer_to_surface_coords (text_view, - GTK_TEXT_WINDOW_WIDGET, - iter_location.x, - iter_location.y, - &iter_location.x, - &iter_location.y); - - gtk_menu_popup_at_rect (GTK_MENU (priv->popup_menu), - gtk_native_get_surface (gtk_widget_get_native (GTK_WIDGET (text_view))), - &iter_location, - GDK_GRAVITY_SOUTH_EAST, - GDK_GRAVITY_NORTH_WEST, - trigger_event); - } - else - gtk_menu_popup_at_widget (GTK_MENU (priv->popup_menu), - GTK_WIDGET (text_view), - GDK_GRAVITY_CENTER, - GDK_GRAVITY_CENTER, - trigger_event); - - gtk_menu_shell_select_first (GTK_MENU_SHELL (priv->popup_menu), FALSE); + gtk_popover_set_pointing_to (GTK_POPOVER (priv->popup_menu), &iter_location); } } + gtk_popover_popup (GTK_POPOVER (priv->popup_menu)); + g_clear_object (&trigger_event); } static gboolean gtk_text_view_popup_menu (GtkWidget *widget) { - gtk_text_view_do_popup (GTK_TEXT_VIEW (widget), NULL); + gtk_text_view_do_popup (GTK_TEXT_VIEW (widget), NULL); return TRUE; } @@ -8741,32 +8827,81 @@ show_or_hide_handles (GtkWidget *popover, } static void -activate_bubble_cb (GtkWidget *item, - GtkTextView *text_view) +append_bubble_item (GtkTextView *text_view, + GtkWidget *toolbar, + GMenuModel *model, + int index) { - const gchar *signal; + GtkWidget *item, *image; + GVariant *att; + const char *icon_name; + const char *action_name; + GMenuModel *link; + char **split = NULL; + gboolean is_toggle_action = FALSE; - signal = g_object_get_qdata (G_OBJECT (item), quark_gtk_signal); - gtk_widget_hide (text_view->priv->selection_bubble); - g_signal_emit_by_name (text_view, signal); -} + link = g_menu_model_get_item_link (model, index, "section"); + if (link) + { + int i; + for (i = 0; i < g_menu_model_get_n_items (link); i++) + append_bubble_item (text_view, toolbar, link, i); + g_object_unref (link); + return; + } -static void -append_bubble_action (GtkTextView *text_view, - GtkWidget *toolbar, - const gchar *label, - const gchar *icon_name, - const gchar *signal, - gboolean sensitive) -{ - GtkWidget *item; + att = g_menu_model_get_item_attribute_value (model, index, "touch-icon", G_VARIANT_TYPE_STRING); + if (att == NULL) + return; - item = gtk_button_new_from_icon_name (icon_name); + icon_name = g_variant_get_string (att, NULL); + g_variant_unref (att); + + att = g_menu_model_get_item_attribute_value (model, index, "action", G_VARIANT_TYPE_STRING); + if (att == NULL) + return; + action_name = g_variant_get_string (att, NULL); + g_variant_unref (att); + + split = g_strsplit (action_name, ".", 2); + if (split[0] && split[1]) + { + GActionGroup *group = NULL; + gboolean enabled; + const GVariantType *param_type; + const GVariantType *state_type; + GtkActionMuxer *muxer; + + muxer = _gtk_widget_get_action_muxer (GTK_WIDGET (text_view), FALSE); + if (muxer) + group = gtk_action_muxer_lookup (muxer, split[0]); + if (group) + { + g_action_group_query_action (group, split[1], &enabled, ¶m_type, &state_type, NULL, NULL); + + if (!enabled) + return; + + if (param_type == NULL && + state_type != NULL && + g_variant_type_equal (state_type, G_VARIANT_TYPE_BOOLEAN)) + is_toggle_action = TRUE; + } + } + g_strfreev (split); + + if (is_toggle_action) + item = gtk_toggle_button_new (); + else + item = gtk_button_new (); gtk_widget_set_focus_on_click (item, FALSE); - gtk_widget_set_tooltip_text (item, label); - g_object_set_qdata (G_OBJECT (item), quark_gtk_signal, (char *)signal); - g_signal_connect (item, "clicked", G_CALLBACK (activate_bubble_cb), text_view); - gtk_widget_set_sensitive (GTK_WIDGET (item), sensitive); + image = gtk_image_new_from_icon_name (icon_name); + gtk_widget_show (image); + gtk_container_add (GTK_CONTAINER (item), image); + gtk_style_context_add_class (gtk_widget_get_style_context (item), "image-button"); + gtk_actionable_set_action_name (GTK_ACTIONABLE (item), action_name); + + gtk_widget_show (GTK_WIDGET (item)); gtk_container_add (GTK_CONTAINER (toolbar), item); } @@ -8776,24 +8911,14 @@ gtk_text_view_selection_bubble_popup_show (gpointer user_data) GtkTextView *text_view = user_data; GtkTextViewPrivate *priv = text_view->priv; cairo_rectangle_int_t rect; - GdkClipboard *clipboard; - gboolean has_selection; - gboolean has_clipboard; - gboolean can_insert; - gboolean all_selected; - GtkTextIter iter; - GtkTextIter sel_start, sel_end; - GtkTextIter start, end; GtkWidget *box; GtkWidget *toolbar; + GMenuModel *model; + int i; + + gtk_text_view_update_clipboard_actions (text_view); priv->selection_bubble_timeout_id = 0; - has_selection = gtk_text_buffer_get_selection_bounds (get_buffer (text_view), - &sel_start, &sel_end); - gtk_text_buffer_get_bounds (get_buffer (text_view), &start, &end); - - all_selected = gtk_text_iter_equal (&start, &sel_start) && - gtk_text_iter_equal (&end, &sel_end); g_clear_pointer (&priv->selection_bubble, gtk_widget_unparent); @@ -8813,25 +8938,12 @@ gtk_text_view_selection_bubble_popup_show (gpointer user_data) gtk_container_add (GTK_CONTAINER (priv->selection_bubble), box); gtk_container_add (GTK_CONTAINER (box), toolbar); - gtk_text_buffer_get_iter_at_mark (get_buffer (text_view), &iter, - gtk_text_buffer_get_insert (get_buffer (text_view))); - can_insert = gtk_text_iter_can_insert (&iter, priv->editable); - clipboard = gtk_widget_get_clipboard (GTK_WIDGET (text_view)); - has_clipboard = gdk_content_formats_contain_gtype (gdk_clipboard_get_formats (clipboard), GTK_TYPE_TEXT_BUFFER); + model = gtk_text_view_get_menu_model (text_view); - append_bubble_action (text_view, toolbar, _("Select all"), "edit-select-all-symbolic", "select-all", !all_selected); + for (i = 0; i < g_menu_model_get_n_items (model); i++) + append_bubble_item (text_view, toolbar, model, i); - if (range_contains_editable_text (&sel_start, &sel_end, priv->editable) && has_selection) - append_bubble_action (text_view, toolbar, _("Cut"), "edit-cut-symbolic", "cut-clipboard", TRUE); - - if (has_selection) - append_bubble_action (text_view, toolbar, _("Copy"), "edit-copy-symbolic", "copy-clipboard", TRUE); - - if (can_insert) - append_bubble_action (text_view, toolbar, _("Paste"), "edit-paste-symbolic", "paste-clipboard", has_clipboard); - - if (priv->populate_all) - g_signal_emit (text_view, signals[POPULATE_POPUP], 0, box); + g_object_unref (model); gtk_text_view_get_selection_rect (text_view, &rect); rect.x -= priv->xoffset; @@ -9782,6 +9894,7 @@ gtk_text_view_set_input_hints (GtkTextView *text_view, NULL); g_object_notify (G_OBJECT (text_view), "input-hints"); + gtk_text_view_update_emoji_action (text_view); } } @@ -9891,3 +10004,44 @@ gtk_text_view_insert_emoji (GtkTextView *text_view) gtk_popover_popup (GTK_POPOVER (chooser)); } + +/** + * gtk_text_view_set_extra_menu: + * @text_view: a #GtkTextView + * @model: (allow-none): a #GMenuModel + * + * Sets a menu model to add when constructing + * the context menu for @text_view. + */ +void +gtk_text_view_set_extra_menu (GtkTextView *text_view, + GMenuModel *model) +{ + GtkTextViewPrivate *priv = text_view->priv; + + g_return_if_fail (GTK_IS_TEXT_VIEW (text_view)); + + if (g_set_object (&priv->extra_menu, model)) + { + g_clear_pointer (&priv->popup_menu, gtk_widget_unparent); + g_object_notify (G_OBJECT (text_view), "extra-menu"); + } +} + +/** + * gtk_text_view_get_extra_menu: + * @text_view: a #GtkTextView + * + * Gets the menu model set with gtk_text_view_set_extra_menu(). + * + * Returns: (transfer none): (nullable): the menu model + */ +GMenuModel * +gtk_text_view_get_extra_menu (GtkTextView *text_view) +{ + GtkTextViewPrivate *priv = text_view->priv; + + g_return_val_if_fail (GTK_IS_TEXT_VIEW (text_view), NULL); + + return priv->extra_menu; +} diff --git a/gtk/gtktextview.h b/gtk/gtktextview.h index 21b953d2d1..9bb9b89eb3 100644 --- a/gtk/gtktextview.h +++ b/gtk/gtktextview.h @@ -120,8 +120,6 @@ struct _GtkTextView /** * GtkTextViewClass: * @parent_class: The object class structure needs to be the first - * @populate_popup: The class handler for the #GtkTextView::populate-popup - * signal. * @move_cursor: The class handler for the #GtkTextView::move-cursor * keybinding signal. * @set_anchor: The class handler for the #GtkTextView::set-anchor @@ -159,8 +157,6 @@ struct _GtkTextViewClass /*< public >*/ - void (* populate_popup) (GtkTextView *text_view, - GtkWidget *popup); void (* move_cursor) (GtkTextView *text_view, GtkMovementStep step, gint count, @@ -431,6 +427,12 @@ void gtk_text_view_set_monospace (GtkTextView *text_vi GDK_AVAILABLE_IN_ALL gboolean gtk_text_view_get_monospace (GtkTextView *text_view); +GDK_AVAILABLE_IN_ALL +void gtk_text_view_set_extra_menu (GtkTextView *text_view, + GMenuModel *model); +GDK_AVAILABLE_IN_ALL +GMenuModel * gtk_text_view_get_extra_menu (GtkTextView *text_view); + G_END_DECLS #endif /* __GTK_TEXT_VIEW_H__ */ diff --git a/gtk/gtktreeview.c b/gtk/gtktreeview.c index e16ae22a8a..a73c54a6c6 100644 --- a/gtk/gtktreeview.c +++ b/gtk/gtktreeview.c @@ -841,9 +841,6 @@ static void gtk_tree_view_search_window_hide (GtkWidget *searc static void gtk_tree_view_search_position_func (GtkTreeView *tree_view, GtkWidget *search_window, gpointer user_data); -static void gtk_tree_view_search_disable_popdown (GtkEntry *entry, - GtkMenu *menu, - gpointer data); static void gtk_tree_view_search_preedit_changed (GtkText *text, const char *preedit, GtkTreeView *tree_view); @@ -851,9 +848,6 @@ static void gtk_tree_view_search_changed (GtkEditable *edita GtkTreeView *tree_view); static void gtk_tree_view_search_activate (GtkEntry *entry, GtkTreeView *tree_view); -static gboolean gtk_tree_view_real_search_enable_popdown(gpointer data); -static void gtk_tree_view_search_enable_popdown (GtkWidget *widget, - gpointer data); static void gtk_tree_view_search_pressed_cb (GtkGesture *gesture, int n_press, double x, @@ -10235,8 +10229,6 @@ gtk_tree_view_ensure_interactive_directory (GtkTreeView *tree_view) /* add entry */ tree_view->priv->search_entry = gtk_text_new (); - g_signal_connect (tree_view->priv->search_entry, "populate-popup", - G_CALLBACK (gtk_tree_view_search_disable_popdown), tree_view); g_signal_connect (tree_view->priv->search_entry, "activate", G_CALLBACK (gtk_tree_view_search_activate), tree_view); g_signal_connect (tree_view->priv->search_entry, "preedit-changed", @@ -13791,18 +13783,6 @@ gtk_tree_view_search_position_func (GtkTreeView *tree_view, { } -static void -gtk_tree_view_search_disable_popdown (GtkEntry *entry, - GtkMenu *menu, - gpointer data) -{ - GtkTreeView *tree_view = (GtkTreeView *)data; - - tree_view->priv->disable_popdown = 1; - g_signal_connect (menu, "hide", - G_CALLBACK (gtk_tree_view_search_enable_popdown), data); -} - /* Because we're visible but offscreen, we just set a flag in the preedit * callback. */ @@ -13855,27 +13835,6 @@ gtk_tree_view_search_activate (GtkEntry *entry, } } -static gboolean -gtk_tree_view_real_search_enable_popdown (gpointer data) -{ - GtkTreeView *tree_view = (GtkTreeView *)data; - - tree_view->priv->disable_popdown = 0; - - return FALSE; -} - -static void -gtk_tree_view_search_enable_popdown (GtkWidget *widget, - gpointer data) -{ - guint id = g_timeout_add_full (G_PRIORITY_HIGH, 200, - gtk_tree_view_real_search_enable_popdown, - g_object_ref (data), - g_object_unref); - g_source_set_name_by_id (id, "[gtk] gtk_tree_view_real_search_enable_popdown"); -} - static void gtk_tree_view_search_pressed_cb (GtkGesture *gesture, int n_press, diff --git a/log b/log new file mode 100644 index 0000000000..15c7c4c662 --- /dev/null +++ b/log @@ -0,0 +1,2768 @@ +[2247320.035] -> wl_display@1.get_registry(new id wl_registry@2) +[2247320.103] -> wl_display@1.sync(new id wl_callback@3) +[2247320.273] wl_display@1.delete_id(3) +[2247320.290] wl_registry@2.global(1, "wl_drm", 2) +[2247320.311] wl_registry@2.global(2, "wl_compositor", 4) +[2247320.330] -> wl_registry@2.bind(2, "wl_compositor", 3, new id [unknown]@4) +[2247320.379] wl_registry@2.global(3, "wl_shm", 1) +[2247320.403] -> wl_registry@2.bind(3, "wl_shm", 1, new id [unknown]@5) +[2247320.588] -> wl_shm@5.create_pool(new id wl_shm_pool@6, fd 12, 2304) +[2247323.838] -> wl_shm_pool@6.resize(6912) +[2247324.158] -> wl_shm_pool@6.resize(16128) +[2247324.707] -> wl_shm_pool@6.resize(34560) +[2247326.800] -> wl_shm_pool@6.resize(71424) +[2247326.887] -> wl_shm_pool@6.resize(145152) +[2247326.996] -> wl_shm_pool@6.resize(292608) +[2247329.190] -> wl_shm_pool@6.resize(587520) +[2247337.626] -> wl_shm_pool@6.resize(1177344) +[2247372.109] wl_registry@2.global(4, "wl_output", 2) +[2247372.153] -> wl_registry@2.bind(4, "wl_output", 2, new id [unknown]@7) +[2247372.255] -> wl_display@1.sync(new id wl_callback@8) +[2247372.269] wl_registry@2.global(5, "zxdg_output_manager_v1", 1) +[2247372.288] -> wl_registry@2.bind(5, "zxdg_output_manager_v1", 1, new id [unknown]@9) +[2247372.313] -> zxdg_output_manager_v1@9.get_xdg_output(new id zxdg_output_v1@10, wl_output@7) +[2247372.329] -> wl_display@1.sync(new id wl_callback@11) +[2247372.340] wl_registry@2.global(6, "wl_data_device_manager", 3) +[2247372.358] -> wl_registry@2.bind(6, "wl_data_device_manager", 3, new id [unknown]@12) +[2247372.382] wl_registry@2.global(7, "gtk_primary_selection_device_manager", 1) +[2247372.400] -> wl_registry@2.bind(7, "gtk_primary_selection_device_manager", 1, new id [unknown]@13) +[2247372.424] wl_registry@2.global(8, "wl_subcompositor", 1) +[2247372.442] -> wl_registry@2.bind(8, "wl_subcompositor", 1, new id [unknown]@14) +[2247372.467] wl_registry@2.global(9, "xdg_wm_base", 2) +[2247372.485] wl_registry@2.global(10, "zxdg_shell_v6", 1) +[2247372.502] wl_registry@2.global(11, "wl_shell", 1) +[2247372.520] wl_registry@2.global(12, "gtk_shell1", 3) +[2247372.537] -> wl_registry@2.bind(12, "gtk_shell1", 2, new id [unknown]@15) +[2247372.562] wl_registry@2.global(13, "wp_viewporter", 1) +[2247372.579] wl_registry@2.global(14, "zwp_pointer_gestures_v1", 1) +[2247372.597] -> wl_registry@2.bind(14, "zwp_pointer_gestures_v1", 1, new id [unknown]@16) +[2247372.621] wl_registry@2.global(15, "zwp_tablet_manager_v2", 1) +[2247372.638] -> wl_registry@2.bind(15, "zwp_tablet_manager_v2", 1, new id [unknown]@17) +[2247372.662] wl_registry@2.global(16, "wl_seat", 5) +[2247372.681] -> wl_registry@2.bind(16, "wl_seat", 5, new id [unknown]@18) +[2247377.791] -> gtk_primary_selection_device_manager@13.get_device(new id gtk_primary_selection_device@19, wl_seat@18) +[2247377.818] -> wl_data_device_manager@12.get_data_device(new id wl_data_device@20, wl_seat@18) +[2247377.957] -> wl_compositor@4.create_surface(new id wl_surface@21) +[2247377.979] -> zwp_tablet_manager_v2@17.get_tablet_seat(new id zwp_tablet_seat_v2@22, wl_seat@18) +[2247378.003] -> wl_display@1.sync(new id wl_callback@23) +[2247378.022] wl_registry@2.global(17, "zwp_relative_pointer_manager_v1", 1) +[2247378.048] wl_registry@2.global(18, "zwp_pointer_constraints_v1", 1) +[2247378.071] wl_registry@2.global(19, "zxdg_exporter_v1", 1) +[2247378.094] -> wl_registry@2.bind(19, "zxdg_exporter_v1", 1, new id [unknown]@24) +[2247378.129] wl_registry@2.global(20, "zxdg_importer_v1", 1) +[2247378.153] -> wl_registry@2.bind(20, "zxdg_importer_v1", 1, new id [unknown]@25) +[2247378.184] wl_registry@2.global(21, "zwp_linux_dmabuf_v1", 3) +[2247378.207] wl_registry@2.global(22, "zwp_keyboard_shortcuts_inhibit_manager_v1", 1) +[2247378.230] -> wl_registry@2.bind(22, "zwp_keyboard_shortcuts_inhibit_manager_v1", 1, new id [unknown]@26) +[2247378.264] wl_registry@2.global(23, "zwp_text_input_manager_v3", 1) +[2247378.289] wl_registry@2.global(24, "gtk_text_input_manager", 1) +[2247378.314] wl_callback@3.done(115338) +[2247378.586] wl_display@1.delete_id(8) +[2247378.597] wl_display@1.delete_id(11) +[2247378.617] wl_display@1.delete_id(23) +[2247378.625] wl_shm@5.format(0) +[2247378.634] wl_shm@5.format(1) +[2247378.642] wl_output@7.geometry(0, 0, 310, 170, 0, "LGD", "0x04a9", 0) +[2247378.689] wl_output@7.mode(3, 1920, 1080, 60020) +[2247378.713] wl_output@7.scale(1) +[2247378.721] wl_output@7.done() +[2247378.727] wl_callback@8.done(115338) +[2247378.736] zxdg_output_v1@10.logical_position(0, 0) +[2247378.750] zxdg_output_v1@10.logical_size(1920, 1080) +[2247378.763] zxdg_output_v1@10.done() +[2247378.772] wl_callback@11.done(115338) +[2247378.781] gtk_shell1@15.capabilities(0) +[2247378.790] wl_seat@18.capabilities(3) +[2247378.800] -> wl_seat@18.get_pointer(new id wl_pointer@11) +[2247378.825] -> zwp_pointer_gestures_v1@16.get_swipe_gesture(new id zwp_pointer_gesture_swipe_v1@8, wl_pointer@11) +[2247378.842] -> zwp_pointer_gestures_v1@16.get_pinch_gesture(new id zwp_pointer_gesture_pinch_v1@3, wl_pointer@11) +[2247378.903] -> wl_seat@18.get_keyboard(new id wl_keyboard@27) +[2247378.925] wl_seat@18.name("seat0") +[2247378.935] wl_callback@23.done(115338) +[2247378.944] -> wl_registry@2.bind(9, "xdg_wm_base", 1, new id [unknown]@23) +[2247849.580] -> wl_compositor@4.create_surface(new id wl_surface@28) +[2247860.463] -> wl_display@1.get_registry(new id wl_registry@29) +[2247860.495] -> wl_display@1.sync(new id wl_callback@30) +[2247861.035] wl_display@1.delete_id(30) +[2247861.060] wl_registry@29.global(1, "wl_drm", 2) +[2247861.089] -> wl_registry@29.bind(1, "wl_drm", 2, new id [unknown]@31) +[2247861.119] wl_registry@29.global(2, "wl_compositor", 4) +[2247861.138] wl_registry@29.global(3, "wl_shm", 1) +[2247861.156] wl_registry@29.global(4, "wl_output", 2) +[2247861.174] wl_registry@29.global(5, "zxdg_output_manager_v1", 1) +[2247861.192] wl_registry@29.global(6, "wl_data_device_manager", 3) +[2247861.210] wl_registry@29.global(7, "gtk_primary_selection_device_manager", 1) +[2247861.228] wl_registry@29.global(8, "wl_subcompositor", 1) +[2247861.247] wl_registry@29.global(9, "xdg_wm_base", 2) +[2247861.265] wl_registry@29.global(10, "zxdg_shell_v6", 1) +[2247861.283] wl_registry@29.global(11, "wl_shell", 1) +[2247861.301] wl_registry@29.global(12, "gtk_shell1", 3) +[2247861.319] wl_registry@29.global(13, "wp_viewporter", 1) +[2247861.338] wl_registry@29.global(14, "zwp_pointer_gestures_v1", 1) +[2247861.356] wl_registry@29.global(15, "zwp_tablet_manager_v2", 1) +[2247861.374] wl_registry@29.global(16, "wl_seat", 5) +[2247861.392] wl_registry@29.global(17, "zwp_relative_pointer_manager_v1", 1) +[2247861.410] wl_registry@29.global(18, "zwp_pointer_constraints_v1", 1) +[2247861.428] wl_registry@29.global(19, "zxdg_exporter_v1", 1) +[2247861.447] wl_registry@29.global(20, "zxdg_importer_v1", 1) +[2247861.465] wl_registry@29.global(21, "zwp_linux_dmabuf_v1", 3) +[2247861.485] -> wl_registry@29.bind(21, "zwp_linux_dmabuf_v1", 3, new id [unknown]@32) +[2247861.511] wl_registry@29.global(22, "zwp_keyboard_shortcuts_inhibit_manager_v1", 1) +[2247861.530] wl_registry@29.global(23, "zwp_text_input_manager_v3", 1) +[2247861.557] wl_registry@29.global(24, "gtk_text_input_manager", 1) +[2247861.584] wl_callback@30.done(115338) +[2247861.598] -> wl_display@1.sync(new id wl_callback@30) +[2247861.792] wl_display@1.delete_id(30) +[2247861.814] wl_drm@31.device("/dev/dri/card0") +[2247861.952] -> wl_drm@31.authenticate(15) +[2247861.973] wl_drm@31.format(875713089) +[2247861.987] wl_drm@31.format(875713112) +[2247861.998] wl_drm@31.format(909199186) +[2247862.009] wl_drm@31.format(961959257) +[2247862.020] wl_drm@31.format(825316697) +[2247862.033] wl_drm@31.format(842093913) +[2247862.044] wl_drm@31.format(909202777) +[2247862.055] wl_drm@31.format(875713881) +[2247862.067] wl_drm@31.format(842094158) +[2247862.078] wl_drm@31.format(909203022) +[2247862.090] wl_drm@31.format(1448695129) +[2247862.102] wl_drm@31.capabilities(1) +[2247862.114] zwp_linux_dmabuf_v1@32.format(875713089) +[2247862.127] zwp_linux_dmabuf_v1@32.modifier(875713089, 0, 0) +[2247862.153] zwp_linux_dmabuf_v1@32.modifier(875713089, 16777216, 1) +[2247862.177] zwp_linux_dmabuf_v1@32.modifier(875713089, 16777216, 2) +[2247862.207] zwp_linux_dmabuf_v1@32.modifier(875713089, 16777216, 4) +[2247862.226] zwp_linux_dmabuf_v1@32.format(875713112) +[2247862.235] zwp_linux_dmabuf_v1@32.modifier(875713112, 0, 0) +[2247862.253] zwp_linux_dmabuf_v1@32.modifier(875713112, 16777216, 1) +[2247862.271] zwp_linux_dmabuf_v1@32.modifier(875713112, 16777216, 2) +[2247862.288] zwp_linux_dmabuf_v1@32.modifier(875713112, 16777216, 4) +[2247862.306] zwp_linux_dmabuf_v1@32.format(808669761) +[2247862.315] zwp_linux_dmabuf_v1@32.modifier(808669761, 0, 0) +[2247862.333] zwp_linux_dmabuf_v1@32.modifier(808669761, 16777216, 1) +[2247862.351] zwp_linux_dmabuf_v1@32.modifier(808669761, 16777216, 2) +[2247862.369] zwp_linux_dmabuf_v1@32.format(909199186) +[2247862.378] zwp_linux_dmabuf_v1@32.modifier(909199186, 0, 0) +[2247862.397] zwp_linux_dmabuf_v1@32.modifier(909199186, 16777216, 1) +[2247862.415] zwp_linux_dmabuf_v1@32.modifier(909199186, 16777216, 2) +[2247862.433] wl_callback@30.done(115338) +[2247862.444] -> wl_display@1.sync(new id wl_callback@30) +[2247862.567] wl_display@1.delete_id(30) +[2247862.587] wl_drm@31.authenticated() +[2247862.594] wl_callback@30.done(115338) +[2247955.129] -> wl_surface@28.set_buffer_scale(1) +[2247961.198] -> xdg_wm_base@23.get_xdg_surface(new id xdg_surface@30, wl_surface@28) +[2247961.234] -> xdg_surface@30.get_toplevel(new id xdg_toplevel@33) +[2247961.246] -> xdg_toplevel@33.set_parent(nil) +[2247961.254] -> xdg_toplevel@33.set_title("gtk4-widget-factory") +[2247961.263] -> xdg_toplevel@33.set_app_id("org.gtk.WidgetFactory4") +[2247961.273] -> gtk_shell1@15.get_gtk_surface(new id gtk_surface1@34, wl_surface@28) +[2247961.288] -> xdg_toplevel@33.set_min_size(1436, 732) +[2247961.301] -> xdg_toplevel@33.set_max_size(0, 0) +[2247961.314] -> gtk_surface1@34.set_dbus_properties("org.gtk.WidgetFactory4", nil, nil, "/org/gtk/WidgetFactory4/window/1", "/org/gtk/WidgetFactory4", ":1.405") +[2247961.346] -> gtk_surface1@34.unset_modal() +[2247961.352] -> wl_surface@28.commit() +[2247962.977] -> gtk_primary_selection_device_manager@13.create_source(new id gtk_primary_selection_source@35) +[2247963.012] -> gtk_primary_selection_source@35.offer("text/plain;charset=utf-8") +[2247963.020] -> gtk_primary_selection_source@35.offer("text/plain") +[2247963.029] -> gtk_primary_selection_device@19.set_selection(gtk_primary_selection_source@35, 0) +[2247963.196] wl_keyboard@27.keymap(1, fd 15, 58657) +[2247965.648] wl_keyboard@27.repeat_info(33, 500) +[2248052.357] xdg_toplevel@33.configure(0, 0, array) +[2248052.402] xdg_surface@30.configure(115339) +0x2062200 received initial configure, update area 0x1248d50 +surface 0x2062200 freeze count now 0 +[2248052.431] -> xdg_surface@30.ack_configure(115339) +[2248513.152] -> wl_surface@28.set_buffer_scale(1) +[2248544.131] -> xdg_toplevel@33.set_min_size(1436, 732) +[2248544.168] -> xdg_toplevel@33.set_max_size(0, 0) +[2248544.182] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2248544.208] -> wl_compositor@4.create_region(new id wl_region@36) +[2248544.221] -> wl_region@36.add(34, 23, 1472, 8) +[2248544.244] -> wl_region@36.add(26, 31, 1488, 776) +[2248544.267] -> wl_surface@28.set_opaque_region(wl_region@36) +[2248544.276] -> wl_region@36.destroy() +[2248544.283] -> wl_compositor@4.create_region(new id wl_region@37) +[2248544.294] -> wl_region@37.add(16, 13, 1508, 804) +[2248544.316] -> wl_surface@28.set_input_region(wl_region@37) +[2248544.325] -> wl_region@37.destroy() +[2248544.332] -> wl_surface@28.frame(new id wl_callback@38) +[2248544.355] -> wl_surface@28.frame(new id wl_callback@39) +[2248544.368] -> zwp_linux_dmabuf_v1@32.create_params(new id zwp_linux_buffer_params_v1@40) +[2248544.393] -> zwp_linux_buffer_params_v1@40.add(fd 17, 0, 0, 6272, 16777216, 4) +[2248544.430] -> zwp_linux_buffer_params_v1@40.add(fd 18, 1, 5419008, 256, 16777216, 4) +[2248544.462] -> zwp_linux_buffer_params_v1@40.create_immed(new id wl_buffer@41, 1540, 836, 875713089, 0) +[2248544.492] -> zwp_linux_buffer_params_v1@40.destroy() +[2248544.499] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2248544.530] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2248544.916] -> wl_surface@28.commit() +[2248547.772] wl_display@1.delete_id(36) +[2248547.802] wl_display@1.delete_id(37) +[2248547.811] wl_display@1.delete_id(40) +[2248547.820] wl_surface@28.enter(wl_output@7) +[2248575.897] gtk_surface1@34.configure(array) +[2248575.931] gtk_surface1@34.configure_edges(array) +[2248575.941] xdg_toplevel@33.configure(1488, 784, array) +[2248575.960] xdg_surface@30.configure(115341) +[2248575.998] -> xdg_surface@30.ack_configure(115341) +[2248576.010] wl_keyboard@27.modifiers(115343, 0, 0, 0, 0) +[2248576.049] wl_keyboard@27.enter(115343, wl_surface@28, array) +[2248576.073] wl_data_device@20.selection(nil) +[2248576.116] gtk_primary_selection_device@19.data_offer(new id gtk_primary_selection_offer@25078160) +[2248576.129] gtk_primary_selection_offer@4278190080.offer("UTF8_STRING") +[2248576.139] gtk_primary_selection_offer@4278190080.offer("COMPOUND_TEXT") +[2248576.148] gtk_primary_selection_offer@4278190080.offer("TEXT") +[2248576.157] gtk_primary_selection_offer@4278190080.offer("STRING") +[2248576.165] gtk_primary_selection_offer@4278190080.offer("text/plain;charset=utf-8") +[2248576.174] gtk_primary_selection_offer@4278190080.offer("text/plain") +[2248576.183] gtk_primary_selection_device@19.selection(gtk_primary_selection_offer@4278190080) +[2248595.649] wl_display@1.delete_id(38) +[2248595.688] wl_display@1.delete_id(39) +[2248595.698] wl_callback@38.done(198352737) +[2248597.894] wl_callback@39.done(198352737) +[2248607.542] -> xdg_toplevel@33.set_min_size(1436, 732) +[2248607.585] -> xdg_toplevel@33.set_max_size(0, 0) +[2248607.601] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2248607.648] -> wl_compositor@4.create_region(new id wl_region@39) +[2248607.667] -> wl_region@39.add(16, 13, 1508, 804) +[2248607.693] -> wl_surface@28.set_input_region(wl_region@39) +[2248607.704] -> wl_region@39.destroy() +[2248607.714] -> wl_surface@28.frame(new id wl_callback@38) +[2248607.745] -> wl_surface@28.frame(new id wl_callback@40) +[2248607.768] -> zwp_linux_dmabuf_v1@32.create_params(new id zwp_linux_buffer_params_v1@37) +[2248607.824] -> zwp_linux_buffer_params_v1@37.add(fd 17, 0, 0, 6272, 16777216, 4) +[2248607.943] -> zwp_linux_buffer_params_v1@37.add(fd 18, 1, 5419008, 256, 16777216, 4) +[2248607.997] -> zwp_linux_buffer_params_v1@37.create_immed(new id wl_buffer@36, 1540, 836, 875713089, 0) +[2248608.057] -> zwp_linux_buffer_params_v1@37.destroy() +[2248608.081] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2248608.142] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2248608.683] -> wl_surface@28.commit() +[2248610.659] wl_display@1.delete_id(39) +[2248610.692] wl_display@1.delete_id(37) +[2248622.301] wl_display@1.delete_id(38) +[2248622.376] wl_display@1.delete_id(40) +[2248622.396] wl_callback@38.done(198352765) +[2248623.470] wl_buffer@41.release() +[2248623.547] wl_callback@40.done(198352765) +[2248627.954] -> xdg_toplevel@33.set_min_size(1436, 732) +[2248628.008] -> xdg_toplevel@33.set_max_size(0, 0) +[2248628.031] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2248628.073] -> wl_surface@28.frame(new id wl_callback@40) +[2248628.098] -> wl_surface@28.frame(new id wl_callback@38) +[2248628.115] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2248628.141] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2248628.173] -> wl_surface@28.commit() +[2248640.344] wl_display@1.delete_id(40) +[2248640.416] wl_display@1.delete_id(38) +[2248640.427] wl_callback@40.done(198352783) +[2248641.201] wl_buffer@36.release() +[2248641.328] wl_callback@38.done(198352783) +[2248643.589] -> xdg_toplevel@33.set_min_size(1436, 732) +[2248643.634] -> xdg_toplevel@33.set_max_size(0, 0) +[2248643.656] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2248643.694] -> wl_surface@28.frame(new id wl_callback@38) +[2248643.718] -> wl_surface@28.frame(new id wl_callback@40) +[2248643.736] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2248643.763] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2248643.798] -> wl_surface@28.commit() +[2248655.553] wl_display@1.delete_id(38) +[2248655.656] wl_display@1.delete_id(40) +[2248655.682] wl_callback@38.done(198352798) +[2248656.664] wl_buffer@41.release() +[2248656.749] wl_callback@40.done(198352798) +[2248658.774] -> xdg_toplevel@33.set_min_size(1436, 732) +[2248658.811] -> xdg_toplevel@33.set_max_size(0, 0) +[2248658.826] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2248658.866] -> wl_surface@28.frame(new id wl_callback@40) +[2248658.891] -> wl_surface@28.frame(new id wl_callback@38) +[2248658.907] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2248658.933] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2248658.958] -> wl_surface@28.commit() +[2248673.086] wl_display@1.delete_id(40) +[2248673.203] wl_display@1.delete_id(38) +[2248673.218] wl_callback@40.done(198352815) +[2248674.115] wl_buffer@36.release() +[2248674.197] wl_callback@38.done(198352815) +[2248675.974] -> xdg_toplevel@33.set_min_size(1436, 732) +[2248676.019] -> xdg_toplevel@33.set_max_size(0, 0) +[2248676.039] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2248676.074] -> wl_surface@28.frame(new id wl_callback@38) +[2248676.100] -> wl_surface@28.frame(new id wl_callback@40) +[2248676.115] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2248676.140] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2248676.171] -> wl_surface@28.commit() +[2248691.142] wl_display@1.delete_id(38) +[2248691.195] wl_display@1.delete_id(40) +[2248691.209] wl_callback@38.done(198352832) +[2248691.728] wl_buffer@41.release() +[2248691.751] wl_callback@40.done(198352832) +[2248693.834] -> xdg_toplevel@33.set_min_size(1436, 732) +[2248693.892] -> xdg_toplevel@33.set_max_size(0, 0) +[2248693.911] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2248693.955] -> wl_surface@28.frame(new id wl_callback@40) +[2248693.981] -> wl_surface@28.frame(new id wl_callback@38) +[2248693.999] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2248694.024] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2248694.054] -> wl_surface@28.commit() +[2248708.246] wl_display@1.delete_id(40) +[2248708.320] wl_display@1.delete_id(38) +[2248708.339] wl_callback@40.done(198352848) +[2248709.100] wl_buffer@36.release() +[2248709.138] wl_callback@38.done(198352848) +[2248711.004] -> xdg_toplevel@33.set_min_size(1436, 732) +[2248711.070] -> xdg_toplevel@33.set_max_size(0, 0) +[2248711.090] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2248711.127] -> wl_surface@28.frame(new id wl_callback@38) +[2248711.159] -> wl_surface@28.frame(new id wl_callback@40) +[2248711.176] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2248711.202] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2248711.234] -> wl_surface@28.commit() +[2248723.150] wl_display@1.delete_id(38) +[2248723.228] wl_display@1.delete_id(40) +[2248723.241] wl_callback@38.done(198352866) +[2248724.014] wl_buffer@41.release() +[2248724.073] wl_callback@40.done(198352866) +[2248726.052] -> xdg_toplevel@33.set_min_size(1436, 732) +[2248726.090] -> xdg_toplevel@33.set_max_size(0, 0) +[2248726.105] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2248726.132] -> wl_surface@28.frame(new id wl_callback@40) +[2248726.151] -> wl_surface@28.frame(new id wl_callback@38) +[2248726.164] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2248726.184] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2248726.210] -> wl_surface@28.commit() +[2248742.953] wl_display@1.delete_id(40) +[2248743.011] wl_display@1.delete_id(38) +[2248743.023] wl_callback@40.done(198352885) +[2248743.550] wl_buffer@36.release() +[2248743.603] wl_callback@38.done(198352885) +[2248745.110] -> xdg_toplevel@33.set_min_size(1436, 732) +[2248745.150] -> xdg_toplevel@33.set_max_size(0, 0) +[2248745.165] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2248745.193] -> wl_surface@28.frame(new id wl_callback@38) +[2248745.212] -> wl_surface@28.frame(new id wl_callback@40) +[2248745.225] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2248745.245] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2248745.270] -> wl_surface@28.commit() +[2248754.434] wl_display@1.delete_id(38) +[2248754.489] wl_display@1.delete_id(40) +[2248754.499] wl_callback@38.done(198352897) +[2248755.024] wl_buffer@41.release() +[2248755.076] wl_callback@40.done(198352897) +[2248757.046] -> xdg_toplevel@33.set_min_size(1436, 732) +[2248757.124] -> xdg_toplevel@33.set_max_size(0, 0) +[2248757.147] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2248757.182] -> wl_surface@28.frame(new id wl_callback@40) +[2248757.211] -> wl_surface@28.frame(new id wl_callback@38) +[2248757.228] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2248757.251] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2248757.283] -> wl_surface@28.commit() +[2248770.864] wl_display@1.delete_id(40) +[2248770.927] wl_display@1.delete_id(38) +[2248770.943] wl_callback@40.done(198352913) +[2248771.683] wl_buffer@36.release() +[2248771.746] wl_callback@38.done(198352913) +[2248773.669] -> xdg_toplevel@33.set_min_size(1436, 732) +[2248773.719] -> xdg_toplevel@33.set_max_size(0, 0) +[2248773.738] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2248773.772] -> wl_surface@28.frame(new id wl_callback@38) +[2248773.798] -> wl_surface@28.frame(new id wl_callback@40) +[2248773.814] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2248773.839] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2248773.887] -> wl_surface@28.commit() +[2248786.666] wl_display@1.delete_id(38) +[2248786.715] wl_display@1.delete_id(40) +[2248786.728] wl_callback@38.done(198352929) +[2248787.311] wl_buffer@41.release() +[2248787.364] wl_callback@40.done(198352929) +[2248789.380] -> xdg_toplevel@33.set_min_size(1436, 732) +[2248789.431] -> xdg_toplevel@33.set_max_size(0, 0) +[2248789.451] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2248789.485] -> wl_surface@28.frame(new id wl_callback@40) +[2248789.509] -> wl_surface@28.frame(new id wl_callback@38) +[2248789.525] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2248789.550] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2248789.582] -> wl_surface@28.commit() +[2248804.260] wl_display@1.delete_id(40) +[2248804.355] wl_display@1.delete_id(38) +[2248804.370] wl_callback@40.done(198352947) +[2248805.155] wl_buffer@36.release() +[2248805.236] wl_callback@38.done(198352947) +[2248807.584] -> xdg_toplevel@33.set_min_size(1436, 732) +[2248807.631] -> xdg_toplevel@33.set_max_size(0, 0) +[2248807.650] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2248807.683] -> wl_surface@28.frame(new id wl_callback@38) +[2248807.707] -> wl_surface@28.frame(new id wl_callback@40) +[2248807.722] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2248807.748] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2248807.787] -> wl_surface@28.commit() +[2248821.515] wl_display@1.delete_id(38) +[2248821.574] wl_display@1.delete_id(40) +[2248821.587] wl_callback@38.done(198352963) +[2248822.118] wl_buffer@41.release() +[2248822.159] wl_callback@40.done(198352963) +[2248824.481] -> xdg_toplevel@33.set_min_size(1436, 732) +[2248824.530] -> xdg_toplevel@33.set_max_size(0, 0) +[2248824.549] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2248824.584] -> wl_surface@28.frame(new id wl_callback@40) +[2248824.610] -> wl_surface@28.frame(new id wl_callback@38) +[2248824.626] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2248824.652] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2248824.687] -> wl_surface@28.commit() +[2248837.585] wl_display@1.delete_id(40) +[2248837.631] wl_display@1.delete_id(38) +[2248837.646] wl_callback@40.done(198352980) +[2248838.255] wl_buffer@36.release() +[2248838.302] wl_callback@38.done(198352980) +[2248840.509] -> xdg_toplevel@33.set_min_size(1436, 732) +[2248840.559] -> xdg_toplevel@33.set_max_size(0, 0) +[2248840.582] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2248840.619] -> wl_surface@28.frame(new id wl_callback@38) +[2248840.645] -> wl_surface@28.frame(new id wl_callback@40) +[2248840.663] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2248840.690] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2248840.724] -> wl_surface@28.commit() +[2248856.461] wl_display@1.delete_id(38) +[2248856.516] wl_display@1.delete_id(40) +[2248856.530] wl_callback@38.done(198352997) +[2248857.212] wl_buffer@41.release() +[2248857.287] wl_callback@40.done(198352997) +[2248859.330] -> xdg_toplevel@33.set_min_size(1436, 732) +[2248859.447] -> xdg_toplevel@33.set_max_size(0, 0) +[2248859.548] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2248859.641] -> wl_surface@28.frame(new id wl_callback@40) +[2248859.922] -> wl_surface@28.frame(new id wl_callback@38) +[2248860.126] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2248860.154] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2248860.189] -> wl_surface@28.commit() +[2248872.794] wl_display@1.delete_id(40) +[2248872.846] wl_display@1.delete_id(38) +[2248872.878] wl_callback@40.done(198353013) +[2248873.424] wl_buffer@36.release() +[2248873.466] wl_callback@38.done(198353013) +[2248875.179] -> xdg_toplevel@33.set_min_size(1436, 732) +[2248875.229] -> xdg_toplevel@33.set_max_size(0, 0) +[2248875.253] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2248875.295] -> wl_surface@28.frame(new id wl_callback@38) +[2248875.324] -> wl_surface@28.frame(new id wl_callback@40) +[2248875.343] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2248875.369] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2248875.403] -> wl_surface@28.commit() +[2248889.481] wl_display@1.delete_id(38) +[2248889.521] wl_display@1.delete_id(40) +[2248889.531] wl_callback@38.done(198353030) +[2248889.908] wl_buffer@41.release() +[2248889.926] wl_callback@40.done(198353030) +[2248891.147] -> xdg_toplevel@33.set_min_size(1436, 732) +[2248891.182] -> xdg_toplevel@33.set_max_size(0, 0) +[2248891.197] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2248891.224] -> wl_surface@28.frame(new id wl_callback@40) +[2248891.244] -> wl_surface@28.frame(new id wl_callback@38) +[2248891.257] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2248891.277] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2248891.303] -> wl_surface@28.commit() +[2248905.014] wl_display@1.delete_id(40) +[2248905.086] wl_display@1.delete_id(38) +[2248905.102] wl_callback@40.done(198353046) +[2248905.489] wl_buffer@36.release() +[2248905.511] wl_callback@38.done(198353046) +[2248907.265] -> xdg_toplevel@33.set_min_size(1436, 732) +[2248907.312] -> xdg_toplevel@33.set_max_size(0, 0) +[2248907.334] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2248907.373] -> wl_surface@28.frame(new id wl_callback@38) +[2248907.398] -> wl_surface@28.frame(new id wl_callback@40) +[2248907.416] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2248907.444] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2248907.482] -> wl_surface@28.commit() +[2248921.049] wl_display@1.delete_id(38) +[2248921.096] wl_display@1.delete_id(40) +[2248921.109] wl_callback@38.done(198353064) +[2248921.982] wl_buffer@41.release() +[2248922.099] wl_callback@40.done(198353064) +[2248923.816] -> xdg_toplevel@33.set_min_size(1436, 732) +[2248923.875] -> xdg_toplevel@33.set_max_size(0, 0) +[2248923.892] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2248923.920] -> wl_surface@28.frame(new id wl_callback@40) +[2248923.940] -> wl_surface@28.frame(new id wl_callback@38) +[2248923.952] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2248923.975] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2248924.008] -> wl_surface@28.commit() +[2248937.603] wl_display@1.delete_id(40) +[2248937.655] wl_display@1.delete_id(38) +[2248937.669] wl_callback@40.done(198353080) +[2248938.306] wl_buffer@36.release() +[2248938.358] wl_callback@38.done(198353080) +[2248940.129] -> xdg_toplevel@33.set_min_size(1436, 732) +[2248940.167] -> xdg_toplevel@33.set_max_size(0, 0) +[2248940.182] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2248940.210] -> wl_surface@28.frame(new id wl_callback@38) +[2248940.229] -> wl_surface@28.frame(new id wl_callback@40) +[2248940.244] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2248940.270] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2248940.304] -> wl_surface@28.commit() +[2248954.025] wl_display@1.delete_id(38) +[2248954.066] wl_display@1.delete_id(40) +[2248954.079] wl_callback@38.done(198353097) +[2248954.532] wl_buffer@41.release() +[2248954.561] wl_callback@40.done(198353097) +[2248956.290] -> xdg_toplevel@33.set_min_size(1436, 732) +[2248956.326] -> xdg_toplevel@33.set_max_size(0, 0) +[2248956.342] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2248956.368] -> wl_surface@28.frame(new id wl_callback@40) +[2248956.388] -> wl_surface@28.frame(new id wl_callback@38) +[2248956.401] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2248956.425] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2248956.458] -> wl_surface@28.commit() +[2248970.782] wl_display@1.delete_id(40) +[2248970.827] wl_display@1.delete_id(38) +[2248970.842] wl_callback@40.done(198353113) +[2248971.413] wl_buffer@36.release() +[2248971.459] wl_callback@38.done(198353113) +[2248973.542] -> xdg_toplevel@33.set_min_size(1436, 732) +[2248973.582] -> xdg_toplevel@33.set_max_size(0, 0) +[2248973.599] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2248973.630] -> wl_surface@28.frame(new id wl_callback@38) +[2248973.652] -> wl_surface@28.frame(new id wl_callback@40) +[2248973.667] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2248973.690] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2248973.719] -> wl_surface@28.commit() +[2248987.511] wl_display@1.delete_id(38) +[2248987.561] wl_display@1.delete_id(40) +[2248987.579] wl_callback@38.done(198353130) +[2248988.167] wl_buffer@41.release() +[2248988.207] wl_callback@40.done(198353130) +[2248990.064] -> xdg_toplevel@33.set_min_size(1436, 732) +[2248990.116] -> xdg_toplevel@33.set_max_size(0, 0) +[2248990.144] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2248990.190] -> wl_surface@28.frame(new id wl_callback@40) +[2248990.221] -> wl_surface@28.frame(new id wl_callback@38) +[2248990.243] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2248990.278] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2248990.320] -> wl_surface@28.commit() +[2249004.158] wl_display@1.delete_id(40) +[2249004.207] wl_display@1.delete_id(38) +[2249004.223] wl_callback@40.done(198353147) +[2249004.773] wl_buffer@36.release() +[2249004.818] wl_callback@38.done(198353147) +[2249006.923] -> xdg_toplevel@33.set_min_size(1436, 732) +[2249006.978] -> xdg_toplevel@33.set_max_size(0, 0) +[2249007.003] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2249007.045] -> wl_surface@28.frame(new id wl_callback@38) +[2249007.076] -> wl_surface@28.frame(new id wl_callback@40) +[2249007.097] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2249007.126] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2249007.160] -> wl_surface@28.commit() +[2249021.038] wl_display@1.delete_id(38) +[2249021.086] wl_display@1.delete_id(40) +[2249021.103] wl_callback@38.done(198353164) +[2249021.560] wl_buffer@41.release() +[2249021.591] wl_callback@40.done(198353164) +[2249023.170] -> xdg_toplevel@33.set_min_size(1436, 732) +[2249023.221] -> xdg_toplevel@33.set_max_size(0, 0) +[2249023.248] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2249023.294] -> wl_surface@28.frame(new id wl_callback@40) +[2249023.325] -> wl_surface@28.frame(new id wl_callback@38) +[2249023.348] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2249023.382] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2249023.424] -> wl_surface@28.commit() +[2249037.739] wl_display@1.delete_id(40) +[2249037.795] wl_display@1.delete_id(38) +[2249037.812] wl_callback@40.done(198353180) +[2249038.502] wl_buffer@36.release() +[2249038.537] wl_callback@38.done(198353180) +[2249039.944] -> xdg_toplevel@33.set_min_size(1436, 732) +[2249039.983] -> xdg_toplevel@33.set_max_size(0, 0) +[2249040.001] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2249040.033] -> wl_surface@28.frame(new id wl_callback@38) +[2249040.053] -> wl_surface@28.frame(new id wl_callback@40) +[2249040.067] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2249040.090] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2249040.119] -> wl_surface@28.commit() +[2249053.821] wl_display@1.delete_id(38) +[2249053.889] wl_display@1.delete_id(40) +[2249053.908] wl_callback@38.done(198353196) +[2249054.438] wl_buffer@41.release() +[2249054.472] wl_callback@40.done(198353196) +[2249056.059] -> xdg_toplevel@33.set_min_size(1436, 732) +[2249056.100] -> xdg_toplevel@33.set_max_size(0, 0) +[2249056.118] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2249056.148] -> wl_surface@28.frame(new id wl_callback@40) +[2249056.168] -> wl_surface@28.frame(new id wl_callback@38) +[2249056.183] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2249056.216] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2249056.244] -> wl_surface@28.commit() +[2249071.075] wl_display@1.delete_id(40) +[2249071.113] wl_display@1.delete_id(38) +[2249071.124] wl_callback@40.done(198353213) +[2249071.533] wl_buffer@36.release() +[2249071.556] wl_callback@38.done(198353213) +[2249073.049] -> xdg_toplevel@33.set_min_size(1436, 732) +[2249073.090] -> xdg_toplevel@33.set_max_size(0, 0) +[2249073.107] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2249073.137] -> wl_surface@28.frame(new id wl_callback@38) +[2249073.162] -> wl_surface@28.frame(new id wl_callback@40) +[2249073.187] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2249073.217] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2249073.255] -> wl_surface@28.commit() +[2249087.951] wl_display@1.delete_id(38) +[2249088.013] wl_display@1.delete_id(40) +[2249088.024] wl_callback@38.done(198353230) +[2249088.413] wl_buffer@41.release() +[2249088.434] wl_callback@40.done(198353230) +[2249089.765] -> xdg_toplevel@33.set_min_size(1436, 732) +[2249089.802] -> xdg_toplevel@33.set_max_size(0, 0) +[2249089.819] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2249089.864] -> wl_surface@28.frame(new id wl_callback@40) +[2249089.889] -> wl_surface@28.frame(new id wl_callback@38) +[2249089.903] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2249089.926] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2249089.955] -> wl_surface@28.commit() +[2249104.058] wl_display@1.delete_id(40) +[2249104.110] wl_display@1.delete_id(38) +[2249104.127] wl_callback@40.done(198353247) +[2249104.573] wl_buffer@36.release() +[2249104.615] wl_callback@38.done(198353247) +[2249106.818] -> xdg_toplevel@33.set_min_size(1436, 732) +[2249106.878] -> xdg_toplevel@33.set_max_size(0, 0) +[2249106.897] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2249106.928] -> wl_surface@28.frame(new id wl_callback@38) +[2249106.950] -> wl_surface@28.frame(new id wl_callback@40) +[2249106.964] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2249106.988] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2249107.018] -> wl_surface@28.commit() +[2249120.375] wl_display@1.delete_id(38) +[2249120.438] wl_display@1.delete_id(40) +[2249120.452] wl_callback@38.done(198353263) +[2249120.959] wl_buffer@41.release() +[2249121.010] wl_callback@40.done(198353263) +[2249123.002] -> xdg_toplevel@33.set_min_size(1436, 732) +[2249123.049] -> xdg_toplevel@33.set_max_size(0, 0) +[2249123.069] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2249123.105] -> wl_surface@28.frame(new id wl_callback@40) +[2249123.130] -> wl_surface@28.frame(new id wl_callback@38) +[2249123.147] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2249123.174] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2249123.208] -> wl_surface@28.commit() +[2249139.166] wl_display@1.delete_id(40) +[2249139.259] wl_display@1.delete_id(38) +[2249139.288] wl_pointer@11.enter(115345, wl_surface@28, 381.843750, 263.929688) +[2249139.394] wl_pointer@11.frame() +[2249139.462] -> wl_shm_pool@6.create_buffer(new id wl_buffer@37, 864000, 24, 24, 96, 0) +[2249139.572] -> wl_pointer@11.set_cursor(115345, wl_surface@21, 4, 4) +[2249139.673] -> wl_surface@21.attach(wl_buffer@37, 0, 0) +[2249139.729] -> wl_surface@21.set_buffer_scale(1) +[2249139.756] -> wl_surface@21.damage(0, 0, 24, 24) +[2249139.824] -> wl_surface@21.commit() +[2249139.875] wl_pointer@11.motion(198353272, 381.843750, 263.929688) +[2249139.953] wl_pointer@11.frame() +[2249140.010] wl_callback@40.done(198353281) +[2249140.804] -> wl_shm_pool@6.create_buffer(new id wl_buffer@40, 329472, 24, 24, 96, 0) +[2249140.928] -> wl_pointer@11.set_cursor(115345, wl_surface@21, 11, 12) +[2249140.977] -> wl_surface@21.attach(wl_buffer@40, 0, 0) +[2249141.015] -> wl_surface@21.set_buffer_scale(1) +[2249141.033] -> wl_surface@21.damage(0, 0, 24, 24) +[2249141.079] -> wl_surface@21.commit() +[2249298.913] wl_buffer@36.release() +[2249298.957] wl_callback@38.done(198353281) +[2249300.541] -> xdg_toplevel@33.set_min_size(1436, 732) +[2249300.586] -> xdg_toplevel@33.set_max_size(0, 0) +[2249300.607] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2249300.649] -> wl_surface@28.frame(new id wl_callback@38) +[2249300.684] -> wl_surface@28.frame(new id wl_callback@39) +[2249300.704] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2249300.730] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2249300.764] -> wl_surface@28.commit() +[2249300.914] wl_surface@21.enter(wl_output@7) +[2249300.948] -> wl_pointer@11.set_cursor(115345, wl_surface@21, 11, 12) +[2249300.987] -> wl_surface@21.attach(wl_buffer@40, 0, 0) +[2249301.016] -> wl_surface@21.set_buffer_scale(1) +[2249301.030] -> wl_surface@21.damage(0, 0, 24, 24) +[2249301.066] -> wl_surface@21.commit() +[2249301.077] wl_pointer@11.motion(198353295, 411.914062, 282.472656) +[2249301.122] wl_pointer@11.frame() +[2249301.143] wl_pointer@11.motion(198353307, 433.503906, 291.125000) +[2249301.177] wl_pointer@11.frame() +[2249301.189] wl_pointer@11.motion(198353317, 453.679688, 293.972656) +[2249301.218] wl_pointer@11.frame() +[2249301.229] wl_pointer@11.motion(198353341, 503.410156, 285.214844) +[2249301.259] wl_pointer@11.frame() +[2249301.271] wl_pointer@11.motion(198353353, 518.636719, 273.972656) +[2249301.303] wl_pointer@11.frame() +[2249301.315] wl_pointer@11.motion(198353376, 546.382812, 240.156250) +[2249301.345] wl_pointer@11.frame() +[2249301.357] wl_pointer@11.motion(198353388, 558.863281, 208.304688) +[2249301.389] wl_pointer@11.frame() +[2249301.400] wl_pointer@11.motion(198353412, 558.488281, 159.746094) +[2249301.434] wl_pointer@11.frame() +[2249301.447] wl_pointer@11.motion(198353422, 550.343750, 135.042969) +[2249301.480] wl_pointer@11.frame() +[2249303.992] wl_display@1.delete_id(38) +[2249304.090] wl_display@1.delete_id(39) +[2249304.105] wl_pointer@11.motion(198353434, 541.503906, 122.140625) +[2249304.160] wl_pointer@11.frame() +[2249304.181] wl_callback@38.done(198353446) +[2249304.558] -> wl_pointer@11.set_cursor(115345, wl_surface@21, 4, 4) +[2249304.595] -> wl_surface@21.attach(wl_buffer@37, 0, 0) +[2249304.613] -> wl_surface@21.set_buffer_scale(1) +[2249304.622] -> wl_surface@21.damage(0, 0, 24, 24) +[2249304.645] -> wl_surface@21.commit() +[2249321.440] wl_buffer@41.release() +[2249321.477] wl_callback@39.done(198353446) +[2249323.547] -> xdg_toplevel@33.set_min_size(1436, 732) +[2249323.593] -> xdg_toplevel@33.set_max_size(0, 0) +[2249323.614] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2249323.652] -> wl_surface@28.frame(new id wl_callback@39) +[2249323.678] -> wl_surface@28.frame(new id wl_callback@38) +[2249323.696] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2249323.722] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2249323.759] -> wl_surface@28.commit() +[2249323.884] wl_pointer@11.motion(198353458, 511.105469, 107.718750) +[2249323.943] wl_pointer@11.frame() +[2249336.817] wl_display@1.delete_id(39) +[2249336.916] wl_display@1.delete_id(38) +[2249336.930] wl_callback@39.done(198353479) +[2249339.833] wl_buffer@36.release() +[2249339.883] wl_callback@38.done(198353479) +[2249343.398] -> xdg_toplevel@33.set_min_size(1436, 732) +[2249343.434] -> xdg_toplevel@33.set_max_size(0, 0) +[2249343.448] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2249343.473] -> wl_surface@28.frame(new id wl_callback@38) +[2249343.491] -> wl_surface@28.frame(new id wl_callback@39) +[2249343.503] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2249343.521] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2249343.545] -> wl_surface@28.commit() +[2249353.904] wl_display@1.delete_id(38) +[2249353.976] wl_display@1.delete_id(39) +[2249353.987] wl_callback@38.done(198353496) +[2249355.404] wl_buffer@41.release() +[2249355.445] wl_callback@39.done(198353496) +[2249360.226] -> xdg_toplevel@33.set_min_size(1436, 732) +[2249360.270] -> xdg_toplevel@33.set_max_size(0, 0) +[2249360.312] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2249360.354] -> wl_surface@28.frame(new id wl_callback@39) +[2249360.381] -> wl_surface@28.frame(new id wl_callback@38) +[2249360.398] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2249360.423] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2249360.464] -> wl_surface@28.commit() +[2249370.489] wl_display@1.delete_id(39) +[2249370.553] wl_display@1.delete_id(38) +[2249370.564] wl_callback@39.done(198353513) +[2249371.621] wl_buffer@36.release() +[2249371.654] wl_callback@38.done(198353513) +[2249376.207] -> xdg_toplevel@33.set_min_size(1436, 732) +[2249376.253] -> xdg_toplevel@33.set_max_size(0, 0) +[2249376.273] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2249376.306] -> wl_surface@28.frame(new id wl_callback@38) +[2249376.352] -> wl_surface@28.frame(new id wl_callback@39) +[2249376.370] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2249376.396] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2249376.429] -> wl_surface@28.commit() +[2249387.176] wl_display@1.delete_id(38) +[2249387.264] wl_display@1.delete_id(39) +[2249387.279] wl_callback@38.done(198353530) +[2249388.982] wl_buffer@41.release() +[2249389.018] wl_callback@39.done(198353530) +[2249393.691] -> xdg_toplevel@33.set_min_size(1436, 732) +[2249393.730] -> xdg_toplevel@33.set_max_size(0, 0) +[2249393.750] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2249393.787] -> wl_surface@28.frame(new id wl_callback@39) +[2249393.814] -> wl_surface@28.frame(new id wl_callback@38) +[2249393.833] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2249393.880] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2249393.917] -> wl_surface@28.commit() +[2249404.058] wl_display@1.delete_id(39) +[2249404.136] wl_display@1.delete_id(38) +[2249404.153] wl_callback@39.done(198353547) +[2249405.690] wl_buffer@36.release() +[2249405.727] wl_callback@38.done(198353547) +[2249410.171] -> xdg_toplevel@33.set_min_size(1436, 732) +[2249410.221] -> xdg_toplevel@33.set_max_size(0, 0) +[2249410.241] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2249410.275] -> wl_surface@28.frame(new id wl_callback@38) +[2249410.309] -> wl_surface@28.frame(new id wl_callback@39) +[2249410.327] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2249410.354] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2249410.389] -> wl_surface@28.commit() +[2249420.572] wl_display@1.delete_id(38) +[2249420.651] wl_display@1.delete_id(39) +[2249420.667] wl_callback@38.done(198353563) +[2249422.055] wl_buffer@41.release() +[2249422.097] wl_callback@39.done(198353563) +[2249426.143] -> xdg_toplevel@33.set_min_size(1436, 732) +[2249426.194] -> xdg_toplevel@33.set_max_size(0, 0) +[2249426.215] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2249426.256] -> wl_surface@28.frame(new id wl_callback@39) +[2249426.284] -> wl_surface@28.frame(new id wl_callback@38) +[2249426.304] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2249426.329] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2249426.364] -> wl_surface@28.commit() +[2249437.091] wl_display@1.delete_id(39) +[2249437.164] wl_display@1.delete_id(38) +[2249437.179] wl_callback@39.done(198353580) +[2249438.561] wl_buffer@36.release() +[2249438.604] wl_callback@38.done(198353580) +[2249442.930] -> xdg_toplevel@33.set_min_size(1436, 732) +[2249442.984] -> xdg_toplevel@33.set_max_size(0, 0) +[2249443.003] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2249443.035] -> wl_surface@28.frame(new id wl_callback@38) +[2249443.061] -> wl_surface@28.frame(new id wl_callback@39) +[2249443.079] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2249443.104] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2249443.136] -> wl_surface@28.commit() +[2249453.761] wl_display@1.delete_id(38) +[2249453.829] wl_display@1.delete_id(39) +[2249453.841] wl_callback@38.done(198353596) +[2249455.329] wl_buffer@41.release() +[2249455.369] wl_callback@39.done(198353596) +[2249459.442] -> xdg_toplevel@33.set_min_size(1436, 732) +[2249459.474] -> xdg_toplevel@33.set_max_size(0, 0) +[2249459.488] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2249459.514] -> wl_surface@28.frame(new id wl_callback@39) +[2249459.533] -> wl_surface@28.frame(new id wl_callback@38) +[2249459.546] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2249459.565] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2249459.590] -> wl_surface@28.commit() +[2249471.829] wl_display@1.delete_id(39) +[2249471.944] wl_display@1.delete_id(38) +[2249471.967] wl_pointer@11.motion(198353610, 557.781250, 105.593750) +[2249472.050] wl_pointer@11.frame() +[2249472.080] wl_callback@39.done(198353614) +[2249473.746] wl_buffer@36.release() +[2249473.780] wl_callback@38.done(198353614) +[2249478.143] -> xdg_toplevel@33.set_min_size(1436, 732) +[2249478.189] -> xdg_toplevel@33.set_max_size(0, 0) +[2249478.208] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2249478.241] -> wl_surface@28.frame(new id wl_callback@38) +[2249478.275] -> wl_surface@28.frame(new id wl_callback@39) +[2249478.293] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2249478.319] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2249478.352] -> wl_surface@28.commit() +[2249488.234] wl_display@1.delete_id(38) +[2249488.324] wl_display@1.delete_id(39) +[2249488.342] wl_pointer@11.motion(198353621, 624.367188, 106.863281) +[2249488.451] wl_pointer@11.frame() +[2249488.493] wl_callback@38.done(198353631) +[2249499.441] wl_buffer@41.release() +[2249499.472] wl_callback@39.done(198353631) +[2249503.701] -> xdg_toplevel@33.set_min_size(1436, 732) +[2249503.749] -> xdg_toplevel@33.set_max_size(0, 0) +[2249503.770] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2249503.804] -> wl_surface@28.frame(new id wl_callback@39) +[2249503.830] -> wl_surface@28.frame(new id wl_callback@38) +[2249503.847] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2249503.889] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2249503.925] -> wl_surface@28.commit() +[2249504.058] wl_pointer@11.motion(198353644, 767.210938, 135.234375) +[2249504.108] wl_pointer@11.frame() +[2249521.643] wl_display@1.delete_id(39) +[2249521.724] wl_display@1.delete_id(38) +[2249521.741] wl_pointer@11.motion(198353655, 816.738281, 156.121094) +[2249521.809] wl_pointer@11.frame() +[2249521.882] wl_callback@39.done(198353664) +[2249526.757] wl_buffer@36.release() +[2249526.798] wl_callback@38.done(198353664) +[2249531.828] -> xdg_toplevel@33.set_min_size(1436, 732) +[2249531.890] -> xdg_toplevel@33.set_max_size(0, 0) +[2249531.911] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2249531.945] -> wl_surface@28.frame(new id wl_callback@38) +[2249531.977] -> wl_surface@28.frame(new id wl_callback@39) +[2249531.995] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2249532.022] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2249532.056] -> wl_surface@28.commit() +[2249537.901] wl_display@1.delete_id(38) +[2249537.987] wl_display@1.delete_id(39) +[2249538.008] wl_pointer@11.motion(198353679, 875.601562, 185.238281) +[2249538.071] wl_pointer@11.frame() +[2249538.088] wl_callback@38.done(198353680) +[2249539.569] wl_buffer@41.release() +[2249539.601] wl_callback@39.done(198353680) +[2249543.782] -> xdg_toplevel@33.set_min_size(1436, 732) +[2249543.834] -> xdg_toplevel@33.set_max_size(0, 0) +[2249543.865] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2249543.893] -> wl_surface@28.frame(new id wl_callback@39) +[2249543.917] -> wl_surface@28.frame(new id wl_callback@38) +[2249543.929] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2249543.949] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2249543.974] -> wl_surface@28.commit() +[2249554.634] wl_display@1.delete_id(39) +[2249554.736] wl_display@1.delete_id(38) +[2249554.755] wl_pointer@11.motion(198353691, 903.644531, 206.328125) +[2249554.891] wl_pointer@11.frame() +[2249554.914] wl_callback@39.done(198353697) +[2249556.838] wl_buffer@36.release() +[2249556.888] wl_callback@38.done(198353697) +[2249561.693] -> xdg_toplevel@33.set_min_size(1436, 732) +[2249561.745] -> xdg_toplevel@33.set_max_size(0, 0) +[2249561.767] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2249561.810] -> wl_surface@28.frame(new id wl_callback@38) +[2249561.837] -> wl_surface@28.frame(new id wl_callback@39) +[2249561.867] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2249561.894] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2249561.926] -> wl_surface@28.commit() +[2249571.386] wl_display@1.delete_id(38) +[2249571.469] wl_display@1.delete_id(39) +[2249571.486] wl_pointer@11.motion(198353702, 920.250000, 221.859375) +[2249571.559] wl_pointer@11.frame() +[2249571.590] wl_callback@38.done(198353714) +[2249573.079] wl_buffer@41.release() +[2249573.110] wl_callback@39.done(198353714) +[2249576.154] -> xdg_toplevel@33.set_min_size(1436, 732) +[2249576.203] -> xdg_toplevel@33.set_max_size(0, 0) +[2249576.227] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2249576.266] -> wl_surface@28.frame(new id wl_callback@39) +[2249576.295] -> wl_surface@28.frame(new id wl_callback@38) +[2249576.312] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2249576.338] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2249576.370] -> wl_surface@28.commit() +[2249588.270] wl_display@1.delete_id(39) +[2249588.344] wl_display@1.delete_id(38) +[2249588.358] wl_pointer@11.motion(198353726, 950.714844, 254.312500) +[2249588.408] wl_pointer@11.frame() +[2249588.426] wl_callback@39.done(198353731) +[2249591.889] wl_buffer@36.release() +[2249591.930] wl_callback@38.done(198353731) +[2249596.661] -> xdg_toplevel@33.set_min_size(1436, 732) +[2249596.710] -> xdg_toplevel@33.set_max_size(0, 0) +[2249596.730] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2249596.765] -> wl_surface@28.frame(new id wl_callback@38) +[2249596.800] -> wl_surface@28.frame(new id wl_callback@39) +[2249596.819] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2249596.847] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2249596.896] -> wl_surface@28.commit() +[2249606.017] wl_display@1.delete_id(38) +[2249606.110] wl_display@1.delete_id(39) +[2249606.135] wl_pointer@11.motion(198353737, 964.496094, 270.832031) +[2249606.211] wl_pointer@11.frame() +[2249606.244] wl_callback@38.done(198353749) +[2249608.966] wl_buffer@41.release() +[2249609.008] wl_callback@39.done(198353749) +[2249613.602] -> xdg_toplevel@33.set_min_size(1436, 732) +[2249613.651] -> xdg_toplevel@33.set_max_size(0, 0) +[2249613.672] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2249613.716] -> wl_surface@28.frame(new id wl_callback@39) +[2249613.743] -> wl_surface@28.frame(new id wl_callback@38) +[2249613.762] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2249613.790] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2249613.826] -> wl_surface@28.commit() +[2249620.953] wl_display@1.delete_id(39) +[2249621.038] wl_display@1.delete_id(38) +[2249621.069] wl_pointer@11.motion(198353760, 977.343750, 288.214844) +[2249621.151] wl_pointer@11.frame() +[2249621.190] wl_callback@39.done(198353764) +[2249624.635] wl_buffer@36.release() +[2249624.676] wl_callback@38.done(198353764) +[2249628.435] -> xdg_toplevel@33.set_min_size(1436, 732) +[2249628.474] -> xdg_toplevel@33.set_max_size(0, 0) +[2249628.489] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2249628.514] -> wl_surface@28.frame(new id wl_callback@38) +[2249628.582] -> wl_surface@28.frame(new id wl_callback@39) +[2249628.596] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2249628.616] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2249628.641] -> wl_surface@28.commit() +[2249638.248] wl_display@1.delete_id(38) +[2249638.335] wl_display@1.delete_id(39) +[2249638.353] wl_pointer@11.motion(198353772, 979.679688, 291.730469) +[2249638.445] wl_pointer@11.frame() +[2249638.466] wl_callback@38.done(198353781) +[2249640.025] wl_buffer@41.release() +[2249640.066] wl_callback@39.done(198353781) +[2249643.474] -> xdg_toplevel@33.set_min_size(1436, 732) +[2249643.512] -> xdg_toplevel@33.set_max_size(0, 0) +[2249643.527] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2249643.558] -> wl_surface@28.frame(new id wl_callback@39) +[2249643.577] -> wl_surface@28.frame(new id wl_callback@38) +[2249643.589] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2249643.609] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2249643.634] -> wl_surface@28.commit() +[2249654.020] wl_display@1.delete_id(39) +[2249654.120] wl_display@1.delete_id(38) +[2249654.141] wl_pointer@11.motion(198353784, 979.679688, 292.058594) +[2249654.198] wl_pointer@11.frame() +[2249654.219] wl_callback@39.done(198353796) +[2249655.814] wl_buffer@36.release() +[2249655.897] wl_callback@38.done(198353796) +[2249659.502] -> xdg_toplevel@33.set_min_size(1436, 732) +[2249659.538] -> xdg_toplevel@33.set_max_size(0, 0) +[2249659.553] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2249659.580] -> wl_surface@28.frame(new id wl_callback@38) +[2249659.601] -> wl_surface@28.frame(new id wl_callback@39) +[2249659.614] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2249659.633] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2249659.658] -> wl_surface@28.commit() +[2249670.473] wl_display@1.delete_id(38) +[2249670.566] wl_display@1.delete_id(39) +[2249670.583] wl_callback@38.done(198353813) +[2249672.213] wl_buffer@41.release() +[2249672.258] wl_callback@39.done(198353813) +[2249675.977] -> xdg_toplevel@33.set_min_size(1436, 732) +[2249676.017] -> xdg_toplevel@33.set_max_size(0, 0) +[2249676.032] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2249676.057] -> wl_surface@28.frame(new id wl_callback@39) +[2249676.075] -> wl_surface@28.frame(new id wl_callback@38) +[2249676.088] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2249676.108] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2249676.132] -> wl_surface@28.commit() +[2249686.597] wl_display@1.delete_id(39) +[2249686.668] wl_display@1.delete_id(38) +[2249686.682] wl_callback@39.done(198353829) +[2249688.497] wl_buffer@36.release() +[2249688.542] wl_callback@38.done(198353829) +[2249692.538] -> xdg_toplevel@33.set_min_size(1436, 732) +[2249692.591] -> xdg_toplevel@33.set_max_size(0, 0) +[2249692.612] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2249692.648] -> wl_surface@28.frame(new id wl_callback@38) +[2249692.675] -> wl_surface@28.frame(new id wl_callback@39) +[2249692.693] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2249692.721] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2249692.758] -> wl_surface@28.commit() +[2249703.764] wl_display@1.delete_id(38) +[2249703.846] wl_display@1.delete_id(39) +[2249703.892] wl_callback@38.done(198353846) +[2249704.945] wl_buffer@41.release() +[2249704.984] wl_callback@39.done(198353846) +[2249708.500] -> xdg_toplevel@33.set_min_size(1436, 732) +[2249708.547] -> xdg_toplevel@33.set_max_size(0, 0) +[2249708.568] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2249708.604] -> wl_surface@28.frame(new id wl_callback@39) +[2249708.628] -> wl_surface@28.frame(new id wl_callback@38) +[2249708.645] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2249708.672] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2249708.703] -> wl_surface@28.commit() +[2249720.058] wl_display@1.delete_id(39) +[2249720.176] wl_display@1.delete_id(38) +[2249720.195] wl_callback@39.done(198353863) +[2249721.038] wl_buffer@36.release() +[2249721.084] wl_callback@38.done(198353863) +[2249725.140] -> xdg_toplevel@33.set_min_size(1436, 732) +[2249725.189] -> xdg_toplevel@33.set_max_size(0, 0) +[2249725.210] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2249725.243] -> wl_surface@28.frame(new id wl_callback@38) +[2249725.270] -> wl_surface@28.frame(new id wl_callback@39) +[2249725.288] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2249725.316] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2249725.351] -> wl_surface@28.commit() +[2249737.293] wl_display@1.delete_id(38) +[2249737.380] wl_display@1.delete_id(39) +[2249737.428] wl_callback@38.done(198353880) +[2249737.997] wl_buffer@41.release() +[2249738.030] wl_callback@39.done(198353880) +[2249740.127] -> xdg_toplevel@33.set_min_size(1436, 732) +[2249740.176] -> xdg_toplevel@33.set_max_size(0, 0) +[2249740.199] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2249740.238] -> wl_surface@28.frame(new id wl_callback@39) +[2249740.269] -> wl_surface@28.frame(new id wl_callback@38) +[2249740.287] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2249740.318] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2249740.356] -> wl_surface@28.commit() +[2249756.086] wl_display@1.delete_id(39) +[2249756.134] wl_display@1.delete_id(38) +[2249756.149] wl_callback@39.done(198353897) +[2249756.679] wl_buffer@36.release() +[2249756.715] wl_callback@38.done(198353897) +[2249758.968] -> xdg_toplevel@33.set_min_size(1436, 732) +[2249759.016] -> xdg_toplevel@33.set_max_size(0, 0) +[2249759.040] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2249759.075] -> wl_surface@28.frame(new id wl_callback@38) +[2249759.106] -> wl_surface@28.frame(new id wl_callback@39) +[2249759.124] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2249759.151] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2249759.185] -> wl_surface@28.commit() +[2249771.152] wl_display@1.delete_id(38) +[2249771.249] wl_display@1.delete_id(39) +[2249771.267] wl_callback@38.done(198353913) +[2249772.018] wl_buffer@41.release() +[2249772.067] wl_callback@39.done(198353913) +[2249774.234] -> xdg_toplevel@33.set_min_size(1436, 732) +[2249774.286] -> xdg_toplevel@33.set_max_size(0, 0) +[2249774.308] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2249774.347] -> wl_surface@28.frame(new id wl_callback@39) +[2249774.373] -> wl_surface@28.frame(new id wl_callback@38) +[2249774.391] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2249774.418] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2249774.458] -> wl_surface@28.commit() +[2249788.094] wl_display@1.delete_id(39) +[2249788.184] wl_display@1.delete_id(38) +[2249788.200] wl_pointer@11.motion(198353924, 981.292969, 294.398438) +[2249788.268] wl_pointer@11.frame() +[2249788.285] wl_callback@39.done(198353930) +[2249788.977] wl_buffer@36.release() +[2249789.003] wl_callback@38.done(198353930) +[2249790.453] -> xdg_toplevel@33.set_min_size(1436, 732) +[2249790.491] -> xdg_toplevel@33.set_max_size(0, 0) +[2249790.505] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2249790.533] -> wl_surface@28.frame(new id wl_callback@38) +[2249790.553] -> wl_surface@28.frame(new id wl_callback@39) +[2249790.565] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2249790.585] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2249790.609] -> wl_surface@28.commit() +[2249804.335] wl_display@1.delete_id(38) +[2249804.429] wl_display@1.delete_id(39) +[2249804.446] wl_pointer@11.motion(198353935, 989.343750, 308.992188) +[2249804.532] wl_pointer@11.frame() +[2249804.566] wl_callback@38.done(198353947) +[2249805.314] wl_buffer@41.release() +[2249805.342] wl_callback@39.done(198353947) +[2249806.712] -> xdg_toplevel@33.set_min_size(1436, 732) +[2249806.749] -> xdg_toplevel@33.set_max_size(0, 0) +[2249806.764] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2249806.791] -> wl_surface@28.frame(new id wl_callback@39) +[2249806.810] -> wl_surface@28.frame(new id wl_callback@38) +[2249806.822] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2249806.842] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2249806.884] -> wl_surface@28.commit() +[2249821.787] wl_display@1.delete_id(39) +[2249822.045] wl_display@1.delete_id(38) +[2249822.086] wl_pointer@11.motion(198353958, 1082.937500, 508.960938) +[2249822.135] wl_pointer@11.frame() +[2249822.153] wl_callback@39.done(198353964) +[2249823.306] wl_buffer@36.release() +[2249823.336] wl_callback@38.done(198353964) +[2249824.903] -> xdg_toplevel@33.set_min_size(1436, 732) +[2249824.941] -> xdg_toplevel@33.set_max_size(0, 0) +[2249824.956] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2249824.983] -> wl_surface@28.frame(new id wl_callback@38) +[2249825.018] -> wl_surface@28.frame(new id wl_callback@39) +[2249825.031] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2249825.051] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2249825.075] -> wl_surface@28.commit() +[2249837.944] wl_display@1.delete_id(38) +[2249838.025] wl_display@1.delete_id(39) +[2249838.036] wl_pointer@11.motion(198353970, 1144.281250, 669.128906) +[2249838.094] wl_pointer@11.frame() +[2249838.114] wl_callback@38.done(198353980) +[2249871.307] wl_buffer@41.release() +[2249871.346] wl_callback@39.done(198353980) +[2249873.522] -> xdg_toplevel@33.set_min_size(1436, 732) +[2249873.570] -> xdg_toplevel@33.set_max_size(0, 0) +[2249873.590] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2249873.626] -> wl_surface@28.frame(new id wl_callback@39) +[2249873.654] -> wl_surface@28.frame(new id wl_callback@38) +[2249873.670] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2249873.699] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2249873.731] -> wl_surface@28.commit() +[2249873.872] wl_pointer@11.leave(115346, wl_surface@28) +[2249873.926] -> wl_pointer@11.set_cursor(115345, wl_surface@21, 4, 4) +[2249873.960] -> wl_surface@21.attach(wl_buffer@37, 0, 0) +[2249873.988] -> wl_surface@21.set_buffer_scale(1) +[2249874.000] -> wl_surface@21.damage(0, 0, 24, 24) +[2249874.031] -> wl_surface@21.commit() +[2249874.045] wl_pointer@11.frame() +[2249887.674] wl_display@1.delete_id(39) +[2249887.758] wl_display@1.delete_id(38) +[2249887.777] wl_callback@39.done(198354030) +[2249985.482] wl_buffer@36.release() +[2249985.518] wl_callback@38.done(198354030) +[2249987.288] -> xdg_toplevel@33.set_min_size(1436, 732) +[2249987.326] -> xdg_toplevel@33.set_max_size(0, 0) +[2249987.340] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2249987.366] -> wl_surface@28.frame(new id wl_callback@38) +[2249987.386] -> wl_surface@28.frame(new id wl_callback@39) +[2249987.397] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2249987.416] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2249987.440] -> wl_surface@28.commit() +[2250005.915] wl_display@1.delete_id(38) +[2250005.964] wl_display@1.delete_id(39) +[2250005.979] wl_callback@38.done(198354147) +[2250007.006] wl_buffer@41.release() +[2250007.043] wl_callback@39.done(198354147) +[2250010.434] -> xdg_toplevel@33.set_min_size(1436, 732) +[2250010.475] -> xdg_toplevel@33.set_max_size(0, 0) +[2250010.501] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2250010.538] -> wl_surface@28.frame(new id wl_callback@39) +[2250010.563] -> wl_surface@28.frame(new id wl_callback@38) +[2250010.581] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2250010.615] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2250010.649] -> wl_surface@28.commit() +[2250020.607] wl_display@1.delete_id(39) +[2250020.707] wl_display@1.delete_id(38) +[2250020.724] wl_callback@39.done(198354163) +[2250022.119] wl_buffer@36.release() +[2250022.159] wl_callback@38.done(198354163) +[2250026.755] -> xdg_toplevel@33.set_min_size(1436, 732) +[2250026.809] -> xdg_toplevel@33.set_max_size(0, 0) +[2250026.829] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2250026.878] -> wl_surface@28.frame(new id wl_callback@38) +[2250026.904] -> wl_surface@28.frame(new id wl_callback@39) +[2250026.923] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2250026.951] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2250026.987] -> wl_surface@28.commit() +[2250037.651] wl_display@1.delete_id(38) +[2250037.704] wl_display@1.delete_id(39) +[2250037.718] wl_callback@38.done(198354180) +[2250038.736] wl_buffer@41.release() +[2250038.772] wl_callback@39.done(198354180) +[2250042.390] -> xdg_toplevel@33.set_min_size(1436, 732) +[2250042.429] -> xdg_toplevel@33.set_max_size(0, 0) +[2250042.445] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2250042.470] -> wl_surface@28.frame(new id wl_callback@39) +[2250042.493] -> wl_surface@28.frame(new id wl_callback@38) +[2250042.507] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2250042.527] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2250042.568] -> wl_surface@28.commit() +[2250053.904] wl_display@1.delete_id(39) +[2250054.002] wl_display@1.delete_id(38) +[2250054.023] wl_callback@39.done(198354196) +[2250054.945] wl_buffer@36.release() +[2250054.979] wl_callback@38.done(198354196) +[2250058.809] -> xdg_toplevel@33.set_min_size(1436, 732) +[2250058.873] -> xdg_toplevel@33.set_max_size(0, 0) +[2250058.895] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2250058.946] -> wl_surface@28.frame(new id wl_callback@38) +[2250058.975] -> wl_surface@28.frame(new id wl_callback@39) +[2250058.999] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2250059.028] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2250059.063] -> wl_surface@28.commit() +[2250072.742] wl_display@1.delete_id(38) +[2250072.791] wl_display@1.delete_id(39) +[2250072.808] wl_callback@38.done(198354213) +[2250073.665] wl_buffer@41.release() +[2250073.694] wl_callback@39.done(198354213) +[2250076.318] -> xdg_toplevel@33.set_min_size(1436, 732) +[2250076.360] -> xdg_toplevel@33.set_max_size(0, 0) +[2250076.375] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2250076.407] -> wl_surface@28.frame(new id wl_callback@39) +[2250076.427] -> wl_surface@28.frame(new id wl_callback@38) +[2250076.440] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2250076.460] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2250076.486] -> wl_surface@28.commit() +[2250087.039] wl_display@1.delete_id(39) +[2250087.133] wl_display@1.delete_id(38) +[2250087.149] wl_callback@39.done(198354230) +[2250088.374] wl_buffer@36.release() +[2250088.425] wl_callback@38.done(198354230) +[2250092.528] -> xdg_toplevel@33.set_min_size(1436, 732) +[2250092.578] -> xdg_toplevel@33.set_max_size(0, 0) +[2250092.599] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2250092.635] -> wl_surface@28.frame(new id wl_callback@38) +[2250092.660] -> wl_surface@28.frame(new id wl_callback@39) +[2250092.677] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2250092.704] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2250092.740] -> wl_surface@28.commit() +[2250103.666] wl_display@1.delete_id(38) +[2250103.769] wl_display@1.delete_id(39) +[2250103.781] wl_callback@38.done(198354246) +[2250105.009] wl_buffer@41.release() +[2250105.047] wl_callback@39.done(198354246) +[2250108.872] -> xdg_toplevel@33.set_min_size(1436, 732) +[2250108.911] -> xdg_toplevel@33.set_max_size(0, 0) +[2250108.926] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2250108.951] -> wl_surface@28.frame(new id wl_callback@39) +[2250108.970] -> wl_surface@28.frame(new id wl_callback@38) +[2250108.983] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2250109.003] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2250109.027] -> wl_surface@28.commit() +[2250120.320] wl_display@1.delete_id(39) +[2250120.385] wl_display@1.delete_id(38) +[2250120.402] wl_callback@39.done(198354263) +[2250121.938] wl_buffer@36.release() +[2250121.983] wl_callback@38.done(198354263) +[2250126.297] -> xdg_toplevel@33.set_min_size(1436, 732) +[2250126.349] -> xdg_toplevel@33.set_max_size(0, 0) +[2250126.372] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2250126.419] -> wl_surface@28.frame(new id wl_callback@38) +[2250126.448] -> wl_surface@28.frame(new id wl_callback@39) +[2250126.467] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2250126.508] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2250126.545] -> wl_surface@28.commit() +[2250136.962] wl_display@1.delete_id(38) +[2250137.048] wl_display@1.delete_id(39) +[2250137.065] wl_callback@38.done(198354279) +[2250138.122] wl_buffer@41.release() +[2250138.163] wl_callback@39.done(198354279) +[2250142.199] -> xdg_toplevel@33.set_min_size(1436, 732) +[2250142.253] -> xdg_toplevel@33.set_max_size(0, 0) +[2250142.276] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2250142.314] -> wl_surface@28.frame(new id wl_callback@39) +[2250142.344] -> wl_surface@28.frame(new id wl_callback@38) +[2250142.367] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2250142.395] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2250142.448] -> wl_surface@28.commit() +[2250154.367] wl_display@1.delete_id(39) +[2250154.415] wl_display@1.delete_id(38) +[2250154.431] wl_callback@39.done(198354296) +[2250155.407] wl_buffer@36.release() +[2250155.446] wl_callback@38.done(198354296) +[2250159.661] -> xdg_toplevel@33.set_min_size(1436, 732) +[2250159.711] -> xdg_toplevel@33.set_max_size(0, 0) +[2250159.733] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2250159.769] -> wl_surface@28.frame(new id wl_callback@38) +[2250159.804] -> wl_surface@28.frame(new id wl_callback@39) +[2250159.824] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2250159.865] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2250159.902] -> wl_surface@28.commit() +[2250170.288] wl_display@1.delete_id(38) +[2250170.332] wl_display@1.delete_id(39) +[2250170.342] wl_callback@38.done(198354313) +[2250171.277] wl_buffer@41.release() +[2250171.316] wl_callback@39.done(198354313) +[2250175.061] -> xdg_toplevel@33.set_min_size(1436, 732) +[2250175.109] -> xdg_toplevel@33.set_max_size(0, 0) +[2250175.139] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2250175.180] -> wl_surface@28.frame(new id wl_callback@39) +[2250175.211] -> wl_surface@28.frame(new id wl_callback@38) +[2250175.230] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2250175.265] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2250175.310] -> wl_surface@28.commit() +[2250187.688] wl_display@1.delete_id(39) +[2250187.720] wl_display@1.delete_id(38) +[2250187.730] wl_callback@39.done(198354329) +[2250188.508] wl_buffer@36.release() +[2250188.535] wl_callback@38.done(198354329) +[2250191.621] -> xdg_toplevel@33.set_min_size(1436, 732) +[2250191.658] -> xdg_toplevel@33.set_max_size(0, 0) +[2250191.673] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2250191.699] -> wl_surface@28.frame(new id wl_callback@38) +[2250191.722] -> wl_surface@28.frame(new id wl_callback@39) +[2250191.735] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2250191.754] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2250191.779] -> wl_surface@28.commit() +[2250204.004] wl_display@1.delete_id(38) +[2250204.040] wl_display@1.delete_id(39) +[2250204.049] wl_callback@38.done(198354347) +[2250204.727] wl_buffer@41.release() +[2250204.757] wl_callback@39.done(198354347) +[2250208.782] -> xdg_toplevel@33.set_min_size(1436, 732) +[2250208.830] -> xdg_toplevel@33.set_max_size(0, 0) +[2250208.866] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2250208.904] -> wl_surface@28.frame(new id wl_callback@39) +[2250208.939] -> wl_surface@28.frame(new id wl_callback@38) +[2250208.958] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2250208.984] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2250209.019] -> wl_surface@28.commit() +[2250220.225] wl_display@1.delete_id(39) +[2250220.267] wl_display@1.delete_id(38) +[2250220.281] wl_callback@39.done(198354363) +[2250221.254] wl_buffer@36.release() +[2250221.297] wl_callback@38.done(198354363) +[2250225.482] -> xdg_toplevel@33.set_min_size(1436, 732) +[2250225.529] -> xdg_toplevel@33.set_max_size(0, 0) +[2250225.550] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2250225.591] -> wl_surface@28.frame(new id wl_callback@38) +[2250225.617] -> wl_surface@28.frame(new id wl_callback@39) +[2250225.635] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2250225.663] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2250225.699] -> wl_surface@28.commit() +[2250237.071] wl_display@1.delete_id(38) +[2250237.113] wl_display@1.delete_id(39) +[2250237.127] wl_callback@38.done(198354380) +[2250238.142] wl_buffer@41.release() +[2250238.190] wl_callback@39.done(198354380) +[2250242.556] -> xdg_toplevel@33.set_min_size(1436, 732) +[2250242.604] -> xdg_toplevel@33.set_max_size(0, 0) +[2250242.622] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2250242.655] -> wl_surface@28.frame(new id wl_callback@39) +[2250242.688] -> wl_surface@28.frame(new id wl_callback@38) +[2250242.705] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2250242.732] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2250242.781] -> wl_surface@28.commit() +[2250253.545] wl_display@1.delete_id(39) +[2250253.590] wl_display@1.delete_id(38) +[2250253.603] wl_callback@39.done(198354396) +[2250254.653] wl_buffer@36.release() +[2250254.698] wl_callback@38.done(198354396) +[2250259.118] -> xdg_toplevel@33.set_min_size(1436, 732) +[2250259.167] -> xdg_toplevel@33.set_max_size(0, 0) +[2250259.188] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2250259.225] -> wl_surface@28.frame(new id wl_callback@38) +[2250259.259] -> wl_surface@28.frame(new id wl_callback@39) +[2250259.278] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2250259.305] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2250259.340] -> wl_surface@28.commit() +[2250272.226] wl_display@1.delete_id(38) +[2250272.289] wl_display@1.delete_id(39) +[2250272.303] wl_callback@38.done(198354413) +[2250273.156] wl_buffer@41.release() +[2250273.197] wl_callback@39.done(198354413) +[2250276.202] -> xdg_toplevel@33.set_min_size(1436, 732) +[2250276.242] -> xdg_toplevel@33.set_max_size(0, 0) +[2250276.258] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2250276.284] -> wl_surface@28.frame(new id wl_callback@39) +[2250276.303] -> wl_surface@28.frame(new id wl_callback@38) +[2250276.315] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2250276.336] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2250276.361] -> wl_surface@28.commit() +[2250287.899] wl_display@1.delete_id(39) +[2250287.954] wl_display@1.delete_id(38) +[2250287.968] wl_callback@39.done(198354430) +[2250289.029] wl_buffer@36.release() +[2250289.074] wl_callback@38.done(198354430) +[2250292.477] -> xdg_toplevel@33.set_min_size(1436, 732) +[2250292.521] -> xdg_toplevel@33.set_max_size(0, 0) +[2250292.540] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2250292.572] -> wl_surface@28.frame(new id wl_callback@38) +[2250292.597] -> wl_surface@28.frame(new id wl_callback@39) +[2250292.614] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2250292.639] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2250292.678] -> wl_surface@28.commit() +[2250336.996] wl_display@1.delete_id(38) +[2250337.038] wl_display@1.delete_id(39) +[2250337.053] gtk_surface1@34.configure(array) +[2250337.068] gtk_surface1@34.configure_edges(array) +[2250337.082] xdg_toplevel@33.configure(1488, 784, array) +[2250337.122] xdg_surface@30.configure(115348) +[2250344.335] -> xdg_surface@30.ack_configure(115348) +[2250344.382] wl_keyboard@27.leave(115350, wl_surface@28) +[2250344.426] wl_callback@38.done(198354471) +[2250481.859] wl_buffer@41.release() +[2250481.907] wl_callback@39.done(198354471) +[2250487.725] -> xdg_toplevel@33.set_min_size(1436, 732) +[2250487.773] -> xdg_toplevel@33.set_max_size(0, 0) +[2250487.796] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2250487.834] -> wl_compositor@4.create_region(new id wl_region@39) +[2250487.888] -> wl_region@39.add(16, 13, 1508, 804) +[2250487.926] -> wl_surface@28.set_input_region(wl_region@39) +[2250487.940] -> wl_region@39.destroy() +[2250487.951] -> wl_surface@28.frame(new id wl_callback@38) +[2250487.976] -> wl_surface@28.frame(new id wl_callback@42) +[2250487.994] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2250488.023] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2250488.214] -> wl_surface@28.commit() +[2250489.061] wl_display@1.delete_id(39) +[2250503.431] wl_display@1.delete_id(38) +[2250503.505] wl_display@1.delete_id(42) +[2250503.520] wl_callback@38.done(198354646) +[2250585.035] wl_buffer@36.release() +[2250585.074] wl_callback@42.done(198354646) +[2250596.843] -> xdg_toplevel@33.set_min_size(1436, 732) +[2250596.910] -> xdg_toplevel@33.set_max_size(0, 0) +[2250596.925] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2250596.952] -> wl_surface@28.frame(new id wl_callback@42) +[2250596.973] -> wl_surface@28.frame(new id wl_callback@38) +[2250596.986] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2250597.006] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2250597.160] -> wl_surface@28.commit() +[2250603.013] wl_display@1.delete_id(42) +[2250603.068] wl_display@1.delete_id(38) +[2250603.082] wl_callback@42.done(198354746) +[2250681.367] wl_buffer@41.release() +[2250681.399] wl_callback@38.done(198354746) +[2250684.987] -> xdg_toplevel@33.set_min_size(1436, 732) +[2250685.025] -> xdg_toplevel@33.set_max_size(0, 0) +[2250685.040] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2250685.066] -> wl_surface@28.frame(new id wl_callback@38) +[2250685.091] -> wl_surface@28.frame(new id wl_callback@42) +[2250685.104] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2250685.123] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2250685.208] -> wl_surface@28.commit() +[2250703.261] wl_display@1.delete_id(38) +[2250703.325] wl_display@1.delete_id(42) +[2250703.335] wl_callback@38.done(198354846) +[2250710.670] wl_buffer@36.release() +[2250710.711] wl_callback@42.done(198354846) +[2250714.174] -> xdg_toplevel@33.set_min_size(1436, 732) +[2250714.207] -> xdg_toplevel@33.set_max_size(0, 0) +[2250714.222] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2250714.247] -> wl_surface@28.frame(new id wl_callback@42) +[2250714.266] -> wl_surface@28.frame(new id wl_callback@38) +[2250714.279] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2250714.298] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2250714.370] -> wl_surface@28.commit() +[2250720.037] wl_display@1.delete_id(42) +[2250720.120] wl_display@1.delete_id(38) +[2250720.138] wl_callback@42.done(198354862) +[2250726.567] wl_buffer@41.release() +[2250726.601] wl_callback@38.done(198354862) +[2250728.524] -> xdg_toplevel@33.set_min_size(1436, 732) +[2250728.577] -> xdg_toplevel@33.set_max_size(0, 0) +[2250728.603] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2250728.630] -> wl_surface@28.frame(new id wl_callback@38) +[2250728.650] -> wl_surface@28.frame(new id wl_callback@42) +[2250728.663] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2250728.683] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2250728.709] -> wl_surface@28.commit() +[2250736.152] wl_display@1.delete_id(38) +[2250736.225] wl_display@1.delete_id(42) +[2250736.236] wl_callback@38.done(198354879) +[2250742.392] wl_buffer@36.release() +[2250742.433] wl_callback@42.done(198354879) +[2250744.412] -> xdg_toplevel@33.set_min_size(1436, 732) +[2250744.453] -> xdg_toplevel@33.set_max_size(0, 0) +[2250744.468] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2250744.498] -> wl_surface@28.frame(new id wl_callback@42) +[2250744.521] -> wl_surface@28.frame(new id wl_callback@38) +[2250744.536] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2250744.559] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2250744.592] -> wl_surface@28.commit() +[2250753.635] wl_display@1.delete_id(42) +[2250753.697] wl_display@1.delete_id(38) +[2250753.712] wl_callback@42.done(198354896) +[2250761.417] wl_buffer@41.release() +[2250761.456] wl_callback@38.done(198354896) +[2250764.213] -> xdg_toplevel@33.set_min_size(1436, 732) +[2250764.257] -> xdg_toplevel@33.set_max_size(0, 0) +[2250764.279] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2250764.316] -> wl_surface@28.frame(new id wl_callback@38) +[2250764.343] -> wl_surface@28.frame(new id wl_callback@42) +[2250764.361] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2250764.390] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2250764.426] -> wl_surface@28.commit() +[2250770.276] wl_display@1.delete_id(38) +[2250770.329] wl_display@1.delete_id(42) +[2250770.344] wl_callback@38.done(198354913) +[2250777.323] wl_buffer@36.release() +[2250777.361] wl_callback@42.done(198354913) +[2250779.636] -> xdg_toplevel@33.set_min_size(1436, 732) +[2250779.674] -> xdg_toplevel@33.set_max_size(0, 0) +[2250779.688] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2250779.733] -> wl_surface@28.frame(new id wl_callback@42) +[2250779.761] -> wl_surface@28.frame(new id wl_callback@38) +[2250779.779] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2250779.807] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2250779.843] -> wl_surface@28.commit() +[2250787.130] wl_display@1.delete_id(42) +[2250787.224] wl_display@1.delete_id(38) +[2250787.238] wl_callback@42.done(198354929) +[2250794.790] wl_buffer@41.release() +[2250794.832] wl_callback@38.done(198354929) +[2250796.845] -> xdg_toplevel@33.set_min_size(1436, 732) +[2250796.902] -> xdg_toplevel@33.set_max_size(0, 0) +[2250796.917] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2250796.962] -> wl_surface@28.frame(new id wl_callback@38) +[2250796.997] -> wl_surface@28.frame(new id wl_callback@42) +[2250797.024] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2250797.058] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2250797.105] -> wl_surface@28.commit() +[2250804.952] wl_display@1.delete_id(38) +[2250805.000] wl_display@1.delete_id(42) +[2250805.013] wl_callback@38.done(198354946) +[2250813.624] wl_buffer@36.release() +[2250813.663] wl_callback@42.done(198354946) +[2250816.323] -> xdg_toplevel@33.set_min_size(1436, 732) +[2250816.369] -> xdg_toplevel@33.set_max_size(0, 0) +[2250816.387] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2250816.418] -> wl_surface@28.frame(new id wl_callback@42) +[2250816.445] -> wl_surface@28.frame(new id wl_callback@38) +[2250816.461] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2250816.485] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2250816.516] -> wl_surface@28.commit() +[2250819.704] wl_display@1.delete_id(42) +[2250819.745] wl_display@1.delete_id(38) +[2250819.758] wl_callback@42.done(198354962) +[2250820.439] wl_buffer@41.release() +[2250820.474] wl_callback@38.done(198354962) +[2250823.212] -> xdg_toplevel@33.set_min_size(1436, 732) +[2250823.281] -> xdg_toplevel@33.set_max_size(0, 0) +[2250823.302] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2250823.336] -> wl_surface@28.frame(new id wl_callback@38) +[2250823.360] -> wl_surface@28.frame(new id wl_callback@42) +[2250823.373] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2250823.402] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2250823.436] -> wl_surface@28.commit() +[2250836.726] wl_display@1.delete_id(38) +[2250836.765] wl_display@1.delete_id(42) +[2250836.775] wl_callback@38.done(198354979) +[2250837.234] wl_buffer@36.release() +[2250837.270] wl_callback@42.done(198354979) +[2250838.990] -> xdg_toplevel@33.set_min_size(1436, 732) +[2250839.041] -> xdg_toplevel@33.set_max_size(0, 0) +[2250839.063] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2250839.099] -> wl_surface@28.frame(new id wl_callback@42) +[2250839.125] -> wl_surface@28.frame(new id wl_callback@38) +[2250839.144] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2250839.172] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2250839.208] -> wl_surface@28.commit() +[2250852.826] wl_display@1.delete_id(42) +[2250852.894] wl_display@1.delete_id(38) +[2250852.904] wl_callback@42.done(198354995) +[2250853.360] wl_buffer@41.release() +[2250853.389] wl_callback@38.done(198354995) +[2250854.521] -> xdg_toplevel@33.set_min_size(1436, 732) +[2250854.557] -> xdg_toplevel@33.set_max_size(0, 0) +[2250854.572] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2250854.597] -> wl_surface@28.frame(new id wl_callback@38) +[2250854.616] -> wl_surface@28.frame(new id wl_callback@42) +[2250854.628] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2250854.648] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2250854.672] -> wl_surface@28.commit() +[2250869.345] wl_display@1.delete_id(38) +[2250869.397] wl_display@1.delete_id(42) +[2250869.410] wl_callback@38.done(198355012) +[2250869.945] wl_buffer@36.release() +[2250870.026] wl_callback@42.done(198355012) +[2250871.106] -> xdg_toplevel@33.set_min_size(1436, 732) +[2250871.143] -> xdg_toplevel@33.set_max_size(0, 0) +[2250871.158] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2250871.184] -> wl_surface@28.frame(new id wl_callback@42) +[2250871.202] -> wl_surface@28.frame(new id wl_callback@38) +[2250871.214] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2250871.234] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2250871.258] -> wl_surface@28.commit() +[2250886.257] wl_display@1.delete_id(42) +[2250886.338] wl_display@1.delete_id(38) +[2250886.352] wl_callback@42.done(198355029) +[2250886.957] wl_buffer@41.release() +[2250886.992] wl_callback@38.done(198355029) +[2250888.748] -> xdg_toplevel@33.set_min_size(1436, 732) +[2250888.796] -> xdg_toplevel@33.set_max_size(0, 0) +[2250888.818] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2250888.941] -> wl_surface@28.frame(new id wl_callback@38) +[2250888.969] -> wl_surface@28.frame(new id wl_callback@42) +[2250888.987] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2250889.016] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2250889.053] -> wl_surface@28.commit() +[2250903.425] wl_display@1.delete_id(38) +[2250903.476] wl_display@1.delete_id(42) +[2250903.488] wl_callback@38.done(198355046) +[2250904.936] wl_buffer@36.release() +[2250904.974] wl_callback@42.done(198355046) +[2250906.617] -> xdg_toplevel@33.set_min_size(1436, 732) +[2250906.664] -> xdg_toplevel@33.set_max_size(0, 0) +[2250906.686] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2250906.749] -> wl_surface@28.frame(new id wl_callback@42) +[2250906.776] -> wl_surface@28.frame(new id wl_callback@38) +[2250906.793] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2250906.818] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2250906.894] -> wl_surface@28.commit() +[2250920.049] wl_display@1.delete_id(42) +[2250920.089] wl_display@1.delete_id(38) +[2250920.100] wl_callback@42.done(198355063) +[2250920.631] wl_buffer@41.release() +[2250920.659] wl_callback@38.done(198355063) +[2250921.955] -> xdg_toplevel@33.set_min_size(1436, 732) +[2250921.991] -> xdg_toplevel@33.set_max_size(0, 0) +[2250922.006] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2250922.032] -> wl_surface@28.frame(new id wl_callback@38) +[2250922.050] -> wl_surface@28.frame(new id wl_callback@42) +[2250922.063] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2250922.082] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2250922.106] -> wl_surface@28.commit() +[2250936.676] wl_display@1.delete_id(38) +[2250936.718] wl_display@1.delete_id(42) +[2250936.731] wl_callback@38.done(198355079) +[2250937.156] wl_buffer@36.release() +[2250937.181] wl_callback@42.done(198355079) +[2250938.479] -> xdg_toplevel@33.set_min_size(1436, 732) +[2250938.514] -> xdg_toplevel@33.set_max_size(0, 0) +[2250938.529] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2250938.554] -> wl_surface@28.frame(new id wl_callback@42) +[2250938.573] -> wl_surface@28.frame(new id wl_callback@38) +[2250938.585] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2250938.605] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2250938.629] -> wl_surface@28.commit() +[2250953.687] wl_display@1.delete_id(42) +[2250953.739] wl_display@1.delete_id(38) +[2250953.753] wl_callback@42.done(198355096) +[2250954.374] wl_buffer@41.release() +[2250954.418] wl_callback@38.done(198355096) +[2250957.919] -> xdg_toplevel@33.set_min_size(1436, 732) +[2250957.966] -> xdg_toplevel@33.set_max_size(0, 0) +[2250957.987] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2250958.019] -> wl_surface@28.frame(new id wl_callback@38) +[2250958.045] -> wl_surface@28.frame(new id wl_callback@42) +[2250958.062] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2250958.089] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2250958.122] -> wl_surface@28.commit() +[2250970.611] wl_display@1.delete_id(38) +[2250970.648] wl_display@1.delete_id(42) +[2250970.660] wl_callback@38.done(198355113) +[2250971.245] wl_buffer@36.release() +[2250971.286] wl_callback@42.done(198355113) +[2250973.081] -> xdg_toplevel@33.set_min_size(1436, 732) +[2250973.129] -> xdg_toplevel@33.set_max_size(0, 0) +[2250973.151] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2250973.185] -> wl_surface@28.frame(new id wl_callback@42) +[2250973.211] -> wl_surface@28.frame(new id wl_callback@38) +[2250973.229] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2250973.257] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2250973.293] -> wl_surface@28.commit() +[2250986.671] wl_display@1.delete_id(42) +[2250986.741] wl_display@1.delete_id(38) +[2250986.912] wl_callback@42.done(198355129) +[2250987.561] wl_buffer@41.release() +[2250987.604] wl_callback@38.done(198355129) +[2250989.384] -> xdg_toplevel@33.set_min_size(1436, 732) +[2250989.430] -> xdg_toplevel@33.set_max_size(0, 0) +[2250989.451] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2250989.491] -> wl_surface@28.frame(new id wl_callback@38) +[2250989.518] -> wl_surface@28.frame(new id wl_callback@42) +[2250989.535] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2250989.562] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2250989.602] -> wl_surface@28.commit() +[2251003.037] wl_display@1.delete_id(38) +[2251003.105] wl_display@1.delete_id(42) +[2251003.120] wl_callback@38.done(198355145) +[2251003.714] wl_buffer@36.release() +[2251003.753] wl_callback@42.done(198355145) +[2251005.515] -> xdg_toplevel@33.set_min_size(1436, 732) +[2251005.561] -> xdg_toplevel@33.set_max_size(0, 0) +[2251005.580] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2251005.617] -> wl_surface@28.frame(new id wl_callback@42) +[2251005.641] -> wl_surface@28.frame(new id wl_callback@38) +[2251005.658] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2251005.683] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2251005.716] -> wl_surface@28.commit() +[2251019.965] wl_display@1.delete_id(42) +[2251020.027] wl_display@1.delete_id(38) +[2251020.039] wl_callback@42.done(198355163) +[2251020.465] wl_buffer@41.release() +[2251020.489] wl_callback@38.done(198355163) +[2251022.213] -> xdg_toplevel@33.set_min_size(1436, 732) +[2251022.261] -> xdg_toplevel@33.set_max_size(0, 0) +[2251022.283] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2251022.325] -> wl_surface@28.frame(new id wl_callback@38) +[2251022.355] -> wl_surface@28.frame(new id wl_callback@42) +[2251022.374] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2251022.402] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2251022.438] -> wl_surface@28.commit() +[2251036.662] wl_display@1.delete_id(38) +[2251036.706] wl_display@1.delete_id(42) +[2251036.720] wl_callback@38.done(198355179) +[2251037.224] wl_buffer@36.release() +[2251037.284] wl_callback@42.done(198355179) +[2251039.268] -> xdg_toplevel@33.set_min_size(1436, 732) +[2251039.318] -> xdg_toplevel@33.set_max_size(0, 0) +[2251039.339] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2251039.378] -> wl_surface@28.frame(new id wl_callback@42) +[2251039.405] -> wl_surface@28.frame(new id wl_callback@38) +[2251039.424] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2251039.452] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2251039.485] -> wl_surface@28.commit() +[2251053.269] wl_display@1.delete_id(42) +[2251053.319] wl_display@1.delete_id(38) +[2251053.329] wl_callback@42.done(198355196) +[2251053.708] wl_buffer@41.release() +[2251053.731] wl_callback@38.done(198355196) +[2251055.334] -> xdg_toplevel@33.set_min_size(1436, 732) +[2251055.385] -> xdg_toplevel@33.set_max_size(0, 0) +[2251055.407] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2251055.446] -> wl_surface@28.frame(new id wl_callback@38) +[2251055.472] -> wl_surface@28.frame(new id wl_callback@42) +[2251055.491] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2251055.519] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2251055.554] -> wl_surface@28.commit() +[2251072.495] wl_display@1.delete_id(38) +[2251072.542] wl_display@1.delete_id(42) +[2251072.557] wl_callback@38.done(198355214) +[2251073.073] wl_buffer@36.release() +[2251073.108] wl_callback@42.done(198355214) +[2251075.036] -> xdg_toplevel@33.set_min_size(1436, 732) +[2251075.085] -> xdg_toplevel@33.set_max_size(0, 0) +[2251075.106] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2251075.144] -> wl_surface@28.frame(new id wl_callback@42) +[2251075.171] -> wl_surface@28.frame(new id wl_callback@38) +[2251075.190] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2251075.219] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2251075.255] -> wl_surface@28.commit() +[2251086.925] wl_display@1.delete_id(42) +[2251086.978] wl_display@1.delete_id(38) +[2251086.987] wl_callback@42.done(198355229) +[2251087.501] wl_buffer@41.release() +[2251087.540] wl_callback@38.done(198355229) +[2251089.266] -> xdg_toplevel@33.set_min_size(1436, 732) +[2251089.303] -> xdg_toplevel@33.set_max_size(0, 0) +[2251089.318] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2251089.344] -> wl_surface@28.frame(new id wl_callback@38) +[2251089.365] -> wl_surface@28.frame(new id wl_callback@42) +[2251089.377] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2251089.397] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2251089.421] -> wl_surface@28.commit() +[2251103.485] wl_display@1.delete_id(38) +[2251103.535] wl_display@1.delete_id(42) +[2251103.549] wl_callback@38.done(198355246) +[2251104.067] wl_buffer@36.release() +[2251104.105] wl_callback@42.done(198355246) +[2251105.908] -> xdg_toplevel@33.set_min_size(1436, 732) +[2251105.946] -> xdg_toplevel@33.set_max_size(0, 0) +[2251105.960] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2251105.987] -> wl_surface@28.frame(new id wl_callback@42) +[2251106.007] -> wl_surface@28.frame(new id wl_callback@38) +[2251106.018] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2251106.038] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2251106.061] -> wl_surface@28.commit() +[2251120.077] wl_display@1.delete_id(42) +[2251120.121] wl_display@1.delete_id(38) +[2251120.137] wl_callback@42.done(198355263) +[2251120.664] wl_buffer@41.release() +[2251120.704] wl_callback@38.done(198355263) +[2251122.565] -> xdg_toplevel@33.set_min_size(1436, 732) +[2251122.620] -> xdg_toplevel@33.set_max_size(0, 0) +[2251122.643] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2251122.682] -> wl_surface@28.frame(new id wl_callback@38) +[2251122.716] -> wl_surface@28.frame(new id wl_callback@42) +[2251122.737] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2251122.773] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2251122.819] -> wl_surface@28.commit() +[2251136.529] wl_display@1.delete_id(38) +[2251136.563] wl_display@1.delete_id(42) +[2251136.573] wl_callback@38.done(198355279) +[2251137.035] wl_buffer@36.release() +[2251137.073] wl_callback@42.done(198355279) +[2251138.779] -> xdg_toplevel@33.set_min_size(1436, 732) +[2251138.820] -> xdg_toplevel@33.set_max_size(0, 0) +[2251138.835] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2251138.882] -> wl_surface@28.frame(new id wl_callback@42) +[2251138.903] -> wl_surface@28.frame(new id wl_callback@38) +[2251138.915] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2251138.935] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2251138.960] -> wl_surface@28.commit() +[2251160.603] wl_display@1.delete_id(42) +[2251160.646] wl_display@1.delete_id(38) +[2251160.659] wl_callback@42.done(198355302) +[2251161.131] wl_buffer@41.release() +[2251161.155] wl_callback@38.done(198355302) +[2251162.766] -> xdg_toplevel@33.set_min_size(1436, 732) +[2251162.820] -> xdg_toplevel@33.set_max_size(0, 0) +[2251162.840] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2251162.895] -> wl_surface@28.frame(new id wl_callback@38) +[2251162.921] -> wl_surface@28.frame(new id wl_callback@42) +[2251162.970] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2251162.997] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2251163.030] -> wl_surface@28.commit() +[2251172.640] wl_display@1.delete_id(38) +[2251172.783] wl_display@1.delete_id(42) +[2251172.798] wl_callback@38.done(198355314) +[2251173.298] wl_buffer@36.release() +[2251173.334] wl_callback@42.done(198355314) +[2251174.938] -> xdg_toplevel@33.set_min_size(1436, 732) +[2251174.987] -> xdg_toplevel@33.set_max_size(0, 0) +[2251175.013] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2251175.050] -> wl_surface@28.frame(new id wl_callback@42) +[2251175.076] -> wl_surface@28.frame(new id wl_callback@38) +[2251175.093] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2251175.117] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2251175.149] -> wl_surface@28.commit() +[2251186.559] wl_display@1.delete_id(42) +[2251186.631] wl_display@1.delete_id(38) +[2251186.645] wl_callback@42.done(198355329) +[2251187.271] wl_buffer@41.release() +[2251187.329] wl_callback@38.done(198355329) +[2251189.229] -> xdg_toplevel@33.set_min_size(1436, 732) +[2251189.265] -> xdg_toplevel@33.set_max_size(0, 0) +[2251189.280] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2251189.306] -> wl_surface@28.frame(new id wl_callback@38) +[2251189.325] -> wl_surface@28.frame(new id wl_callback@42) +[2251189.337] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2251189.357] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2251189.381] -> wl_surface@28.commit() +[2251203.388] wl_display@1.delete_id(38) +[2251203.429] wl_display@1.delete_id(42) +[2251203.442] wl_callback@38.done(198355346) +[2251203.965] wl_buffer@36.release() +[2251204.006] wl_callback@42.done(198355346) +[2251205.512] -> xdg_toplevel@33.set_min_size(1436, 732) +[2251205.557] -> xdg_toplevel@33.set_max_size(0, 0) +[2251205.579] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2251205.617] -> wl_surface@28.frame(new id wl_callback@42) +[2251205.641] -> wl_surface@28.frame(new id wl_callback@38) +[2251205.658] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2251205.686] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2251205.722] -> wl_surface@28.commit() +[2251219.743] wl_display@1.delete_id(42) +[2251219.775] wl_display@1.delete_id(38) +[2251219.784] wl_callback@42.done(198355362) +[2251220.185] wl_buffer@41.release() +[2251220.214] wl_callback@38.done(198355362) +[2251221.279] -> xdg_toplevel@33.set_min_size(1436, 732) +[2251221.314] -> xdg_toplevel@33.set_max_size(0, 0) +[2251221.328] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2251221.360] -> wl_surface@28.frame(new id wl_callback@38) +[2251221.378] -> wl_surface@28.frame(new id wl_callback@42) +[2251221.390] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2251221.412] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2251221.442] -> wl_surface@28.commit() +[2251236.394] wl_display@1.delete_id(38) +[2251236.438] wl_display@1.delete_id(42) +[2251236.450] wl_callback@38.done(198355379) +[2251236.839] wl_buffer@36.release() +[2251236.909] wl_callback@42.done(198355379) +[2251238.290] -> xdg_toplevel@33.set_min_size(1436, 732) +[2251238.340] -> xdg_toplevel@33.set_max_size(0, 0) +[2251238.362] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2251238.400] -> wl_surface@28.frame(new id wl_callback@42) +[2251238.426] -> wl_surface@28.frame(new id wl_callback@38) +[2251238.444] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2251238.472] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2251238.508] -> wl_surface@28.commit() +[2251253.059] wl_display@1.delete_id(42) +[2251253.100] wl_display@1.delete_id(38) +[2251253.110] wl_callback@42.done(198355396) +[2251253.469] wl_buffer@41.release() +[2251253.491] wl_callback@38.done(198355396) +[2251254.961] -> xdg_toplevel@33.set_min_size(1436, 732) +[2251255.014] -> xdg_toplevel@33.set_max_size(0, 0) +[2251255.036] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2251255.073] -> wl_surface@28.frame(new id wl_callback@38) +[2251255.100] -> wl_surface@28.frame(new id wl_callback@42) +[2251255.119] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2251255.147] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2251255.183] -> wl_surface@28.commit() +[2251269.434] wl_display@1.delete_id(38) +[2251269.482] wl_display@1.delete_id(42) +[2251269.496] wl_callback@38.done(198355412) +[2251269.983] wl_buffer@36.release() +[2251270.014] wl_callback@42.done(198355412) +[2251271.369] -> xdg_toplevel@33.set_min_size(1436, 732) +[2251271.420] -> xdg_toplevel@33.set_max_size(0, 0) +[2251271.441] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2251271.478] -> wl_surface@28.frame(new id wl_callback@42) +[2251271.504] -> wl_surface@28.frame(new id wl_callback@38) +[2251271.521] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2251271.549] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2251271.584] -> wl_surface@28.commit() +[2251286.700] wl_display@1.delete_id(42) +[2251286.760] wl_display@1.delete_id(38) +[2251286.775] wl_callback@42.done(198355429) +[2251287.292] wl_buffer@41.release() +[2251287.326] wl_callback@38.done(198355429) +[2251289.025] -> xdg_toplevel@33.set_min_size(1436, 732) +[2251289.072] -> xdg_toplevel@33.set_max_size(0, 0) +[2251289.093] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2251289.131] -> wl_surface@28.frame(new id wl_callback@38) +[2251289.156] -> wl_surface@28.frame(new id wl_callback@42) +[2251289.174] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2251289.201] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2251289.236] -> wl_surface@28.commit() +[2251303.169] wl_display@1.delete_id(38) +[2251303.207] wl_display@1.delete_id(42) +[2251303.217] wl_callback@38.done(198355446) +[2251303.595] wl_buffer@36.release() +[2251303.621] wl_callback@42.done(198355446) +[2251305.186] -> xdg_toplevel@33.set_min_size(1436, 732) +[2251305.236] -> xdg_toplevel@33.set_max_size(0, 0) +[2251305.257] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2251305.294] -> wl_surface@28.frame(new id wl_callback@42) +[2251305.320] -> wl_surface@28.frame(new id wl_callback@38) +[2251305.337] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2251305.365] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2251305.399] -> wl_surface@28.commit() +[2251319.750] wl_display@1.delete_id(42) +[2251319.792] wl_display@1.delete_id(38) +[2251319.806] wl_callback@42.done(198355462) +[2251320.225] wl_buffer@41.release() +[2251320.258] wl_callback@38.done(198355462) +[2251321.749] -> xdg_toplevel@33.set_min_size(1436, 732) +[2251321.801] -> xdg_toplevel@33.set_max_size(0, 0) +[2251321.822] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2251321.881] -> wl_surface@28.frame(new id wl_callback@38) +[2251321.906] -> wl_surface@28.frame(new id wl_callback@42) +[2251321.924] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2251321.952] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2251321.986] -> wl_surface@28.commit() +[2251336.417] wl_display@1.delete_id(38) +[2251336.509] wl_display@1.delete_id(42) +[2251336.527] wl_callback@38.done(198355479) +[2251337.179] wl_buffer@36.release() +[2251337.217] wl_callback@42.done(198355479) +[2251338.891] -> xdg_toplevel@33.set_min_size(1436, 732) +[2251338.942] -> xdg_toplevel@33.set_max_size(0, 0) +[2251338.961] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2251338.994] -> wl_surface@28.frame(new id wl_callback@42) +[2251339.019] -> wl_surface@28.frame(new id wl_callback@38) +[2251339.036] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2251339.062] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2251339.097] -> wl_surface@28.commit() +[2251353.083] wl_display@1.delete_id(42) +[2251353.122] wl_display@1.delete_id(38) +[2251353.132] wl_callback@42.done(198355496) +[2251353.537] wl_buffer@41.release() +[2251353.603] wl_callback@38.done(198355496) +[2251355.344] -> xdg_toplevel@33.set_min_size(1436, 732) +[2251355.397] -> xdg_toplevel@33.set_max_size(0, 0) +[2251355.418] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2251355.457] -> wl_surface@28.frame(new id wl_callback@38) +[2251355.483] -> wl_surface@28.frame(new id wl_callback@42) +[2251355.501] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2251355.530] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2251355.565] -> wl_surface@28.commit() +[2251370.363] wl_display@1.delete_id(38) +[2251370.403] wl_display@1.delete_id(42) +[2251370.418] wl_callback@38.done(198355513) +[2251370.891] wl_buffer@36.release() +[2251370.921] wl_callback@42.done(198355513) +[2251372.728] -> xdg_toplevel@33.set_min_size(1436, 732) +[2251372.785] -> xdg_toplevel@33.set_max_size(0, 0) +[2251372.806] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2251372.860] -> wl_surface@28.frame(new id wl_callback@42) +[2251372.889] -> wl_surface@28.frame(new id wl_callback@38) +[2251372.904] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2251372.930] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2251372.964] -> wl_surface@28.commit() +[2251386.711] wl_display@1.delete_id(42) +[2251386.787] wl_display@1.delete_id(38) +[2251386.801] wl_callback@42.done(198355529) +[2251387.328] wl_buffer@41.release() +[2251387.364] wl_callback@38.done(198355529) +[2251388.546] -> xdg_toplevel@33.set_min_size(1436, 732) +[2251388.581] -> xdg_toplevel@33.set_max_size(0, 0) +[2251388.596] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2251388.622] -> wl_surface@28.frame(new id wl_callback@38) +[2251388.640] -> wl_surface@28.frame(new id wl_callback@42) +[2251388.652] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2251388.671] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2251388.696] -> wl_surface@28.commit() +[2251403.207] wl_display@1.delete_id(38) +[2251403.254] wl_display@1.delete_id(42) +[2251403.267] wl_callback@38.done(198355546) +[2251403.931] wl_buffer@36.release() +[2251403.964] wl_callback@42.done(198355546) +[2251405.584] -> xdg_toplevel@33.set_min_size(1436, 732) +[2251405.630] -> xdg_toplevel@33.set_max_size(0, 0) +[2251405.648] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2251405.682] -> wl_surface@28.frame(new id wl_callback@42) +[2251405.707] -> wl_surface@28.frame(new id wl_callback@38) +[2251405.724] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2251405.749] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2251405.779] -> wl_surface@28.commit() +[2251419.757] wl_display@1.delete_id(42) +[2251419.794] wl_display@1.delete_id(38) +[2251419.804] wl_callback@42.done(198355562) +[2251420.188] wl_buffer@41.release() +[2251420.215] wl_callback@38.done(198355562) +[2251421.462] -> xdg_toplevel@33.set_min_size(1436, 732) +[2251421.510] -> xdg_toplevel@33.set_max_size(0, 0) +[2251421.529] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2251421.564] -> wl_surface@28.frame(new id wl_callback@38) +[2251421.589] -> wl_surface@28.frame(new id wl_callback@42) +[2251421.606] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2251421.631] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2251421.666] -> wl_surface@28.commit() +[2251436.111] wl_display@1.delete_id(38) +[2251436.145] wl_display@1.delete_id(42) +[2251436.154] wl_callback@38.done(198355579) +[2251436.544] wl_buffer@36.release() +[2251436.564] wl_callback@42.done(198355579) +[2251437.584] -> xdg_toplevel@33.set_min_size(1436, 732) +[2251437.616] -> xdg_toplevel@33.set_max_size(0, 0) +[2251437.632] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2251437.671] -> wl_surface@28.frame(new id wl_callback@42) +[2251437.694] -> wl_surface@28.frame(new id wl_callback@38) +[2251437.709] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2251437.733] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2251437.763] -> wl_surface@28.commit() +[2251452.571] wl_display@1.delete_id(42) +[2251452.623] wl_display@1.delete_id(38) +[2251452.638] wl_callback@42.done(198355595) +[2251453.377] wl_buffer@41.release() +[2251453.414] wl_callback@38.done(198355595) +[2251455.198] -> xdg_toplevel@33.set_min_size(1436, 732) +[2251455.246] -> xdg_toplevel@33.set_max_size(0, 0) +[2251455.268] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2251455.307] -> wl_surface@28.frame(new id wl_callback@38) +[2251455.333] -> wl_surface@28.frame(new id wl_callback@42) +[2251455.351] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2251455.379] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2251455.415] -> wl_surface@28.commit() +[2251469.465] wl_display@1.delete_id(38) +[2251469.507] wl_display@1.delete_id(42) +[2251469.520] wl_callback@38.done(198355612) +[2251470.050] wl_buffer@36.release() +[2251470.085] wl_callback@42.done(198355612) +[2251471.738] -> xdg_toplevel@33.set_min_size(1436, 732) +[2251471.785] -> xdg_toplevel@33.set_max_size(0, 0) +[2251471.804] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2251471.840] -> wl_surface@28.frame(new id wl_callback@42) +[2251471.879] -> wl_surface@28.frame(new id wl_callback@38) +[2251471.896] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2251471.922] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2251471.955] -> wl_surface@28.commit() +[2251486.458] wl_display@1.delete_id(42) +[2251486.536] wl_display@1.delete_id(38) +[2251486.552] wl_callback@42.done(198355629) +[2251487.091] wl_buffer@41.release() +[2251487.153] wl_callback@38.done(198355629) +[2251488.815] -> xdg_toplevel@33.set_min_size(1436, 732) +[2251488.888] -> xdg_toplevel@33.set_max_size(0, 0) +[2251488.911] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2251488.949] -> wl_surface@28.frame(new id wl_callback@38) +[2251488.977] -> wl_surface@28.frame(new id wl_callback@42) +[2251488.996] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2251489.025] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2251489.062] -> wl_surface@28.commit() +[2251503.243] wl_display@1.delete_id(38) +[2251503.302] wl_display@1.delete_id(42) +[2251503.316] wl_callback@38.done(198355646) +[2251503.874] wl_buffer@36.release() +[2251503.911] wl_callback@42.done(198355646) +[2251505.546] -> xdg_toplevel@33.set_min_size(1436, 732) +[2251505.598] -> xdg_toplevel@33.set_max_size(0, 0) +[2251505.618] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2251505.655] -> wl_surface@28.frame(new id wl_callback@42) +[2251505.683] -> wl_surface@28.frame(new id wl_callback@38) +[2251505.702] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2251505.730] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2251505.766] -> wl_surface@28.commit() +[2251519.939] wl_display@1.delete_id(42) +[2251519.989] wl_display@1.delete_id(38) +[2251520.004] wl_callback@42.done(198355662) +[2251520.602] wl_buffer@41.release() +[2251520.655] wl_callback@38.done(198355662) +[2251522.652] -> xdg_toplevel@33.set_min_size(1436, 732) +[2251522.708] -> xdg_toplevel@33.set_max_size(0, 0) +[2251522.731] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2251522.772] -> wl_surface@28.frame(new id wl_callback@38) +[2251522.801] -> wl_surface@28.frame(new id wl_callback@42) +[2251522.821] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2251522.873] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2251522.913] -> wl_surface@28.commit() +[2251536.548] wl_display@1.delete_id(38) +[2251536.611] wl_display@1.delete_id(42) +[2251536.621] wl_callback@38.done(198355679) +[2251537.100] wl_buffer@36.release() +[2251537.127] wl_callback@42.done(198355679) +[2251538.350] -> xdg_toplevel@33.set_min_size(1436, 732) +[2251538.390] -> xdg_toplevel@33.set_max_size(0, 0) +[2251538.405] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2251538.432] -> wl_surface@28.frame(new id wl_callback@42) +[2251538.452] -> wl_surface@28.frame(new id wl_callback@38) +[2251538.464] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2251538.484] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2251538.510] -> wl_surface@28.commit() +[2251552.806] wl_display@1.delete_id(42) +[2251552.882] wl_display@1.delete_id(38) +[2251552.898] wl_callback@42.done(198355695) +[2251553.416] wl_buffer@41.release() +[2251553.465] wl_callback@38.done(198355695) +[2251555.411] -> xdg_toplevel@33.set_min_size(1436, 732) +[2251555.464] -> xdg_toplevel@33.set_max_size(0, 0) +[2251555.494] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2251555.530] -> wl_surface@28.frame(new id wl_callback@38) +[2251555.557] -> wl_surface@28.frame(new id wl_callback@42) +[2251555.574] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2251555.601] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2251555.633] -> wl_surface@28.commit() +[2251570.618] wl_display@1.delete_id(38) +[2251570.699] wl_display@1.delete_id(42) +[2251570.716] wl_callback@38.done(198355713) +[2251571.396] wl_buffer@36.release() +[2251571.436] wl_callback@42.done(198355713) +[2251573.107] -> xdg_toplevel@33.set_min_size(1436, 732) +[2251573.147] -> xdg_toplevel@33.set_max_size(0, 0) +[2251573.162] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2251573.190] -> wl_surface@28.frame(new id wl_callback@42) +[2251573.214] -> wl_surface@28.frame(new id wl_callback@38) +[2251573.236] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2251573.269] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2251573.310] -> wl_surface@28.commit() +[2251587.770] wl_display@1.delete_id(42) +[2251587.876] wl_display@1.delete_id(38) +[2251587.891] wl_callback@42.done(198355730) +[2251588.370] wl_buffer@41.release() +[2251588.398] wl_callback@38.done(198355730) +[2251590.051] -> xdg_toplevel@33.set_min_size(1436, 732) +[2251590.099] -> xdg_toplevel@33.set_max_size(0, 0) +[2251590.122] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2251590.162] -> wl_surface@28.frame(new id wl_callback@38) +[2251590.189] -> wl_surface@28.frame(new id wl_callback@42) +[2251590.209] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2251590.239] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2251590.275] -> wl_surface@28.commit() +[2251603.788] wl_display@1.delete_id(38) +[2251603.899] wl_display@1.delete_id(42) +[2251603.915] wl_callback@38.done(198355746) +[2251604.551] wl_buffer@36.release() +[2251604.608] wl_callback@42.done(198355746) +[2251606.225] -> xdg_toplevel@33.set_min_size(1436, 732) +[2251606.275] -> xdg_toplevel@33.set_max_size(0, 0) +[2251606.299] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2251606.338] -> wl_surface@28.frame(new id wl_callback@42) +[2251606.365] -> wl_surface@28.frame(new id wl_callback@38) +[2251606.385] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2251606.415] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2251606.451] -> wl_surface@28.commit() +[2251620.106] wl_display@1.delete_id(42) +[2251620.185] wl_display@1.delete_id(38) +[2251620.201] wl_callback@42.done(198355763) +[2251620.812] wl_buffer@41.release() +[2251620.862] wl_callback@38.done(198355763) +[2251622.511] -> xdg_toplevel@33.set_min_size(1436, 732) +[2251622.559] -> xdg_toplevel@33.set_max_size(0, 0) +[2251622.580] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2251622.617] -> wl_surface@28.frame(new id wl_callback@38) +[2251622.645] -> wl_surface@28.frame(new id wl_callback@42) +[2251622.662] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2251622.689] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2251622.724] -> wl_surface@28.commit() +[2251637.556] wl_display@1.delete_id(38) +[2251637.643] wl_display@1.delete_id(42) +[2251637.659] wl_pointer@11.enter(115359, wl_surface@28, 745.304688, 521.039062) +[2251637.773] -> wl_pointer@11.set_cursor(115359, wl_surface@21, 4, 4) +[2251637.821] -> wl_surface@21.attach(wl_buffer@37, 0, 0) +[2251637.882] -> wl_surface@21.set_buffer_scale(1) +[2251637.916] -> wl_surface@21.damage(0, 0, 24, 24) +[2251637.952] -> wl_surface@21.commit() +[2251637.979] wl_pointer@11.frame() +[2251638.018] wl_pointer@11.motion(198355775, 745.304688, 521.039062) +[2251638.100] wl_pointer@11.frame() +[2251638.116] wl_callback@38.done(198355780) +[2251740.512] wl_buffer@36.release() +[2251740.545] wl_callback@42.done(198355780) +[2251741.574] -> xdg_toplevel@33.set_min_size(1436, 732) +[2251741.611] -> xdg_toplevel@33.set_max_size(0, 0) +[2251741.625] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2251741.650] -> wl_surface@28.frame(new id wl_callback@42) +[2251741.669] -> wl_surface@28.frame(new id wl_callback@38) +[2251741.681] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2251741.700] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2251741.724] -> wl_surface@28.commit() +[2251741.837] wl_pointer@11.motion(198355787, 689.011719, 486.597656) +[2251741.904] wl_pointer@11.frame() +[2251741.920] wl_pointer@11.motion(198355810, 618.714844, 442.433594) +[2251741.943] wl_pointer@11.frame() +[2251741.951] wl_pointer@11.motion(198355822, 603.664062, 432.824219) +[2251741.973] wl_pointer@11.frame() +[2251741.980] wl_pointer@11.motion(198355845, 586.519531, 422.976562) +[2251742.014] wl_pointer@11.frame() +[2251742.027] wl_pointer@11.motion(198355857, 582.621094, 421.214844) +[2251742.055] wl_pointer@11.frame() +[2251742.064] wl_pointer@11.motion(198355869, 581.324219, 420.687500) +[2251742.085] wl_pointer@11.frame() +[2251753.176] wl_display@1.delete_id(42) +[2251753.258] wl_display@1.delete_id(38) +[2251753.274] wl_pointer@11.motion(198355892, 583.089844, 428.710938) +[2251753.345] wl_pointer@11.frame() +[2251753.384] wl_callback@42.done(198355896) +[2251767.141] wl_buffer@41.release() +[2251767.193] wl_callback@38.done(198355896) +[2251769.344] -> xdg_toplevel@33.set_min_size(1436, 732) +[2251769.396] -> xdg_toplevel@33.set_max_size(0, 0) +[2251769.413] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2251769.439] -> wl_surface@28.frame(new id wl_callback@38) +[2251769.468] -> wl_surface@28.frame(new id wl_callback@42) +[2251769.486] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2251769.512] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2251769.537] -> wl_surface@28.commit() +[2251786.060] wl_display@1.delete_id(38) +[2251786.171] wl_display@1.delete_id(42) +[2251786.187] wl_callback@38.done(198355928) +[2251787.301] wl_buffer@36.release() +[2251787.330] wl_callback@42.done(198355928) +[2251790.829] -> xdg_toplevel@33.set_min_size(1436, 732) +[2251790.898] -> xdg_toplevel@33.set_max_size(0, 0) +[2251790.918] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2251790.960] -> wl_surface@28.frame(new id wl_callback@42) +[2251790.986] -> wl_surface@28.frame(new id wl_callback@38) +[2251791.002] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2251791.029] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2251791.062] -> wl_surface@28.commit() +[2251802.910] wl_display@1.delete_id(42) +[2251802.977] wl_display@1.delete_id(38) +[2251802.990] wl_callback@42.done(198355946) +[2251804.155] wl_buffer@41.release() +[2251804.188] wl_callback@38.done(198355946) +[2251806.838] -> xdg_toplevel@33.set_min_size(1436, 732) +[2251806.893] -> xdg_toplevel@33.set_max_size(0, 0) +[2251806.910] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2251806.939] -> wl_surface@28.frame(new id wl_callback@38) +[2251806.969] -> wl_surface@28.frame(new id wl_callback@42) +[2251806.983] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2251807.006] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2251807.034] -> wl_surface@28.commit() +[2251819.764] wl_display@1.delete_id(38) +[2251819.886] wl_display@1.delete_id(42) +[2251819.909] wl_callback@38.done(198355962) +[2251821.062] wl_buffer@36.release() +[2251821.120] wl_callback@42.done(198355962) +[2251826.709] -> xdg_toplevel@33.set_min_size(1436, 732) +[2251826.751] -> xdg_toplevel@33.set_max_size(0, 0) +[2251826.768] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2251826.797] -> wl_surface@28.frame(new id wl_callback@42) +[2251826.825] -> wl_surface@28.frame(new id wl_callback@38) +[2251826.839] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2251826.877] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2251826.905] -> wl_surface@28.commit() +[2251836.563] wl_display@1.delete_id(42) +[2251836.673] wl_display@1.delete_id(38) +[2251836.697] wl_callback@42.done(198355979) +[2251837.837] wl_buffer@41.release() +[2251837.891] wl_callback@38.done(198355979) +[2251841.597] -> xdg_toplevel@33.set_min_size(1436, 732) +[2251841.644] -> xdg_toplevel@33.set_max_size(0, 0) +[2251841.668] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2251841.709] -> wl_surface@28.frame(new id wl_callback@38) +[2251841.750] -> wl_surface@28.frame(new id wl_callback@42) +[2251841.771] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2251841.803] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2251841.843] -> wl_surface@28.commit() +[2251856.925] wl_display@1.delete_id(38) +[2251856.977] wl_display@1.delete_id(42) +[2251856.996] wl_pointer@11.motion(198355997, 625.601562, 443.714844) +[2251857.056] wl_pointer@11.frame() +[2251857.078] wl_callback@38.done(198355999) +[2251874.564] wl_buffer@36.release() +[2251874.599] wl_callback@42.done(198355999) +[2251876.944] -> xdg_toplevel@33.set_min_size(1436, 732) +[2251876.987] -> xdg_toplevel@33.set_max_size(0, 0) +[2251877.004] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2251877.032] -> wl_surface@28.frame(new id wl_callback@42) +[2251877.064] -> wl_surface@28.frame(new id wl_callback@38) +[2251877.078] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2251877.101] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2251877.128] -> wl_surface@28.commit() +[2251877.278] wl_pointer@11.motion(198356008, 686.562500, 459.546875) +[2251877.350] wl_pointer@11.frame() +[2251892.492] wl_display@1.delete_id(42) +[2251892.546] wl_display@1.delete_id(38) +[2251892.558] wl_pointer@11.motion(198356031, 875.328125, 534.699219) +[2251892.598] wl_pointer@11.frame() +[2251892.614] wl_callback@42.done(198356035) +[2251894.927] wl_buffer@41.release() +[2251894.958] wl_callback@38.done(198356035) +[2251897.693] -> xdg_toplevel@33.set_min_size(1436, 732) +[2251897.747] -> xdg_toplevel@33.set_max_size(0, 0) +[2251897.766] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2251898.163] -> wl_surface@28.frame(new id wl_callback@38) +[2251898.188] -> wl_surface@28.frame(new id wl_callback@42) +[2251898.201] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2251898.221] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2251898.246] -> wl_surface@28.commit() +[2251906.210] wl_display@1.delete_id(38) +[2251906.261] wl_display@1.delete_id(42) +[2251906.275] wl_pointer@11.leave(115360, wl_surface@28) +[2251906.323] -> wl_pointer@11.set_cursor(115359, wl_surface@21, 4, 4) +[2251906.357] -> wl_surface@21.attach(wl_buffer@37, 0, 0) +[2251906.383] -> wl_surface@21.set_buffer_scale(1) +[2251906.396] -> wl_surface@21.damage(0, 0, 24, 24) +[2251906.425] -> wl_surface@21.commit() +[2251906.439] wl_pointer@11.frame() +[2251906.455] wl_callback@38.done(198356047) +[2252022.056] wl_buffer@36.release() +[2252022.093] wl_callback@42.done(198356047) +[2252023.314] -> xdg_toplevel@33.set_min_size(1436, 732) +[2252023.349] -> xdg_toplevel@33.set_max_size(0, 0) +[2252023.364] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2252023.391] -> wl_surface@28.frame(new id wl_callback@42) +[2252023.409] -> wl_surface@28.frame(new id wl_callback@38) +[2252023.421] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2252023.440] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2252023.463] -> wl_surface@28.commit() +[2252038.117] wl_display@1.delete_id(42) +[2252038.231] wl_display@1.delete_id(38) +[2252038.253] wl_callback@42.done(198356180) +[2252039.718] wl_buffer@41.release() +[2252039.759] wl_callback@38.done(198356180) +[2252043.383] -> xdg_toplevel@33.set_min_size(1436, 732) +[2252043.430] -> xdg_toplevel@33.set_max_size(0, 0) +[2252043.453] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2252043.490] -> wl_surface@28.frame(new id wl_callback@38) +[2252043.516] -> wl_surface@28.frame(new id wl_callback@42) +[2252043.534] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2252043.562] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2252043.599] -> wl_surface@28.commit() +[2252053.056] wl_display@1.delete_id(38) +[2252053.136] wl_display@1.delete_id(42) +[2252053.153] wl_callback@38.done(198356196) +[2252054.461] wl_buffer@36.release() +[2252054.497] wl_callback@42.done(198356196) +[2252057.632] -> xdg_toplevel@33.set_min_size(1436, 732) +[2252057.681] -> xdg_toplevel@33.set_max_size(0, 0) +[2252057.703] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2252057.735] -> wl_surface@28.frame(new id wl_callback@42) +[2252057.762] -> wl_surface@28.frame(new id wl_callback@38) +[2252057.779] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2252057.804] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2252057.840] -> wl_surface@28.commit() +[2252069.901] wl_display@1.delete_id(42) +[2252069.999] wl_display@1.delete_id(38) +[2252070.019] wl_callback@42.done(198356212) +[2252071.390] wl_buffer@41.release() +[2252071.436] wl_callback@38.done(198356212) +[2252074.263] -> xdg_toplevel@33.set_min_size(1436, 732) +[2252074.302] -> xdg_toplevel@33.set_max_size(0, 0) +[2252074.317] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2252074.343] -> wl_surface@28.frame(new id wl_callback@38) +[2252074.361] -> wl_surface@28.frame(new id wl_callback@42) +[2252074.374] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2252074.393] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2252074.418] -> wl_surface@28.commit() +[2252086.403] wl_display@1.delete_id(38) +[2252086.517] wl_display@1.delete_id(42) +[2252086.539] wl_callback@38.done(198356229) +[2252087.795] wl_buffer@36.release() +[2252087.884] wl_callback@42.done(198356229) +[2252091.740] -> xdg_toplevel@33.set_min_size(1436, 732) +[2252091.793] -> xdg_toplevel@33.set_max_size(0, 0) +[2252091.814] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2252091.873] -> wl_surface@28.frame(new id wl_callback@42) +[2252091.914] -> wl_surface@28.frame(new id wl_callback@38) +[2252091.934] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2252091.961] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2252091.994] -> wl_surface@28.commit() +[2252110.590] wl_display@1.delete_id(42) +[2252110.675] wl_display@1.delete_id(38) +[2252110.693] wl_callback@42.done(198356253) +[2252111.638] wl_buffer@41.release() +[2252111.666] wl_callback@38.done(198356253) +[2252115.357] -> xdg_toplevel@33.set_min_size(1436, 732) +[2252115.408] -> xdg_toplevel@33.set_max_size(0, 0) +[2252115.430] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2252115.486] -> wl_surface@28.frame(new id wl_callback@38) +[2252115.514] -> wl_surface@28.frame(new id wl_callback@42) +[2252115.532] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2252115.556] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2252115.594] -> wl_surface@28.commit() +[2252119.596] wl_display@1.delete_id(38) +[2252119.685] wl_display@1.delete_id(42) +[2252119.696] wl_callback@38.done(198356262) +[2252120.558] wl_buffer@36.release() +[2252120.588] wl_callback@42.done(198356262) +[2252122.718] -> xdg_toplevel@33.set_min_size(1436, 732) +[2252122.765] -> xdg_toplevel@33.set_max_size(0, 0) +[2252122.780] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2252122.816] -> wl_surface@28.frame(new id wl_callback@42) +[2252122.836] -> wl_surface@28.frame(new id wl_callback@38) +[2252122.859] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2252122.882] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2252122.906] -> wl_surface@28.commit() +[2252138.590] wl_display@1.delete_id(42) +[2252138.704] wl_display@1.delete_id(38) +[2252138.721] wl_callback@42.done(198356281) +[2252139.385] wl_buffer@41.release() +[2252139.418] wl_callback@38.done(198356281) +[2252141.608] -> xdg_toplevel@33.set_min_size(1436, 732) +[2252141.656] -> xdg_toplevel@33.set_max_size(0, 0) +[2252141.678] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2252141.709] -> wl_surface@28.frame(new id wl_callback@38) +[2252141.735] -> wl_surface@28.frame(new id wl_callback@42) +[2252141.750] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2252141.770] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2252141.795] -> wl_surface@28.commit() +[2252152.993] wl_display@1.delete_id(38) +[2252153.041] wl_display@1.delete_id(42) +[2252153.055] wl_callback@38.done(198356296) +[2252153.661] wl_buffer@36.release() +[2252153.701] wl_callback@42.done(198356296) +[2252155.428] -> xdg_toplevel@33.set_min_size(1436, 732) +[2252155.483] -> xdg_toplevel@33.set_max_size(0, 0) +[2252155.503] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2252155.539] -> wl_surface@28.frame(new id wl_callback@42) +[2252155.567] -> wl_surface@28.frame(new id wl_callback@38) +[2252155.586] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2252155.613] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2252155.647] -> wl_surface@28.commit() +[2252169.595] wl_display@1.delete_id(42) +[2252169.645] wl_display@1.delete_id(38) +[2252169.656] wl_callback@42.done(198356312) +[2252170.293] wl_buffer@41.release() +[2252170.333] wl_callback@38.done(198356312) +[2252172.034] -> xdg_toplevel@33.set_min_size(1436, 732) +[2252172.086] -> xdg_toplevel@33.set_max_size(0, 0) +[2252172.106] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2252172.146] -> wl_surface@28.frame(new id wl_callback@38) +[2252172.174] -> wl_surface@28.frame(new id wl_callback@42) +[2252172.192] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2252172.219] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2252172.255] -> wl_surface@28.commit() +[2252186.163] wl_display@1.delete_id(38) +[2252186.219] wl_display@1.delete_id(42) +[2252186.232] wl_callback@38.done(198356329) +[2252187.189] wl_buffer@36.release() +[2252187.318] wl_callback@42.done(198356329) +[2252188.782] -> xdg_toplevel@33.set_min_size(1436, 732) +[2252188.822] -> xdg_toplevel@33.set_max_size(0, 0) +[2252188.836] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2252188.891] -> wl_surface@28.frame(new id wl_callback@42) +[2252188.921] -> wl_surface@28.frame(new id wl_callback@38) +[2252188.938] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2252188.963] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2252189.016] -> wl_surface@28.commit() +[2252203.045] wl_display@1.delete_id(42) +[2252203.123] wl_display@1.delete_id(38) +[2252203.135] wl_callback@42.done(198356346) +[2252203.909] wl_buffer@41.release() +[2252203.983] wl_callback@38.done(198356346) +[2252206.297] -> xdg_toplevel@33.set_min_size(1436, 732) +[2252206.337] -> xdg_toplevel@33.set_max_size(0, 0) +[2252206.352] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2252206.379] -> wl_surface@28.frame(new id wl_callback@38) +[2252206.399] -> wl_surface@28.frame(new id wl_callback@42) +[2252206.411] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2252206.431] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2252206.455] -> wl_surface@28.commit() +[2252219.868] wl_display@1.delete_id(38) +[2252219.923] wl_display@1.delete_id(42) +[2252219.937] wl_callback@38.done(198356362) +[2252220.628] wl_buffer@36.release() +[2252220.667] wl_callback@42.done(198356362) +[2252222.401] -> xdg_toplevel@33.set_min_size(1436, 732) +[2252222.450] -> xdg_toplevel@33.set_max_size(0, 0) +[2252222.471] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2252222.509] -> wl_surface@28.frame(new id wl_callback@42) +[2252222.537] -> wl_surface@28.frame(new id wl_callback@38) +[2252222.555] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2252222.583] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2252222.618] -> wl_surface@28.commit() +[2252236.250] wl_display@1.delete_id(42) +[2252236.285] wl_display@1.delete_id(38) +[2252236.299] wl_callback@42.done(198356379) +[2252236.748] wl_buffer@41.release() +[2252236.807] wl_callback@38.done(198356379) +[2252238.381] -> xdg_toplevel@33.set_min_size(1436, 732) +[2252238.428] -> xdg_toplevel@33.set_max_size(0, 0) +[2252238.447] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2252238.482] -> wl_surface@28.frame(new id wl_callback@38) +[2252238.507] -> wl_surface@28.frame(new id wl_callback@42) +[2252238.523] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2252238.554] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2252238.585] -> wl_surface@28.commit() +[2252256.298] wl_display@1.delete_id(38) +[2252256.340] wl_display@1.delete_id(42) +[2252256.354] wl_callback@38.done(198356396) +[2252256.905] wl_buffer@36.release() +[2252256.979] wl_callback@42.done(198356396) +[2252258.886] -> xdg_toplevel@33.set_min_size(1436, 732) +[2252258.953] -> xdg_toplevel@33.set_max_size(0, 0) +[2252258.976] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2252259.017] -> wl_surface@28.frame(new id wl_callback@42) +[2252259.044] -> wl_surface@28.frame(new id wl_callback@38) +[2252259.063] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2252259.093] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2252259.132] -> wl_surface@28.commit() +[2252269.639] wl_display@1.delete_id(42) +[2252269.684] wl_display@1.delete_id(38) +[2252269.697] wl_callback@42.done(198356412) +[2252270.231] wl_buffer@41.release() +[2252270.270] wl_callback@38.done(198356412) +[2252271.572] -> xdg_toplevel@33.set_min_size(1436, 732) +[2252271.610] -> xdg_toplevel@33.set_max_size(0, 0) +[2252271.625] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2252271.652] -> wl_surface@28.frame(new id wl_callback@38) +[2252271.670] -> wl_surface@28.frame(new id wl_callback@42) +[2252271.682] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2252271.702] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2252271.737] -> wl_surface@28.commit() +[2252286.221] wl_display@1.delete_id(38) +[2252286.265] wl_display@1.delete_id(42) +[2252286.279] wl_callback@38.done(198356429) +[2252286.653] wl_buffer@36.release() +[2252286.696] wl_callback@42.done(198356429) +[2252288.293] -> xdg_toplevel@33.set_min_size(1436, 732) +[2252288.334] -> xdg_toplevel@33.set_max_size(0, 0) +[2252288.349] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2252288.376] -> wl_surface@28.frame(new id wl_callback@42) +[2252288.395] -> wl_surface@28.frame(new id wl_callback@38) +[2252288.408] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2252288.427] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2252288.452] -> wl_surface@28.commit() +[2252302.776] wl_display@1.delete_id(42) +[2252302.816] wl_display@1.delete_id(38) +[2252302.826] wl_callback@42.done(198356445) +[2252303.273] wl_buffer@41.release() +[2252303.318] wl_callback@38.done(198356445) +[2252304.514] -> xdg_toplevel@33.set_min_size(1436, 732) +[2252304.550] -> xdg_toplevel@33.set_max_size(0, 0) +[2252304.565] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2252304.591] -> wl_surface@28.frame(new id wl_callback@38) +[2252304.610] -> wl_surface@28.frame(new id wl_callback@42) +[2252304.622] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2252304.642] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2252304.666] -> wl_surface@28.commit() +[2252319.806] wl_display@1.delete_id(38) +[2252319.861] wl_display@1.delete_id(42) +[2252319.888] wl_callback@38.done(198356462) +[2252320.441] wl_buffer@36.release() +[2252320.480] wl_callback@42.done(198356462) +[2252322.266] -> xdg_toplevel@33.set_min_size(1436, 732) +[2252322.320] -> xdg_toplevel@33.set_max_size(0, 0) +[2252322.340] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2252322.375] -> wl_surface@28.frame(new id wl_callback@42) +[2252322.399] -> wl_surface@28.frame(new id wl_callback@38) +[2252322.416] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2252322.443] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2252322.482] -> wl_surface@28.commit() +[2252337.070] wl_display@1.delete_id(42) +[2252337.114] wl_display@1.delete_id(38) +[2252337.128] wl_callback@42.done(198356480) +[2252337.637] wl_buffer@41.release() +[2252337.703] wl_callback@38.done(198356480) +[2252339.371] -> xdg_toplevel@33.set_min_size(1436, 732) +[2252339.423] -> xdg_toplevel@33.set_max_size(0, 0) +[2252339.525] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2252339.584] -> wl_surface@28.frame(new id wl_callback@38) +[2252339.612] -> wl_surface@28.frame(new id wl_callback@42) +[2252339.630] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2252339.659] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2252339.694] -> wl_surface@28.commit() +[2252354.175] wl_display@1.delete_id(38) +[2252354.271] wl_display@1.delete_id(42) +[2252354.288] wl_callback@38.done(198356496) +[2252354.873] wl_buffer@36.release() +[2252354.908] wl_callback@42.done(198356496) +[2252356.761] -> xdg_toplevel@33.set_min_size(1436, 732) +[2252356.817] -> xdg_toplevel@33.set_max_size(0, 0) +[2252356.839] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2252356.915] -> wl_surface@28.frame(new id wl_callback@42) +[2252356.943] -> wl_surface@28.frame(new id wl_callback@38) +[2252356.959] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2252356.984] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2252357.016] -> wl_surface@28.commit() +[2252368.899] wl_display@1.delete_id(42) +[2252368.978] wl_display@1.delete_id(38) +[2252368.990] wl_callback@42.done(198356511) +[2252369.829] wl_buffer@41.release() +[2252369.887] wl_callback@38.done(198356511) +[2252371.283] -> xdg_toplevel@33.set_min_size(1436, 732) +[2252371.333] -> xdg_toplevel@33.set_max_size(0, 0) +[2252371.355] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2252371.393] -> wl_surface@28.frame(new id wl_callback@38) +[2252371.419] -> wl_surface@28.frame(new id wl_callback@42) +[2252371.437] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2252371.466] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2252371.501] -> wl_surface@28.commit() +[2252386.039] wl_display@1.delete_id(38) +[2252386.085] wl_display@1.delete_id(42) +[2252386.100] wl_callback@38.done(198356529) +[2252386.938] wl_buffer@36.release() +[2252387.027] wl_callback@42.done(198356529) +[2252388.684] -> xdg_toplevel@33.set_min_size(1436, 732) +[2252388.727] -> xdg_toplevel@33.set_max_size(0, 0) +[2252388.749] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2252388.788] -> wl_surface@28.frame(new id wl_callback@42) +[2252388.813] -> wl_surface@28.frame(new id wl_callback@38) +[2252388.831] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2252388.872] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2252388.909] -> wl_surface@28.commit() +[2252403.307] wl_display@1.delete_id(42) +[2252403.401] wl_display@1.delete_id(38) +[2252403.416] wl_callback@42.done(198356546) +[2252404.214] wl_buffer@41.release() +[2252404.246] wl_callback@38.done(198356546) +[2252405.901] -> xdg_toplevel@33.set_min_size(1436, 732) +[2252405.939] -> xdg_toplevel@33.set_max_size(0, 0) +[2252405.954] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2252405.981] -> wl_surface@28.frame(new id wl_callback@38) +[2252406.000] -> wl_surface@28.frame(new id wl_callback@42) +[2252406.012] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2252406.033] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2252406.057] -> wl_surface@28.commit() +[2252419.431] wl_display@1.delete_id(38) +[2252419.507] wl_display@1.delete_id(42) +[2252419.523] wl_callback@38.done(198356562) +[2252420.079] wl_buffer@36.release() +[2252420.125] wl_callback@42.done(198356562) +[2252421.883] -> xdg_toplevel@33.set_min_size(1436, 732) +[2252421.940] -> xdg_toplevel@33.set_max_size(0, 0) +[2252421.962] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2252422.001] -> wl_surface@28.frame(new id wl_callback@42) +[2252422.027] -> wl_surface@28.frame(new id wl_callback@38) +[2252422.045] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2252422.073] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2252422.108] -> wl_surface@28.commit() +[2252438.602] wl_display@1.delete_id(42) +[2252438.643] wl_display@1.delete_id(38) +[2252438.655] wl_callback@42.done(198356581) +[2252439.270] wl_buffer@41.release() +[2252439.301] wl_callback@38.done(198356581) +[2252440.804] -> xdg_toplevel@33.set_min_size(1436, 732) +[2252440.861] -> xdg_toplevel@33.set_max_size(0, 0) +[2252440.884] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2252440.924] -> wl_surface@28.frame(new id wl_callback@38) +[2252440.950] -> wl_surface@28.frame(new id wl_callback@42) +[2252440.969] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2252440.997] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2252441.033] -> wl_surface@28.commit() +[2252453.705] wl_display@1.delete_id(38) +[2252453.772] wl_display@1.delete_id(42) +[2252453.785] wl_callback@38.done(198356595) +[2252454.323] wl_buffer@36.release() +[2252454.352] wl_callback@42.done(198356595) +[2252456.042] -> xdg_toplevel@33.set_min_size(1436, 732) +[2252456.093] -> xdg_toplevel@33.set_max_size(0, 0) +[2252456.115] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2252456.155] -> wl_surface@28.frame(new id wl_callback@42) +[2252456.182] -> wl_surface@28.frame(new id wl_callback@38) +[2252456.210] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2252456.240] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2252456.277] -> wl_surface@28.commit() +[2252469.645] wl_display@1.delete_id(42) +[2252469.717] wl_display@1.delete_id(38) +[2252469.729] wl_callback@42.done(198356612) +[2252470.272] wl_buffer@41.release() +[2252470.301] wl_callback@38.done(198356612) +[2252471.661] -> xdg_toplevel@33.set_min_size(1436, 732) +[2252471.710] -> xdg_toplevel@33.set_max_size(0, 0) +[2252471.731] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2252471.770] -> wl_surface@28.frame(new id wl_callback@38) +[2252471.795] -> wl_surface@28.frame(new id wl_callback@42) +[2252471.813] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2252471.841] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2252471.892] -> wl_surface@28.commit() +[2252486.735] wl_display@1.delete_id(38) +[2252486.882] wl_display@1.delete_id(42) +[2252486.909] wl_callback@38.done(198356629) +[2252487.593] wl_buffer@36.release() +[2252487.667] wl_callback@42.done(198356629) +[2252489.322] -> xdg_toplevel@33.set_min_size(1436, 732) +[2252489.361] -> xdg_toplevel@33.set_max_size(0, 0) +[2252489.376] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2252489.403] -> wl_surface@28.frame(new id wl_callback@42) +[2252489.422] -> wl_surface@28.frame(new id wl_callback@38) +[2252489.435] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2252489.455] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2252489.479] -> wl_surface@28.commit() +[2252502.773] wl_display@1.delete_id(42) +[2252502.830] wl_display@1.delete_id(38) +[2252502.846] wl_callback@42.done(198356645) +[2252503.639] wl_buffer@41.release() +[2252503.702] wl_callback@38.done(198356645) +[2252505.225] -> xdg_toplevel@33.set_min_size(1436, 732) +[2252505.265] -> xdg_toplevel@33.set_max_size(0, 0) +[2252505.280] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2252505.307] -> wl_surface@28.frame(new id wl_callback@38) +[2252505.325] -> wl_surface@28.frame(new id wl_callback@42) +[2252505.338] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2252505.358] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2252505.383] -> wl_surface@28.commit() +[2252520.605] wl_display@1.delete_id(38) +[2252520.730] wl_display@1.delete_id(42) +[2252520.760] wl_callback@38.done(198356663) +[2252521.561] wl_buffer@36.release() +[2252521.606] wl_callback@42.done(198356663) +[2252523.042] -> xdg_toplevel@33.set_min_size(1436, 732) +[2252523.091] -> xdg_toplevel@33.set_max_size(0, 0) +[2252523.110] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2252523.148] -> wl_surface@28.frame(new id wl_callback@42) +[2252523.175] -> wl_surface@28.frame(new id wl_callback@38) +[2252523.194] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2252523.218] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2252523.244] -> wl_surface@28.commit() +[2252536.216] wl_display@1.delete_id(42) +[2252536.320] wl_display@1.delete_id(38) +[2252536.338] wl_callback@42.done(198356679) +[2252536.940] wl_buffer@41.release() +[2252536.976] wl_callback@38.done(198356679) +[2252538.279] -> xdg_toplevel@33.set_min_size(1436, 732) +[2252538.319] -> xdg_toplevel@33.set_max_size(0, 0) +[2252538.334] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2252538.362] -> wl_surface@28.frame(new id wl_callback@38) +[2252538.381] -> wl_surface@28.frame(new id wl_callback@42) +[2252538.396] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2252538.420] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2252538.454] -> wl_surface@28.commit() +[2252553.077] wl_display@1.delete_id(38) +[2252553.131] wl_display@1.delete_id(42) +[2252553.149] wl_callback@38.done(198356696) +[2252553.834] wl_buffer@36.release() +[2252553.884] wl_callback@42.done(198356696) +[2252555.414] -> xdg_toplevel@33.set_min_size(1436, 732) +[2252555.466] -> xdg_toplevel@33.set_max_size(0, 0) +[2252555.488] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2252555.528] -> wl_surface@28.frame(new id wl_callback@42) +[2252555.557] -> wl_surface@28.frame(new id wl_callback@38) +[2252555.576] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2252555.605] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2252555.641] -> wl_surface@28.commit() +[2252573.577] wl_display@1.delete_id(42) +[2252573.638] wl_display@1.delete_id(38) +[2252573.649] wl_callback@42.done(198356716) +[2252574.127] wl_buffer@41.release() +[2252574.152] wl_callback@38.done(198356716) +[2252575.198] -> xdg_toplevel@33.set_min_size(1436, 732) +[2252575.247] -> xdg_toplevel@33.set_max_size(0, 0) +[2252575.265] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2252575.305] -> wl_surface@28.frame(new id wl_callback@38) +[2252575.334] -> wl_surface@28.frame(new id wl_callback@42) +[2252575.356] -> wl_surface@28.attach(wl_buffer@41, 0, 0) +[2252575.388] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2252575.423] -> wl_surface@28.commit() +[2252586.245] wl_display@1.delete_id(38) +[2252586.317] wl_display@1.delete_id(42) +[2252586.335] wl_callback@38.done(198356729) +[2252587.117] wl_buffer@36.release() +[2252587.155] wl_callback@42.done(198356729) +[2252588.752] -> xdg_toplevel@33.set_min_size(1436, 732) +[2252588.797] -> xdg_toplevel@33.set_max_size(0, 0) +[2252588.819] -> xdg_surface@30.set_window_geometry(26, 23, 1488, 784) +[2252588.869] -> wl_surface@28.frame(new id wl_callback@42) +[2252588.896] -> wl_surface@28.frame(new id wl_callback@38) +[2252588.913] -> wl_surface@28.attach(wl_buffer@36, 0, 0) +[2252588.939] -> wl_surface@28.damage(0, 0, 2147483647, 2147483647) +[2252588.973] -> wl_surface@28.commit()