Closed pgaskin closed 4 years ago
Surprisingly, most symbols are still intact, at least for now. I haven't looked at libnickel in detail yet, but I'm still going to update them if the way the new nav uses them is different to avoid future breakage.
Here's a script to add configs for testing actions:
#!/bin/sh
rm -rf /mnt/onboard/.adds/nm
mkdir /mnt/onboard/.adds/nm
cd /mnt/onboard/.adds/nm
# after testing, run: rm /mnt/onboard/.adds/nm/config; mv /mnt/onboard/.adds/nm/1.swp /mnt/onboard/.adds/nm/1
cat <<'EOF' > config
invalid
EOF
# then, cycle through the menus and test the items (in any order)
cat <<'EOF' > 1.swp
menu_item :main :1 :cmd_spawn :sleep 10s
menu_item :reader :1 :cmd_spawn :sleep 10s
menu_item :browser :1 :cmd_spawn :sleep 10s
menu_item :library :1 :cmd_spawn :sleep 10s
menu_item :main :2 :cmd_spawn :quiet:sleep 10s
menu_item :reader :2 :cmd_spawn :quiet:sleep 10s
menu_item :browser :2 :cmd_spawn :quiet:sleep 10s
menu_item :library :2 :cmd_spawn :quiet:sleep 10s
menu_item :main :3 :cmd_output :500:logread|tac
menu_item :reader :3 :cmd_output :500:logread|tac
menu_item :browser :3 :cmd_output :500:logread|tac
menu_item :library :3 :cmd_output :500:logread|tac
menu_item :main :4 :cmd_output :500:quiet:logread|tac
menu_item :reader :4 :cmd_output :500:quiet:logread|tac
menu_item :browser :4 :cmd_output :500:quiet:logread|tac
menu_item :library :4 :cmd_output :500:quiet:logread|tac
menu_item :main :N1 :cmd_output :500:quiet:mv /mnt/onboard/.adds/nm/1 /mnt/onboard/.adds/nm/1.swp; mv /mnt/onboard/.adds/nm/2.swp /mnt/onboard/.adds/nm/2
chain_success :dbg_toast :N2/9
EOF
cat <<'EOF' > 2.swp
menu_item :main :5 :dbg_syslog :test
menu_item :reader :5 :dbg_syslog :test
menu_item :browser :5 :dbg_syslog :test
menu_item :library :5 :dbg_syslog :test
menu_item :main :6 :dbg_error :test
menu_item :reader :6 :dbg_error :test
menu_item :browser :6 :dbg_error :test
menu_item :library :6 :dbg_error :test
menu_item :main :7 :dbg_msg :test
menu_item :reader :7 :dbg_msg :test
menu_item :browser :7 :dbg_msg :test
menu_item :library :7 :dbg_msg :test
menu_item :main :8 :dbg_toast :test
menu_item :reader :8 :dbg_toast :test
menu_item :browser :8 :dbg_toast :test
menu_item :library :8 :dbg_toast :test
menu_item :main :N2 :cmd_output :500:quiet:mv /mnt/onboard/.adds/nm/2 /mnt/onboard/.adds/nm/2.swp; mv /mnt/onboard/.adds/nm/3.swp /mnt/onboard/.adds/nm/3
chain_success :dbg_toast :N3/9
EOF
cat <<'EOF' > 3.swp
menu_item :main :9 :kfmon :test.png
menu_item :reader :9 :kfmon :test.png
menu_item :browser :9 :kfmon :test.png
menu_item :library :9 :kfmon :test.png
menu_item :main :10 :nickel_setting :toggle:invert
menu_item :reader :10 :nickel_setting :toggle:invert
menu_item :browser :10 :nickel_setting :toggle:invert
menu_item :library :10 :nickel_setting :toggle:invert
menu_item :main :11 :nickel_setting :toggle:lockscreen
menu_item :reader :11 :nickel_setting :toggle:lockscreen
menu_item :browser :11 :nickel_setting :toggle:lockscreen
menu_item :library :11 :nickel_setting :toggle:lockscreen
menu_item :main :12 :nickel_setting :toggle:screenshots
menu_item :reader :12 :nickel_setting :toggle:screenshots
menu_item :browser :12 :nickel_setting :toggle:screenshots
menu_item :library :12 :nickel_setting :toggle:screenshots
menu_item :main :13 :nickel_setting :toggle:force_wifi
menu_item :reader :13 :nickel_setting :toggle:force_wifi
menu_item :browser :13 :nickel_setting :toggle:force_wifi
menu_item :library :13 :nickel_setting :toggle:force_wifi
menu_item :main :14 :nickel_setting :toggle:auto_usb_gadget
menu_item :reader :14 :nickel_setting :toggle:auto_usb_gadget
menu_item :browser :14 :nickel_setting :toggle:auto_usb_gadget
menu_item :library :14 :nickel_setting :toggle:auto_usb_gadget
menu_item :main :N3 :cmd_output :500:quiet:mv /mnt/onboard/.adds/nm/3 /mnt/onboard/.adds/nm/3.swp; mv /mnt/onboard/.adds/nm/4.swp /mnt/onboard/.adds/nm/4
chain_success :dbg_toast :N4/9
EOF
cat <<'EOF' > 4.swp
menu_item :main :15 :nickel_extras :unblock_it
menu_item :reader :15 :nickel_extras :unblock_it
menu_item :browser :15 :nickel_extras :unblock_it
menu_item :library :15 :nickel_extras :unblock_it
menu_item :main :16 :nickel_extras :sketch_pad
menu_item :reader :16 :nickel_extras :sketch_pad
menu_item :browser :16 :nickel_extras :sketch_pad
menu_item :library :16 :nickel_extras :sketch_pad
menu_item :main :17 :nickel_extras :solitaire
menu_item :reader :17 :nickel_extras :solitaire
menu_item :browser :17 :nickel_extras :solitaire
menu_item :library :17 :nickel_extras :solitaire
menu_item :main :18 :nickel_extras :sudoku
menu_item :reader :18 :nickel_extras :sudoku
menu_item :browser :18 :nickel_extras :sudoku
menu_item :library :18 :nickel_extras :sudoku
menu_item :main :19 :nickel_extras :word_scramble
menu_item :reader :19 :nickel_extras :word_scramble
menu_item :browser :19 :nickel_extras :word_scramble
menu_item :library :19 :nickel_extras :word_scramble
menu_item :main :20 :nickel_browser :
menu_item :reader :20 :nickel_browser :
menu_item :browser :20 :nickel_browser :
menu_item :library :20 :nickel_browser :
menu_item :main :21 :nickel_browser :https://pgaskin.net
menu_item :reader :21 :nickel_browser :https://pgaskin.net
menu_item :browser :21 :nickel_browser :https://pgaskin.net
menu_item :library :21 :nickel_browser :https://pgaskin.net
menu_item :main :22 :nickel_browser :https://pgaskin.net *{background:black}
menu_item :reader :22 :nickel_browser :https://pgaskin.net *{background:black}
menu_item :browser :22 :nickel_browser :https://pgaskin.net *{background:black}
menu_item :library :22 :nickel_browser :https://pgaskin.net *{background:black}
menu_item :main :23 :nickel_browser :modal
menu_item :reader :23 :nickel_browser :modal
menu_item :browser :23 :nickel_browser :modal
menu_item :library :23 :nickel_browser :modal
menu_item :main :24 :nickel_browser :modal:https://pgaskin.net
menu_item :reader :24 :nickel_browser :modal:https://pgaskin.net
menu_item :browser :24 :nickel_browser :modal:https://pgaskin.net
menu_item :library :24 :nickel_browser :modal:https://pgaskin.net
menu_item :main :25 :nickel_browser :modal:https://pgaskin.net *{background:black}
menu_item :reader :25 :nickel_browser :modal:https://pgaskin.net *{background:black}
menu_item :browser :25 :nickel_browser :modal:https://pgaskin.net *{background:black}
menu_item :library :25 :nickel_browser :modal:https://pgaskin.net *{background:black}
menu_item :main :N4 :cmd_output :500:quiet:mv /mnt/onboard/.adds/nm/4 /mnt/onboard/.adds/nm/4.swp; mv /mnt/onboard/.adds/nm/5.swp /mnt/onboard/.adds/nm/5
chain_success :dbg_toast :N5/9
EOF
cat <<'EOF' > 5.swp
menu_item :main :26 :nickel_misc :home
menu_item :reader :26 :nickel_misc :home
menu_item :browser :26 :nickel_misc :home
menu_item :library :26 :nickel_misc :home
menu_item :main :27 :nickel_misc :force_usb_connection
menu_item :reader :27 :nickel_misc :force_usb_connection
menu_item :browser :27 :nickel_misc :force_usb_connection
menu_item :library :27 :nickel_misc :force_usb_connection
menu_item :main :28 :nickel_misc :rescan_books
menu_item :reader :28 :nickel_misc :rescan_books
menu_item :browser :28 :nickel_misc :rescan_books
menu_item :library :28 :nickel_misc :rescan_books
menu_item :main :29 :nickel_misc :rescan_books_full
menu_item :reader :29 :nickel_misc :rescan_books_full
menu_item :browser :29 :nickel_misc :rescan_books_full
menu_item :library :29 :nickel_misc :rescan_books_full
menu_item :main :N5 :cmd_output :500:quiet:mv /mnt/onboard/.adds/nm/5 /mnt/onboard/.adds/nm/5.swp; mv /mnt/onboard/.adds/nm/6.swp /mnt/onboard/.adds/nm/6
chain_success :dbg_toast :N6/9
EOF
cat <<'EOF' > 6.swp
menu_item :main :30 :nickel_open :discover:storefront
menu_item :reader :30 :nickel_open :discover:storefront
menu_item :browser :30 :nickel_open :discover:storefront
menu_item :library :30 :nickel_open :discover:storefront
menu_item :main :31 :nickel_open :discover:wishlist
menu_item :reader :31 :nickel_open :discover:wishlist
menu_item :browser :31 :nickel_open :discover:wishlist
menu_item :library :31 :nickel_open :discover:wishlist
menu_item :main :32 :nickel_open :library:library
menu_item :reader :32 :nickel_open :library:library
menu_item :browser :32 :nickel_open :library:library
menu_item :library :32 :nickel_open :library:library
menu_item :main :33 :nickel_open :library:library2
menu_item :reader :33 :nickel_open :library:library2
menu_item :browser :33 :nickel_open :library:library2
menu_item :library :33 :nickel_open :library:library2
menu_item :main :34 :nickel_open :library:all
menu_item :reader :34 :nickel_open :library:all
menu_item :browser :34 :nickel_open :library:all
menu_item :library :34 :nickel_open :library:all
menu_item :main :35 :nickel_open :library:authors
menu_item :reader :35 :nickel_open :library:authors
menu_item :browser :35 :nickel_open :library:authors
menu_item :library :35 :nickel_open :library:authors
menu_item :main :36 :nickel_open :library:series
menu_item :reader :36 :nickel_open :library:series
menu_item :browser :36 :nickel_open :library:series
menu_item :library :36 :nickel_open :library:series
menu_item :main :37 :nickel_open :library:shelves
menu_item :reader :37 :nickel_open :library:shelves
menu_item :browser :37 :nickel_open :library:shelves
menu_item :library :37 :nickel_open :library:shelves
menu_item :main :38 :nickel_open :library:pocket
menu_item :reader :38 :nickel_open :library:pocket
menu_item :browser :38 :nickel_open :library:pocket
menu_item :library :38 :nickel_open :library:pocket
menu_item :main :39 :nickel_open :library:dropbox
menu_item :reader :39 :nickel_open :library:dropbox
menu_item :browser :39 :nickel_open :library:dropbox
menu_item :library :39 :nickel_open :library:dropbox
menu_item :main :40 :nickel_open :reading_life:reading_life
menu_item :reader :40 :nickel_open :reading_life:reading_life
menu_item :browser :40 :nickel_open :reading_life:reading_life
menu_item :library :40 :nickel_open :reading_life:reading_life
menu_item :main :41 :nickel_open :reading_life:stats
menu_item :reader :41 :nickel_open :reading_life:stats
menu_item :browser :41 :nickel_open :reading_life:stats
menu_item :library :41 :nickel_open :reading_life:stats
menu_item :main :42 :nickel_open :reading_life:awards
menu_item :reader :42 :nickel_open :reading_life:awards
menu_item :browser :42 :nickel_open :reading_life:awards
menu_item :library :42 :nickel_open :reading_life:awards
menu_item :main :43 :nickel_open :reading_life:words
menu_item :reader :43 :nickel_open :reading_life:words
menu_item :browser :43 :nickel_open :reading_life:words
menu_item :library :43 :nickel_open :reading_life:words
menu_item :main :44 :nickel_open :store:overdrive
menu_item :reader :44 :nickel_open :store:overdrive
menu_item :browser :44 :nickel_open :store:overdrive
menu_item :library :44 :nickel_open :store:overdrive
menu_item :main :45 :nickel_open :store:search
menu_item :reader :45 :nickel_open :store:search
menu_item :browser :45 :nickel_open :store:search
menu_item :library :45 :nickel_open :store:search
menu_item :main :N6 :cmd_output :500:quiet:mv /mnt/onboard/.adds/nm/6 /mnt/onboard/.adds/nm/6.swp; mv /mnt/onboard/.adds/nm/7.swp /mnt/onboard/.adds/nm/7
chain_success :dbg_toast :N7/9
EOF
cat <<'EOF' > 7.swp
menu_item :main :46 :nickel_wifi :autoconnect
menu_item :reader :46 :nickel_wifi :autoconnect
menu_item :browser :46 :nickel_wifi :autoconnect
menu_item :library :46 :nickel_wifi :autoconnect
menu_item :main :47 :nickel_wifi :autoconnect_silent
menu_item :reader :47 :nickel_wifi :autoconnect_silent
menu_item :browser :47 :nickel_wifi :autoconnect_silent
menu_item :library :47 :nickel_wifi :autoconnect_silent
menu_item :main :48 :nickel_wifi :enable
menu_item :reader :48 :nickel_wifi :enable
menu_item :browser :48 :nickel_wifi :enable
menu_item :library :48 :nickel_wifi :enable
menu_item :main :49 :nickel_wifi :disable
menu_item :reader :49 :nickel_wifi :disable
menu_item :browser :49 :nickel_wifi :disable
menu_item :library :49 :nickel_wifi :disable
menu_item :main :50 :nickel_wifi :toggle
menu_item :reader :50 :nickel_wifi :toggle
menu_item :browser :50 :nickel_wifi :toggle
menu_item :library :50 :nickel_wifi :toggle
menu_item :main :N7 :cmd_output :500:quiet:mv /mnt/onboard/.adds/nm/7 /mnt/onboard/.adds/nm/7.swp; mv /mnt/onboard/.adds/nm/8.swp /mnt/onboard/.adds/nm/8
chain_success :dbg_toast :N8/9
EOF
cat <<'EOF' > 8.swp
menu_item :main :51 :nickel_orientation :portrait
menu_item :reader :51 :nickel_orientation :portrait
menu_item :browser :51 :nickel_orientation :portrait
menu_item :library :51 :nickel_orientation :portrait
menu_item :main :52 :nickel_orientation :landscape
menu_item :reader :52 :nickel_orientation :landscape
menu_item :browser :52 :nickel_orientation :landscape
menu_item :library :52 :nickel_orientation :landscape
menu_item :main :53 :nickel_orientation :inverted_portrait
menu_item :reader :53 :nickel_orientation :inverted_portrait
menu_item :browser :53 :nickel_orientation :inverted_portrait
menu_item :library :53 :nickel_orientation :inverted_portrait
menu_item :main :54 :nickel_orientation :inverted_landscape
menu_item :reader :54 :nickel_orientation :inverted_landscape
menu_item :browser :54 :nickel_orientation :inverted_landscape
menu_item :library :54 :nickel_orientation :inverted_landscape
menu_item :main :55 :nickel_orientation :invert
menu_item :reader :55 :nickel_orientation :invert
menu_item :browser :55 :nickel_orientation :invert
menu_item :library :55 :nickel_orientation :invert
menu_item :main :56 :nickel_orientation :swap
menu_item :reader :56 :nickel_orientation :swap
menu_item :browser :56 :nickel_orientation :swap
menu_item :library :56 :nickel_orientation :swap
menu_item :main :57 :power :shutdown
menu_item :reader :57 :power :shutdown
menu_item :browser :57 :power :shutdown
menu_item :library :57 :power :shutdown
menu_item :main :58 :power :reboot
menu_item :reader :58 :power :reboot
menu_item :browser :58 :power :reboot
menu_item :library :58 :power :reboot
menu_item :main :59 :power :sleep
menu_item :reader :59 :power :sleep
menu_item :browser :59 :power :sleep
menu_item :library :59 :power :sleep
menu_item :main :N8 :cmd_output :500:quiet:mv /mnt/onboard/.adds/nm/8 /mnt/onboard/.adds/nm/8.swp; mv /mnt/onboard/.adds/nm/9.swp /mnt/onboard/.adds/nm/9
chain_success :dbg_toast :N9/9
EOF
cat <<'EOF' > 9.swp
generator :main :kfmon
generator :reader :kfmon
generator :browser :kfmon
generator :library :kfmon
generator :main :_test :5
generator :reader :_test :5
generator :browser :_test :5
generator :library :_test :5
generator :main :_test_time
generator :reader :_test_time
generator :browser :_test_time
generator :library :_test_time
menu_item :main :N9 :cmd_output :500:quiet:mv /mnt/onboard/.adds/nm/9 /mnt/onboard/.adds/nm/9.swp; mv /mnt/onboard/.adds/nm/1.swp /mnt/onboard/.adds/nm/1
chain_success :dbg_toast :N1/9
EOF
Testing results on Aura2v1 with FW 15505:
nickel_browser
without modal
needs a note about not being able to exit without another menu item.nickel_misc:home
needs a new symbol.nickel_open:library:library
segfaults.nickel_open:library:library2
segfaults.nickel_open:library:all
segfaults.nickel_open:library:authors
segfaults.nickel_open:library:series
segfaults.nickel_open:library:shelves
segfaults.nickel_open:library:pocket
segfaults.nickel_open:library:dropbox
needs a new symbol.nickel_orientation
works even better, so I should see if the old requirement of ForceAllowLandscape
still applies.The library segfaults are all like:
# 00 sp: 0x7edfe7a8 ip: 0x2b6c191e /usr/local/Kobo/libnickel.so.1.0.0: _ZNK23LinearLibraryDataSourceI6VolumeE4sizeEv+0x5
# 01 sp: 0x7edfe7b0 ip: 0x2b6b3f67 /usr/local/Kobo/libnickel.so.1.0.0: _ZN25AbstractLibraryControllerI6VolumeE6layoutEb+0x10a
# 02 sp: 0x7edfe7f0 ip: 0x2b6b4cab /usr/local/Kobo/libnickel.so.1.0.0: _ZN25AbstractLibraryControllerI6VolumeE13performLayoutEb+0x10a
# 03 sp: 0x7edfe848 ip: 0x2b6b15d1 /usr/local/Kobo/libnickel.so.1.0.0: _ZN25AbstractLibraryControllerI6VolumeE8loadViewEv+0xe8
# 04 sp: 0x7edfe888 ip: 0x2b90a205 /usr/local/Kobo/libnickel.so.1.0.0: _ZN28GridAndListLibraryControllerI15GridLibraryViewE8loadViewEv+0x78
# 05 sp: 0x7edfe8a0 ip: 0x2b6b0ea5 /usr/local/Kobo/libnickel.so.1.0.0: _ZN18AbstractController4viewIP19AbstractLibraryViewI6VolumeEEET_v+0x1c
# 06 sp: 0x7edfe8d0 ip: 0x2b6d21c5 /usr/local/Kobo/libnickel.so.1.0.0: _ZN22AbstractLibraryBuilder13newControllerE14QSharedPointerI17LibraryDataSourceI6VolumeEE+0x68
# 07 sp: 0x7edfe8f0 ip: 0x2b6d7b5d /usr/local/Kobo/libnickel.so.1.0.0: _ZN15AbstractBuilderI6VolumeE15buildControllerEv+0x60
I've fixed and tested everything except for nickel_open:library:*
in 492319df87ec17150a4aece968ec4c981bb9d376.
The reason for the nickel_open:library:*
segfaults was twofold, as for some reason, I made the base object aQObject
when making that action in #38, even though it wasn't actually one (I don't know how I came to that conclusion before, as it doesn't even have a QMetaObject ... I think it was a copy-paste mistake from some of the other code). In older firmware versions, this didn't matter since nothing depended on variables being zeroed in the class at certain offsets (15505 stores pointers in it and lazy-initializes them). In addition, since 15505, more variables are stored in the class, making it larger than a QObject
, and thus segfaulting when trying to access them (I store the *NavMixin
objects on the stack).
Edit: nickel_open:library:*
now segfaults on my Clara with the 15268. I'm going to look into this more.
This type of thing seems to be the main difference in usage between 15268 and 15505 (also note that LibraryNavMixin is 8 bytes larger):
15268:
00b001a2 03F682E6 blx _ZN20MainWindowController14sharedInstanceEv@PLT ; MainWindowController::sharedInstance()
00b001a6 2946 mov r1, r5
00b001a8 E8F50AE4 blx _ZN20MainWindowController5popToEP18AbstractController@PLT ; MainWindowController::popTo(AbstractController*)
00b001ac 08F662E6 blx _ZN14LibraryBuilder14sharedInstanceEv@PLT ; LibraryBuilder::sharedInstance()
00b001b0 2E4A ldr r2, =0x1c244 ; 0x1c244,dword_b0026c
00b001b2 8046 mov r8, r0
00b001b4 0368 ldr r3, [r0]
00b001b6 2846 mov r0, r5
00b001b8 2D49 ldr r1, =0x19980 ; 0x19980,dword_b00270
00b001ba B258 ldr r2, [r6, r2]
00b001bc D3F83490 ldr.w sb, [r3, #0x34]
00b001c0 0023 movs r3, #0x0
00b001c2 7158 ldr r1, [r6, r1]
00b001c4 17F66EE1 blx __dynamic_cast@PLT ; __dynamic_cast
00b001c8 4146 mov r1, r8
00b001ca 0246 mov r2, r0
00b001cc 0023 movs r3, #0x0
00b001ce 2046 mov r0, r4
00b001d0 C847 blx sb
00b001d2 7C68 ldr r4, [r7, #0x4]
00b001d4 C4B1 cbz r4, loc_b00208
15505:
00b10e8c 01F65EE4 blx _ZN20MainWindowController14sharedInstanceEv@PLT ; MainWindowController::sharedInstance()
00b10e90 2946 mov r1, r5
00b10e92 E6F588E1 blx _ZN20MainWindowController5popToEP18AbstractController@PLT ; MainWindowController::popTo(AbstractController*)
00b10e96 4146 mov r1, r8
00b10e98 3846 mov r0, r7
00b10e9a F2F564E6 blx _ZN15LibraryNavMixin7builderEv@PLT ; LibraryNavMixin::builder()
00b10e9e D7F80080 ldr.w r8, [r7]
00b10ea2 2846 mov r0, r5
00b10ea4 374A ldr r2, =0x1c5bc ; 0x1c5bc,dword_b10f84
00b10ea6 3849 ldr r1, =0x19c78 ; 0x19c78,dword_b10f88
00b10ea8 D8F80030 ldr.w r3, [r8]
00b10eac B258 ldr r2, [r6, r2]
00b10eae 7158 ldr r1, [r6, r1]
00b10eb0 D3F83490 ldr.w sb, [r3, #0x34]
00b10eb4 0023 movs r3, #0x0
00b10eb6 15F648E0 blx __dynamic_cast@PLT ; __dynamic_cast
00b10eba 4146 mov r1, r8
00b10ebc 0246 mov r2, r0
00b10ebe 0023 movs r3, #0x0
00b10ec0 2046 mov r0, r4
00b10ec2 C847 blx sb
00b10ec4 FC68 ldr r4, [r7, #0xc]
00b10ec6 C4B1 cbz r4, loc_b10efa
...
00b10efc 0AF632E3 blx _ZN14QSharedPointerI14LibraryBuilderE5derefEPN15QtSharedPointer20ExternalRefCountDataE@PLT ; QSharedPointer<LibraryBuilder>::deref(QtSharedPointer::ExternalRefCountData*)
My Glo is on 15190. You need anything tested yet?
You need anything tested yet?
A lot less changed than I originally expected, so I don't think I'll need too much testing on old firmware versions. The only thing I have to figure out is why LibraryNavMixin is causing crashes differently on different versions (I just fixed it for 15505, but it now crashes on older ones), but that's not really device specific.
Once you upgrade, can you test the main menu from the pgaskin/fw-15505-experiments branch on it? Everything (including the library actions) should work on 492319df87ec17150a4aece968ec4c981bb9d376.
Once I figure out the LibraryNavMixin crashes (if I can't, I'm going to disable those actions for 15505+) and decide on an icon (I might leave that for the next version), I'm going to put my changes into a PR, then release NM v0.3.2 and go back to testing the patches again.
Just a note on the version number, It's a big enough change that it might be worth going to 0.4. That might make it a little more 'visible' that FW 4.23 requires 0.4.0 or later. Otherwise, people might see the '0.3' bit and think any '0.3.x' will work.
It's a big enough change that it might be worth going to 0.4.
On the other hand, this change is meant to be fully backwards-compatible, and doesn't affect older firmware versions.
I think I've managed to fix it: 71c07c5e35cc636a67ca79bccb98e947c3556511.
Edit: There's still one bug. If I'm not already in one of the library views, nickel_open:library:library
segfaults on 15505. nickel_open:library:library2
and the others don't, though.
That seems to occur when this code path is taken (because the library view isn't in the MainWindowController):
00b10f26 01F612E4 blx _ZN20MainWindowController14sharedInstanceEv@PLT ; MainWindowController::sharedInstance(), CODE XREF=_ZN15LibraryNavMixin11showLibraryEv+74
00b10f2a 4146 mov r1, r8
00b10f2c 0546 mov r5, r0
00b10f2e 2046 mov r0, r4
00b10f30 F2F518E6 blx _ZN15LibraryNavMixin7builderEv@PLT ; LibraryNavMixin::builder()
00b10f34 B868 ldr r0, [r7, #0x8]
00b10f36 0368 ldr r3, [r0]
00b10f38 1B6B ldr r3, [r3, #0x30]
00b10f3a 9847 blx r3
00b10f3c 0146 mov r1, r0
00b10f3e 0022 movs r2, #0x0
00b10f40 2846 mov r0, r5
00b10f42 F8F550E1 blx _ZN20MainWindowController5clearEP18AbstractControllerb@PLT ; MainWindowController::clear(AbstractController*, bool)
00b10f46 F868 ldr r0, [r7, #0xc]
00b10f48 0AF60CE3 blx _ZN14QSharedPointerI14LibraryBuilderE5derefEPN15QtSharedPointer20ExternalRefCountDataE@PLT ; QSharedPointer<LibraryBuilder>::deref(QtSharedPointer::ExternalRefCountData*)
00b10f4c 1437 adds r7, #0x14
00b10f4e BD46 mov sp, r7
00b10f50 BDE8F083 pop.w {r4, r5, r6, r7, r8, sb, pc}
Rather than this:
00b10e8c 01F65EE4 blx _ZN20MainWindowController14sharedInstanceEv@PLT ; MainWindowController::sharedInstance()
00b10e90 2946 mov r1, r5
00b10e92 E6F588E1 blx _ZN20MainWindowController5popToEP18AbstractController@PLT ; MainWindowController::popTo(AbstractController*)
00b10e96 4146 mov r1, r8
00b10e98 3846 mov r0, r7
00b10e9a F2F564E6 blx _ZN15LibraryNavMixin7builderEv@PLT ; LibraryNavMixin::builder()
00b10e9e D7F80080 ldr.w r8, [r7]
00b10ea2 2846 mov r0, r5
00b10ea4 374A ldr r2, =0x1c5bc ; 0x1c5bc,dword_b10f84
00b10ea6 3849 ldr r1, =0x19c78 ; 0x19c78,dword_b10f88
00b10ea8 D8F80030 ldr.w r3, [r8]
00b10eac B258 ldr r2, [r6, r2]
00b10eae 7158 ldr r1, [r6, r1]
00b10eb0 D3F83490 ldr.w sb, [r3, #0x34]
00b10eb4 0023 movs r3, #0x0
00b10eb6 15F648E0 blx __dynamic_cast@PLT ; __dynamic_cast
00b10eba 4146 mov r1, r8
00b10ebc 0246 mov r2, r0
00b10ebe 0023 movs r3, #0x0
00b10ec0 2046 mov r0, r4
00b10ec2 C847 blx sb
00b10ec4 FC68 ldr r4, [r7, #0xc]
00b10ec6 C4B1 cbz r4, loc_b10efa
...
00b10efa 7868 ldr r0, [r7, #0x4] ; CODE XREF=_ZN15LibraryNavMixin11showLibraryEv+134, _ZN15LibraryNavMixin11showLibraryEv+178
00b10efc 0AF632E3 blx _ZN14QSharedPointerI14LibraryBuilderE5derefEPN15QtSharedPointer20ExternalRefCountDataE@PLT ; QSharedPointer<LibraryBuilder>::deref(QtSharedPointer::ExternalRefCountData*)
00b10f00 1437 adds r7, #0x14
00b10f02 BD46 mov sp, r7
00b10f04 BDE8F083 pop.w {r4, r5, r6, r7, r8, sb, pc}
In 15055, the function called by library:library
, LibraryNavMixin::showLibrary
isn't used anywhere else, except by _ZN15LibraryNavMixin12showAllItemsEv
, which calls _ZN15LibraryNavMixin19setFilterToAllItemsEv
first. The books tab only uses _ZN15LibraryNavMixin18showLastLibraryTabEv
and _ZN15LibraryNavMixin12showAllItemsEv
. In comparison, AuthorWidget::tapped
calls _ZN15LibraryNavMixin11showLibraryEv
in 15268 after calling _ZN22AbstractLibraryBuilder14filterByAuthorERK7QString
. On 15055, AuthorWidget::tapped
calls _ZN15LibraryNavMixin10pushAuthorERK7QString
instead, which then calls _ZN22AbstractLibraryBuilder14filterByAuthorERK7QString
and _ZN15LibraryNavMixin11pushLibraryEv
. Based on this, it appears that LibraryNavMixin::showLibrary
wasn't ever meant to be called by itself, and it only used to work on older firmware versions because nothing ended up making use of the filter in a way which would cause it to segfault if it wasn't set beforehand. In addition, note that _ZN15LibraryNavMixin11pushLibraryEv
is essentially identical to the code path at the top of this comment.
Based on this, I've decided to make library:library2
identical to library:library
. I will implement this by removing library2
from the documentation, and making it do the same thing as library
in the action code.
I have re-tested everything on my Clara (running 15268) and my Aura2v1 (running 15505), and everything works well. In addition, I have tested the nickel_open
actions on my Mini (running 4.10.11655), and they still work correctly on old firmware versions.
I'll be adding it to the symbol tests after I start working on the patches.
If anyone wants to help test the
nickel_*
actions, it'd be appreciated.Also see #78.