When the page already exists in a window then we can't be restoring pages
so stop checking. The "window" variable will be nullptr if we're trying to
open the page "in any window".
This bug was introduced in the changes for bug 798564.
- Don't save the address of a stack variable
==105765== Conditional jump or move depends on uninitialised value(s)
==105765== at 0x10E763: test_gnc_float_txn_to_txn_swap_accounts (utest-split-register-copy-ops.c:540)
==105765== by 0x5109675: ??? (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.7600.1)
==105765== by 0x510938A: ??? (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.7600.1)
==105765== by 0x510938A: ??? (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.7600.1)
==105765== by 0x510938A: ??? (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.7600.1)
==105765== by 0x5109BC9: g_test_run_suite (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.7600.1)
==105765== by 0x5103FFC: g_test_run (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.7600.1)
==105765== by 0x10BC6F: main (test-split-register.c:45)
==105765==
==105765== Conditional jump or move depends on uninitialised value(s)
==105765== at 0x4877C57: gnc_float_txn_to_txn_swap_accounts (split-register-copy-ops.c:433)
==105765== by 0x10E7E1: test_gnc_float_txn_to_txn_swap_accounts (utest-split-register-copy-ops.c:548)
==105765== by 0x5109675: ??? (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.7600.1)
==105765== by 0x510938A: ??? (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.7600.1)
==105765== by 0x510938A: ??? (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.7600.1)
==105765== by 0x510938A: ??? (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.7600.1)
==105765== by 0x5109BC9: g_test_run_suite (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.7600.1)
==105765== by 0x5103FFC: g_test_run (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.7600.1)
==105765== by 0x10BC6F: main (test-split-register.c:45)
==105765==
==105765== Conditional jump or move depends on uninitialised value(s)
==105765== at 0x10EFC1: test_gnc_float_txn_to_txn_swap_accounts (utest-split-register-copy-ops.c:589)
==105765== by 0x5109675: ??? (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.7600.1)
==105765== by 0x510938A: ??? (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.7600.1)
==105765== by 0x510938A: ??? (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.7600.1)
==105765== by 0x510938A: ??? (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.7600.1)
==105765== by 0x5109BC9: g_test_run_suite (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.7600.1)
==105765== by 0x5103FFC: g_test_run (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.7600.1)
==105765== by 0x10BC6F: main (test-split-register.c:45)
==4031== Invalid read of size 8
==4031== at 0x4E58C09: gncVendorGetAddr (gncVendor.c:677)
==4031== by 0x10A7E3: test_vendor (test-vendor.c:97)
...
==4031== Address 0x7e0c4e8 is 168 bytes inside a block of size 232 free'd
==4031== at 0x484620F: free (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==4031== by 0x51526C3: g_type_free_instance (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.7600.1)
==4031== by 0x4E58616: gncVendorFree (gncVendor.c:511)
==4031== by 0x4E58EFF: vendor_free (gncVendor.c:782)
==4031== by 0x4E8611E: qof_commit_edit_part2 (qofinstance.cpp:1034)
==4031== by 0x4E58F59: gncVendorCommitEdit (gncVendor.c:788)
==4031== by 0x4E584EF: gncVendorDestroy (gncVendor.c:483)
==4031== by 0x10A729: test_vendor (test-vendor.c:80)
...
==4031== Block was alloc'd at
==4031== at 0x4848A13: calloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==4031== by 0x5033550: g_malloc0 (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.7600.1)
==4031== by 0x5157CBC: g_type_create_instance (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.7600.1)
==4031== by 0x513F20F: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.7600.1)
==4031== by 0x51407B7: g_object_new_with_properties (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.7600.1)
==4031== by 0x5141560: g_object_new (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.7600.1)
==4031== by 0x4E583CF: gncVendorCreate (gncVendor.c:459)
==4031== by 0x10A6A5: test_vendor (test-vendor.c:74)
...
==4029== Invalid read of size 8
==4029== at 0x4E41F15: gncEmployeeGetAddr (gncEmployee.c:642)
==4029== by 0x10A8A5: test_employee (test-employee.c:97)
...
==4029== Address 0x7e0c208 is 152 bytes inside a block of size 248 free'd
==4029== at 0x484620F: free (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==4029== by 0x51526C3: g_type_free_instance (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.7600.1)
==4029== by 0x4E418D5: gncEmployeeFree (gncEmployee.c:477)
==4029== by 0x4E42144: emp_free (gncEmployee.c:714)
==4029== by 0x4E8611E: qof_commit_edit_part2 (qofinstance.cpp:1034)
==4029== by 0x4E4219E: gncEmployeeCommitEdit (gncEmployee.c:721)
==4029== by 0x4E41823: gncEmployeeDestroy (gncEmployee.c:459)
==4029== by 0x10A77F: test_employee (test-employee.c:79)
...
==4029== Block was alloc'd at
==4029== at 0x4848A13: calloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==4029== by 0x5033550: g_malloc0 (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.7600.1)
==4029== by 0x5157CBC: g_type_create_instance (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.7600.1)
==4029== by 0x513F20F: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.7600.1)
==4029== by 0x51407B7: g_object_new_with_properties (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.7600.1)
==4029== by 0x5141560: g_object_new (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.7600.1)
==4029== by 0x4E416DA: gncEmployeeCreate (gncEmployee.c:434)
==4029== by 0x10A6FB: test_employee (test-employee.c:73)
...
==4028== Invalid read of size 8
==4028== at 0x4E3F641: gncCustomerGetAddr (gncCustomer.c:579)
==4028== by 0x10A8EE: test_customer (test-customer.c:90)
...
==4028== Address 0x7e861b8 is 168 bytes inside a block of size 272 free'd
==4028== at 0x484620F: free (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==4028== by 0x51526C3: g_type_free_instance (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.7600.1)
==4028== by 0x4E3EDD6: gncCustomerFree (gncCustomer.c:368)
==4028== by 0x4E3F57B: cust_free (gncCustomer.c:551)
==4028== by 0x4E8611E: qof_commit_edit_part2 (qofinstance.cpp:1034)
==4028== by 0x4E3F5D5: gncCustomerCommitEdit (gncCustomer.c:557)
==4028== by 0x4E3EC89: gncCustomerDestroy (gncCustomer.c:338)
==4028== by 0x10A7EC: test_customer (test-customer.c:71)
...
==4028== Block was alloc'd at
==4028== at 0x4848A13: calloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==4028== by 0x5033550: g_malloc0 (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.7600.1)
==4028== by 0x5157CBC: g_type_create_instance (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.7600.1)
==4028== by 0x513F20F: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.7600.1)
==4028== by 0x51407B7: g_object_new_with_properties (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.7600.1)
==4028== by 0x5141560: g_object_new (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.7600.1)
==4028== by 0x4E3EB0D: gncCustomerCreate (gncCustomer.c:309)
==4028== by 0x10A768: test_customer (test-customer.c:66)
...
==4028== Invalid read of size 8
==4028== at 0x4E3F796: gncCustomerGetShipAddr (gncCustomer.c:633)
==4028== by 0x10A91D: test_customer (test-customer.c:91)
...
==4028== Address 0x7e86210 is 256 bytes inside a block of size 272 free'd
==4028== at 0x484620F: free (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==4028== by 0x51526C3: g_type_free_instance (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.7600.1)
==4028== by 0x4E3EDD6: gncCustomerFree (gncCustomer.c:368)
==4028== by 0x4E3F57B: cust_free (gncCustomer.c:551)
==4028== by 0x4E8611E: qof_commit_edit_part2 (qofinstance.cpp:1034)
==4028== by 0x4E3F5D5: gncCustomerCommitEdit (gncCustomer.c:557)
==4028== by 0x4E3EC89: gncCustomerDestroy (gncCustomer.c:338)
==4028== by 0x10A7EC: test_customer (test-customer.c:71)
...
==4028== Block was alloc'd at
==4028== at 0x4848A13: calloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==4028== by 0x5033550: g_malloc0 (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.7600.1)
==4028== by 0x5157CBC: g_type_create_instance (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.7600.1)
==4028== by 0x513F20F: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.7600.1)
==4028== by 0x51407B7: g_object_new_with_properties (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.7600.1)
==4028== by 0x5141560: g_object_new (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.7600.1)
==4028== by 0x4E3EB0D: gncCustomerCreate (gncCustomer.c:309)
==4028== by 0x10A768: test_customer (test-customer.c:66)
...
==7520== Invalid read of size 8
==7520== at 0x4E36DCC: guid_copy (guid.cpp:123)
==7520== by 0x1E3E62: KvpValueImpl::duplicate(KvpValueImpl const&) (kvp-value.cpp:378)
==7520== by 0x1E31CC: KvpValueImpl::KvpValueImpl(KvpValueImpl const&) (kvp-value.cpp:36)
==7520== by 0x1FF6C3: KvpValueTest_Copy_Test::TestBody() (test-kvp-value.cpp:74)
...
==7520== Address 0x7e10f48 is 8 bytes inside a block of size 16 free'd
==7520== at 0x4846AFF: operator delete(void*, unsigned long) (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==7520== by 0x4E36D98: guid_free (guid.cpp:115)
==7520== by 0x1E3D04: void delete_visitor::operator()<_gncGuid*>(_gncGuid*&) (kvp-value.cpp:358)
...
==7520== Block was alloc'd at
==7520== at 0x4843FA3: operator new(unsigned long) (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==7520== by 0x4E36D5C: guid_malloc (guid.cpp:105)
==7520== by 0x4E36DC3: guid_copy (guid.cpp:122)
==7520== by 0x4E36EB0: guid_new (guid.cpp:153)
==7520== by 0x1FF4DB: KvpValueTest_Copy_Test::TestBody() (test-kvp-value.cpp:68)
Report options need to be saved when they're different from the
defaults, book options need to be saved when their value changes
regardless of whether it's the default value. That's dirty. Implement
it.
When a description popup has long text a horizontal scroll bar will be
used. If a subsequent popup has short text which does not need a scroll
bar, the previous one is still visible so queue a tree view column
resize to reevaluate the need for a scroll bar.
When editing an existing entry, similar descriptions would not show so
instead of using the whole of the description text to search on just
use the portion up to the cursor.
... when called from guile e.g. test-transaction and lots of other tests
- gchar will also get the char* typemap, by typedef reduction
==119964== Mismatched free() / delete / delete []
==119964== at 0x4847A1F: operator delete[](void*) (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==119964== by 0x669F3E4: _wrap_gnc_print_time64(scm_unused_struct*, scm_unused_struct*) (swig-engine.cpp:38533)
...
==119948== Mismatched free() / delete / delete []
==119948== at 0x4847A1F: operator delete[](void*) (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==119948== by 0x6F6B431: _wrap_qof_print_date(scm_unused_struct*) (swig-engine.cpp:39124)
...
The pointer passed to the gfec exception handler is
not valid after the exception handler ends
==382525== Invalid read of size 1
==382525== at 0x484B050: memcpy@GLIBC_2.2.5 (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==382525== by 0x531AB67: __printf_buffer_write (Xprintf_buffer_write.c:39)
==382525== by 0x5322CD4: __printf_buffer (vfprintf-process-arg.c:501)
==382525== by 0x53465F3: __vasprintf_internal (vasprintf.c:102)
==382525== by 0x499C8C1: g_vasprintf (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.7600.1)
==382525== by 0x4969BE0: g_strdup_vprintf (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.7600.1)
==382525== by 0x494B2F6: g_logv (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.7600.1)
==382525== by 0x494B7A2: g_log (in /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.7600.1)
==382525== by 0x4862862: func_op (gnc-exp-parser.c:342)
==382525== by 0x485D381: primary_exp (expression_parser.c:1222)
==382525== by 0x485CE0F: multiply_divide_op (expression_parser.c:1028)
==382525== by 0x485CC33: add_sub_op (expression_parser.c:968)
==382525== Address 0xad387ec is 764 bytes inside a block of size 766 free'd
==382525== at 0x484620F: free (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==382525== by 0x4861D9B: gfec_apply (gfec.c:145)
==382525== by 0x4862813: func_op (gnc-exp-parser.c:339)
==382525== by 0x485D381: primary_exp (expression_parser.c:1222)
==382525== by 0x485CE0F: multiply_divide_op (expression_parser.c:1028)
==382525== by 0x485CC33: add_sub_op (expression_parser.c:968)
==382525== by 0x485C9DE: assignment_op (expression_parser.c:886)
==382525== by 0x485C101: parse_string (expression_parser.c:605)
==382525== by 0x4862F07: gnc_exp_parser_parse_separate_vars (gnc-exp-parser.c:535)
==382525== by 0x4862D60: gnc_exp_parser_parse (gnc-exp-parser.c:475)
==382525== by 0x10A963: run_parser_test (test-exp-parser.c:94)
==382525== by 0x10AB99: run_parser_tests (test-exp-parser.c:144)
==382525== Block was alloc'd at
==382525== at 0x4843738: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==382525== by 0x4A81473: scm_realloc (in /usr/lib/x86_64-linux-gnu/libguile-3.0.so.1.5.0)
==382525== by 0x4AEEF70: scm_to_utf8_stringn (in /usr/lib/x86_64-linux-gnu/libguile-3.0.so.1.5.0)
==382525== by 0x55AA71F: gnc_scm_to_utf8_string (gnc-guile-utils.c:42)
==382525== by 0x4861D4E: gfec_apply (gfec.c:136)
==382525== by 0x4862813: func_op (gnc-exp-parser.c:339)
==382525== by 0x485D381: primary_exp (expression_parser.c:1222)
==382525== by 0x485CE0F: multiply_divide_op (expression_parser.c:1028)
==382525== by 0x485CC33: add_sub_op (expression_parser.c:968)
==382525== by 0x485C9DE: assignment_op (expression_parser.c:886)
==382525== by 0x485C101: parse_string (expression_parser.c:605)
==382525== by 0x4862F07: gnc_exp_parser_parse_separate_vars (gnc-exp-parser.c:535)
When loading the book on startup, GnuCash takes a long time. This is partly
because gnc_restore_all_state() is loading data for every register page and
I have 35+ registers open.
Register loads should be deferred on tabs that are not visible until those
tabs are focused, like what already happens for restored open reports.
Every time a change to a transaction is saved by navigating away from it,
the UI freezes for almost a second. This is because
gnc_split_register_move_cursor() calls gnc_gui_refresh_internal() which
refreshes all the registers.
Register refreshes should be deferred on tabs that are not visible until
those tabs are focused again.
Use focus information to suppress the last part of the refresh_handler()
if the ledger isn't currently visible. When it becomes visible again, run
the deferred refresh step.
Don't immediately load or refresh the ledger (this will happen the first
time it is focused instead).
This has to disregard the "open adjacent" preference to get them to be in
the right order because the first page will remain focused until the
restore is complete.
Change the register page so that it doesn't assume it will be in focus on
creation.
gnc_ledger_display_gl() is called to create the ledger:
1. Exclude template accounts (unconditionally)
2. Calls gnc_ledger_display_internal()
gnc_ledger_display_internal():
1. Run query
2. Set watches
3. Load splits
refresh_handler() is called to refresh all pages when a change happens:
1. Check if the number of subaccounts has changed
2. Exclude any template accounts (for specific register types)
3. Run query
4. Set watches
5. Load splits
gnc_ledger_display_refresh() is called by the register plugin:
1. [Doesn't check if the number of subaccounts has changed]
2. Exclude template accounts (for specific register types)
3. Run query
4. Set watches
5. Load splits
The last two are inconsistent because they don't both check if the number
of subaccounts has changed.
Make it easier to conditionally refresh the ledger only when it's visible
by consolidating the code from these functions into one place within
gnc_ledger_display_refresh() and gnc_ledger_display_refresh_internal().
Make counters explicitly integer type and adjust the kvp load and save functions
to recognize that and behave accordingly so that other range options like day
threshold aren't affected.