diff --git a/kobopatch.yaml b/kobopatch.yaml index 044d796..19c34a8 100644 --- a/kobopatch.yaml +++ b/kobopatch.yaml @@ -1,6 +1,6 @@ ## Sixthhokage1's kobopatch config -version: 4.22.15190 -in: src/kobo-update-4.22.15190.zip +version: 4.23.15505 +in: src/kobo-update-4.23.15505.zip out: out/KoboRoot.tgz log: out/log.txt @@ -35,7 +35,3 @@ files: # Anti-adware/malware hosts file # https://github.com/StevenBlack/hosts pkg/adblock-hosts/hosts.txt: etc/hosts - - # kobo-dotfile-hack - pkg/kobo-dotfile-hack-6f452d1/usr/local/geek1011/libhidedir_kobo.so: usr/local/geek1011/libhidedir_kobo.so - pkg/kobo-dotfile-hack-6f452d1/etc/ld.so.preload: etc/ld.so.preload diff --git a/pkg/kobo-dotfile-hack-6f452d1/etc/ld.so.preload b/pkg/kobo-dotfile-hack-6f452d1/etc/ld.so.preload deleted file mode 100644 index e3dc4b1..0000000 --- a/pkg/kobo-dotfile-hack-6f452d1/etc/ld.so.preload +++ /dev/null @@ -1 +0,0 @@ -/usr/local/geek1011/libhidedir_kobo.so diff --git a/pkg/kobo-dotfile-hack-6f452d1/ld.so.preload b/pkg/kobo-dotfile-hack-6f452d1/ld.so.preload deleted file mode 100644 index e3dc4b1..0000000 --- a/pkg/kobo-dotfile-hack-6f452d1/ld.so.preload +++ /dev/null @@ -1 +0,0 @@ -/usr/local/geek1011/libhidedir_kobo.so diff --git a/pkg/kobo-dotfile-hack-6f452d1/usr/local/geek1011/libhidedir_kobo.so b/pkg/kobo-dotfile-hack-6f452d1/usr/local/geek1011/libhidedir_kobo.so deleted file mode 100755 index 21eb115..0000000 Binary files a/pkg/kobo-dotfile-hack-6f452d1/usr/local/geek1011/libhidedir_kobo.so and /dev/null differ diff --git a/src/libadobe.so.yaml b/src/libadobe.so.yaml index e91f2c5..a2811d6 100644 --- a/src/libadobe.so.yaml +++ b/src/libadobe.so.yaml @@ -1,4 +1,4 @@ -# The following patch(es) were fixed and are updated by geek1011 +# The following patch(es) were fixed and are updated by pgaskin (geek1011) Remove PDF map widget shown during panning: - Enabled: no diff --git a/src/libnickel.so.1.0.0.yaml b/src/libnickel.so.1.0.0.yaml index 873c48f..351f90d 100644 --- a/src/libnickel.so.1.0.0.yaml +++ b/src/libnickel.so.1.0.0.yaml @@ -1,714 +1,4 @@ -# The following patch(es) are by geek1011 - -Both page turn buttons go next: - - Enabled: no - - Description: Make both page turn buttons on the Forma go next in the reader. - - ReplaceBytes: - Base: "ReadingView::keyPressEvent(QKeyEvent*)" - Offset: 54 - FindInstBW: {SymPLTTail: "ReadingView::prevPageWithTimer()"} - ReplaceInstBW: {SymPLTTail: "ReadingView::nextPageWithTimer()"} - -Both page turn sides go next: - - Enabled: no - - Description: Make both page turn sides go next in the reader. - # In ReadingView::processTap(TapGesture*) where the page direction is checked: - - BaseAddress: {Sym: "ReadingView::processTap(TapGesture*)", Rel: 390} - - ReplaceBytes: {Offset: 0, FindInstBLX: {SymPLT: "ReadingView::leftToRightPageProgressDirection() const"}, CheckOnly: true} - # nop the branch for checking if left-to-right (so it always runs the swap of back/forward) - - ReplaceBytes: {Offset: 4, FindH: 18 B9, ReplaceInstNOP: true} - # where r3 = *(r7+0x18) (back) and r2 = *(r7+0x20) (forward), then they are stored in reverse, - # instead of storing each one, just store forward (by changing the source register in the str - # instruction) - - ReplaceBytes: {Offset: 10, FindH: 3B 62, ReplaceH: 3A 62} - # This patch could have also been done later on where the tap point is checked against different - # QRects, but that's a lot more complicated due to the use of QHash s of pointers to functions. - -Replace adobe page numbers toggle with invert screen: - - Enabled: no - - Description: | - Replaces the adobe page numbers toggle in reading settings with an invert - screen one. - # Settings page - - BaseAddress: "N3SettingsReadingView::N3SettingsReadingView(QWidget*)" - - ReplaceBytes: {Offset: 876, FindInstBLX: {SymPLT: "ReadingSettings::getShowAdobePageNumbers()"}, ReplaceInstBLX: {SymPLT: "FeatureSettings::invertScreen()"}} - # Settings page controller - - BaseAddress: {Sym: "N3SettingsReadingController::showAdobePageNumbersToggled()"} - - ReplaceBytes: {Offset: 62, FindInstBLX: {SymPLT: "ReadingSettings::getShowAdobePageNumbers()"}, ReplaceInstBLX: {SymPLT: "FeatureSettings::invertScreen()"}} - - ReplaceBytes: {Offset: 74, FindInstBLX: {SymPLT: "ReadingSettings::setShowAdobePageNumbers(bool)"}, ReplaceInstBLX: {SymPLT: "FeatureSettings::setInvertScreen(bool)"}} - # Settings page text - - FindReplaceString: {Find: "Show Adobe EPUB page numbers", Replace: "Invert screen"} - -Always show confirmation dialog before upgrading: - - Enabled: no - - PatchGroup: Firmware upgrade options - - Description: This patch makes the confirmation dialog always show before upgrading. - - BaseAddress: "UpgradeManager::requestUpgradeConfirmation(UpgradeType, QString const&)" - - ReplaceBytes: {Offset: 22, FindH: 01 2C, ReplaceH: A4 42} # make the optional UpgradeType check always true (CMP r4, #1 -> CMP r4, r4) - - ReplaceBytes: {Offset: 42, FindInstBLX: {SymPLT: "UpgradeManager::isSilent()"}, ReplaceH: 4F F0 00 00} # make the call to UpgradeManager::isSilent always false (MOV r0, #0) - -Allow USB storage even when device locked: - - Enabled: no - - Description: | - Always allows USB storage even when the device is locked. When combined - with an enabled lock screen, this patch allows recovery from almost any - segfaulting patch without a factory reset, as most code isn't executed - until after the initial unlock. WARNING - this patches renders the lock - screen security completely useless! But, for some security by obscurity - this will only take effect when you plug it in while the sleep screen is - visible. - # Never reject the permission request (i.e. don't set *r5 = false), even when - # the PIN entry dialog is enabled: - - ReplaceBytes: - Base: "N3PowerWorkflowManager::onUSBPlugPermissionRequest(PermissionRequest*)" - Offset: 40 - FindH: 2B 70 # strb r3, [r5] - ReplaceInstNOP: true - -Hide browser from beta features: - - Enabled: no - - Description: Hides the built-in browser from beta features. - - ReplaceBytes: - Base: "N3SettingsExtrasView::N3SettingsExtrasView(QWidget*)" - Offset: 1220 - FindInstBLX: {SymPLT: "Device::isParentalControlEnabled() const"} - ReplaceH: 4F F0 01 00 - - ReplaceBytes: - Base: {Sym: "SelectionMenuController::setupMainOptions()"} - Offset: 396 - FindInstBLX: {SymPLT: "Device::isParentalControlEnabled() const"} - ReplaceH: 4F F0 01 00 - -Remove beta features not supported text: - - Enabled: no - - Description: Does what it says to clear up the clutter. - - ReplaceBytes: - Base: "Ui_N3SettingsExtrasView::retranslateUi(QWidget*)" - Offset: 96 - FindInstBLX: {SymPLT: "QLabel::setText(QString const&)"} - ReplaceInstBLX: {SymPLT: "QWidget::hide()"} - -Disable all tutorial dialogs: - - Enabled: no - - Description: | - Removes the annoying tutorials (and recurring dialogs). Note - I may - have missed a few of them. If I have, just open an issue on GitHub or - PM me (geek1011) on MobileRead, and I'll fix it. - # QVariant::toBool is called after getting the setting (of if it has/should - # show) as a QVariant. I am replacing this method as opposed to replacing the - # return value of the function because 1. A MOV instruction with an immediate - # (fixed) value is 4 long (rather than 2) and 2. This is simpler to update as - # I only need to update the function offset and the offset for each setting. - - ReplaceBytes: {Base: "DialogSettings::firstPurchaseCreditJitShown()", Offset: 54, FindInstBLX: {SymPLT: "QVariant::toBool() const"}, ReplaceH: 4F F0 01 00} - - ReplaceBytes: {Base: "DialogSettings::quickTurnDialogShown()", Offset: 54, FindInstBLX: {SymPLT: "QVariant::toBool() const"}, ReplaceH: 4F F0 01 00} - - ReplaceBytes: {Base: "DialogSettings::returningReaderDialogShown()", Offset: 54, FindInstBLX: {SymPLT: "QVariant::toBool() const"}, ReplaceH: 4F F0 01 00} - - ReplaceBytes: {Base: "ApplicationSettings::koboLoveDialogShown()", Offset: 54, FindInstBLX: {SymPLT: "QVariant::toBool() const"}, ReplaceH: 4F F0 01 00} - - ReplaceBytes: {Base: "ApplicationSettings::quickTourWidgetShown()", Offset: 54, FindInstBLX: {SymPLT: "QVariant::toBool() const"}, ReplaceH: 4F F0 01 00} - - ReplaceBytes: {Base: "ApplicationSettings::overDriveFilterShown()", Offset: 54, FindInstBLX: {SymPLT: "QVariant::toBool() const"}, ReplaceH: 4F F0 01 00} - - ReplaceBytes: {Base: "ApplicationSettings::wifiReminderDialogShown()", Offset: 54, FindInstBLX: {SymPLT: "QVariant::toBool() const"}, ReplaceH: 4F F0 01 00} - - ReplaceBytes: {Base: "ApplicationSettings::readABookShown()", Offset: 54, FindInstBLX: {SymPLT: "QVariant::toBool() const"}, ReplaceH: 4F F0 01 00} - - ReplaceBytes: {Base: "ApplicationSettings::borrowDialogShown()", Offset: 54, FindInstBLX: {SymPLT: "QVariant::toBool() const"}, ReplaceH: 4F F0 01 00} - - ReplaceBytes: {Base: "ApplicationSettings::quickTourShown()", Offset: 54, FindInstBLX: {SymPLT: "QVariant::toBool() const"}, ReplaceH: 4F F0 01 00} - - ReplaceBytes: {Base: "ApplicationSettings::libraryFTEShown()", Offset: 54, FindInstBLX: {SymPLT: "QVariant::toBool() const"}, ReplaceH: 4F F0 01 00} - - ReplaceBytes: {Base: "ApplicationSettings::zoomFTEShown()", Offset: 54, FindInstBLX: {SymPLT: "QVariant::toBool() const"}, ReplaceH: 4F F0 01 00} - - ReplaceBytes: {Base: "ApplicationSettings::welcomeShown()", Offset: 54, FindInstBLX: {SymPLT: "QVariant::toBool() const"}, ReplaceH: 4F F0 01 00} - - ReplaceBytes: {Base: "ApplicationSettings::koboPlusPromoShown()", Offset: 54, FindInstBLX: {SymPLT: "QVariant::toBool() const"}, ReplaceH: 4F F0 01 00} - - ReplaceBytes: {Base: "ApplicationSettings::syncWarningDialogShown()", Offset: 54, FindInstBLX: {SymPLT: "QVariant::toBool() const"}, ReplaceH: 4F F0 01 00} - - ReplaceBytes: {Base: "ApplicationSettings::addedToMyWordsDialogShown()", Offset: 54, FindInstBLX: {SymPLT: "QVariant::toBool() const"}, ReplaceH: 4F F0 01 00} - - ReplaceBytes: {Base: "ApplicationSettings::longPressDialogShown()", Offset: 54, FindInstBLX: {SymPLT: "QVariant::toBool() const"}, ReplaceH: 4F F0 01 00} - - ReplaceBytes: {Base: "ApplicationSettings::swipeDialogShown()", Offset: 54, FindInstBLX: {SymPLT: "QVariant::toBool() const"}, ReplaceH: 4F F0 01 00} - - ReplaceBytes: {Base: "ApplicationSettings::syncReminderDialogShown()", Offset: 54, FindInstBLX: {SymPLT: "QVariant::toBool() const"}, ReplaceH: 4F F0 01 00} - - ReplaceBytes: {Base: "ApplicationSettings::eReaderBooksManagementFTEShown()", Offset: 54, FindInstBLX: {SymPLT: "QVariant::toBool() const"}, ReplaceH: 4F F0 01 00} - - ReplaceBytes: {Base: "ApplicationSettings::libraryCuratedListsDialogShown()", Offset: 54, FindInstBLX: {SymPLT: "QVariant::toBool() const"}, ReplaceH: 4F F0 01 00} - -Remove recommendations (row1col2) from home screen: - - Enabled: no - - Description: | - By default, when there are less than 2 books open, a recommendations - column shows in the top right of the home screen. This patch hides it. - - ReplaceBytes: - Base: "HomePageView::configureTopRight(HomePageWidgets)" - Offset: 48 - FindH: 58 B1 # never skip hiding the top-right widget - ReplaceInstNOP: true - -Rename new home screen footer: - - Enabled: no - # This patch happens use shared strings in most versions, and may cause unusual - # replacements in other parts of the GUI (see https://github.com/geek1011/kobopatch-patches/issues/34). - # This isn't usually an issue (and changes between versions), but occasionally, - # the keyboard uses a letter from one of these strings, and will type the letter - # from the replacement. - - FindReplaceString: {Find: "Find your next great read", Replace: "Find your next great read"} - - FindReplaceString: {Find: "Find your next book in Kobo Plus or our store", Replace: "Find your next book in Kobo Plus or our store"} - - ReplaceBytes: - Base: "HomePageView::setOverDriveUser(OverDriveUser const&)" - Offset: 60 - FindInstBLX: {SymPLT: "GenericHomeWidget::setTitleText(QString)"} - ReplaceInstNOP: true - # You can enable the following replacement, but note that it might cause the o letter on the keyboard to change -# - FindReplaceString: {Find: "Shop Kobo", Replace: "9char-str"} - -## Change Browse Kobo home screen link target ### -# This patch allows you to change the target of the Browse Kobo link. To -# rename the top description, use the rename home screen footer patch. -# -# The easy options for this patch are fairly limited, as BrowseKoboWidget::tapped -# just calls the superclass event, then the call to DiscoverNavMixin::storeFront -# in the PLT is tail-call optimized. This places a number of restrictions on the -# replacement target, namely: the branch must be a branch and exchange, but not -# link (lr must be unchanged to return correctly), which is implemented as a -# 32-bit branch to a bx pc (nop branch, but still switch instruction sets) -# immediately before a PLT entry to a nav mixin without any arguments (i.e. -# must be static). Note that the first branch is relative to pc. Also, note that -# in general, this requirement means anything called by StatusBarController (the -# menu) can be used as a replacement. -# -# Basically, the following two steps are needed: -# - In BrowseKoboWidget::tapped, change the tail-call to the bx before -# [something]NavMixin::[something] in the PLT. -# - In the BrowseKoboWidget constructor, change which function is called to get -# the bottom text (Shop Kobo) from N3DeviceCharm::shopName (Shop Kobo / Walmart) -# to N3DeviceCharm::[something] (note that there isn't enough room to -# load an entirely different string here). - -Change Browse Kobo home screen link target - Activity: - - Enabled: no - - PatchGroup: Browse Kobo link target - - Description: See the comment above. - - ReplaceBytes: - Base: "BrowseKoboWidget::tapped()" - Offset: 22 - FindInstBW: {SymPLTTail: "DiscoverNavMixin::storefront()"} # Store - ReplaceInstBW: {SymPLTTail: "ReadingLifeNavMixin::chooseActivity()"} # Activity - - ReplaceBytes: - Base: "BrowseKoboWidget::tapped()" - Offset: 32 - FindInstBW: {SymPLTTail: "StoreNavMixin::overDriveFeaturedLists()"} # OverDrive - ReplaceInstBW: {SymPLTTail: "ReadingLifeNavMixin::chooseActivity()"} # Activity - - ReplaceBytes: - Base: "BrowseKoboWidget::BrowseKoboWidget(QWidget*)" - Offset: 196 - FindInstBLX: {SymPLT: "N3DeviceCharm::shopName()"} # "Shop Kobo" or "Walmart" - ReplaceInstBLX: {SymPLT: "N3DeviceCharm::extrasName()"} # "Activity" - - ReplaceBytes: - Base: "HomePageView::setOverDriveUser(OverDriveUser const&)" - Offset: 114 - FindInstBLX: {SymPLT: "GenericHomeWidget::setMetaText(QString)"} # "OverDrive" - ReplaceInstNOP: true - -Change Browse Kobo home screen link target - Articles: - - Enabled: no - - PatchGroup: Browse Kobo link target - - Description: See the comment above. - - ReplaceBytes: - Base: "BrowseKoboWidget::tapped()" - Offset: 22 - FindInstBW: {SymPLTTail: "DiscoverNavMixin::storefront()"} # Store - ReplaceInstBW: {SymPLTTail: "LibraryNavMixin::showPocketLibrary()"} # My Articles - - ReplaceBytes: - Base: "BrowseKoboWidget::tapped()" - Offset: 32 - FindInstBW: {SymPLTTail: "StoreNavMixin::overDriveFeaturedLists()"} # OverDrive - ReplaceInstBW: {SymPLTTail: "LibraryNavMixin::showPocketLibrary()"} # My Articles - - ReplaceBytes: - Base: "BrowseKoboWidget::BrowseKoboWidget(QWidget*)" - Offset: 196 - FindInstBLX: {SymPLT: "N3DeviceCharm::shopName()"} # "Shop Kobo" or "Walmart" - ReplaceInstBLX: {SymPLT: "N3DeviceCharm::articlesSearchName()"} # "My Articles" - - ReplaceBytes: - Base: "HomePageView::setOverDriveUser(OverDriveUser const&)" - Offset: 114 - FindInstBLX: {SymPLT: "GenericHomeWidget::setMetaText(QString)"} # "OverDrive" - ReplaceInstNOP: true - -### - -### Smartlink patches ### - -Set visible SmartLink: - - Enabled: no - - PatchGroup: SmartLink - - Description: Sets the currently visible smartlink (does not override priority messages). - # SmartLinks: (name from SmartLinkWidget::getAnalyticsMessage) - # # - internal name - default condition - what - action - # PRIORITY MESSAGES (shown first up to 3 times each): (SmartLinkWidget::showPriorityMessage, ActivityManager::smartLinkPriorityMessage, SmartLinkWidget::tapped) - # 5 - ReleaseNotes - whats new available from Activity - RELEASE NOTES: Find out what's new in this software update - whats new (from Activity) - # 6 - OverDriveFTE - overdrive enabled && not signed in - OVERDRIVE: Learn how to borrow eBooks from your public library - overdrive about - # 7 - KoboPlusFTE - kobo plus enabled && not subscribed - KOBO PLUS: Browse Kobo Plus books - kobo store -> kobo plus - # 8 - OverDrive - overdrive enabled && signed in && have hold - OVERDRIVE: View your public library holds - overdrive holds list - # ROTATION MESSAGES (randomly chosen): (SmartLinkWidget::showRotationMessage, ActivityManager::smartLinkGeneralMessage, SmartLinkWidget::tapped) - # 1 - Pocket - pocket not signed in - POCKET: Read articles from the web on your eReader - pocket about - # 2 - KoboPlus - kobo plus enabled && not subscribed - KOBO PLUS: Get unlimited access to books in all genres - kobo store -> kobo plus - # 2 - KoboPlus - kobo plus enabled && not subscribed - KOBO PLUS: Read as much as you want with a Kobo Plus subscription- kobo store -> kobo plus - # 3 - Overdrive - overdrive enabled && not signed in - OVERDRIVE: Borrow eBooks from your public library - overdrive about - # 4 - Categories - always - CATEGORIES: Browse fiction, romance, biography and more - kobo store -> categories - # 9 - NaturalLight - has light sensor && not viewed tutorial - DEVICE NAME: Learn about the Natural Light feature - rgb front light about - # 10 - QuickTour - quick tour not shown && quick turn tile not visible - GETTING STARTED: Get to know your %0 - quick tour - # 11 - ReadingTour - read a book tour not showed - READING A BOOK: Get quick tips about reading on your eReader - read a book tutorial - # 12 - UserGuide - user guide present && not opened - USER GUIDE: Read the user guide for your %0 - read -> user guide - # 13 - RelatedReads - recent book available from Activity - RELATED READS: Discover books related to the ones you're reading - browse -> similar books - # 14 - Wishlist - no wishlist items || something else - WISHLIST: Create a Wishlist of books you're interested in - browse -> wishlist - # 15 - ReadingSettings - reading settings not changed - READING SETTINGS: Customize the way you read a book - settings -> reading settings - # 16 - ReadingStats - books finished > 0 && hours read rounded to .5 > 0 - READING STATS: You've finished %n books and read for %n hours - reading life -> stats - # 17 - SuperPoints - participating in super points && points > 2400 - KOBO SUPER POINTS: You have %0 Super Points to redeem - kobo store - # 18 - PocketUser - unread pocket articles > 0 - POCKET: Catch up on the %n article(s) you added recently - library -> pocket - # - - BaseAddress: {Sym: "SmartLinkWidget::showRotationMessage(Device const&)", Rel: 20} - - ReplaceBytes: {FindInstBLX: {SymPLT: "ActivityManager::smartLinkGeneralMessage(Device const&)"}, ReplaceH: 4F F0 04 00} # MOV.W r0, #4 - # set the new SmartLink to show (you can set this to your preference based on - # the list above, but it MUST be one of the above options, or you may need - # to factory reset): - - ReplaceInt: {Offset: 2, Find: 4, Replace: 4} - -Only show Pocket SmartLink: - - Enabled: no - - PatchGroup: SmartLink - - Description: Only show the Pocket SmartLink on the home screen. - - ReplaceBytes: - Base: "SmartLinkWidget::showRotationMessage(Device const&)" - Offset: 20 - FindInstBLX: {SymPLT: "ActivityManager::smartLinkGeneralMessage(Device const&)"} - ReplaceH: 4F F0 12 00 - # replace the text (choose one, or remove both): - - FindReplaceString: {Find: "Catch up on the %n article(s) you added recently", Replace: "My Articles"} -# - FindReplaceString: {Find: "Catch up on the %n article(s) you added recently", Replace: "My Articles (%n unread)"} - -Only show stats SmartLink: - - Enabled: no - - PatchGroup: SmartLink - - Description: Only show the stats SmartLink on the home screen. - - ReplaceBytes: - Base: "SmartLinkWidget::showRotationMessage(Device const&)" - Offset: 20 - FindInstBLX: {SymPLT: "ActivityManager::smartLinkGeneralMessage(Device const&)"} - ReplaceH: 4F F0 10 00 - -Never show Kobo Plus, wishlist, and points SmartLinks: - - Enabled: no - - PatchGroup: SmartLink - - Description: Removes Kobo Plus, wishlist, and points SmartLinks from the rotation. - - BaseAddress: "ActivityManager::smartLinkGeneralMessage(Device const&)" - # NOP Kobo Plus (2): - - ReplaceBytes: {Offset: 292, FindH: 02 23, CheckOnly: true} # MOVS r3, #2 - - ReplaceBytes: {Offset: 302, FindInstBLX: {SymPLT: "QVector::append(SmartLinkType const&)"}, ReplaceInstNOP: true} - # NOP wishlist (14): - - ReplaceBytes: {Offset: 266, FindH: 0E 23, CheckOnly: true} # MOVS r3, #14 - - ReplaceBytes: {Offset: 276, FindInstBLX: {SymPLT: "QVector::append(SmartLinkType const&)"}, ReplaceInstNOP: true} - # NOP super points (17): - - ReplaceBytes: {Offset: 1540, FindH: 11 23, CheckOnly: true} # MOVS r3, #17 - - ReplaceBytes: {Offset: 1552, FindInstBLX: {SymPLT: "QVector::append(SmartLinkType const&)"}, ReplaceInstNOP: true} - -### - -### Hide top-left menu items ### -# This following patches take advantage of the parental controls feature, as -# StatusBarMenuController::updateParentControlSensitiveMenuItems is always -# called when setting them up. All that is needed to hide items is to hardcode -# false before calling QAction::setVisible ([XX 46] mov r1, XX -> [00 21] movs r1, #0). -# To prevent ghost items, the value which stores the number of items to draw -# also needs to be fixed before the ldrex/strex just after the setVisible. - -# Note for updating: -# It's just the r1 before QAction::setVisible and after -# QWidgetAction::defaultWidget for each widget name. - -Hide top-left menu item - Dropbox: - - Enabled: no - - Description: See the comment above. - - BaseAddress: {Sym: "StatusBarMenuController::updateParentControlSensitiveMenuItems()", Rel: 182} - - ReplaceBytes: {Offset: 0, FindH: 51 46, ReplaceH: 00 21} # DropboxSeparator (sl=51) (sl:sb&r5) - - ReplaceBytes: {Offset: 22, FindH: 51 46, ReplaceH: 00 21} # DropboxSeparator (sl=51) - - BaseAddress: {Sym: "StatusBarMenuController::updateParentControlSensitiveMenuItems()", Rel: 366} - - ReplaceBytes: {Offset: 0, FindH: 41 46, ReplaceH: 00 21} # DropboxWidget (sb=41) (sb:sb&r5) - - ReplaceBytes: {Offset: 22, FindH: 41 46, ReplaceH: 00 21} # DropboxWidget (sb=41) - -Hide top-left menu item - Pocket: - - Enabled: no - - Description: See the comment above. - - BaseAddress: {Sym: "StatusBarMenuController::updateParentControlSensitiveMenuItems()", Rel: 544} - - ReplaceBytes: {Offset: 0, FindH: 29 46, ReplaceH: 00 21} # PocketSeparator (r5=29) - - ReplaceBytes: {Offset: 22, FindH: 29 46, ReplaceH: 00 21} # PocketSeparator (r5=29) - - BaseAddress: {Sym: "StatusBarMenuController::updateParentControlSensitiveMenuItems()", Rel: 722} - - ReplaceBytes: {Offset: 0, FindH: 29 46, ReplaceH: 00 21} # PocketWidget (r5=29) - - ReplaceBytes: {Offset: 22, FindH: 29 46, ReplaceH: 00 21} # PocketWidget (r5=29) - -Hide top-left menu item - Store: - - Enabled: no - - Description: See the comment above. - - BaseAddress: {Sym: "StatusBarMenuController::updateParentControlSensitiveMenuItems()", Rel: 900} - - ReplaceBytes: {Offset: 0, FindH: 29 46, ReplaceH: 00 21} # StoreSeparator (r5=29) - - ReplaceBytes: {Offset: 22, FindH: 29 46, ReplaceH: 00 21} # StoreSeparator (r5=29) - - BaseAddress: {Sym: "StatusBarMenuController::updateParentControlSensitiveMenuItems()", Rel: 1078} - - ReplaceBytes: {Offset: 0, FindH: 29 46, ReplaceH: 00 21} # StoreWidget (r5=29) - - ReplaceBytes: {Offset: 22, FindH: 29 46, ReplaceH: 00 21} # StoreWidget (r5=29) - -Hide top-left menu item - Recommended: - - Enabled: no - - Description: See the comment above. - - BaseAddress: {Sym: "StatusBarMenuController::updateParentControlSensitiveMenuItems()", Rel: 1196} - - ReplaceBytes: {Offset: 0, FindH: 29 46, ReplaceH: 00 21} # RecommendedSeparator (r5=29) - - ReplaceBytes: {Offset: 22, FindH: 29 46, ReplaceH: 00 21} # RecommendedSeparator (r5=29) - - BaseAddress: {Sym: "StatusBarMenuController::updateParentControlSensitiveMenuItems()", Rel: 1308} - - ReplaceBytes: {Offset: 0, FindH: 29 46, ReplaceH: 00 21} # RecommendedWidget (r5=29) - - ReplaceBytes: {Offset: 22, FindH: 29 46, ReplaceH: 00 21} # RecommendedWidget (r5=29) - -# Note about updating: the following ones were mistakenly detected as outside -# the procedure by Hopper, but this can be fixed by NOPing the DDs between and -# recreating the procedure (press P at the start). - -Hide top-left menu item - Wishlist: - - Enabled: no - - Description: See the comment above. - - BaseAddress: {Sym: "StatusBarMenuController::updateParentControlSensitiveMenuItems()", Rel: 4380} - - ReplaceBytes: {Offset: 0, FindH: 51 46, ReplaceH: 00 21} # WishlistSeparator (fp=51) (fp:sb&r5) - - ReplaceBytes: {Offset: 22, FindH: 51 46, ReplaceH: 00 21} # WishlistSeparator (fp=51) - - BaseAddress: {Sym: "StatusBarMenuController::updateParentControlSensitiveMenuItems()", Rel: 4778} - - ReplaceBytes: {Offset: 0, FindH: 49 46, ReplaceH: 00 21} # WishlistWidget (r8=49) (r8:r8&r5) - - ReplaceBytes: {Offset: 22, FindH: 49 46, ReplaceH: 00 21} # WishlistWidget (r8=49) - -Hide top-left menu item - Activity: - - Enabled: no - - Description: See the comment above. - - BaseAddress: {Sym: "StatusBarMenuController::updateParentControlSensitiveMenuItems()", Rel: 5172} - - ReplaceBytes: {Offset: 0, FindH: 29 46, ReplaceH: 00 21} # ActivitySeparator (r5=29) - - ReplaceBytes: {Offset: 22, FindH: 29 46, ReplaceH: 00 21} # ActivitySeparator (r5=29) - - BaseAddress: {Sym: "StatusBarMenuController::updateParentControlSensitiveMenuItems()", Rel: 5656} - - ReplaceBytes: {Offset: 0, FindH: 29 46, ReplaceH: 00 21} # ActivityWidget (r5=29) - - ReplaceBytes: {Offset: 22, FindH: 29 46, ReplaceH: 00 21} # ActivityWidget (r5=29) - -### - -Increase TOC level indentation: - - Enabled: no - - PatchGroup: TOC Indentation - - Description: | - The space indented Table of Contents levels are quite hard to see, as the - difference is almost too small to easily notice. - - ReplaceBytes: - Base: {Sym: "N3TableOfContentsWidget::setContent(Shortcover const&)"} - Offset: 198 - FindH: 42 00 # left shift by 1 (i.e. multiply by 2) (LSLS r2, r0, #1) - ReplaceH: 82 00 # left shift by 2 (i.e. multiply by 4) (LSLS r2, r0, #2) - -Increase TOC level indentation and fix extra indentation bug: - - Enabled: no - - PatchGroup: TOC Indentation - - Description: | - The space indented Table of Contents levels are quite hard to see, as the - difference is almost too small to easily notice. In addition, this fixes - the bug where all TOC entries are indented by 1 level extra. - - BaseAddress: {Sym: "N3TableOfContentsWidget::setContent(Shortcover const&)", Rel: 194} - # Clear out existing instructions with NOPs - - ReplaceBytes: {Offset: 0, FindH: 07 F1 0C 0B, ReplaceH: 00 20 00 20} # put string address in fp - - ReplaceBytes: {Offset: 4, FindH: 42 00, ReplaceH: 00 20} # shift level by 1 (multiply by 2) into r2 - - ReplaceBytes: {Offset: 6, FindH: 4F F0 20 01, ReplaceH: 00 20 00 20} # set r1 to 0x20 (space char) - - ReplaceBytes: {Offset: 10, FindH: 58 46, ReplaceH: 00 20} # put fp in r0 - # Put new instructions - - ReplaceBytes: {Offset: 0, FindH: 00 20, ReplaceH: 40 1E} # decrease level by 1 - - ReplaceBytes: {Offset: 2, FindH: 00 20, ReplaceH: 82 00} # shift level by 2 (multiply by 4) into r2 - - ReplaceBytes: {Offset: 4, FindH: 00 20, ReplaceH: 20 21} # set r1 to 0x20 (space char) - - ReplaceBytes: {Offset: 6, FindH: 00 20 00 20, ReplaceH: 07 F1 0C 0B} # put string address into fp - - ReplaceBytes: {Offset: 10, FindH: 00 20, ReplaceH: 58 46} # put fp in r0 - -Allow showing info panel on random screensaver: - - Enabled: no - - Description: | - See https://www.mobileread.com/forums/showthread.php?t=321609. This patch - allows showing the info panel even when using a random screensaver image - from .kobo/screensaver (note that full-screen covers needs to be enabled - for the screensaver to show). - - ReplaceBytes: - Base: "PowerViewController::updateCover()" - Offset: 252 - FindInstBLX: {SymPLT: "FullScreenDragonPowerView::setInfoPanelVisible(bool)"} - ReplaceInstNOP: true - -Remove title from reading header/footer: - - Enabled: no - - Description: Removes the chapter/book title from the new reading header/footer. - # In the longest form of ReadingFooter::update (the others are wrappers with - # the args being set to the current value), the first one is the title. The - # final string is created by starting with the title, then appending the "-", - # then the page number / percentage / etc text. - # - # This one is slightly unusual in that the reading header also shares the - # ReadingFooter code (ReadingView::updateProgressHeader only has the page - # text, and it ends with a branch to ReadingFooter::update). This means we - # only have to patch one place, but it also means you can't have the title in - # one, but not the other. - # - # We'll patch this in a slightly hacky and inefficient, but simple and - # easy-to-update way by replacing the first QString::append (the dash) with a - # QString::resize to zero (I would have done a QString::clear, but that symbol - # isn't imported): - - BaseAddress: {Sym: "ReadingFooter::update(QString const&, QString const&, QString const&, bool)", Rel: 298} - - ReplaceBytes: {Offset: 0, FindH: F9 68, ReplaceH: 00 21} # replace LDR r1, [...] with MOV r1, #0 (the LDR doesn't matter, but may to be updated to match) - - ReplaceBytes: {Offset: 4, FindInstBLX: {SymPLT: "QString::append(QString const&)"}, ReplaceInstBLX: {SymPLT: "QString::resize(int)"}} - -# Prevent Kobo from scanning dotfiles/folders (since 4.17.13651): See https://www.mobileread.com/forums/showthread.php?t=323083. - -Larger Sleep/Power-off timeouts: - - Enabled: no - - PatchGroup: Sleep/Power-off timeouts - - Description: | - Increase the available sleep/power-off timeouts to larger values (up to a - few weeks). To customize this patch, see https://pgaskin.net/kobopatch-patches/lgrpwroff-14601.html . - - IMPORTANT - Although this patch has been tested by multiple users and - confirmed to be working, the interaction between the RTC timer and Nickel - has many moving parts. As reported by JSWolf on MR, this patch might have - issues with actually powering-off with timeouts longer than a day. The - cause is likely to be the auto-sync interval or sleepcover causing the - timer to be overridden/reset every day. Nevertheless, this patch should - work reliably for timeouts under 12 hours, and probably under 1 day. - - If you are using this patch with timeouts above 12 hours, and can confirm - if it works/doesn't work, please PM me or comment on GitHub with your - setting values, sleepcover or not, auto-sync interval, wifi on/off, firmware - version, and Kobo model. - - See https://github.com/geek1011/kobopatch-patches/issues/28#issuecomment-537161827 - for more details about this. - # Multipliers - - ReplaceBytes: - Base: "N3PowerWorkflowManager::configureWakeup(AlarmControl*, int, char const*)" - Offset: 12 - FindH: 04 FB 05 F5 # MUL r5(dest), r4(multiplier), r5(mins) - ReplaceH: 4F EA C5 45 # LSL r5, r5, #19 - - ReplaceBytes: {Base: "N3PowerWorkflowManager::pollBattery()", Offset: 106, FindH: 08 FB 00 F8, ReplaceH: 4F EA C0 48} # MUL r8(dest), r8(multiplier), r0(mins) -> LSL r8, r0, #19 - - ReplaceBytes: {Base: "N3PowerWorkflowManager::pollBattery()", Offset: 156, FindH: 02 FB 00 F2, ReplaceH: 4F EA C0 42} # MUL r2(dest), r2(multiplier), r0(mins) -> LSL r2, r0, #19 - # Menu text - - FindBaseAddressString: "5 mins\0" - - ReplaceString: {Offset: 0, Find: "5 mins\0", Replace: "8m"} - - ReplaceString: {Offset: 8, Find: "10 mins", Replace: "34m"} - - ReplaceString: {Offset: 16, Find: "15 mins", Replace: "1h1m"} - - ReplaceString: {Offset: 24, Find: "30 mins", Replace: "4h4m"} - - ReplaceString: {Offset: 32, Find: "45 mins", Replace: "12h5m"} - - ReplaceString: {Offset: 38, Find: "60 mins", Replace: "24h1m"} - # Values (see https://www.mobileread.com/forums/showpost.php?p=3887105) - - FindBaseAddressSymbol: "N3SettingsPowerView::initChoices()" - - ReplaceInt: {Offset: 11, Find: 5, Replace: 1} - - ReplaceInt: {Offset: 465, Find: 5, Replace: 1} - - ReplaceInt: {Offset: 99, Find: 10, Replace: 4} - - ReplaceInt: {Offset: 525, Find: 10, Replace: 4} - - ReplaceInt: {Offset: 159, Find: 15, Replace: 7} - - ReplaceInt: {Offset: 583, Find: 15, Replace: 7} - - ReplaceInt: {Offset: 219, Find: 30, Replace: 28} - - ReplaceInt: {Offset: 641, Find: 30, Replace: 28} - - ReplaceInt: {Offset: 279, Find: 45, Replace: 83} - - ReplaceInt: {Offset: 699, Find: 45, Replace: 83} - - ReplaceInt: {Offset: 339, Find: 60, Replace: 165} - - ReplaceInt: {Offset: 755, Find: 60, Replace: 165} - -Allow rotation on all devices: - - Enabled: no - - Description: | - Enables rotation on all devices. This shows a rotation icon in the status - bar, which shows a menu allowing you to choose between portrait and landscape - when pressed. This icon is only shown on rotateable views (like the reader). - Unlike only the DeveloperSettings ForceAllowLandscape option, this patch - also makes the rotation icon show on the new reader as well. - # Always return true for ForceAllowLandscape: - - ReplaceBytes: {Offset: 0x76745E, FindInstBLX: {SymPLT: "QVariant::toBool() const"}, ReplaceH: 4F F0 01 00} - # In ReadingMenuView::ReadingMenuView, replace the value of Device::hasOrientationSensor, - # which is passed to a function to hide/show the rotate icon: - - ReplaceBytes: {Offset: 0xB96E72, FindInstBLX: {SymPLT: "Device::hasOrientationSensor() const"}, ReplaceH: 4F F0 01 00} - # Also fix sizing of popup by doing the same in RotatePopup::RotatePopup, but - # note that this will make the Automatic option show too (and do nothing): - - ReplaceBytes: {Offset: 0xBB30CE, FindInstBLX: {SymPLT: "Device::hasOrientationSensor() const"}, ReplaceH: 4F F0 01 00} - -Don't uppercase header/footer text: - - Enabled: no - - Description: Prevents the text in the reader header/footer from being uppercased. - - PatchGroup: Header/footer page number text - # Replace QString::toUpper call with QString::trimmed (to copy the string, and - # not need to add a mov instruction and NOP the destructor): - - ReplaceBytes: - Base: "ReadingView::getChapterTitle()" - Offset: 282 - FindInstBLX: {SymPLT: "QString::toUpper() const"} - ReplaceInstBLX: {SymPLT: "QString::trimmed() const"} - - ReplaceBytes: - Base: "ReadingView::updateFooter()" - Offset: 26 - FindInstBLX: {SymPLT: "QString::toUpper() const"} - ReplaceInstBLX: {SymPLT: "QString::trimmed() const"} - # Page number text: - - FindReplaceString: {Find: "%1 OF %2", Replace: "%1 of %2"} - -Custom header/footer page number text: - - Enabled: no - - PatchGroup: Header/footer page number text - - Description: Changes the page number text format in the reading header & footer - - FindReplaceString: {Find: "%1 OF %2", Replace: "%1 / %2"} - -Don't uppercase header/footer text and change page number text: - - Enabled: no - - Description: Combines the previous two patches. - - PatchGroup: Header/footer page number text - - ReplaceBytes: - Base: "ReadingView::getChapterTitle()" - Offset: 282 - FindInstBLX: {SymPLT: "QString::toUpper() const"} - ReplaceInstBLX: {SymPLT: "QString::trimmed() const"} - - ReplaceBytes: - Base: "ReadingView::updateFooter()" - Offset: 26 - FindInstBLX: {SymPLT: "QString::toUpper() const"} - ReplaceInstBLX: {SymPLT: "QString::trimmed() const"} - - FindReplaceString: {Find: "%1 OF %2", Replace: "%1 / %2"} - -Swap reading header/footer: - - Enabled: no - - Description: | - Swaps the reading header/footer text (i.e. book progress on top, chapter - progress on the bottom). This patch has undefined behaviour if the header - or footer is disabled. - # Both the header and footer use the ReadingFooter class and update them using - # the overloaded ReadingFooter::update function. The difference is which r0 (this) - # is passed to them. Since tbe header and footer are both members of ReadingView, - # and they are loaded just before the update (and aren't used otherwise), they - # can be swapped by switching the struct offset used by LDR. - # - # Offsets (since 4.19.14123): - # - ReadingView->header - 0x10 - # - ReadingView->footer - 0x1C - - ReplaceBytes: - Base: "ReadingView::updateProgressHeader(QString const&, QString const&)" - Offset: 8 - FindH: 00 69 # LDR r0, [r0, #0x10] - ReplaceH: C0 69 # LDR r0, [r0, #0x1C] - - ReplaceBytes: - Base: "ReadingView::updatePercentageFooter(QString const&)" - Offset: 158 - FindH: C0 69 # LDR r0, [r0, #0x1C] - ReplaceH: 00 69 # LDR r0, [r0, #0x10] - - ReplaceBytes: - Base: "ReadingView::updatePageFooter(QString const&)" - Offset: 178 - FindH: C0 69 # LDR r0, [r0, #0x1C] - ReplaceH: 00 69 # LDR r0, [r0, #0x10] - - ReplaceBytes: - Base: "ReadingView::updateTimeFooter(QString const&)" - Offset: 100 - FindH: D3 F8 1C 90 # LDR.W sb, [r3, #0x1C] - ReplaceH: D3 F8 10 90 # LDR.W sb, [r3, #0x10] - -Enable advanced settings for all fonts: - - Enabled: no - - Description: | - This patch allows the advanced font options (weight/sharpness adjustments) - to work with sideloaded fonts too. (KEPUB - OTF and TTF. EPUB - TTF only.) - - ReplaceBytes: - Base: "AdvancedFontSettingsController::loadView()" # font dropdown in advanced font settings dialog - Offset: 144 - FindInstBLX: {SymPLT: "N3FontTypeUtil::setupMonotypeDropdown(TouchDropDown*, QString const&)"} # monotype fonts only - ReplaceInstBLX: {SymPLT: "N3FontTypeUtil::setupDropdown(TouchDropDown*, QString const&)"} # all fonts - - ReplaceBytes: - Base: "ReadingMenuFontSettingsController::setupAdvancedOption(QString const&)" - Offset: 112 - FindInstBLX: {SymPLT: "N3FontTypeUtil::isMonotypeFont(QString const&)"} - ReplaceH: 4F F0 01 00 - -Customize ComfortLight settings: - - Enabled: no - - Description: | - Change the times available in the ComfortLight bedtime dropdown and the - start/end times for the color changes. All values in this patch are - customizable. - - The default values for this patch give you 21 options between 5PM and 3AM - at 30 minute intervals, with the colour change starting at 4PM, and the - change back to blue between 5AM and 7AM. The firmware default is 13 options - between 9PM-3AM at 30 minute intervals, with the transition starting at 6PM. - ## - # In an unnamed subroutine two layers into FrontLightPopupController::loadView - # (find it by going back from QTime::addSecs), the times for the dropdown are - # generated into a QVector> with a simple loop. - - BaseAddress: 0xADA8B0 # find by the x-ref to _ZN5QTimeC1Eiiii from an unnamed sub - # - # Change the initial hour / first bedtime dropdown item passed to the QTime - # constructor (mov r1, #21): - - ReplaceInt: {Offset: 22, Find: 21, Replace: 17} # 21:00 (9PM) -> 17:00 (5PM) - # - # Optional: Change the increment passed to QTime::addSecs (you need to use an - # ARM assembler to change this value): - - ReplaceBytes: {Offset: 122, FindH: 4F F4 E1 61, ReplaceH: 4F F4 E1 61} # mov.w r1, #1800: 30m - # - # Change the number of increments / bedtime dropdown options (start at the - # initial time, add this number -1 more items with the above increment each - # time) (movs r5, #13): - - ReplaceInt: {Offset: 78, Find: 13, Replace: 21} # 13 [9PM..3AM]+30m -> 21 [5PM..3AM]+30m - # - # Change the number of pre-allocated elements (I don't think this is actually - # required, as Qt will realloc as necessary, but we might as well do this just - # in case) (mov r1, #21): - - ReplaceInt: {Offset: 696, Find: 13, Replace: 21} # same as prev replacement - ## - # The actual color adjustment is done in BedtimeManager::adjustTemperature. - # The color temperature is based on the current time, the bedtime, the hardcoded - # sunset, the hardcoded sunrise start, the hardcoded sunrise end, the daytime - # temperature, and the nighttime temperature. - - BaseAddress: "BedtimeManager::adjustTemperature()" - # - # Change the sunset time (the transition to a warmer temperature starts here - # and transitions until the bedtime chosen) (this should be 1-3 hours before - # the minimum bedtime from the first replacement above) (mov r1, #18): - - ReplaceInt: {Offset: 158, Find: 18, Replace: 16} # 18:00 (9PM-3=6PM) -> 16:00 (5PM-1=4PM) - # - # Change the time for the sunset timer to fire at (this is passed to a QTime - # constructor which is passed to PowerTime::fireAt) (mov r1, #18): - - ReplaceInt: {Offset: 438, Find: 18, Replace: 16} # should match the sunset time above - # - # Optional: Change the sunrise start time (the transition back to a cooler - # temperature starts here) (this should be sometime after the last bedtime, - # but before the sunset time) (mov r1, #5): - - ReplaceInt: {Offset: 192, Find: 5, Replace: 5} # 5AM - # - # Optional: Change the sunrise end time (the transition back to a cooler - # temperature ends here) (this should be 1-3 hours after the sunrise start but - # before the sunset time or bad things will happen with negative values) (mov r1, #7): - - ReplaceInt: {Offset: 138, Find: 7, Replace: 7} # 5AM+2=7AM - -# The following patches allow you to enable a config file option with a patch. - -FeatureSettings - BookSpecificStats: - - Enabled: no - - Description: Adds an option to view stats for a specific book to the book menu. - - ReplaceBytes: {Base: "FeatureSettings::bookSpecificStatsEnabled()", Offset: 54, FindInstBLX: {SymPLT: "QVariant::toBool() const"}, ReplaceH: 4F F0 01 00} - -FeatureSettings - ShowFacebookShare: - - Enabled: no - - Description: Re-enables the Facebook share option in menus. - - ReplaceBytes: {Base: "FeatureSettings::showFacebookShare()", Offset: 54, FindInstBLX: {SymPLT: "QVariant::toBool() const"}, ReplaceH: 4F F0 01 00} - -FeatureSettings - FullScreenBrowser: - - Enabled: no - - Description: Makes the browser fullscreen (note that there is no way out except for rebooting). - - ReplaceBytes: {Base: "FeatureSettings::fullScreenBrowser()", Offset: 54, FindInstBLX: {SymPLT: "QVariant::toBool() const"}, ReplaceH: 4F F0 01 00} - -FeatureSettings - MyWords: - - Enabled: no - - Description: Enables the My Words tab of the Activity screen. - - ReplaceBytes: {Base: "FeatureSettings::myWords()", Offset: 54, FindInstBLX: {SymPLT: "QVariant::toBool() const"}, ReplaceH: 4F F0 01 00} - -FeatureSettings - ExportHighlights: - - Enabled: no - - Description: Add an option to export highlights to the book menu. - - ReplaceBytes: {Base: "FeatureSettings::exportHighlightsEnabled()", Offset: 54, FindInstBLX: {SymPLT: "QVariant::toBool() const"}, ReplaceH: 4F F0 01 00} - -DeveloperSettings - AutoUsbGadget: - - Enabled: no - - Description: Automatically enable USB Storage mode when connected. - - ReplaceBytes: {Offset: 0x7674FE, FindInstBLX: {SymPLT: "QVariant::toBool() const"}, ReplaceH: 4F F0 01 00} - -PowerSettings - UnlockEnabled: - - Enabled: no - - Description: Disables/enables the slide to unlock feature. - - ReplaceBytes: {Base: "PowerSettings::getUnlockEnabled()", Offset: 62, FindInstBLX: {SymPLT: "QVariant::toBool() const"}, ReplaceH: 4F F0 00 00} # disable -# - ReplaceBytes: {Base: "PowerSettings::getUnlockEnabled()", Offset: 62, FindInstBLX: {SymPLT: "QVariant::toBool() const"}, ReplaceH: 4F F0 01 00} # enable -# The following patch(es) were made by GeoffR, and most are updated by geek1011 +# The following patch(es) were made by GeoffR, and most are updated by pgaskin (geek1011) # The next 2 patches are alternatives. # Beware that the KePub reader has problems with its page break position @@ -894,8 +184,8 @@ Custom font sizes: # Glo/Aura: 12px - 88px (50 sizes) # Touch/Mini: 12px - 80px (48 sizes) # - # Note (geek1011): The device values can be determined with info from - # https://gist.github.com/geek1011/613b34c23f026f7c39c50ee32f5e167e and + # Note (pgaskin): The device values can be determined with info from + # https://gist.github.com/pgaskin/613b34c23f026f7c39c50ee32f5e167e and # the Device::is* calls. # - BaseAddress: "N3FontTypeUtil::fontSizes()" @@ -943,7 +233,7 @@ ePub disable built-in body padding-bottom: The built-in ePub stylesheet adds a line of padding at the bottom of the body element, to prevent the chapter ending on the last line of a page. This patch disables that stylesheet entry. - + This patch is not compatible with `ePub fixed/adjustable top/bottom margins` patch, which already removes this stylesheet entry to make room for other things. @@ -970,12 +260,12 @@ Block WiFi firmware upgrade: - PatchGroup: Firmware upgrade options - Description: | WARNING! THIS IS A DANGEROUS PATCH! READ THE INFORMATION BELOW CAREFULLY! - + THIS PATCH IS UNTESTED, as there is no way to be sure it still works until the next firmware version is released. If it works then the firmware will not be upgraded during a WiFi sync, but you will still be able to upgrade manually or by syncing with the Kobo desktop. - + THIS PATCH COULD RESULT IN A BOOT LOOP when signing out of your Kobo account (Settings > Accounts > Sign out) or when invoking a factory reset from the device information menu (Settings > Device information > Factory reset). @@ -1025,10 +315,10 @@ Set KePub hyphenation: to turn on hyphenation, but it is only used if the device's justification button is set to full justification. With this patch enabled hyphenation will always be turned on, regardless of justification button setting. - + (The publisher can still turn hyphenation off/on in the book's stylesheet.) - - ReplaceBytes: {Offset: 0xB7FEEA, FindInstBLX: {SymPLT: "QString::operator==(QLatin1String) const"}, ReplaceH: 01 20 01 20} # Alternative 1: Always turn KePub hyphenation on -# - ReplaceBytes: {Offset: 0xB7FEEA, FindInstBLX: {SymPLT: "QString::operator==(QLatin1String) const"}, ReplaceH: 00 20 00 20} # Alternative 2: Never turn KePub hyphenation on + - ReplaceBytes: {Offset: 0xB8F15E, FindInstBLX: {SymPLT: "QString::operator==(QLatin1String) const"}, ReplaceH: 01 20 01 20} # Alternative 1: Always turn KePub hyphenation on +# - ReplaceBytes: {Offset: 0xB8F15E, FindInstBLX: {SymPLT: "QString::operator==(QLatin1String) const"}, ReplaceH: 00 20 00 20} # Alternative 2: Never turn KePub hyphenation on Force user line spacing in KePubs: - Enabled: no @@ -1113,8 +403,8 @@ KePub constant font sharpness: Find: "body { -kobo-font-sharpness: %1; -kobo-font-thickness: %2; }\n" Replace: "body{-kobo-font-sharpness:0.0/*%1*/;-kobo-font-thickness:%2}\n" MustMatchLength: yes - - ReplaceString: - Offset: 5 + - ReplaceString: + Offset: 5 Find: "-kobo-font-sharpness:0.0" Replace: "-kobo-font-sharpness:0.2" # Replacement sharpness value MustMatchLength: yes @@ -1127,7 +417,7 @@ Un-Force user text-align in div,p tags in KePubs: # div, p { text-align: %1 !important; } # --> body { text-align: %1 !important; } - FindBaseAddressString: "div, p { text-align: %1" - - ReplaceString: + - ReplaceString: Find: "div, p {" Replace: "body {" MustMatchLength: yes @@ -1244,16 +534,16 @@ Set font scale factor: # Original value X=14, so original scale factor is (font size slider) / 46. # Allowed replacement values for X: 0-15 (smaller X --> larger scale factor) # Note: vmov.f32 s1, #15.0 before getReadingFontSizeScaleFactor - - ReplaceInt: {Offset: 0x5773AC, Find: 14, Replace: 4} # ePub - - ReplaceInt: {Offset: 0xB7FAC0, Find: 14, Replace: 4} # KePub + - ReplaceInt: {Offset: 0x586A7C, Find: 14, Replace: 4} # ePub + - ReplaceInt: {Offset: 0xB8ED34, Find: 14, Replace: 4} # KePub # The following patch(es) were made by jackie_w Dictionary text font-family/font-size/line-height: - Enabled: no - Description: | - This patch allows you to to customise the appearance of the text + This patch allows you to to customise the appearance of the text in the pop-up and full-screen dictionary widgets. - 4.17.13651: improved to also reduce the blank lines displayed in many + 4.17.13651: improved to also reduce the blank lines displayed in many sideloaded custom dictionaries which contain
. . See https://www.mobileread.com/forums/showpost.php?p=3521137&postcount=48 @@ -1291,18 +581,18 @@ Dictionary text font-family/font-size/line-height: # Stage 2: N.B. You MUST keep old and new strings EXACTLY the same length # # Notes for changing font-family: - # 1. Pad the shorter of the old/new strings with spaces to + # 1. Pad the shorter of the old/new strings with spaces to # keep same length for both strings (see examples below) # - # 2. If the new font-family name (max. 29 chars) contains any spaces it + # 2. If the new font-family name (max. 29 chars) contains any spaces it # should be wrapped in 'single quotes' (see examples 2, 3) # - # 3. To change from Georgia to the Kobo default sans-serif font, Avenir, + # 3. To change from Georgia to the Kobo default sans-serif font, Avenir, # use either one of the following to achieve the same result: # - sans-serif # - 'Avenir Next Medium' - # - # Un-comment ONE ONLY of the following ReplaceString examples + # + # Un-comment ONE ONLY of the following ReplaceString examples # to change dictionary font-family from default Georgia: # - to a different built-in font # - to one of your sideloaded custom fonts @@ -1339,10 +629,10 @@ Change Wikipedia search language: The patch set the search language in Wikipedia. Replace the "en" (in both the replace_string lines) to language code you want. For example English is "en" (set as default), for German is "de", for Russian is "ru". - - FindReplaceString: + - FindReplaceString: Find: "\0https://%1.m.wikipedia.org/wiki/Special:Search\0" Replace: "\0https://es.m.wikipedia.org/wiki/Special:Search\0" - - FindReplaceString: + - FindReplaceString: Find: "\0https://%1.wikipedia.org/wiki/Special:Search\0" Replace: "\0https://es.wikipedia.org/wiki/Special:Search\0" # The following keyboard patches were originally by GeoffR and updated by various users. @@ -1353,7 +643,7 @@ Cyrillic Keyboard (GloHD/ClaraHD/AuraOne/H2O2): - PatchGroup: Keyboard alternatives - Description: | Replaces keys on the Extended Latin keypad with Cyrillic alternatives. - + Note that after the device boots, the keypad might just show blank squares until after the first book has been opened. Also note that long-pressing keys on the base keypad will no longer show @@ -1412,7 +702,7 @@ Greek Keyboard (GloHD/ClaraHD/AuraOne/H2O2): - PatchGroup: Keyboard alternatives - Description: | Replaces keys on the Extended Latin keypad with Cyrillic alternatives. - + Note that after the device boots, the keypad might just show blank squares until after the first book has been opened. Also note that long-pressing keys on the base keypad will no longer show @@ -1531,4 +821,664 @@ Bulgarian Phonetic Keyboard (GloHD/ClaraHD/AuraOne/H2O2/Forma/Libra): Don't grab exclusive access to event0: - Enabled: no - Description: Allows third-party tools to read the event0 input device - - FindReplaceString: {Find: "%0:keymap=keys/device.qmap:grab=1", Replace: "%0:keymap=keys/device.qmap:grab=0"} + - FindReplaceString: {Find: "%0::keymap=keys/device.qmap::grab=1", Replace: "%0::keymap=keys/device.qmap::grab=0"} +# The following patch(es) are by pgaskin (geek1011) + +Both page turn buttons go next: + - Enabled: no + - Description: Make both page turn buttons on the Forma go next in the reader. + - ReplaceBytes: + Base: "ReadingView::keyPressEvent(QKeyEvent*)" + Offset: 54 + FindInstBW: {SymPLTTail: "ReadingView::prevPageWithTimer()"} + ReplaceInstBW: {SymPLTTail: "ReadingView::nextPageWithTimer()"} + +Both page turn sides go next: + - Enabled: no + - Description: Make both page turn sides go next in the reader. + # In ReadingView::processTap(TapGesture*) where the page direction is checked: + - BaseAddress: {Sym: "ReadingView::processTap(TapGesture*)", Rel: 390} + - ReplaceBytes: {Offset: 0, FindInstBLX: {SymPLT: "ReadingView::leftToRightPageProgressDirection() const"}, CheckOnly: true} + # nop the branch for checking if left-to-right (so it always runs the swap of back/forward) + - ReplaceBytes: {Offset: 4, FindH: 18 B9, ReplaceInstNOP: true} + # where r3 = *(r7+0x18) (back) and r2 = *(r7+0x20) (forward), then they are stored in reverse, + # instead of storing each one, just store forward (by changing the source register in the str + # instruction) + - ReplaceBytes: {Offset: 10, FindH: 3B 62, ReplaceH: 3A 62} + # This patch could have also been done later on where the tap point is checked against different + # QRects, but that's a lot more complicated due to the use of QHash s of pointers to functions. + +Increase page navigation history: + - Enabled: no + - Description: Increases the number of dots marking navigation history on the scrubber. + # Replace the immediate value for the cmp r1, #2 before the bgt to the inlined + # QVector::removeFirst() (i e. QVector::erase(start, start+1)): + - BaseAddress: "BookmarkHistoryMixin::pushBookmark(Bookmark const&)" + - ReplaceInt: {Offset: 18, Find: 2, Replace: 4} # note: you can set thr replacement to whatever you want, but it MUST be > 1 or bad things will happen + +Replace adobe page numbers toggle with invert screen: + - Enabled: no + - Description: | + Replaces the adobe page numbers toggle in reading settings with an invert + screen one. + # Settings page + - BaseAddress: "N3SettingsReadingView::N3SettingsReadingView(QWidget*)" + - ReplaceBytes: {Offset: 876, FindInstBLX: {SymPLT: "ReadingSettings::getShowAdobePageNumbers()"}, ReplaceInstBLX: {SymPLT: "FeatureSettings::invertScreen()"}} + # Settings page controller + - BaseAddress: {Sym: "N3SettingsReadingController::showAdobePageNumbersToggled()"} + - ReplaceBytes: {Offset: 62, FindInstBLX: {SymPLT: "ReadingSettings::getShowAdobePageNumbers()"}, ReplaceInstBLX: {SymPLT: "FeatureSettings::invertScreen()"}} + - ReplaceBytes: {Offset: 74, FindInstBLX: {SymPLT: "ReadingSettings::setShowAdobePageNumbers(bool)"}, ReplaceInstBLX: {SymPLT: "FeatureSettings::setInvertScreen(bool)"}} + # Settings page text + - FindReplaceString: {Find: "Show Adobe EPUB page numbers", Replace: "Invert screen"} + +Always show confirmation dialog before upgrading: + - Enabled: no + - PatchGroup: Firmware upgrade options + - Description: This patch makes the confirmation dialog always show before upgrading. + - BaseAddress: "UpgradeManager::requestUpgradeConfirmation(UpgradeType, QString const&)" + - ReplaceBytes: {Offset: 22, FindH: 01 2C, ReplaceH: A4 42} # make the optional UpgradeType check always true (CMP r4, #1 -> CMP r4, r4) + - ReplaceBytes: {Offset: 42, FindInstBLX: {SymPLT: "UpgradeManager::isSilent()"}, ReplaceH: 4F F0 00 00} # make the call to UpgradeManager::isSilent always false (MOV r0, #0) + +Allow USB storage even when device locked: + - Enabled: no + - Description: | + Always allows USB storage even when the device is locked. When combined + with an enabled lock screen, this patch allows recovery from almost any + segfaulting patch without a factory reset, as most code isn't executed + until after the initial unlock. WARNING - this patches renders the lock + screen security completely useless! But, for some security by obscurity + this will only take effect when you plug it in while the sleep screen is + visible. + # Never reject the permission request (i.e. don't set *r5 = false), even when + # the PIN entry dialog is enabled: + - ReplaceBytes: + Base: "N3PowerWorkflowManager::onUSBPlugPermissionRequest(PermissionRequest*)" + Offset: 40 + FindH: 2B 70 # strb r3, [r5] + ReplaceInstNOP: true + +Hide browser from beta features: + - Enabled: no + - Description: Hides the built-in browser from beta features. + - ReplaceBytes: + Base: "N3SettingsExtrasView::N3SettingsExtrasView(QWidget*)" + Offset: 1220 + FindInstBLX: {SymPLT: "Device::isParentalControlEnabled() const"} + ReplaceH: 4F F0 01 00 + - ReplaceBytes: + Base: {Sym: "SelectionMenuController::setupMainOptions()"} + Offset: 396 + FindInstBLX: {SymPLT: "Device::isParentalControlEnabled() const"} + ReplaceH: 4F F0 01 00 + +Remove beta features not supported text: + - Enabled: no + - Description: Does what it says to clear up the clutter. + - ReplaceBytes: + Base: "Ui_N3SettingsExtrasView::retranslateUi(QWidget*)" + Offset: 96 + FindInstBLX: {SymPLT: "QLabel::setText(QString const&)"} + ReplaceInstBLX: {SymPLT: "QWidget::hide()"} + +Disable all tutorial dialogs: + - Enabled: no + - Description: | + Removes the annoying tutorials (and recurring dialogs). Note - I may + have missed a few of them. If I have, just open an issue on GitHub or + PM me (geek1011) on MobileRead, and I'll fix it. + # QVariant::toBool is called after getting the setting (of if it has/should + # show) as a QVariant. I am replacing this method as opposed to replacing the + # return value of the function because 1. A MOV instruction with an immediate + # (fixed) value is 4 long (rather than 2) and 2. This is simpler to update as + # I only need to update the function offset and the offset for each setting. + - ReplaceBytes: {Base: "DialogSettings::firstPurchaseCreditJitShown()", Offset: 54, FindInstBLX: {SymPLT: "QVariant::toBool() const"}, ReplaceH: 4F F0 01 00} + - ReplaceBytes: {Base: "DialogSettings::quickTurnDialogShown()", Offset: 54, FindInstBLX: {SymPLT: "QVariant::toBool() const"}, ReplaceH: 4F F0 01 00} + - ReplaceBytes: {Base: "DialogSettings::returningReaderDialogShown()", Offset: 54, FindInstBLX: {SymPLT: "QVariant::toBool() const"}, ReplaceH: 4F F0 01 00} + - ReplaceBytes: {Base: "ApplicationSettings::koboLoveDialogShown()", Offset: 54, FindInstBLX: {SymPLT: "QVariant::toBool() const"}, ReplaceH: 4F F0 01 00} + - ReplaceBytes: {Base: "ApplicationSettings::quickTourWidgetShown()", Offset: 54, FindInstBLX: {SymPLT: "QVariant::toBool() const"}, ReplaceH: 4F F0 01 00} + - ReplaceBytes: {Base: "ApplicationSettings::overDriveFilterShown()", Offset: 54, FindInstBLX: {SymPLT: "QVariant::toBool() const"}, ReplaceH: 4F F0 01 00} + - ReplaceBytes: {Base: "ApplicationSettings::wifiReminderDialogShown()", Offset: 54, FindInstBLX: {SymPLT: "QVariant::toBool() const"}, ReplaceH: 4F F0 01 00} + - ReplaceBytes: {Base: "ApplicationSettings::readABookShown()", Offset: 54, FindInstBLX: {SymPLT: "QVariant::toBool() const"}, ReplaceH: 4F F0 01 00} + - ReplaceBytes: {Base: "ApplicationSettings::borrowDialogShown()", Offset: 54, FindInstBLX: {SymPLT: "QVariant::toBool() const"}, ReplaceH: 4F F0 01 00} + - ReplaceBytes: {Base: "ApplicationSettings::quickTourShown()", Offset: 54, FindInstBLX: {SymPLT: "QVariant::toBool() const"}, ReplaceH: 4F F0 01 00} + - ReplaceBytes: {Base: "ApplicationSettings::libraryFTEShown()", Offset: 54, FindInstBLX: {SymPLT: "QVariant::toBool() const"}, ReplaceH: 4F F0 01 00} + - ReplaceBytes: {Base: "ApplicationSettings::zoomFTEShown()", Offset: 54, FindInstBLX: {SymPLT: "QVariant::toBool() const"}, ReplaceH: 4F F0 01 00} + - ReplaceBytes: {Base: "ApplicationSettings::welcomeShown()", Offset: 54, FindInstBLX: {SymPLT: "QVariant::toBool() const"}, ReplaceH: 4F F0 01 00} + - ReplaceBytes: {Base: "ApplicationSettings::koboPlusPromoShown()", Offset: 54, FindInstBLX: {SymPLT: "QVariant::toBool() const"}, ReplaceH: 4F F0 01 00} + - ReplaceBytes: {Base: "ApplicationSettings::syncWarningDialogShown()", Offset: 54, FindInstBLX: {SymPLT: "QVariant::toBool() const"}, ReplaceH: 4F F0 01 00} + - ReplaceBytes: {Base: "ApplicationSettings::addedToMyWordsDialogShown()", Offset: 54, FindInstBLX: {SymPLT: "QVariant::toBool() const"}, ReplaceH: 4F F0 01 00} + - ReplaceBytes: {Base: "ApplicationSettings::longPressDialogShown()", Offset: 54, FindInstBLX: {SymPLT: "QVariant::toBool() const"}, ReplaceH: 4F F0 01 00} + - ReplaceBytes: {Base: "ApplicationSettings::swipeDialogShown()", Offset: 54, FindInstBLX: {SymPLT: "QVariant::toBool() const"}, ReplaceH: 4F F0 01 00} + - ReplaceBytes: {Base: "ApplicationSettings::syncReminderDialogShown()", Offset: 54, FindInstBLX: {SymPLT: "QVariant::toBool() const"}, ReplaceH: 4F F0 01 00} + - ReplaceBytes: {Base: "ApplicationSettings::eReaderBooksManagementFTEShown()", Offset: 54, FindInstBLX: {SymPLT: "QVariant::toBool() const"}, ReplaceH: 4F F0 01 00} + - ReplaceBytes: {Base: "ApplicationSettings::libraryCuratedListsDialogShown()", Offset: 54, FindInstBLX: {SymPLT: "QVariant::toBool() const"}, ReplaceH: 4F F0 01 00} + +Remove recommendations (row1col2) from home screen: + - Enabled: no + - Description: | + By default, when there are less than 2 books open, a recommendations + column shows in the top right of the home screen. This patch hides it. + - ReplaceBytes: + Base: "HomePageView::configureTopRight(HomePageWidgets)" + Offset: 48 + FindH: 58 B1 # never skip hiding the top-right widget + ReplaceInstNOP: true + +Rename new home screen footer: + - Enabled: no + # This patch happens use shared strings in most versions, and may cause unusual + # replacements in other parts of the GUI (see https://github.com/pgaskin/kobopatch-patches/issues/34). + # This isn't usually an issue (and changes between versions), but occasionally, + # the keyboard uses a letter from one of these strings, and will type the letter + # from the replacement. + - FindReplaceString: {Find: "Find your next great read", Replace: "Find your next great read"} + - FindReplaceString: {Find: "Find your next book in Kobo Plus or our store", Replace: "Find your next book in Kobo Plus or our store"} + - ReplaceBytes: + Base: "HomePageView::setOverDriveUser(OverDriveUser const&)" + Offset: 60 + FindInstBLX: {SymPLT: "GenericHomeWidget::setTitleText(QString)"} + ReplaceInstNOP: true + # You can enable the following replacement, but note that it might cause the o letter on the keyboard to change +# - FindReplaceString: {Find: "Shop Kobo", Replace: "9char-str"} + +Remove line from bottom tab bar: + - Enabled: no + - Description: Removes the line from the top of the bottom tab bar added in 4.23.15505. + # Instead of setting the minimum size of the QFrame for the line, hide it. + - ReplaceBytes: + Base: "Ui_MainNavView::setupUi(QWidget*)" + Offset: 322 + FindInstBLX: {SymPLT: "QWidget::setMinimumSize(int, int)"} + ReplaceInstBLX: {SymPLT: "QWidget::hide()"} + +## Change Browse Kobo home screen link target ### +# This patch allows you to change the target of the Browse Kobo link. To +# rename the top description, use the rename home screen footer patch. +# +# The easy options for this patch are fairly limited, as BrowseKoboWidget::tapped +# just calls the superclass event, then the call to DiscoverNavMixin::storeFront +# in the PLT is tail-call optimized. This places a number of restrictions on the +# replacement target, namely: the branch must be a branch and exchange, but not +# link (lr must be unchanged to return correctly), which is implemented as a +# 32-bit branch to a bx pc (nop branch, but still switch instruction sets) +# immediately before a PLT entry to a nav mixin without any arguments (i.e. +# must be static). Note that the first branch is relative to pc. Also, note that +# in general, this requirement means anything called by StatusBarController (the +# menu) can be used as a replacement. +# +# Basically, the following two steps are needed: +# - In BrowseKoboWidget::tapped, change the tail-call to the bx before +# [something]NavMixin::[something] in the PLT. +# - In the BrowseKoboWidget constructor, change which function is called to get +# the bottom text (Shop Kobo) from N3DeviceCharm::shopName (Shop Kobo / Walmart) +# to N3DeviceCharm::[something] (note that there isn't enough room to +# load an entirely different string here). + +Change Browse Kobo home screen link target - Activity: + - Enabled: no + - PatchGroup: Browse Kobo link target + - Description: See the comment above. + - ReplaceBytes: + Base: "BrowseKoboWidget::tapped()" + Offset: 22 + FindInstBW: {SymPLTTail: "DiscoverNavMixin::storefront()"} # Store + ReplaceInstBW: {SymPLTTail: "ReadingLifeNavMixin::chooseActivity()"} # Activity + - ReplaceBytes: + Base: "BrowseKoboWidget::tapped()" + Offset: 32 + FindInstBW: {SymPLTTail: "StoreNavMixin::overDriveFeaturedLists()"} # OverDrive + ReplaceInstBW: {SymPLTTail: "ReadingLifeNavMixin::chooseActivity()"} # Activity + - ReplaceBytes: + Base: "BrowseKoboWidget::BrowseKoboWidget(QWidget*)" + Offset: 196 + FindInstBLX: {SymPLT: "N3DeviceCharm::shopName()"} # "Shop Kobo" or "Walmart" + ReplaceInstBLX: {SymPLT: "N3DeviceCharm::extrasName()"} # "Activity" + - ReplaceBytes: + Base: "HomePageView::setOverDriveUser(OverDriveUser const&)" + Offset: 114 + FindInstBLX: {SymPLT: "GenericHomeWidget::setMetaText(QString)"} # "OverDrive" + ReplaceInstNOP: true + +Change Browse Kobo home screen link target - Articles: + - Enabled: no + - PatchGroup: Browse Kobo link target + - Description: See the comment above. + - ReplaceBytes: + Base: "BrowseKoboWidget::tapped()" + Offset: 22 + FindInstBW: {SymPLTTail: "DiscoverNavMixin::storefront()"} # Store + ReplaceInstBW: {SymPLTTail: "MoreController::articles()"} # Articles + - ReplaceBytes: + Base: "BrowseKoboWidget::tapped()" + Offset: 32 + FindInstBW: {SymPLTTail: "StoreNavMixin::overDriveFeaturedLists()"} # OverDrive + ReplaceInstBW: {SymPLTTail: "MoreController::articles()"} # Articles + - ReplaceBytes: + Base: "BrowseKoboWidget::BrowseKoboWidget(QWidget*)" + Offset: 196 + FindInstBLX: {SymPLT: "N3DeviceCharm::shopName()"} # "Shop Kobo" or "Walmart" + ReplaceInstBLX: {SymPLT: "N3DeviceCharm::articlesSearchName()"} # "My Articles" + - ReplaceBytes: + Base: "HomePageView::setOverDriveUser(OverDriveUser const&)" + Offset: 114 + FindInstBLX: {SymPLT: "GenericHomeWidget::setMetaText(QString)"} # "OverDrive" + ReplaceInstNOP: true + +### + +### Smartlink patches ### + +Set visible SmartLink: + - Enabled: no + - PatchGroup: SmartLink + - Description: Sets the currently visible smartlink (does not override priority messages). + # SmartLinks: (name from SmartLinkWidget::getAnalyticsMessage) + # # - internal name - default condition - what - action + # PRIORITY MESSAGES (shown first up to 3 times each): (SmartLinkWidget::showPriorityMessage, ActivityManager::smartLinkPriorityMessage, SmartLinkWidget::tapped) + # 5 - ReleaseNotes - whats new available from Activity - RELEASE NOTES: Find out what's new in this software update - whats new (from Activity) + # 6 - OverDriveFTE - overdrive enabled && not signed in - OVERDRIVE: Learn how to borrow eBooks from your public library - overdrive about + # 7 - KoboPlusFTE - kobo plus enabled && not subscribed - KOBO PLUS: Browse Kobo Plus books - kobo store -> kobo plus + # 8 - OverDrive - overdrive enabled && signed in && have hold - OVERDRIVE: View your public library holds - overdrive holds list + # ROTATION MESSAGES (randomly chosen): (SmartLinkWidget::showRotationMessage, ActivityManager::smartLinkGeneralMessage, SmartLinkWidget::tapped) + # 1 - Pocket - pocket not signed in - POCKET: Read articles from the web on your eReader - pocket about + # 2 - KoboPlus - kobo plus enabled && not subscribed - KOBO PLUS: Get unlimited access to books in all genres - kobo store -> kobo plus + # 2 - KoboPlus - kobo plus enabled && not subscribed - KOBO PLUS: Read as much as you want with a Kobo Plus subscription- kobo store -> kobo plus + # 3 - Overdrive - overdrive enabled && not signed in - OVERDRIVE: Borrow eBooks from your public library - overdrive about + # 4 - Categories - always - CATEGORIES: Browse fiction, romance, biography and more - kobo store -> categories + # 9 - NaturalLight - has light sensor && not viewed tutorial - DEVICE NAME: Learn about the Natural Light feature - rgb front light about + # 10 - QuickTour - quick tour not shown && quick turn tile not visible - GETTING STARTED: Get to know your %0 - quick tour + # 11 - ReadingTour - read a book tour not showed - READING A BOOK: Get quick tips about reading on your eReader - read a book tutorial + # 12 - UserGuide - user guide present && not opened - USER GUIDE: Read the user guide for your %0 - read -> user guide + # 13 - RelatedReads - recent book available from Activity - RELATED READS: Discover books related to the ones you're reading - browse -> similar books + # 14 - Wishlist - no wishlist items || something else - WISHLIST: Create a Wishlist of books you're interested in - browse -> wishlist + # 15 - ReadingSettings - reading settings not changed - READING SETTINGS: Customize the way you read a book - settings -> reading settings + # 16 - ReadingStats - books finished > 0 && hours read rounded to .5 > 0 - READING STATS: You've finished %n books and read for %n hours - reading life -> stats + # 17 - SuperPoints - participating in super points && points > 2400 - KOBO SUPER POINTS: You have %0 Super Points to redeem - kobo store + # 18 - PocketUser - unread pocket articles > 0 - POCKET: Catch up on the %n article(s) you added recently - library -> pocket + # + - BaseAddress: {Sym: "SmartLinkWidget::showRotationMessage(Device const&)", Rel: 20} + - ReplaceBytes: {FindInstBLX: {SymPLT: "ActivityManager::smartLinkGeneralMessage(Device const&)"}, ReplaceH: 4F F0 04 00} # MOV.W r0, #4 + # set the new SmartLink to show (you can set this to your preference based on + # the list above, but it MUST be one of the above options, or you may need + # to factory reset): + - ReplaceInt: {Offset: 2, Find: 4, Replace: 4} + +Only show Pocket SmartLink: + - Enabled: no + - PatchGroup: SmartLink + - Description: Only show the Pocket SmartLink on the home screen. + - ReplaceBytes: + Base: "SmartLinkWidget::showRotationMessage(Device const&)" + Offset: 20 + FindInstBLX: {SymPLT: "ActivityManager::smartLinkGeneralMessage(Device const&)"} + ReplaceH: 4F F0 12 00 + # replace the text (choose one, or remove both): + - FindReplaceString: {Find: "Catch up on the %n article(s) you added recently", Replace: "My Articles"} +# - FindReplaceString: {Find: "Catch up on the %n article(s) you added recently", Replace: "My Articles (%n unread)"} + +Only show stats SmartLink: + - Enabled: no + - PatchGroup: SmartLink + - Description: Only show the stats SmartLink on the home screen. + - ReplaceBytes: + Base: "SmartLinkWidget::showRotationMessage(Device const&)" + Offset: 20 + FindInstBLX: {SymPLT: "ActivityManager::smartLinkGeneralMessage(Device const&)"} + ReplaceH: 4F F0 10 00 + +Never show Kobo Plus, wishlist, and points SmartLinks: + - Enabled: no + - PatchGroup: SmartLink + - Description: Removes Kobo Plus, wishlist, and points SmartLinks from the rotation. + - BaseAddress: "ActivityManager::smartLinkGeneralMessage(Device const&)" + # NOP Kobo Plus (2): + - ReplaceBytes: {Offset: 292, FindH: 02 23, CheckOnly: true} # MOVS r3, #2 + - ReplaceBytes: {Offset: 302, FindInstBLX: {SymPLT: "QVector::append(SmartLinkType const&)"}, ReplaceInstNOP: true} + # NOP wishlist (14): + - ReplaceBytes: {Offset: 266, FindH: 0E 23, CheckOnly: true} # MOVS r3, #14 + - ReplaceBytes: {Offset: 276, FindInstBLX: {SymPLT: "QVector::append(SmartLinkType const&)"}, ReplaceInstNOP: true} + # NOP super points (17): + - ReplaceBytes: {Offset: 1540, FindH: 11 23, CheckOnly: true} # MOVS r3, #17 + - ReplaceBytes: {Offset: 1552, FindInstBLX: {SymPLT: "QVector::append(SmartLinkType const&)"}, ReplaceInstNOP: true} + +### + +Increase TOC level indentation: + - Enabled: no + - PatchGroup: TOC Indentation + - Description: | + The space indented Table of Contents levels are quite hard to see, as the + difference is almost too small to easily notice. + - ReplaceBytes: + Base: {Sym: "N3TableOfContentsWidget::setContent(Shortcover const&)"} + Offset: 198 + FindH: 42 00 # left shift by 1 (i.e. multiply by 2) (LSLS r2, r0, #1) + ReplaceH: 82 00 # left shift by 2 (i.e. multiply by 4) (LSLS r2, r0, #2) + +Increase TOC level indentation and fix extra indentation bug: + - Enabled: no + - PatchGroup: TOC Indentation + - Description: | + The space indented Table of Contents levels are quite hard to see, as the + difference is almost too small to easily notice. In addition, this fixes + the bug where all TOC entries are indented by 1 level extra. + - BaseAddress: {Sym: "N3TableOfContentsWidget::setContent(Shortcover const&)", Rel: 194} + # Clear out existing instructions with NOPs + - ReplaceBytes: {Offset: 0, FindH: 07 F1 0C 0B, ReplaceH: 00 20 00 20} # put string address in fp + - ReplaceBytes: {Offset: 4, FindH: 42 00, ReplaceH: 00 20} # shift level by 1 (multiply by 2) into r2 + - ReplaceBytes: {Offset: 6, FindH: 4F F0 20 01, ReplaceH: 00 20 00 20} # set r1 to 0x20 (space char) + - ReplaceBytes: {Offset: 10, FindH: 58 46, ReplaceH: 00 20} # put fp in r0 + # Put new instructions + - ReplaceBytes: {Offset: 0, FindH: 00 20, ReplaceH: 40 1E} # decrease level by 1 + - ReplaceBytes: {Offset: 2, FindH: 00 20, ReplaceH: 82 00} # shift level by 2 (multiply by 4) into r2 + - ReplaceBytes: {Offset: 4, FindH: 00 20, ReplaceH: 20 21} # set r1 to 0x20 (space char) + - ReplaceBytes: {Offset: 6, FindH: 00 20 00 20, ReplaceH: 07 F1 0C 0B} # put string address into fp + - ReplaceBytes: {Offset: 10, FindH: 00 20, ReplaceH: 58 46} # put fp in r0 + +Allow showing info panel on random screensaver: + - Enabled: no + - Description: | + See https://www.mobileread.com/forums/showthread.php?t=321609. This patch + allows showing the info panel even when using a random screensaver image + from .kobo/screensaver (note that full-screen covers needs to be enabled + for the screensaver to show). + - ReplaceBytes: + Base: "PowerViewController::updateCover()" + Offset: 252 + FindInstBLX: {SymPLT: "FullScreenDragonPowerView::setInfoPanelVisible(bool)"} + ReplaceInstNOP: true + +Remove title from reading header/footer: + - Enabled: no + - Description: Removes the chapter/book title from the new reading header/footer. + # In the longest form of ReadingFooter::update (the others are wrappers with + # the args being set to the current value), the first one is the title. The + # final string is created by starting with the title, then appending the "-", + # then the page number / percentage / etc text. + # + # This one is slightly unusual in that the reading header also shares the + # ReadingFooter code (ReadingView::updateProgressHeader only has the page + # text, and it ends with a branch to ReadingFooter::update). This means we + # only have to patch one place, but it also means you can't have the title in + # one, but not the other. + # + # We'll patch this in a slightly hacky and inefficient, but simple and + # easy-to-update way by replacing the first QString::append (the dash) with a + # QString::resize to zero (I would have done a QString::clear, but that symbol + # isn't imported): + - BaseAddress: {Sym: "ReadingFooter::update(QString const&, QString const&, QString const&, bool)", Rel: 298} + - ReplaceBytes: {Offset: 0, FindH: F9 68, ReplaceH: 00 21} # replace LDR r1, [...] with MOV r1, #0 (the LDR doesn't matter, but may to be updated to match) + - ReplaceBytes: {Offset: 4, FindInstBLX: {SymPLT: "QString::append(QString const&)"}, ReplaceInstBLX: {SymPLT: "QString::resize(int)"}} + +# Prevent Kobo from scanning dotfiles/folders (since 4.17.13651): See https://www.mobileread.com/forums/showthread.php?t=323083. + +Larger Sleep/Power-off timeouts: + - Enabled: no + - PatchGroup: Sleep/Power-off timeouts + - Description: | + Increase the available sleep/power-off timeouts to larger values (up to a + few weeks). To customize this patch, see https://pgaskin.net/kobopatch-patches/lgrpwroff-15505.html . + + IMPORTANT - Although this patch has been tested by multiple users and + confirmed to be working, the interaction between the RTC timer and Nickel + has many moving parts. As reported by JSWolf on MR, this patch might have + issues with actually powering-off with timeouts longer than a day. The + cause is likely to be the auto-sync interval or sleepcover causing the + timer to be overridden/reset every day. Nevertheless, this patch should + work reliably for timeouts under 12 hours, and probably under 1 day. + + If you are using this patch with timeouts above 12 hours, and can confirm + if it works/doesn't work, please PM me or comment on GitHub with your + setting values, sleepcover or not, auto-sync interval, wifi on/off, firmware + version, and Kobo model. + + See https://github.com/pgaskin/kobopatch-patches/issues/28#issuecomment-537161827 + for more details about this. + # Multipliers + - ReplaceBytes: + Base: "N3PowerWorkflowManager::configureWakeup(AlarmControl*, int, AlarmControlDelegate*)" + Offset: 28 + FindH: 03 FB 04 F2 # MUL r2(dest), r3(multiplier), r4(mins) + ReplaceH: 4F EA C4 42 # LSL r2, r4, #19 + - ReplaceBytes: {Base: "N3PowerWorkflowManager::pollBattery()", Offset: 106, FindH: 08 FB 00 F8, ReplaceH: 4F EA C0 48} # MUL r8(dest), r8(multiplier), r0(mins) -> LSL r8, r0, #19 + - ReplaceBytes: {Base: "N3PowerWorkflowManager::pollBattery()", Offset: 156, FindH: 02 FB 00 F2, ReplaceH: 4F EA C0 42} # MUL r2(dest), r2(multiplier), r0(mins) -> LSL r2, r0, #19 + # Menu text + - FindBaseAddressString: "5 mins\0" + - ReplaceString: {Offset: 0, Find: "5 mins\0", Replace: "8m"} + - ReplaceString: {Offset: 8, Find: "10 mins", Replace: "34m"} + - ReplaceString: {Offset: 16, Find: "15 mins", Replace: "1h1m"} + - ReplaceString: {Offset: 24, Find: "30 mins", Replace: "4h4m"} + - ReplaceString: {Offset: 32, Find: "45 mins", Replace: "12h5m"} + - ReplaceString: {Offset: 38, Find: "60 mins", Replace: "24h1m"} + # Values (see https://www.mobileread.com/forums/showpost.php?p=3887105) + - FindBaseAddressSymbol: "N3SettingsPowerView::initChoices()" + - ReplaceInt: {Offset: 11, Find: 5, Replace: 1} + - ReplaceInt: {Offset: 465, Find: 5, Replace: 1} + - ReplaceInt: {Offset: 99, Find: 10, Replace: 4} + - ReplaceInt: {Offset: 525, Find: 10, Replace: 4} + - ReplaceInt: {Offset: 159, Find: 15, Replace: 7} + - ReplaceInt: {Offset: 583, Find: 15, Replace: 7} + - ReplaceInt: {Offset: 219, Find: 30, Replace: 28} + - ReplaceInt: {Offset: 641, Find: 30, Replace: 28} + - ReplaceInt: {Offset: 279, Find: 45, Replace: 83} + - ReplaceInt: {Offset: 699, Find: 45, Replace: 83} + - ReplaceInt: {Offset: 339, Find: 60, Replace: 165} + - ReplaceInt: {Offset: 755, Find: 60, Replace: 165} + +Allow rotation on all devices: + - Enabled: no + - Description: | + Enables rotation on all devices. This shows a rotation icon in the status + bar, which shows a menu allowing you to choose between portrait and landscape + when pressed. This icon is only shown on rotateable views (like the reader). + Unlike only the DeveloperSettings ForceAllowLandscape option, this patch + also makes the rotation icon show on the new reader as well. + # Always return true for ForceAllowLandscape: + - ReplaceBytes: {Offset: 0x777E4E, FindInstBLX: {SymPLT: "QVariant::toBool() const"}, ReplaceH: 4F F0 01 00} + # In ReadingMenuView::ReadingMenuView, replace the value of Device::hasOrientationSensor, + # which is passed to a function to hide/show the rotate icon: + - ReplaceBytes: {Offset: 0xBA60FC, FindInstBLX: {SymPLT: "Device::hasOrientationSensor() const"}, ReplaceH: 4F F0 01 00} + # Also fix sizing of popup by doing the same in RotatePopup::RotatePopup, but + # note that this will make the Automatic option show too (and do nothing): + - ReplaceBytes: {Offset: 0xBC29BE, FindInstBLX: {SymPLT: "Device::hasOrientationSensor() const"}, ReplaceH: 4F F0 01 00} + +Don't uppercase header/footer text: + - Enabled: no + - Description: Prevents the text in the reader header/footer from being uppercased. + - PatchGroup: Header/footer page number text + # Replace QString::toUpper call with QString::trimmed (to copy the string, and + # not need to add a mov instruction and NOP the destructor): + - ReplaceBytes: + Base: "ReadingView::getChapterTitle()" + Offset: 282 + FindInstBLX: {SymPLT: "QString::toUpper() const"} + ReplaceInstBLX: {SymPLT: "QString::trimmed() const"} + - ReplaceBytes: + Base: "ReadingView::updateFooter()" + Offset: 26 + FindInstBLX: {SymPLT: "QString::toUpper() const"} + ReplaceInstBLX: {SymPLT: "QString::trimmed() const"} + # Page number text: + - FindReplaceString: {Find: "%1 OF %2", Replace: "%1 of %2"} + +Custom header/footer page number text: + - Enabled: no + - PatchGroup: Header/footer page number text + - Description: Changes the page number text format in the reading header & footer + - FindReplaceString: {Find: "%1 OF %2", Replace: "%1 / %2"} + +Don't uppercase header/footer text and change page number text: + - Enabled: no + - Description: Combines the previous two patches. + - PatchGroup: Header/footer page number text + - ReplaceBytes: + Base: "ReadingView::getChapterTitle()" + Offset: 282 + FindInstBLX: {SymPLT: "QString::toUpper() const"} + ReplaceInstBLX: {SymPLT: "QString::trimmed() const"} + - ReplaceBytes: + Base: "ReadingView::updateFooter()" + Offset: 26 + FindInstBLX: {SymPLT: "QString::toUpper() const"} + ReplaceInstBLX: {SymPLT: "QString::trimmed() const"} + - FindReplaceString: {Find: "%1 OF %2", Replace: "%1 / %2"} + +Swap reading header/footer: + - Enabled: no + - Description: | + Swaps the reading header/footer text (i.e. book progress on top, chapter + progress on the bottom). This patch has undefined behaviour if the header + or footer is disabled. + # Both the header and footer use the ReadingFooter class and update them using + # the overloaded ReadingFooter::update function. The difference is which r0 (this) + # is passed to them. Since tbe header and footer are both members of ReadingView, + # and they are loaded just before the update (and aren't used otherwise), they + # can be swapped by switching the struct offset used by LDR. + # + # Offsets (since 4.19.14123): + # - ReadingView->header - 0x10 + # - ReadingView->footer - 0x1C + - ReplaceBytes: + Base: "ReadingView::updateProgressHeader(QString const&, QString const&)" + Offset: 8 + FindH: 00 69 # LDR r0, [r0, #0x10] + ReplaceH: C0 69 # LDR r0, [r0, #0x1C] + - ReplaceBytes: + Base: "ReadingView::updatePercentageFooter(QString const&)" + Offset: 158 + FindH: C0 69 # LDR r0, [r0, #0x1C] + ReplaceH: 00 69 # LDR r0, [r0, #0x10] + - ReplaceBytes: + Base: "ReadingView::updatePageFooter(QString const&)" + Offset: 172 + FindH: C0 69 # LDR r0, [r0, #0x1C] + ReplaceH: 00 69 # LDR r0, [r0, #0x10] + - ReplaceBytes: + Base: "ReadingView::updateTimeFooter(QString const&)" + Offset: 50 # "Loading..." + FindH: E4 69 # LDR r4, [r4, #0x1C] + ReplaceH: 24 69 # LDR r4, [r4, #0x10] + - ReplaceBytes: + Base: "ReadingView::updateTimeFooter(QString const&)" + Offset: 102 # time estimate + FindH: D3 F8 1C 90 # LDR.W sb, [r3, #0x1C] + ReplaceH: D3 F8 10 90 # LDR.W sb, [r3, #0x10] + - ReplaceBytes: + Base: "ReadingView::updateTimeFooter(QString const&)" + Offset: 240 # pages + FindH: DE F8 1C 40 # LDR.W r4, [lr, #0x1C] + ReplaceH: DE F8 10 40 # LDR.W r4, [lr, #0x10] + +Enable advanced settings for all fonts: + - Enabled: no + - Description: | + This patch allows the advanced font options (weight/sharpness adjustments) + to work with sideloaded fonts too. (KEPUB - OTF and TTF. EPUB - TTF only.) + - ReplaceBytes: + Base: "AdvancedFontSettingsController::loadView()" # font dropdown in advanced font settings dialog + Offset: 144 + FindInstBLX: {SymPLT: "N3FontTypeUtil::setupMonotypeDropdown(TouchDropDown*, QString const&)"} # monotype fonts only + ReplaceInstBLX: {SymPLT: "N3FontTypeUtil::setupDropdown(TouchDropDown*, QString const&)"} # all fonts + - ReplaceBytes: + Base: "ReadingMenuFontSettingsController::setupAdvancedOption(QString const&)" + Offset: 112 + FindInstBLX: {SymPLT: "N3FontTypeUtil::isMonotypeFont(QString const&)"} + ReplaceH: 4F F0 01 00 + +Customize ComfortLight settings: + - Enabled: no + - Description: | + Change the times available in the ComfortLight bedtime dropdown and the + start/end times for the color changes. All values in this patch are + customizable. + + The default values for this patch give you 21 options between 5PM and 3AM + at 30 minute intervals, with the colour change starting at 4PM, and the + change back to blue between 5AM and 7AM. The firmware default is 13 options + between 9PM-3AM at 30 minute intervals, with the transition starting at 6PM. + ## + # In an unnamed subroutine two layers into FrontLightPopupController::loadView + # (find it by going back from QTime::addSecs), the times for the dropdown are + # generated into a QVector> with a simple loop. + - BaseAddress: 0xAE9B90 # find the base of the unnamed subroutine with the x-ref to _ZN5QTimeC1Eiiii + # + # Change the initial hour / first bedtime dropdown item passed to the QTime + # constructor (mov r1, #21): + - ReplaceInt: {Offset: 22, Find: 21, Replace: 17} # 21:00 (9PM) -> 17:00 (5PM) + # + # Optional: Change the increment passed to QTime::addSecs (you need to use an + # ARM assembler to change this value): + - ReplaceBytes: {Offset: 122, FindH: 4F F4 E1 61, ReplaceH: 4F F4 E1 61} # mov.w r1, #1800: 30m + # + # Change the number of increments / bedtime dropdown options (start at the + # initial time, add this number -1 more items with the above increment each + # time) (movs r5, #13): + - ReplaceInt: {Offset: 78, Find: 13, Replace: 21} # 13 [9PM..3AM]+30m -> 21 [5PM..3AM]+30m + # + # Change the number of pre-allocated elements (I don't think this is actually + # required, as Qt will realloc as necessary, but we might as well do this just + # in case) (mov r1, #21): + - ReplaceInt: {Offset: 696, Find: 13, Replace: 21} # same as prev replacement + ## + # The actual color adjustment is done in BedtimeManager::adjustTemperature. + # The color temperature is based on the current time, the bedtime, the hardcoded + # sunset, the hardcoded sunrise start, the hardcoded sunrise end, the daytime + # temperature, and the nighttime temperature. + - BaseAddress: "BedtimeManager::adjustTemperature()" + # + # Change the sunset time (the transition to a warmer temperature starts here + # and transitions until the bedtime chosen) (this should be 1-3 hours before + # the minimum bedtime from the first replacement above) (mov r1, #18): + - ReplaceInt: {Offset: 158, Find: 18, Replace: 16} # 18:00 (9PM-3=6PM) -> 16:00 (5PM-1=4PM) + # + # Change the time for the sunset timer to fire at (this is passed to a QTime + # constructor which is passed to PowerTime::fireAt) (mov r1, #18): + - ReplaceInt: {Offset: 438, Find: 18, Replace: 16} # should match the sunset time above + # + # Optional: Change the sunrise start time (the transition back to a cooler + # temperature starts here) (this should be sometime after the last bedtime, + # but before the sunset time) (mov r1, #5): + - ReplaceInt: {Offset: 192, Find: 5, Replace: 5} # 5AM + # + # Optional: Change the sunrise end time (the transition back to a cooler + # temperature ends here) (this should be 1-3 hours after the sunrise start but + # before the sunset time or bad things will happen with negative values) (mov r1, #7): + - ReplaceInt: {Offset: 138, Find: 7, Replace: 7} # 5AM+2=7AM + +# The following patches allow you to enable a config file option with a patch. + +FeatureSettings - BookSpecificStats: + - Enabled: no + - Description: Adds an option to view stats for a specific book to the book menu. + - ReplaceBytes: {Base: "FeatureSettings::bookSpecificStatsEnabled()", Offset: 54, FindInstBLX: {SymPLT: "QVariant::toBool() const"}, ReplaceH: 4F F0 01 00} + +FeatureSettings - ShowFacebookShare: + - Enabled: no + - Description: Re-enables the Facebook share option in menus. + - ReplaceBytes: {Base: "FeatureSettings::showFacebookShare()", Offset: 54, FindInstBLX: {SymPLT: "QVariant::toBool() const"}, ReplaceH: 4F F0 01 00} + +FeatureSettings - FullScreenBrowser: + - Enabled: no + - Description: Makes the browser fullscreen (note that there is no way out except for rebooting). + - ReplaceBytes: {Base: "FeatureSettings::fullScreenBrowser()", Offset: 54, FindInstBLX: {SymPLT: "QVariant::toBool() const"}, ReplaceH: 4F F0 01 00} + +FeatureSettings - MyWords: + - Enabled: no + - Description: Enables the My Words tab of the Activity screen. + - ReplaceBytes: {Base: "FeatureSettings::myWords()", Offset: 54, FindInstBLX: {SymPLT: "QVariant::toBool() const"}, ReplaceH: 4F F0 01 00} + +FeatureSettings - ExportHighlights: + - Enabled: no + - Description: Add an option to export highlights to the book menu. + - ReplaceBytes: {Base: "FeatureSettings::exportHighlightsEnabled()", Offset: 54, FindInstBLX: {SymPLT: "QVariant::toBool() const"}, ReplaceH: 4F F0 01 00} + +DeveloperSettings - AutoUsbGadget: + - Enabled: no + - Description: Automatically enable USB Storage mode when connected. + - ReplaceBytes: {Offset: 0x777EEE, FindInstBLX: {SymPLT: "QVariant::toBool() const"}, ReplaceH: 4F F0 01 00} + +PowerSettings - UnlockEnabled: + - Enabled: no + - Description: Disables/enables the slide to unlock feature. + - ReplaceBytes: {Base: "PowerSettings::getUnlockEnabled()", Offset: 62, FindInstBLX: {SymPLT: "QVariant::toBool() const"}, ReplaceH: 4F F0 00 00} # disable +# - ReplaceBytes: {Base: "PowerSettings::getUnlockEnabled()", Offset: 62, FindInstBLX: {SymPLT: "QVariant::toBool() const"}, ReplaceH: 4F F0 01 00} # enable diff --git a/src/librmsdk.so.1.0.0.yaml b/src/librmsdk.so.1.0.0.yaml index e1eed5e..53d9bab 100644 --- a/src/librmsdk.so.1.0.0.yaml +++ b/src/librmsdk.so.1.0.0.yaml @@ -116,17 +116,17 @@ Default ePub monospace font: - Description: | Updated for fw 4.19.14123: This patch only affects standard ePub, not kepub. - + The Kobo firmware doesn't include a monospace font, you need to sideload one. - If the book's stylesheet specifies font-family:monospace; + If the book's stylesheet specifies font-family:monospace; then the ePub reader will try to use the "Courier" font. - - Unpatched the EPUB reader will now use any installed font with + + Unpatched the EPUB reader will now use any installed font with a name beginning "Courier" as the default monospace font. - e.g. CourierStd or + e.g. CourierStd or Courier Prime, available at http://quoteunquoteapps.com/courierprime) - - If your sideloaded monospace fontname does not start with "Courier" then + + If your sideloaded monospace fontname does not start with "Courier" then enable this patch and change "Courier" in the replacement string to another font name prefix (7 letters max.). For example, change `normal/Courier` to `normal/Dark`, `bold/Courier` to `bold/Dark`, etc. to diff --git a/src/nickel.yaml b/src/nickel.yaml index 5cf36ea..641c166 100644 --- a/src/nickel.yaml +++ b/src/nickel.yaml @@ -1,45 +1,3 @@ -# The following patch(es) are by geek1011 - -Show all games: - - Enabled: no - - Description: | - Shows all games in beta features. Since firmware 4.20.14601, this patch is - not needed if you have developer mode enabled (search - devmodeon/devmodeoff). - - FindZlib: "#boggleContainer[devModeOn=false][qApp_deviceIsPika=true]" - - ReplaceZlib: {Find: "qproperty-visible: false;", Replace: "qproperty-visible: true;"} - -Remove forgot pin button from lock screen: - - Enabled: no - - Description: | - Removes the Forgot PIN -> Sign Out button from the lock screen. - If this is enabled and you forget your pin, you will need to - hard reset your Kobo. - - BaseAddress: 0x140661E - - ReplaceZlib: - Find: "#lblForgotPin[qApp_deviceIsDragon=true],\n#lblSignOut[qApp_deviceIsDragon=true] {\n font-size: 26px;\n}" - Replace: "#lblForgotPin,#lblSignOut{qproperty-visible:false;}" - - BaseAddress: 0x1409CDC - - ReplaceZlib: - Find: "#lblForgotPin[qApp_deviceIsDragon=true],\n#lblSignOut[qApp_deviceIsDragon=true] {\n font-size: 26px;\n}" - Replace: "#lblForgotPin,#lblSignOut{qproperty-visible:false;}" - -Increase size of kepub chapter progress chart: - - Enabled: no - - Description: Originally by oren64, rewritten for 4.16.13337 by geek1011. - - FindZlib: "#chapterSizes" - - ReplaceZlibGroup: - Replacements: - # Top padding is aready set to 15px, 25px, 33px, vertical aligned to middle. - # Progress chart bar sizes: - - Find: "#chapterSizes[qApp_deviceIsTrilogy=true] {\n max-height: 56px;\n min-height: 56px;\n}" - Replace: "#chapterSizes[qApp_deviceIsTrilogy=true] {\n max-height: 90px;\n min-height: 90px;\n min-width: 385px;\n max-width: 385px;\n}" - - Find: "#chapterSizes[qApp_deviceIsPhoenix=true] {\n max-height: 70px;\n min-height: 70px;\n}" - Replace: "#chapterSizes[qApp_deviceIsPhoenix=true] {\n max-height: 130px;\n min-height: 130px;\n min-width: 495px;\n max-width: 495px;\n}" - - Find: "#chapterSizes[qApp_deviceIsDragon=true] {\n max-height: 100px;\n min-height: 100px;\n}" - Replace: "#chapterSizes[qApp_deviceIsDragon=true] {\n max-height: 170px;\n min-height: 170px;\n min-width: 678px;\n max-width: 678px;\n}" - - Find: "#chapterSizes[qApp_deviceIsDaylight=true] {\n max-height: 130px;\n min-height: 130px;\n}" - Replace: "#chapterSizes[qApp_deviceIsDaylight=true] {\n max-height: 215px;\n min-height: 215px;\n min-width: 865px;\n max-width: 865px;\n}" # The following patch(es) are ported from GeoffR's patch zips Reduce top/bottom page spacer: @@ -103,20 +61,20 @@ Increase home screen cover size: - ReplaceZlibGroup: Replacements: # Touch/Mini (Trilogy) - - {Find: "qproperty-leftMargin: 26;", Replace: "qproperty-leftMargin: 10;"} - - {Find: "qproperty-rightMargin: 26;", Replace: "qproperty-rightMargin: 10;"} + - {Find: "qproperty-leftMargin: 32px;", Replace: "qproperty-leftMargin: 16px;"} + - {Find: "qproperty-rightMargin: 32px;", Replace: "qproperty-rightMargin: 16px;"} # Glo/Aura/Aura2E (Phoenix) - - {Find: "qproperty-leftMargin: 36;", Replace: "qproperty-leftMargin: 12;"} - - {Find: "qproperty-rightMargin: 36;", Replace: "qproperty-rightMargin: 12;"} + - {Find: "qproperty-leftMargin: 40px;", Replace: "qproperty-leftMargin: 16px;"} + - {Find: "qproperty-rightMargin: 40px;", Replace: "qproperty-rightMargin: 16px;"} # AuraHD/H2O/GloHD/ClaraHD (Dragon) - - {Find: "qproperty-leftMargin: 50;", Replace: "qproperty-leftMargin: 16;"} - - {Find: "qproperty-rightMargin: 50;", Replace: "qproperty-rightMargin: 16;"} + - {Find: "qproperty-leftMargin: 57px;", Replace: "qproperty-leftMargin: 22px;"} + - {Find: "qproperty-rightMargin: 57px;", Replace: "qproperty-rightMargin: 22px;"} # AuraOne/Forma (Daylight) - - {Find: "qproperty-leftMargin: 65;", Replace: "qproperty-leftMargin: 20;"} - - {Find: "qproperty-rightMargin: 65;", Replace: "qproperty-rightMargin: 20;"} + - {Find: "qproperty-leftMargin: 74px;", Replace: "qproperty-leftMargin: 29px;"} + - {Find: "qproperty-rightMargin: 74px;", Replace: "qproperty-rightMargin: 29px;"} # LibraH2O (Storm) - - {Find: "qproperty-leftMargin: 56;", Replace: "qproperty-leftMargin: 18;"} - - {Find: "qproperty-rightMargin: 56;", Replace: "qproperty-rightMargin: 18;"} + - {Find: "qproperty-leftMargin: 67px;", Replace: "qproperty-leftMargin: 29px;"} + - {Find: "qproperty-rightMargin: 67px;", Replace: "qproperty-rightMargin: 29px;"} # The following patch(es) are ported from jackie_w's patches Dictionary pop-up - increase available text area: @@ -136,13 +94,13 @@ Dictionary pop-up - increase available text area: # Touch/Mini - Find: "#dictionary[qApp_deviceIsTrilogy=true] {\n margin-top: 20px;\n margin-left: 10px;\n}" Replace: "#dictionary[qApp_deviceIsTrilogy=true] {\n margin-top: 5px;\n margin-left: 0px;\n}" - # Glo/Aura/Aura2 + # Glo/Aura/Aura2 - Find: "#dictionary[qApp_deviceIsPhoenix=true] {\n margin-top: 20px;\n margin-left: 20px;\n}" Replace: "#dictionary[qApp_deviceIsPhoenix=true] {\n margin-top: 7px;\n margin-left: 0px;\n}" # AuraHD/H2O/H2O2/GloHD/ClaraHD - Find: "#dictionary[qApp_deviceIsDragon=true] {\n margin-top: 30px;\n margin-left: 30px;\n}" Replace: "#dictionary[qApp_deviceIsDragon=true] {\n margin-top: 10px;\n margin-left: 0px;\n}" - # AuraOne/Forma + # AuraOne/Forma - Find: "#dictionary[qApp_deviceIsDaylight=true] {\n margin-top: 42px;\n margin-left: 42px;\n}" Replace: "#dictionary[qApp_deviceIsDaylight=true] {\n margin-top: 14px;\n margin-left: 0px;\n}" # @@ -150,13 +108,13 @@ Dictionary pop-up - increase available text area: # Touch/Mini - Find: "#header[qApp_deviceIsTrilogy=true] {\n max-height: 46px;\n min-height: 46px;\n}" Replace: "#header[qApp_deviceIsTrilogy=true] {\n max-height: 46px;\n min-height: 46px;\n}" - # Glo/Aura/Aura2 + # Glo/Aura/Aura2 - Find: "#header[qApp_deviceIsPhoenix=true] {\n max-height: 60px;\n min-height: 60px;\n}" Replace: "#header[qApp_deviceIsPhoenix=true] {\n max-height: 50px;\n min-height: 50px;\n}" # AuraHD/H2O/H2O2/GloHD/ClaraHD/LibraH2O - Find: "#header[qApp_deviceIsDragon=true] {\n max-height: 90px;\n min-height: 90px;\n}" Replace: "#header[qApp_deviceIsDragon=true] {\n max-height: 70px;\n min-height: 70px;\n}" - # AuraOne/Forma + # AuraOne/Forma - Find: "#header[qApp_deviceIsDaylight=true] {\n max-height: 120px;\n min-height: 120px;\n}" Replace: "#header[qApp_deviceIsDaylight=true] {\n max-height: 90px;\n min-height: 90px;\n}" # @@ -164,16 +122,16 @@ Dictionary pop-up - increase available text area: # Touch/Mini - Find: "#mainContainer[qApp_deviceIsTrilogy=true] {\n qproperty-leftMargin: 12px;\n qproperty-rightMargin: 12px;\n}" Replace: "#mainContainer[qApp_deviceIsTrilogy=true] {\n qproperty-leftMargin: 6px;\n qproperty-rightMargin: 6px;\n}" - # Glo/Aura/Aura2 + # Glo/Aura/Aura2 - Find: "#mainContainer[qApp_deviceIsPhoenix=true] {\n qproperty-leftMargin: 16px;\n qproperty-rightMargin: 16px;\n}" Replace: "#mainContainer[qApp_deviceIsPhoenix=true] {\n qproperty-leftMargin: 8px;\n qproperty-rightMargin: 8px;\n}" # AuraHD/H2O/H2O2/GloHD/ClaraHD - Find: "#mainContainer[qApp_deviceIsDragon=true] {\n qproperty-leftMargin: 22px;\n qproperty-rightMargin: 22px;\n}" Replace: "#mainContainer[qApp_deviceIsDragon=true] {\n qproperty-leftMargin: 11px;\n qproperty-rightMargin: 11px;\n}" - # AuraOne/Forma + # AuraOne/Forma - Find: "#mainContainer[qApp_deviceIsDaylight=true] {\n qproperty-leftMargin: 28px;\n qproperty-rightMargin: 28px;\n}" Replace: "#mainContainer[qApp_deviceIsDaylight=true] {\n qproperty-leftMargin: 14px;\n qproperty-rightMargin: 14px;\n}" - # LibraH2O + # LibraH2O - Find: "#mainContainer[qApp_deviceIsStorm=true] {\n qproperty-leftMargin: 25px;\n qproperty-rightMargin: 25px;\n}" Replace: "#mainContainer[qApp_deviceIsStorm=true] {\n qproperty-leftMargin: 12px;\n qproperty-rightMargin: 12px;\n}" # @@ -183,7 +141,7 @@ Dictionary pop-up - increase available text area: Find: "DictionaryViewFooter[qApp_deviceIsTrilogy=true] {\n max-height: 46px;\n min-height: 46px;\n}" Replace: "DictionaryViewFooter[qApp_deviceIsTrilogy=true] {\n max-height: 40px;\n min-height: 40px;\n}" MustMatchLength: yes - # Glo/Aura/Aura2 + # Glo/Aura/Aura2 - FindReplaceString: Find: "DictionaryViewFooter[qApp_deviceIsPhoenix=true] {\n max-height: 60px;\n min-height: 60px;\n}" Replace: "DictionaryViewFooter[qApp_deviceIsPhoenix=true] {\n max-height: 50px;\n min-height: 50px;\n}" @@ -203,20 +161,20 @@ Increase Book Details synopsis area: - Enabled: no - Description: | Book details page - - Increase height of bottom half (Synopsis) by + - Increase height of bottom half (Synopsis) by decreasing height of top half (Cover, Title, Author, Series) - See https://www.mobileread.com/forums/showpost.php?p=3311354&postcount=134 - fw 4.12/4.16 - rewritten by jackie_w to replace oren64's patch - FindZlib: "#bookInfoWidget" - ReplaceZlibGroup: Replacements: - # Portrait mode: #bookInfoWidget[isLandscape=false]: + # Portrait mode: #bookInfoWidget[isLandscape=false]: - {Find: "height: 300px;", Replace: "height: 200px;"} #Touch/Mini - {Find: "height: 390px;", Replace: "height: 230px;"} #Glo/Aura/Aura2 - {Find: "height: 550px;", Replace: "height: 370px;"} #AuraHD/H2O/H2O2/GloHD/ClaraHD - {Find: "height: 642px;", Replace: "height: 425px;"} #LibraH2O (*untested) - {Find: "height: 715px;", Replace: "height: 500px;"} #AuraOne/Forma - # Landscape mode: #bookInfoWidget[isLandscape=true]: + # Landscape mode: #bookInfoWidget[isLandscape=true]: - {Find: "height: 210px;", Replace: "height: 200px;"} #Touch/Mini - {Find: "height: 265px;", Replace: "height: 230px;"} #Glo/Aura/Aura2 - {Find: "height: 420px;", Replace: "height: 370px;"} #AuraHD/H2O/H2O2/GloHD/ClaraHD @@ -256,25 +214,22 @@ Custom collection/author header title font: See https://www.mobileread.com/forums/showpost.php?p=3520879&postcount=42 fw 4.17.13694 rewritten by jackie_w to replace oren64's patch "Custom font to collection and author titles" - # First set: - - FindZlib: "#header,\n#backButton,\n#moreLink {" + fw 4.23.15505 Author/Series/Collection list headers no longer forced to uppercase + - FindZlib: "#scrollContainer[containerSpacing=true]" - ReplaceZlibGroup: Replacements: - # #header #headerTitle Change font-family, case, font-size - # - # Un-comment next line to un-force UPPERCASE - #- {Find: "text-transform: uppercase", Replace: "text-transform: none;"} + # #header #headerTitle Change font-family, font-size # # Change font-family. # Note: If new font-family name contains spaces wrap in 'single quotes' # e.g. 'Kobo Nickel' # Un-comment & edit next line to change font-family - #- {Find: "font-family: Avenir;", Replace: "font-family: 'Kobo Nickel';"} + #- {Find: "font-family: Avenir;", Replace: "font-family: Georgia;"} # # Increase font-size. # Touch/Mini (Trilogy) - {Find: "font-size: 16px;", Replace: "font-size: 28px;"} - # Glo/Aura/Aura2 (Phoenix) + # Glo/Aura/Aura2/Nia (Phoenix) - {Find: "font-size: 20px;", Replace: "font-size: 36px;"} # AuraHD/H2O/H2O2/GloHD/ClaraHD (Dragon) - {Find: "font-size: 28px;", Replace: "font-size: 42px;"} @@ -319,6 +274,8 @@ Custom new header/footer font: new header/footer. They will automatically be a matched pair. Full details & screenshots at https://www.mobileread.com/forums/showpost.php?p=3897175&postcount=4 N.B: This patch is not suitable for Japanese/Chinese locale users + fw 4.23.15505 No longer possible to customise font-size for GloHD/ClaraHD + separately from AuraHD/H2O. - FindZlib: "ReadingFooter" - ReplaceZlibGroup: @@ -344,24 +301,18 @@ Custom new header/footer font: # 2a. Change font-size for models other than Touch/Mini (header & footer simultaneously) # #caption[newHeader=true] & #caption[newFooter=true] - # Glo/Aura/Aura2E (Phoenix) - - Find: "[qApp_deviceIsPhoenix=true] {\n font-size: 16px;\n}" - Replace: "[qApp_deviceIsPhoenix=true] {\n font-size: 16px;\n}" - # AuraHD/H2O (Dragon) - - Find: "[qApp_deviceIsDragon=true] {\n font-size: 21px;\n}" - Replace: "[qApp_deviceIsDragon=true] {\n font-size: 21px;\n}" - # GloHD (Alyssum) - - Find: "[qApp_deviceIsAlyssum=true] {\n font-size: 23px;\n}" - Replace: "[qApp_deviceIsAlyssum=true] {\n font-size: 23px;\n}" - # ClaraHD (Nova) - - Find: "[qApp_deviceIsNova=true] {\n font-size: 23px;\n}" - Replace: "[qApp_deviceIsNova=true] {\n font-size: 23px;\n}" + # Glo/Aura/Aura2E/Nia (Phoenix) + - Find: "[qApp_deviceIsPhoenix=true] {\n font-size: 17px;\n}" + Replace: "[qApp_deviceIsPhoenix=true] {\n font-size: 17px;\n}" + # AuraHD/H2O/GloHD/ClaraHD (Dragon/Alyssum/Nova) + - Find: "[qApp_deviceIsDragon=true] {\n font-size: 25px;\n}" + Replace: "[qApp_deviceIsDragon=true] {\n font-size: 25px;\n}" # LibraH2O (Storm) - - Find: "[qApp_deviceIsStorm=true] {\n font-size: 25px;\n}" - Replace: "[qApp_deviceIsStorm=true] {\n font-size: 25px;\n}" + - Find: "[qApp_deviceIsStorm=true] {\n font-size: 29px;\n}" + Replace: "[qApp_deviceIsStorm=true] {\n font-size: 29px;\n}" # AuraOne/Forma (Daylight) - - Find: "[qApp_deviceIsDaylight=true] {\n font-size: 27px;\n}" - Replace: "[qApp_deviceIsDaylight=true] {\n font-size: 27px;\n}" + - Find: "[qApp_deviceIsDaylight=true] {\n font-size: 32px;\n}" + Replace: "[qApp_deviceIsDaylight=true] {\n font-size: 32px;\n}" # N.B: If you do not have a Touch/Mini and your header/footer # positions are exactly as you like them you do not need the @@ -370,22 +321,22 @@ Custom new header/footer font: # Don't change the following pair. It exists to split the header/footer styles # which were merged in 4.19.14123. - - Find: "#caption[newHeader=true][qApp_deviceIsTrilogy=true],\n#caption[newFooter=true][qApp_deviceIsTrilogy=true] {\n font-size: 13px;\n}" - Replace: "#caption[newHeader=true][qApp_deviceIsTrilogy=true] {\n font-size: 13px;\n}\n#caption[newFooter=true][qApp_deviceIsTrilogy=true] {\n font-size: 13px;\n}" + - Find: "#caption[newHeader=true][qApp_deviceIsTrilogy=true],\n#caption[newFooter=true][qApp_deviceIsTrilogy=true] {\n font-size: 14px;\n}" + Replace: "#caption[newHeader=true][qApp_deviceIsTrilogy=true] {\n font-size: 14px;\n}\n#caption[newFooter=true][qApp_deviceIsTrilogy=true] {\n font-size: 14px;\n}" # 2a. Touch/Mini users only: Adjust footer font-size as required. # 2b. All models (optional): Fine-tune footer position by adjusting margin-top value # A negative margin-top (e.g -10px) moves the footer text slightly upwards # further from the bottom bezel/progressbar, closer to the page content - - Find: "#caption[newFooter=true][qApp_deviceIsTrilogy=true] {\n font-size: 13px;\n}" - Replace: "#caption[newFooter=true] {\n font-size: 13px; margin-top: 0px;}" + - Find: "#caption[newFooter=true][qApp_deviceIsTrilogy=true] {\n font-size: 14px;\n}" + Replace: "#caption[newFooter=true] {\n font-size: 14px; margin-top: 0px;}" # 2a. Touch/Mini users only: Adjust header font-size as required. # 2b. All models (optional): Fine-tune header position by adjusting margin-bottom value. # A negative margin-bottom (e.g -10px) moves the header text slightly downwards # further from the top bezel, closer to the page content - - Find: "#caption[newHeader=true][qApp_deviceIsTrilogy=true] {\n font-size: 13px;\n}" - Replace: "#caption[newHeader=true] {\n font-size: 13px; margin-bottom: 0px;}" + - Find: "#caption[newHeader=true][qApp_deviceIsTrilogy=true] {\n font-size: 14px;\n}" + Replace: "#caption[newHeader=true] {\n font-size: 14px; margin-bottom: 0px;}" # Don't change anything below. It exists to free up some space for # your changes above by removing Japanese/Chinese-specific CSS code blocks @@ -408,7 +359,7 @@ Custom page navigation scrubber: # Part 1. Customise all 3 of these buttons # - Left & Right 'Back to page nnn' (#revertLeft, #revertRight) # - Current chapter name (#chapter) - + # 1a. Customise font-size for desired model(s): # Touch/Mini (Trilogy) - Find: "[qApp_deviceIsTrilogy=true] {\n font-size: 19px;" @@ -441,7 +392,7 @@ Custom page navigation scrubber: - Find: "{\n font-family: Avenir;\n font-weight: bold;\n font-style: normal;\n}" Replace: "{font-family:Avenir; font-weight:bold; font-style:normal;}" # Users with CSS knowledge can add extra style properties as desired, - # e.g. to make them look more like buttons and less like labels, + # e.g. to make them look more like buttons and less like labels, # use this Replace instead. If it can be done with CSS you can do it here. #Replace: "{font-family:Avenir; font-weight:normal; font-style:normal; background-color:#ddd;}" @@ -492,11 +443,7 @@ Customise Header back button: Series list increase cover thumbnails: - Enabled: no - Description: | - Series list view (not cover view). Enlarge cover thumbnails. - NB: After enabling this patch, if you find that the - last Series thumbnail on each page is truncated along its bottom edge - then you should also enable the additional nickel patch: - 'Reduce height of page navigator arrows' + Series list view (not Series cover view). Increase cover thumbnail size. - FindZlib: "#seriesCoverPack" - ReplaceZlibGroup: Replacements: @@ -522,52 +469,25 @@ Series list increase cover thumbnails: # Part 2: #seriesCoverPack - Increase cover thumbnail size # Touch/Mini - {Find: "width: 60px;", Replace: "width: 85px;"} - - {Find: "height: 94px;", Replace: "height: 105px;"} + - {Find: "height: 94px;", Replace: "height: 102px;"} # Glo/Aura6"/Aurav2 - {Find: "width: 70px;", Replace: "width: 100px;"} - - {Find: "height: 115px;", Replace: "height: 140px;"} + - {Find: "height: 115px;", Replace: "height: 137px;"} # AuraHD/H2O/H2Ov2/GloHD/ClaraHD - {Find: "width: 108px;", Replace: "width: 141px;"} - - {Find: "height: 175px;", Replace: "height: 200px;"} + - {Find: "height: 175px;", Replace: "height: 195px;"} # AuraOne/Forma - {Find: "width: 140px;", Replace: "width: 190px;"} - - {Find: "height: 222px;", Replace: "height: 265px;"} + - {Find: "height: 222px;", Replace: "height: 260px;"} # LibraH2O - {Find: "width: 126px;", Replace: "width: 165px;"} - - {Find: "height: 205px;", Replace: "height: 234px;"} + - {Find: "height: 205px;", Replace: "height: 229px;"} # # Part 3: All models: #hBooks - Move bookcount up & away from horizontal gridline - # Users of lower-res models (Touch/Mini/Glo/Aura6"/Aurav2) may prefer to + # Users of lower-res models (Touch/Mini/Glo/Aura6"/Aurav2) may prefer to # decrease the Replace value of 20px for padding-bottom - Find: "#hBooks {\n padding-left: 0px;\n padding-bottom: 0px;\n font-style: normal;\n}" Replace: "#hBooks {\n padding-left: 0px;\n padding-bottom:20px;\n font-style: normal;\n}" - -Reduce height of page navigator arrows: - - Enabled: no - - Description: | - Reduce page navigator footer height (Book list, Series list) - This patch may be helpful to users who also enable the nickel patch - 'Series list increase cover thumbnails' - It should prevent the white background of the page footer/navigation arrow - overlapping the bottom edge of the last Series list thumbnail on each page. - - FindZlib: "QWidget[footerFixedHeight=true][qApp_deviceIsTrilogy=true]" - - ReplaceZlibGroup: - Replacements: - # Touch/Mini - - Find: "QWidget[footerFixedHeight=true][qApp_deviceIsTrilogy=true] {\n min-height: 70px;\n max-height: 70px;\n}" - Replace: "QWidget[footerFixedHeight=true][qApp_deviceIsTrilogy=true] {\n min-height: 54px;\n max-height: 54px;\n}" - # Glo/Aura6"/Aurav2 - - Find: "QWidget[footerFixedHeight=true][qApp_deviceIsPhoenix=true] {\n min-height: 82px;\n max-height: 82px;\n}" - Replace: "QWidget[footerFixedHeight=true][qApp_deviceIsPhoenix=true] {\n min-height: 70px;\n max-height: 70px;\n}" - # AuraHD/H20/H20v2/GloHD/ClaraHD - - Find: "QWidget[footerFixedHeight=true][qApp_deviceIsDragon=true] {\n min-height: 120px;\n max-height: 120px;\n}" - Replace: "QWidget[footerFixedHeight=true][qApp_deviceIsDragon=true] {\n min-height: 90px;\n max-height: 90px;\n}" - # AuraOne/Forma - - Find: "QWidget[footerFixedHeight=true][qApp_deviceIsDaylight=true] {\n min-height: 156px;\n max-height: 156px;\n}" - Replace: "QWidget[footerFixedHeight=true][qApp_deviceIsDaylight=true] {\n min-height: 120px;\n max-height: 120px;\n}" - # LibraH2O - - Find: "QWidget[footerFixedHeight=true][qApp_deviceIsStorm=true] {\n min-height: 138px;\n max-height: 138px;\n}" - Replace: "QWidget[footerFixedHeight=true][qApp_deviceIsStorm=true] {\n min-height: 105px;\n max-height: 105px;\n}" # The following patch(es) are ported from oren64's patches Increase headlines font: @@ -597,7 +517,7 @@ New home screen subtitle custom font: - Description: | Increase subtitle font size, font color black. Works best when used with with patch `New home screen increasing cover size` - - BaseAddress: 0x1400C98 # FindZlib: "MetaDataLabel {\n color: #666666;\n qproperty-indent: 0;\n}" + - BaseAddress: 0x14AAB73 # FindZlib: "MetaDataLabel {\n color: #666666;\n qproperty-indent: 0;\n}" - ReplaceZlib: {Find: "MetaDataLabel {\n color: #666666;\n qproperty-indent: 0;\n}", Replace: "MetaDataLabel {\n color: #000000;\n qproperty-indent: 0;\n}"} - ReplaceZlib: Find: "MetaDataLabel[qApp_deviceIsTrilogy=true] {\n font-size: 13px;\n}" @@ -612,7 +532,7 @@ New home screen subtitle custom font: Find: "MetaDataLabel[qApp_deviceIsDaylight=true] {\n font-size: 31px;\n}" Replace: "MetaDataLabel[qApp_deviceIsDaylight=true] {\n font-size: 34px;\n}" # duplicate - - BaseAddress: 0x14093E8 + - BaseAddress: 0x14AF266 - ReplaceZlib: {Find: "MetaDataLabel {\n color: #666666;\n qproperty-indent: 0;\n}", Replace: "MetaDataLabel {\n color: #000000;\n qproperty-indent: 0;\n}"} - ReplaceZlib: Find: "MetaDataLabel[qApp_deviceIsTrilogy=true] {\n font-size: 13px;\n}" @@ -630,20 +550,21 @@ New home screen subtitle custom font: Remove footer (row3) and increase cover size on new home screen: - Enabled: no - PatchGroup: Home screen layout tweaks - - FindZlib: "#mainContainer[qApp_deviceIsTrilogy=true] {\n qproperty-leftMargin: 26;" + - FindZlib: "#row1col2" - ReplaceZlibGroup: Replacements: - - Find: "#mainContainer[qApp_deviceIsTrilogy=true] {\n qproperty-leftMargin: 26;\n qproperty-rightMargin: 26;\n qproperty-topMargin: 96;\n qproperty-bottomMargin: 26;\n qproperty-spacing: 10;\n}" - Replace: "#mainContainer[qApp_deviceIsTrilogy=true] {\n qproperty-leftMargin: 10;\n qproperty-rightMargin: 10;\n qproperty-topMargin: 96;\n qproperty-bottomMargin: 26;\n qproperty-spacing: 10;\n}" - - Find: "#mainContainer[qApp_deviceIsPhoenix=true] {\n qproperty-leftMargin: 36;\n qproperty-rightMargin: 36;\n qproperty-topMargin: 126;\n qproperty-bottomMargin: 36;\n qproperty-spacing: 14;\n}" - Replace: "#mainContainer[qApp_deviceIsPhoenix=true] {\n qproperty-leftMargin: 12;\n qproperty-rightMargin: 12;\n qproperty-topMargin: 126;\n qproperty-bottomMargin: 36;\n qproperty-spacing: 14;\n}" - - Find: "#mainContainer[qApp_deviceIsDragon=true] {\n qproperty-leftMargin: 50;\n qproperty-rightMargin: 50;\n qproperty-topMargin: 170;\n qproperty-bottomMargin: 50;\n qproperty-spacing: 20;\n}" - Replace: "#mainContainer[qApp_deviceIsDragon=true] {\n qproperty-leftMargin: 16;\n qproperty-rightMargin: 16;\n qproperty-topMargin: 170;\n qproperty-bottomMargin: 50;\n qproperty-spacing: 20;\n}" - - Find: "#mainContainer[qApp_deviceIsDaylight=true] {\n qproperty-leftMargin: 65;\n qproperty-rightMargin: 65;\n qproperty-topMargin: 220;\n qproperty-bottomMargin: 65;\n qproperty-spacing: 26;\n}" - Replace: "#mainContainer[qApp_deviceIsDaylight=true] {\n qproperty-leftMargin: 20;\n qproperty-rightMargin: 20;\n qproperty-topMargin: 220;\n qproperty-bottomMargin: 65;\n qproperty-spacing: 26;\n}" - # Note: this shouldn't conflict with the below patch, as the original row1col2 rule is kept intact, and there's no harm in duplicate rules. - - Find: "#row1col2 {\n qproperty-visible: false;\n}" - Replace: "#row1col2 {\n qproperty-visible: false;\n}\n#row3 {\n qproperty-visible: false;\n}" + - {Find: "qproperty-leftMargin: 32px;", Replace: "qproperty-leftMargin: 16px;"} + - {Find: "qproperty-rightMargin: 32px;", Replace: "qproperty-rightMargin: 16px;"} + - {Find: "qproperty-leftMargin: 40px;", Replace: "qproperty-leftMargin: 16px;"} + - {Find: "qproperty-rightMargin: 40px;", Replace: "qproperty-rightMargin: 16px;"} + - {Find: "qproperty-leftMargin: 57px;", Replace: "qproperty-leftMargin: 22px;"} + - {Find: "qproperty-rightMargin: 57px;", Replace: "qproperty-rightMargin: 22px;"} + - {Find: "qproperty-leftMargin: 74px;", Replace: "qproperty-leftMargin: 29px;"} + - {Find: "qproperty-rightMargin: 74px;", Replace: "qproperty-rightMargin: 29px;"} + - {Find: "qproperty-leftMargin: 67px;", Replace: "qproperty-leftMargin: 29px;"} + - {Find: "qproperty-rightMargin: 67px;", Replace: "qproperty-rightMargin: 29px;"} + - Find: "#row1col2 {\n qproperty-visible: false;\n}" + Replace: "#row1col2 {\n qproperty-visible: false;\n}\n#row3 {\n qproperty-visible: false;\n}" Remove footer (row3) on new home screen: - Enabled: no @@ -652,3 +573,45 @@ Remove footer (row3) on new home screen: - ReplaceZlib: Find: "#row1col2 {\n qproperty-visible: false;\n}" Replace: "#row1col2 {\n qproperty-visible: false;\n}\n#row3 {\n qproperty-visible: false;\n}" +# The following patch(es) are by pgaskin (geek1011) + +Show all games: + - Enabled: no + - Description: | + Shows all games in beta features. Since firmware 4.20.14601, this patch is + not needed if you have developer mode enabled (search + devmodeon/devmodeoff). + - FindZlib: "#boggleContainer[devModeOn=false][qApp_deviceIsPika=true]" + - ReplaceZlib: {Find: "qproperty-visible: false;", Replace: "qproperty-visible: true;"} + +Remove forgot pin button from lock screen: + - Enabled: no + - Description: | + Removes the Forgot PIN -> Sign Out button from the lock screen. + If this is enabled and you forget your pin, you will need to + hard reset your Kobo. + - BaseAddress: 0x14B787C + - ReplaceZlib: + Find: "#lblForgotPin[qApp_deviceIsDragon=true],\n#lblSignOut[qApp_deviceIsDragon=true] {\n font-size: 26px;\n}" + Replace: "#lblForgotPin,#lblSignOut{qproperty-visible:false;}" + - BaseAddress: 0x14BB84A + - ReplaceZlib: + Find: "#lblForgotPin[qApp_deviceIsDragon=true],\n#lblSignOut[qApp_deviceIsDragon=true] {\n font-size: 26px;\n}" + Replace: "#lblForgotPin,#lblSignOut{qproperty-visible:false;}" + +Increase size of kepub chapter progress chart: + - Enabled: no + - Description: Originally by oren64, rewritten for 4.16.13337 by pgaskin (geek1011). + - FindZlib: "#chapterSizes" + - ReplaceZlibGroup: + Replacements: + # Top padding is aready set to 15px, 25px, 33px, vertical aligned to middle. + # Progress chart bar sizes: + - Find: "#chapterSizes[qApp_deviceIsTrilogy=true] {\n max-height: 56px;\n min-height: 56px;\n}" + Replace: "#chapterSizes[qApp_deviceIsTrilogy=true] {\n max-height: 90px;\n min-height: 90px;\n min-width: 385px;\n max-width: 385px;\n}" + - Find: "#chapterSizes[qApp_deviceIsPhoenix=true] {\n max-height: 70px;\n min-height: 70px;\n}" + Replace: "#chapterSizes[qApp_deviceIsPhoenix=true] {\n max-height: 130px;\n min-height: 130px;\n min-width: 495px;\n max-width: 495px;\n}" + - Find: "#chapterSizes[qApp_deviceIsDragon=true] {\n max-height: 100px;\n min-height: 100px;\n}" + Replace: "#chapterSizes[qApp_deviceIsDragon=true] {\n max-height: 170px;\n min-height: 170px;\n min-width: 678px;\n max-width: 678px;\n}" + - Find: "#chapterSizes[qApp_deviceIsDaylight=true] {\n max-height: 130px;\n min-height: 130px;\n}" + Replace: "#chapterSizes[qApp_deviceIsDaylight=true] {\n max-height: 215px;\n min-height: 215px;\n min-width: 865px;\n max-width: 865px;\n}"