Drop wps_internals.h from skin_engine.h. The WPS and to a lesser
extent the radio screen are too tightly integrated to drop their
dependency on wps_internals.h, unfortunately. Skinned lists, for
obvious reasons, also need access to the internals.
Change-Id: I00a55aa423900f9ad22edccbe2fc1910af380e38
the GUI_EVENT_NEED_UI_UPDATE event was not canceled till
after the call to scroll_stop this resulted in the scrolled line
being re-added after the function was done causing a crash
thanks spork, amachronic
Change-Id: I2e484a2b877f6da63171eb997f62a21e95ca9bfc
Several places in the codebase implemented an ad-hoc form of pinning;
they can be converted to use buflib pinning instead.
Change-Id: I4450be007e80f6c9cc9f56c2929fa4b9b85ebff3
allow buflib_free to check for invalid or already freed handles
within the function -- remove all the invalid handle guards thru core_free
Change-Id: Ibdcbc82760fc93b674c42283fca420d94907df8e
the loading track splash flashes and is ugly
add a function to display a progressbar along with the splash message
spruce up database commit message as well
Change-Id: I2749b958c1ee5dad2631a5f999a4b00ddca7f225
Only the "Rockbox Info" screen uses it for a rather silly purpose,
so remove the function. This helps to decouple things from the GUI.
Change-Id: Icf73e3ee1230c75bf43016c0f1c05c7fe1a24895
Get rid of the "limit_scroll" member from lists and make it a
local variable of gui_synclist_do_button().
Bump plugin API version since struct gui_synclist was changed.
Change-Id: Ie3244a85e5a1022a2f6e238a506fdbba67724962
Removing the "list_wrap" argument is actually pretty easy.
In practice, almost all lists are using LIST_WRAP_UNLESS_HELD
behavior so we can make that the default. A couple of lists
disable wraparound with LIST_WRAP_OFF; this is now achieved
by setting the list "wraparound" flag to false when setting
up the list. LIST_WRAP_ON was unused and is of questionable
value, so it has been removed entirely.
This makes list wraparound behavior a property of the list,
controlled solely by the "wraparound" flag. The result is a
simpler list API and implementation, without changing the
behavior of any lists.
Change-Id: Ib55d17519e6d92fc95ae17b84ab0aaf4233bcb5a
Since gui_synclist_do_button() overrides the setting at runtime
there is no reason to have a public API call to set it. Really
it should be a local variable, but it will be simpler to do that
after refactoring how list wraparound behavior is handled.
Change-Id: Id09d42197814102693752a9f64db8325118ca796
gui_list_screen_scroll_step() and gui_list_screen_scroll_out_of_view()
just copy the global setting into a local static variable.
Since they don't do anything special when the setting changes
it's simpler to use the global setting directly.
Change-Id: Ib6a7bf4e09b6dabbc1597cf28ddbafc0bc857526
The implementation of the "show_selection_marker" option in
lists isn't great. It's a cosmetic option used to hide the
selection, but it causes the list to do funny things to the
selected_item and doesn't play nice with voiced menus, since
these rely on the selection to determine what item is spoken.
There are only two user-facing lists that use the option, the
"Rockbox Info" screen and a menu in the superdom plugin. The
rest are debug screens, and cosmetics don't matter much there.
Given how little used the option is, and its issues, removing
it seems reasonable.
Change-Id: I2c70b3e4c74ff3cc6dbac46366a371d271dd2d58
Use const char* pointers for list titles. Only one debug menu
actually modifies the title, and in that case it's legal to
cast away const because the title points to a known mutable
buffer on the stack.
Change-Id: Idb8ab307b9a6ec23a93d8420c5e19fafd9f59c30
The %Vs(color) tag doesn't set the text style properly and causes
the background to not be cleared when rendering lines. For static
text this is rarely a problem, but for scrolling text it'll cause
the text to "smear" once it starts scrolling.
Fix this by setting STYLE_DEFAULT, so the background gets redrawn
when the line scrolls.
Bug report: https://forums.rockbox.org/index.php/topic,54320.0.html
Change-Id: I835c806005ea40fd6bac3692e52a9c325581a293
UBSan reports an avalanche of unaligned pointer bugs stemming from
hardcoded 4-byte alignments used in certain places. Use sizeof(long)
instead to align to the machine word size.
Change-Id: I28e505212462c5268afa24e95df3a103ac3e2213
flags were getting un-initialized memory
it really didn't matter with the flags getting initialized
anyway
But once I added a new flag that didn't explicitly
set or clear the flag at init well here we are
set flags to VP_DEFAULT_FLAGS in viewport_set_defaults()
add the flags variable to the default vp's set to 0
(it was already initialized to 0 by bss, make it explicit)
Change-Id: I3a9a062455b4cf66d2b8c70fdf05402a5c0c091c
its really painful needing to override global settings in order to change
some aspects of lists
this patch moves:
[scrollbar position, cursor type,
talk_menus, keyclick,
wrap around, scroll paginated]
to variables within the synclist, it also makes updating
after settings changes a necessity
I think I have the static synclists in core covered
(I think the one in gui/list-skinned can be left as is)
this patch allows easy modification these flags on the fly
Change-Id: Id0dcb8b05eb9ecd78929c0aff7678bf2ab4c70a7
fix bugs introduced in the switch over to using string_option
instead of if else strcmp trees,
embedded album art should work again
skin parser had an error for 'noborder' and 'nobar'
Change-Id: I957d81e5fa8467b33bbd93d63c4428c36100acca
Large embedded album art can cause pauses during
playback or when skipping between tracks, especially
on older devices, but embedded art is currently loaded
even when separately stored smaller image files would be
available.
A workaround is to remove large album art from the
metadata of files.
This now adds a setting to either turn off loading of
album art completely, or to prefer loading the album art
from a separate image file and thus ignore the embedded
versions.
Change-Id: I22fb581abf56072e35e6c29d72e553747ec1a96a
allow the guts of gui_sync_list to be used with owner drawn items
WIP
printcell_helper--
goal: allow data to be displayed in a spreadsheet format with an easy to use interface
printcell_set_columns(gui_synclist, title, icon)
sets title and calculates cell widths
each column is identified by '$' character
ex 3 columns title = "Col1$Col2$Col3"
also accepts $*WIDTH$
ex 3 columns varying width title = "$*64$Col1$*128$Col2$Col3
printcell_enable(gui_synclist, enable)
sets the printcell function enabled
After setting the columns and enabling the printcell function
items can be added to the list like normal
column items are supplied delimited by '$'
ex item = "Item1$item2$item3"
they will be placed in cells defined by set_columns and scroll if the cell is too small
--Fixed for 1 bit & 2 bit displays
Change-Id: I49bd7903005d7a54e93af4379b0cdea63c860656
Adds a command for showing track info to
the Playlist Viewer's context menu, which
brings up the same screen used by the WPS
for currently playing tracks.
Change-Id: I17d99671935934dad565d290a0d6fb3b0dfd8b01
The sort order of numeric lists can now be changed with the
new "List Order" setting. It defaults to ascending for most
scrollwheel targets and descending for all others, matching
the old hardcoded behavior.
Change-Id: I4866f04ec5995158edf9e40badf7f661b3ddea81
Scrolling via the scrollbar is now a bit smoother -- it's
now drawn pixelwise, and dragging it will scroll the list
pixelwise instead of rigidly snapping to items.
Several other general UX issues were fixed:
- List and scrollbar now occupy the full viewport height,
to maximize use of screen space.
- Fixed issue with last item in the list suddenly appearing
or disappearing while scrolling.
- Prevented scrolling into blank space after the last item.
Change-Id: Ib279ac87ec2f2ffc8834c19ff0af45286e2d6d4d
In absolute pointing mode, the quickscreen now accepts
a touch anywhere in the middle third of the screen edge
to trigger an item, and pressing anywhere else on the
'grid' will exit -- the same as how 3x3 mode works.
Previously it required a touch inside the text viewport
to trigger an item, and exited after any touch outside
the viewports. This made it very difficult to use since
the text viewports are too small to reliably touch.
Change-Id: I971eaeb4a2c67bebef3d7b070a29b897df07b8e7
The behavior of the top/bottom items is not intuitive when used
with settings like volume or brightness -- pressing up will
actually *decrease* the setting, and down will increase it.
This patch inverts the direction, so the top item will increase
the setting.
The reason for this is that historically, the quickscreen seems
to have had only 3 directions -- left, right, and bottom. Bottom
therefore selected the next value, and when top was introduced
it selected the previous value.
The counter-intuitive nature of this was later reported as a bug
on the Fuze V2 and got an incorrect fix (commit 2271995517) under
the assumption that ASCENDING_INT_SETTINGS was the issue.
Change-Id: I3be92534469cea4f5efd81ab024288c052367411
Should prevent a delay, dropouts and memory corruption
that can occur when applying a skin while music is playing
Change-Id: Ic2c8fd788117a7d797fb315a36e366a2e34d3460
Allows user to decide whether scrolling lists will wrap around
to the opposite end after the first or last item has been reached.
Change-Id: I22156812cf4c857ddc4b6c48c1cef013b1985260
| with some code refactoring we can eliminate the static
char buffer in get_full_path()
I'm guessing making the functions recursive prompted the static buffer
I don't see any reason we can't just pass the same buffer
|
During tested I noted failure after buffer was full
-- splash added for buffer full notification
added some logic to not add partial entries and try to find a
| selected item that will fit in the remaing buffer
------------------------------------------------------------------------
While looking through the source I noticed a few potential
pitfalls with the current code.
Namely the stack allocated temporary buffer
sized to setting_len.
I also noted the rigid vect[32] with the timeless --
/* 32 separate folders should be Enough For Everybody(TM) */
and decided to make it a bit more robust
The saved items are hashed with crc32 on all the paths
and a hashed_len is kept to aid in the buffer full message before the
user actually goes to save the changes
(assuming they even get the message)
In the old code, buffer might be the same since it ran out of
space and didn't get their later selections
the hashed_len could easily be turned into a way to get a needed buffer
size as well for someone in the future just pass a really large maxlen
I made get_full_path non recursive since it liked to blow the stack
while embedded in all the other recursive calls making it a pain to debug
(the real reason the buffer was static?)
traverse first from the current folder to root mutating the
parent pointers to point at the previous child
next traverse back to the folder unmutating & taking names on the way
Folder depth is now uint16 65535 levels is probably excessive
children_count is also uint16 as well
I made the first folders below root '/' stay below root
instead of shifting since the horizontal real estate is limited
slightly smaller than it began but hopefully faster & more reliable
Change-Id: I348f61baf865cccdeacddfd9d50641a882e890fc
So that a “scroll left” button can be repurposed
for returning to the main menu when there is no
existing menu button mapping.
Change-Id: I38515943313f69cc3241b3f523c94ea012471b88
CheckWPS doesn't catch errors involving translated strings
Instead of breaking old themes when the langids no long exist
return "<ERR>"
Change-Id: I0d744cd48bb5a27e735fce3f6f740450d1f6a55a
This fixes a bug reported on IRC:
1. Set 'bookmark on stop' to 'ask'
2. Play a track from the file browser
3. Stop playback, yes/no screen briefly flashes then disappears.
The screen still handles input correctly but the prompt will not
be displayed on the LCD. Long story short, get_action() can cause
the skin engine to do a full redraw which cleared the screen and
erased the prompt.
There is a special event, GUI_EVENT_NEED_UI_UPDATE, which the list
code uses to avoid precisely this problem.
Hooking up a handler for this event and redrawing the yes/no prompt
fixes the bug.
Change-Id: If3c26655540c13b488b3a11bd46e1d60d4111469
Some lists have tall items that span more than one line of text,
eg. the bookmark menu or ID3 tag menu. The touchscreen code didn't
handle these menus correctly and touching on the lower part of a
list item could select "between" two items, leading to incorrect
rendering and behavior due to callers relying on the selected item
being properly aligned to the selection size. Fix this by ensuring
the touch code only generates properly aligned selections.
Change-Id: I73945bb0947590517a005754bd447639e22812e2
Seems to fix the unintuitive / inaccurate behavior of this screen.
Rejigger the generic touchscreen keymap because the 3x3 buttons are
no longer used. Also map physical keys for yes/no on the Q1.
Change-Id: I2ed633896b87030fa654d47d9d02929b849495da
Due to this inadequate bounds check, it was possible under certain
conditions to cause a crash by touching & scrolling in the empty
space "after" the last item of a list.
Change-Id: Ic6c30214d887e1c7ccb212de272248ca24f60856
The old way of padding out bars was to just create a bigger touch
region, the intent being to make it easier to touch the end of a
bar. Unfortunately, this didn't even accomplish that, and caused
an annoying offset between the bar graphics and the touch point.
New method is to account for padding explicitly and clamp touches
in the padding region so they are within the proper touch region.
Change-Id: Id39e571fc1b033a4da94f0eb1143a2fc276bab03
Increased the precision of the bar from 100 steps to 1000 steps so
it is possible to make finer adjustments, and made it possible to
pick the maximum value in a bar rather than just the maximum - 1.
Change-Id: I2e694d3e86e4a151e014da1bd15ab3ade4c4b95e
Allows the ACTION_YESNO_ACCEPT action to be set
to a button release by ignoring certain system events.
Moving USB init in main.c to the last thing to prevent
getting stuck in the USB prompt, if enabled.
Also changing ACTION_YESNO_ACCEPT to button release on erosq
Change-Id: I5e7498521a13cb4e840223dd0b9c8633e99093bc
(Don't include rbpaths.h in settings.h, or string-extra.h in rbpaths.h)
Build-tested on rocker, erosq, mini2g, nano2g,
xduoox3, clipzip, dx50, and uisim
Change-Id: If32e9c9910f5c8247a655cb64522b84d6d7ccbb5
This is basically the same problem as FS#13272, except it happens
on certain themes, eg. rayboradio. The issue only affects targets
with decimal volume levels.
Tested the fix using the rayboradio theme on the FiiO M3K and the
Fuze+ simulator. Volume was displayed correctly on both.
Change-Id: I9e035f7a3c04c85c9b3b01243c7f0a5f8f0ccf9f
The viewport used for the scrollbar is allocated on the stack, and falls
out of scope before the next call to set_viewport(), which sets a flag
in the now-out-of-scope "last" viewport.
Change-Id: I2c8bfcff500d189fa3857411aadc2e16aa545d2c
make shortcuts menu drop back into WPS on exit
different icons for plugins and files versus folders
Change-Id: I1b590c223b63a6b6598c33e767738daaea1c8ad0
Fix returns from shortcuts -- should now run plugins
Fix formatting of file names to remove path from browser shortcuts
Change-Id: I46e337110d04b84bedcb0c2945d5dd29a1860847
If the tag being checked returns a negative number (e.g. %LI does that
when the current list item does not have an icon) the tag's value would
always end up being 1.
Change-Id: I69ab175b6c46dd7567386e649732dbb8327972fc
While using Rockbox for a while on my 1st-gen iPod mini I noticed that
the first entry of a list sometimes displays a wrong character at the
18th column. For example, the ':' character would display as 'z', the
'-' character as 'm', 0x00 would display '@' and so on. Oddly enough
this only occurred when the scrollbar was enabled.
I figured that the call to `display->set_viewport(list_text_vp);` in the
for loop inside `list_draw(...)` causes this. Digging deeper I noticed
that in the `lcd-bitmap-common.c` driver the `current_viewport` was
pointing to the start of the line's text. From what I can tell the
cause of this was that the viewport was set to a struct with a shorter
scope than the entire function.
The actual fix for this is quite straightforward -- once the scrollbar
has been drawn the viewport is now changed back to the default one.
Change-Id: Id6a7bd8f74864641ea1670fedea9d12d764e78c0
it takes a lot of code to check validity and dereference a pointer for every numeric tag branch in get_token_value
apparently about 900 bytes actually
Change-Id: If463e755e9bbc73cbd4a02441572d22df9206121
AUDIOHW_SETTING() defines number of decimals and step size.
This is taken into account in sound menu but ignored in lists
(had been recently fixed in WPS).
This was not a problem so far since all drivers used 0 decimal
places and step size equal 1.
Change-Id: I8807d5b6f2f3d412a2bc5769905bd776553ece0b
Basically setting a null buffer is valid but it must be selected
into a screen to initialize to the default buffer
I wrongly assumed screen type wouldn't matter but since I decided to
reference backdrops directly to the default buffer
(since they are saved as an offset from what it later assumes to be the
default framebuffer)
SCREEN_MAIN/SCREEN_REMOTE are not longer optional
Change-Id: I8a8afbbe1e3ed0bfe6abd40ce287638e9fc6da60
Pretty subtle problem; looks like the skin core was relying on a
destructor to actually help initialize things.
Change-Id: Ieb4b9e4f11377dec7be61d13759590fc5f4bc921
And size elements horizaontally based on SYSFONT_WIDTH
Unfortunately we need 16px icons to make 16px statusbar look right
but at least it _works_ properly now.
Also: all targets currently use 8-px SYSFONT, except some hosted bootloaders
Change-Id: I0cdf97e6ef47ec49693ef79667b200595b4fe075
I'm currently running up against the limitations of the lcd_draw functions
I want these functions to be able to be used on any size buffer not
just buffers with a stride matching the underlying device
[DONE] allow the framebuffer to be decoupled from the device framebuffer
[DONE need examples] allow for some simple blit like transformations
[DONE] remove the device framebuffer from the plugin api
[DONE}ditto remote framebuffer
[DONE] remove _viewport_get_framebuffer you can call struct *vp = lcd_set_viewport(NULL) and vp->buffer->fb_ptr
while remote lcds may compile (and work in the sim) its not been tested on targets
[FIXED] backdrops need work to be screen agnostic
[FIXED] screen statusbar is not being combined into the main viewport correctly yet
[FIXED] screen elements are displayed incorrectly after switch to void*
[FIXED] core didn't restore proper viewport on splash etc.
[NEEDS TESTING] remote lcd garbled data
[FIXED] osd lib garbled screen on bmp_part
[FIXED] grey_set_vp needs to return old viewport like lcd_set_viewport
[FIXED] Viewport update now handles viewports with differing buffers/strides by copying to the main buffer
[FIXED] splash on top of WPS leaves old framebuffer data (doesn't redraw)
[UPDATE] refined this a bit more to have clear_viewport set the clean bit and have skin_render do its own screen clear
scrolling viewports no longer trigger wps refresh
also fixed a bug where guisyncyesno was displaying and then disappearing
[ADDED!] New LCD macros that allow you to create properly size frame buffers in you desired size without wasting bytes
(LCD_ and LCD_REMOTE_)
LCD_STRIDE(w, h) same as STRIDE_MAIN
LCD_FBSTRIDE(w, h) returns target specific stride for a buffer W x H
LCD_NBELEMS(w, h) returns the number of fb_data sized elemenst needed for a buffer W x H
LCD_NATIVE_STRIDE(s) conversion between rockbox native vertical and lcd native stride (2bitH)
test_viewports.c has an example of usage
[FIXED!!] 2bit targets don't respect non-native strides
[FIXED] Few define snags
Change-Id: I0d04c3834e464eca84a5a715743a297a0cefd0af
eg with numdecimals=1, a value of "-300" actually means "-30.0" So
divide it down appropriately, and only display the whole integer
portion.
Change-Id: I62927d2e64b224f3c11640b9bb9e84d60dbde34b