From 8e8d2bf002843ec69b6ea2ef6ddca80a21974eb6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oscar=20Meg=C3=ADa=20L=C3=B3pez?= Date: Wed, 28 May 2025 09:27:42 +0200 Subject: [PATCH] Bug 799538 - Clipboard pastes to wrong field in... Fixed Cut, Copy and Paste when focus is not in GnucashSheet. Now, when the user clicks on the "Scheduled Transactions" tab, the focus goes to the last edited cell. --- gnucash/gnome/dialog-sx-editor.c | 27 +++++++++++++++ gnucash/gnome/gnc-plugin-page-register.cpp | 33 +++++++++++++++++++ .../register-gnome/gnucash-item-edit.c | 4 +++ 3 files changed, 64 insertions(+) diff --git a/gnucash/gnome/dialog-sx-editor.c b/gnucash/gnome/dialog-sx-editor.c index f8144effed..92fd507ec6 100644 --- a/gnucash/gnome/dialog-sx-editor.c +++ b/gnucash/gnome/dialog-sx-editor.c @@ -1128,6 +1128,30 @@ sxed_delete_event (GtkWidget *widget, GdkEvent *event, gpointer ud) return FALSE; } +static gboolean +focus_idle_callback(gpointer user_data) +{ + GNCLedgerDisplay *ledger_display = (GNCLedgerDisplay *)user_data; + + if (ledger_display) + gnc_ledger_display_refresh(ledger_display); + + return FALSE; +} + +static void +on_notebook_switch_page(GtkNotebook *notebook, GtkWidget *page, + guint page_num, gpointer user_data) +{ + GtkWidget *current_page = gtk_notebook_get_nth_page(notebook, page_num); + if (current_page && page_num == 2) + { + GncSxEditorDialog *sxed = (GncSxEditorDialog *)user_data; + + // Wait until Gtk is idle to refresh the display. + g_idle_add (focus_idle_callback, sxed->ledger); + } +} /************************************* * Create the Schedule Editor Dialog * @@ -1239,6 +1263,9 @@ gnc_ui_scheduled_xaction_editor_dialog_create (GtkWindow *parent, g_signal_connect (sxed->dialog, "destroy", G_CALLBACK (scheduledxaction_editor_dialog_destroy), sxed); + g_signal_connect (sxed->notebook, "switch-page", + G_CALLBACK(on_notebook_switch_page), + sxed); for (i = 0; widgets[i].name; i++) { diff --git a/gnucash/gnome/gnc-plugin-page-register.cpp b/gnucash/gnome/gnc-plugin-page-register.cpp index b5f5fcf494..856f567bee 100644 --- a/gnucash/gnome/gnc-plugin-page-register.cpp +++ b/gnucash/gnome/gnc-plugin-page-register.cpp @@ -3654,6 +3654,17 @@ gnc_plugin_page_register_cmd_cut (GSimpleAction *simple, ENTER ("(action %p, page %p)", simple, page); priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page); + + GtkWidget *widget = gtk_window_get_focus(GTK_WINDOW (priv->gsr->window)); + const char *name = gtk_widget_get_name(widget); + if (strcmp(name, "GnucashSheet") != 0) + { + gtk_editable_cut_clipboard( GTK_EDITABLE(widget)); + LEAVE("Not cut from GnucashSheet"); + + return; + } + gnucash_register_cut_clipboard (priv->gsr->reg); LEAVE (""); } @@ -3671,6 +3682,17 @@ gnc_plugin_page_register_cmd_copy (GSimpleAction *simple, ENTER ("(action %p, page %p)", simple, page); priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page); + + GtkWidget *widget = gtk_window_get_focus(GTK_WINDOW (priv->gsr->window)); + const char *name = gtk_widget_get_name(widget); + if (strcmp(name, "GnucashSheet") != 0) + { + gtk_editable_copy_clipboard( GTK_EDITABLE(widget)); + LEAVE("Not copied from GnucashSheet"); + + return; + } + gnucash_register_copy_clipboard (priv->gsr->reg); LEAVE (""); } @@ -3688,6 +3710,17 @@ gnc_plugin_page_register_cmd_paste (GSimpleAction *simple, ENTER ("(action %p, page %p)", simple, page); priv = GNC_PLUGIN_PAGE_REGISTER_GET_PRIVATE (page); + + GtkWidget *widget = gtk_window_get_focus(GTK_WINDOW (priv->gsr->window)); + const char *name = gtk_widget_get_name(widget); + if (strcmp(name, "GnucashSheet") != 0) + { + gtk_editable_paste_clipboard( GTK_EDITABLE(widget)); + LEAVE("Not pasted to GnucashSheet"); + + return; + } + gnucash_register_paste_clipboard (priv->gsr->reg); LEAVE (""); } diff --git a/gnucash/register/register-gnome/gnucash-item-edit.c b/gnucash/register/register-gnome/gnucash-item-edit.c index ee96f3d716..33faab3967 100644 --- a/gnucash/register/register-gnome/gnucash-item-edit.c +++ b/gnucash/register/register-gnome/gnucash-item-edit.c @@ -852,6 +852,10 @@ button_press_cb (GtkWidget *widget, GdkEventButton *event, gpointer *pointer) } return TRUE; } + + if (!gtk_widget_has_focus (GTK_WIDGET(sheet))) + gtk_widget_grab_focus (GTK_WIDGET(sheet)); + return FALSE; }