Skip to content

settings_quick_launch: new combo back + up#707

Open
asyba wants to merge 1 commit intocoredevices:mainfrom
asyba:quick_launch_combo
Open

settings_quick_launch: new combo back + up#707
asyba wants to merge 1 commit intocoredevices:mainfrom
asyba:quick_launch_combo

Conversation

@asyba
Copy link
Contributor

@asyba asyba commented Jan 14, 2026

Added a new Quick Launch button using a Hold with BACK+UP.

@saltedlolly
Copy link
Contributor

@asyba Thank you so much for doing this. Having a couple more quick-launch options that can be performed without even needing to look down at the watch would be so useful.

I only own a Pebble 2 Duo right now. Have you tried this with a Round Pebble? Obviously, with the rectangular Pebble model this quick-launch pinch combo makes sense, as the buttons are opposite each other. I just wonder how it feels on the round Pebbles, with the back button in the center of the watch, and whether it works as well? I had forgotten that using select-back is the combo for reset, so using that combo for this quick-launch on the Round may not be possible. (It also probably helps to be consistent across models).

As far as I am aware, these two system combos are currently used by PebbleOS itself:

  • Reset Watch - Hold back+select for 10 seconds
  • Reboot into Recovery Mode - Hold back+up+select for 30 seconds

Are there any others to be aware of?

I concede that a multi-button quick-launch combo is probably not a feature that normal users are likely to ever use, not that it matters if they don't. Pebble watches tend to appeal more to geeky types, and those types of users are likely to find these really useful.

I do hope that this gets merged.

@saltedlolly
Copy link
Contributor

Also, how does this implementation adapt for left-handed users, who wear their Pebble on their right wrist, with watch and screen flipped? In this orientation, the combo would probably want to be back+down, (rather than still back+up) so the buttons remain opposite each other.

@gmarull gmarull requested a review from jplexer January 15, 2026 21:22

void quick_launch_app_menu_window_push_combo(void) {
QuickLaunchAppMenuData *data = app_zalloc_check(sizeof(*data));
data->is_tap = true;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Setting is_tap = true for a hold-combo is confusing. Consider adding a comment explaining why, or restructuring the filter logic to be clearer.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

cleanup

// Reset recognizer state to prevent stale state
ClickRecognizer *recognizer = &s_click_manager.recognizers[button_id];
recognizer->is_button_down = false;
recognizer->number_of_clicks_counted = 0;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Directly manipulating ClickRecognizer internal state is fragile. If button up events arrive after this reset, it could cause state corruption.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@jplexer I was having problems where, after successfully executing the combo, the quick launches would generally be messed up. This helped me reset them and fix them.

I just try instead call click_manager_reset(&s_click_manager);, I did a quick test and it worked fine.

I also tried removing both and it works fine... maybe none reset is necessary.
Although I do notice the animations are slower without any kind of reset, I don't know if that's just my imagination from so much testing, haha.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

removed

@asyba asyba force-pushed the quick_launch_combo branch 3 times, most recently from e4a359f to ca39c78 Compare February 2, 2026 17:57
@asyba asyba requested a review from jplexer February 2, 2026 18:03
@asyba asyba force-pushed the quick_launch_combo branch from ca39c78 to 73b374b Compare February 2, 2026 18:04
@asyba
Copy link
Contributor Author

asyba commented Feb 11, 2026

@jplexer can you review


if (!quick_launch_single_click_is_enabled(button)) return;
//check if quick launch app is not timeline
if (quick_launch_single_click_get_app(click_recognizer_get_button_id(recognizer)) != APP_ID_TIMELINE) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: button is now extracted on line 124 but the function body still calls click_recognizer_get_button_id(recognizer) three more times instead of using it.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done

// This ensures only the combo executes, not individual hold handlers
if (s_click_manager.recognizers[BUTTON_ID_BACK].hold_timer != NULL) {
app_timer_cancel(s_click_manager.recognizers[BUTTON_ID_BACK].hold_timer);
s_click_manager.recognizers[BUTTON_ID_BACK].hold_timer = NULL;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reaching directly into s_click_manager.recognizers[].hold_timer is fragile, it bypasses the recognizer's own state machine and could leave fields like is_held stale. There's no per-recognizer cancel API (only click_manager_reset() which resets all buttons), so this is the only option short of adding one. Might be worth adding a click_recognizer_reset() to click_internal.h and using it here.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done, created

@jplexer
Copy link
Member

jplexer commented Feb 16, 2026

sorry! this one got away from me

@asyba
Copy link
Contributor Author

asyba commented Feb 17, 2026

@saltedlolly no I don't have round pebble or others.

Signed-off-by: Federico Bechini <federico.bechini@gmail.com>
@asyba asyba force-pushed the quick_launch_combo branch from 73b374b to 8332430 Compare February 17, 2026 20:19
@asyba asyba requested a review from jplexer February 17, 2026 20:30
@@ -54,6 +55,8 @@ static const char *s_row_titles[NUM_ROWS] = {
[ROW_HOLD_DOWN] = i18n_noop("Hold Down"),
/// Shown in Quick Launch Settings as the title of the hold back button quick launch option.
[ROW_HOLD_BACK] = i18n_noop("Hold Back"),
/// Shown in Quick Launch Settings as the title of the hold back+up button combination option.
[ROW_HOLD_BACK_UP] = i18n_noop("Hold Back + Up"),
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fyi, we'd only merge this as a phone-side setting (meaning this menu entry would be removed and the corresponding pref would be added to the settings whitelist at src/fw/services/normal/blob_db/settings_blob_db.c)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

got it, Is there a set method for deciding this, or is it done on a case-by-case basis?
For example, will each new configuration be automatically added to mobile-only, or will some other existing old configurations also be moved to mobile-only?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

currently its new configs will be mobile-only but it can be decided on a case by case basis :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

Comments