pgaskin / NickelMenu

The easiest way to launch scripts, change settings, and run actions on Kobo e-readers.
https://pgaskin.net/NickelMenu
MIT License
556 stars 28 forks source link

Testing compatibility of actions on 4.23.15505 #79

Closed pgaskin closed 4 years ago

pgaskin commented 4 years ago

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.

pgaskin commented 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.

pgaskin commented 4 years ago

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
pgaskin commented 4 years ago

Testing results on Aura2v1 with FW 15505:


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
pgaskin commented 4 years ago

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.

pgaskin commented 4 years ago

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*)
shermp commented 4 years ago

My Glo is on 15190. You need anything tested yet?

pgaskin commented 4 years ago

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.

shermp commented 4 years ago

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.

pgaskin commented 4 years ago

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.

pgaskin commented 4 years ago

I think I've managed to fix it: 71c07c5e35cc636a67ca79bccb98e947c3556511.

https://github.com/pgaskin/NickelMenu/blob/71c07c5e35cc636a67ca79bccb98e947c3556511/src/action_cc.cc#L137-L153


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.

pgaskin commented 4 years ago

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.