[Scummvm-git-logs] scummvm master -> b40af9a9308630b210bd570d8f5fc80102d624ca
sev-
noreply at scummvm.org
Fri Apr 3 13:52:56 UTC 2026
This automated email contains information about 13 new commits which have been
pushed to the 'scummvm' repo located at https://api.github.com/repos/scummvm/scummvm .
Summary:
6dc02783fe GUI: Refactor cursor data storage to support multiple cursors
9135819221 GUI: Add cursor type attribute to theme cursor element
a1fdfe0d6e GUI: THEMES: Add index cursor to scummmodern theme
835863756b GUI: Switch to index cursor when hovering links in RichTextWidget
a4ae174a0a GUI: THEMES: Move cursor index SVG from scummodern theme folder to common-svg and update THEMERC to include common-svg
735223a5d6 GUI: THEMES: Add cursor index bitmap files to common folder
ca4e0a37ae GUI: THEMES: Add cursor index bitmap and cursor definitions to .stx files of residualvm and scummremastered themes
20e7035e14 GUI: THEMES: Regenerate .zip files of residualvm, scummclassic, scummmodern, and scummremastered themes to include the n
d97dc54e8a GUI: Update cursor fallback logic in setActiveCursor function
8d6c784736 GUI: Increase palette size in CursorData structure from 3 * 255 to 3 * 256
6298f49ab3 GUI: Modify RichTextWidget::handleMouseMoved() to have conformant code formatting
cbefd718dd GUI: THEMES: Undo scummodern THEMERC modification and add cursor index SVG file to scummodern theme
b40af9a930 GUI: THEMES: Regenerate residualvm, scummmodern, and scummremastered theme zip files
Commit: 6dc02783feec02953332f5235f048b9aff02a2ea
https://github.com/scummvm/scummvm/commit/6dc02783feec02953332f5235f048b9aff02a2ea
Author: Marwane ElBaraka (marwane.elbaraka at gmail.com)
Date: 2026-04-03T15:52:43+02:00
Commit Message:
GUI: Refactor cursor data storage to support multiple cursors
Introduce CursorData struct and array to store multiple cursor definitions. This prepares the ThemeEngine for supporting different cursor types (e.g., normal, cursor-index).
Changed paths:
gui/ThemeEngine.cpp
gui/ThemeEngine.h
diff --git a/gui/ThemeEngine.cpp b/gui/ThemeEngine.cpp
index a94292f9eaa..054238edda7 100644
--- a/gui/ThemeEngine.cpp
+++ b/gui/ThemeEngine.cpp
@@ -227,12 +227,6 @@ ThemeEngine::ThemeEngine(Common::String id, GraphicsMode mode) :
_themeArchive = nullptr;
_initOk = false;
- _cursorHotspotX = _cursorHotspotY = 0;
- _cursorWidth = _cursorHeight = 0;
- _cursorTransparent = 255;
- _cursorFormat = Graphics::PixelFormat::createFormatCLUT8();
- _cursorPalSize = 0;
-
// We prefer files in archive bundles over the common search paths.
_themeFiles.add("default", &SearchMan, 0, false);
}
@@ -258,7 +252,9 @@ ThemeEngine::~ThemeEngine() {
delete _parser;
delete _themeEval;
- delete[] _cursor;
+ for (int i = 0; i < kCursorMax; i++) {
+ delete[] _cursors[i].data;
+ }
}
@@ -401,9 +397,10 @@ void ThemeEngine::refresh() {
_system->showOverlay();
if (_useCursor) {
- if (_cursorPalSize)
- CursorMan.replaceCursorPalette(_cursorPal, 0, _cursorPalSize);
- CursorMan.replaceCursor(_cursor, _cursorWidth, _cursorHeight, _cursorHotspotX, _cursorHotspotY, _cursorTransparent, true, &_cursorFormat);
+ CursorData &cur = _cursors[_activeCursorType];
+ if (cur.palSize)
+ CursorMan.replaceCursorPalette(cur.pal, 0, cur.palSize);
+ CursorMan.replaceCursor(cur.data, cur.width, cur.height, cur.hotspotX, cur.hotspotY, cur.transparent, true, &cur.format);
}
}
}
@@ -1583,34 +1580,37 @@ void ThemeEngine::applyScreenShading(ShadingStyle style) {
}
}
-bool ThemeEngine::createCursor(const Common::String &filename, int hotspotX, int hotspotY) {
+bool ThemeEngine::createCursor(const Common::String &filename, int hotspotX, int hotspotY, CursorType type) {
// Try to locate the specified file among all loaded bitmaps
const Graphics::ManagedSurface *cursor = _bitmaps[filename];
if (!cursor)
+ //warning("createCursor: Bitmap '%s' not found in _bitmaps! (type=%d)", filename.c_str(), type);
return false;
+ CursorData &cur = _cursors[type];
+
// Set up the cursor parameters
- _cursorHotspotX = hotspotX;
- _cursorHotspotY = hotspotY;
+ cur.hotspotX = hotspotX;
+ cur.hotspotY = hotspotY;
- _cursorWidth = cursor->w;
- _cursorHeight = cursor->h;
+ cur.width = cursor->w;
+ cur.height = cursor->h;
- _cursorTransparent = 255;
- _cursorFormat = Graphics::PixelFormat::createFormatCLUT8();
- _cursorPalSize = 0;
+ cur.transparent = 255;
+ cur.format = Graphics::PixelFormat::createFormatCLUT8();
+ cur.palSize = 0;
if (_system->hasFeature(OSystem::kFeatureCursorAlpha)) {
- _cursorFormat = cursor->format;
- _cursorTransparent = _cursorFormat.RGBToColor(0xFF, 0, 0xFF);
+ cur.format = cursor->format;
+ cur.transparent = cur.format.RGBToColor(0xFF, 0, 0xFF);
// Allocate a new buffer for the cursor
- delete[] _cursor;
- _cursor = new byte[_cursorWidth * _cursorHeight * _cursorFormat.bytesPerPixel];
- assert(_cursor);
- Graphics::copyBlit(_cursor, (const byte *)cursor->getPixels(),
- _cursorWidth * _cursorFormat.bytesPerPixel, cursor->pitch,
- _cursorWidth, _cursorHeight, _cursorFormat.bytesPerPixel);
+ delete[] cur.data;
+ cur.data = new byte[cur.width * cur.height * cur.format.bytesPerPixel];
+ assert(cur.data);
+ Graphics::copyBlit(cur.data, (const byte *)cursor->getPixels(),
+ cur.width * cur.format.bytesPerPixel, cursor->pitch,
+ cur.width, cur.height, cur.format.bytesPerPixel);
_useCursor = true;
return true;
@@ -1620,10 +1620,10 @@ bool ThemeEngine::createCursor(const Common::String &filename, int hotspotX, int
return true;
// Allocate a new buffer for the cursor
- delete[] _cursor;
- _cursor = new byte[_cursorWidth * _cursorHeight];
- assert(_cursor);
- memset(_cursor, 0xFF, sizeof(byte) * _cursorWidth * _cursorHeight);
+ delete[] cur.data;
+ cur.data = new byte[cur.width * cur.height];
+ assert(cur.data);
+ memset(cur.data, 0xFF, sizeof(byte) * cur.width * cur.height);
// the transparent color is 0xFF00FF
const uint32 colTransparent = cursor->format.RGBToColor(0xFF, 0, 0xFF);
@@ -1634,8 +1634,8 @@ bool ThemeEngine::createCursor(const Common::String &filename, int hotspotX, int
uint colorsFound = 0;
Common::HashMap<int, int> colorToIndex;
const byte *src = (const byte *)cursor->getPixels();
- for (uint y = 0; y < _cursorHeight; ++y) {
- for (uint x = 0; x < _cursorWidth; ++x) {
+ for (uint y = 0; y < cur.height; ++y) {
+ for (uint x = 0; x < cur.width; ++x) {
uint32 color = colTransparent;
byte r, g, b;
@@ -1666,25 +1666,44 @@ bool ThemeEngine::createCursor(const Common::String &filename, int hotspotX, int
const int index = colorsFound++;
colorToIndex[col] = index;
- _cursorPal[index * 3 + 0] = r;
- _cursorPal[index * 3 + 1] = g;
- _cursorPal[index * 3 + 2] = b;
+ cur.pal[index * 3 + 0] = r;
+ cur.pal[index * 3 + 1] = g;
+ cur.pal[index * 3 + 2] = b;
}
// Copy pixel from the 16 bit source surface to the 8bit target surface
const int index = colorToIndex[col];
- _cursor[y * _cursorWidth + x] = index;
+ cur.data[y * cur.width + x] = index;
}
src += cursor->pitch - cursor->w * cursor->format.bytesPerPixel;
}
_useCursor = true;
- _cursorPalSize = colorsFound;
+ cur.palSize = colorsFound;
return true;
}
+void ThemeEngine::setActiveCursor(CursorType type) {
+ if (type < 0 || type >= kCursorMax || !_cursors[type].data) {
+ warning("setActiveCursor: Failed to switch - type=%d, data=%p", type, _cursors[type].data);
+ return;
+ }
+
+ _activeCursorType = type;
+
+ if (_useCursor) {
+ CursorData &cur = _cursors[_activeCursorType];
+ if (cur.palSize) {
+ CursorMan.replaceCursorPalette(cur.pal, 0, cur.palSize);
+ }
+
+ CursorMan.replaceCursor(cur.data, cur.width, cur.height,
+ cur.hotspotX, cur.hotspotY,
+ cur.transparent, true, &cur.format);
+ }
+}
/**********************************************************
* Legacy GUI::Theme support functions
@@ -2246,17 +2265,24 @@ Common::String ThemeEngine::getThemeId(const Common::Path &filename) {
}
void ThemeEngine::showCursor() {
- if (_useCursor) {
- if (_cursorPalSize)
- CursorMan.pushCursorPalette(_cursorPal, 0, _cursorPalSize);
- CursorMan.pushCursor(_cursor, _cursorWidth, _cursorHeight, _cursorHotspotX, _cursorHotspotY, _cursorTransparent, true, &_cursorFormat);
- CursorMan.showMouse(true);
- }
+ if (!_useCursor)
+ return;
+
+ CursorData &cur = _cursors[_activeCursorType];
+
+ if (cur.palSize)
+ CursorMan.pushCursorPalette(cur.pal, 0, cur.palSize);
+
+ CursorMan.pushCursor(cur.data, cur.width, cur.height,
+ cur.hotspotX, cur.hotspotY,
+ cur.transparent, true, &cur.format);
+ CursorMan.showMouse(true);
}
void ThemeEngine::hideCursor() {
if (_useCursor) {
- if (_cursorPalSize)
+ CursorData &cur = _cursors[_activeCursorType];
+ if (cur.palSize)
CursorMan.popCursorPalette();
CursorMan.popCursor();
}
diff --git a/gui/ThemeEngine.h b/gui/ThemeEngine.h
index a60171fe094..9fb077edccc 100644
--- a/gui/ThemeEngine.h
+++ b/gui/ThemeEngine.h
@@ -618,6 +618,15 @@ public:
*/
bool addTextData(const Common::String &drawDataId, TextData textId, TextColor id, Graphics::TextAlign alignH, TextAlignVertical alignV);
+public:
+ enum CursorType {
+ kCursorNormal = 0,
+ kCursorIndex = 1,
+ kCursorMax
+ };
+
+ void setActiveCursor(CursorType type);
+
protected:
/**
* Returns if the Theme is ready to draw stuff on screen.
@@ -638,6 +647,22 @@ protected:
*/
void setGraphicsMode(GraphicsMode mode);
+ struct CursorData {
+ byte *data = nullptr;
+ uint width = 0;
+ uint height = 0;
+ int hotspotX = 0;
+ int hotspotY = 0;
+ uint32 transparent = 255;
+ Graphics::PixelFormat format;
+ byte palSize = 0;
+ byte pal[3 * 255];
+ };
+
+ CursorData _cursors[kCursorMax];
+ CursorType _activeCursorType = kCursorNormal;
+ bool _useCursor = false;
+
public:
inline ThemeEval *getEvaluator() { return _themeEval; }
inline Graphics::VectorRenderer *renderer() { return _vectorRenderer; }
@@ -656,8 +681,9 @@ public:
* @param filename File name of the bitmap to load.
* @param hotspotX X Coordinate of the bitmap which does the cursor click.
* @param hotspotY Y Coordinate of the bitmap which does the cursor click.
+ * @param type Cursor type (normal or index)
*/
- bool createCursor(const Common::String &filename, int hotspotX, int hotspotY);
+ bool createCursor(const Common::String &filename, int hotspotX, int hotspotY, CursorType type = kCursorNormal);
/**
* Wrapper for restoring data from the Back Buffer to the screen.
@@ -810,7 +836,6 @@ protected:
ImagesMap _bitmaps;
Graphics::PixelFormat _overlayFormat;
- Graphics::PixelFormat _cursorFormat;
/** List of all the dirty screens that must be blitted to the overlay. */
Common::List<Common::Rect> _dirtyScreen;
@@ -825,7 +850,6 @@ protected:
Common::Archive *_themeArchive;
Common::SearchSet _themeFiles;
- bool _useCursor;
int _cursorHotspotX, _cursorHotspotY;
uint32 _cursorTransparent;
byte *_cursor;
@@ -834,8 +858,6 @@ protected:
enum {
MAX_CURS_COLORS = 255
};
- byte _cursorPal[3 * MAX_CURS_COLORS];
- byte _cursorPalSize;
Common::Rect _clip;
};
Commit: 913581922161da5037e10ed6098f773e5a99f01e
https://github.com/scummvm/scummvm/commit/913581922161da5037e10ed6098f773e5a99f01e
Author: Marwane ElBaraka (marwane.elbaraka at gmail.com)
Date: 2026-04-03T15:52:43+02:00
Commit Message:
GUI: Add cursor type attribute to theme cursor element
Add optional 'type' attribute to the <cursor> XML element to allow themes to define different cursor types (normal, index).
Changed paths:
gui/ThemeParser.cpp
gui/ThemeParser.h
diff --git a/gui/ThemeParser.cpp b/gui/ThemeParser.cpp
index 97e43b502a9..4c32cb54899 100644
--- a/gui/ThemeParser.cpp
+++ b/gui/ThemeParser.cpp
@@ -78,6 +78,11 @@ static const TextColorDataInfo kTextColorDefaults[] = {
{ kTextColorButtonDisabled, "color_button_disabled" }
};
+enum CursorType {
+ kCursorNormal,
+ kCursorIndex
+};
+
static TextColor parseTextColorId(const Common::String &name) {
for (int i = 0; i < kTextColorMAX; ++i)
if (name.compareToIgnoreCase(kTextColorDefaults[i].name) == 0)
@@ -346,7 +351,18 @@ bool ThemeParser::parserCallback_cursor(ParserNode *node) {
if (!parseList(node->values["hotspot"], 2, &spotx, &spoty))
return parserError("Error parsing cursor Hot Spot coordinates.");
- if (!_theme->createCursor(node->values["file"], spotx, spoty))
+ ThemeEngine::CursorType cursorType = ThemeEngine::kCursorNormal;
+ if (node->values.contains("type")) {
+ Common::String t = node->values["type"];
+ t.toLowercase();
+ if (t == "index") {
+ cursorType = ThemeEngine::kCursorIndex;
+ } else if (t != "normal") {
+ return parserError(Common::String::format("Invalid cursor type '%s'", t.c_str()));
+ }
+ }
+
+ if (!_theme->createCursor(node->values["file"], spotx, spoty, cursorType))
return parserError("Error creating Bitmap Cursor.");
return true;
diff --git a/gui/ThemeParser.h b/gui/ThemeParser.h
index c23be58582d..0ffbc0c1e10 100644
--- a/gui/ThemeParser.h
+++ b/gui/ThemeParser.h
@@ -100,6 +100,7 @@ protected:
XML_PROP(file, true)
XML_PROP(hotspot, true)
XML_PROP(resolution, false)
+ XML_PROP(type, false)
KEY_END()
XML_KEY(defaults)
Commit: a1fdfe0d6eb2380eb65edf58470ab42643b26238
https://github.com/scummvm/scummvm/commit/a1fdfe0d6eb2380eb65edf58470ab42643b26238
Author: Marwane ElBaraka (marwane.elbaraka at gmail.com)
Date: 2026-04-03T15:52:43+02:00
Commit Message:
GUI: THEMES: Add index cursor to scummmodern theme
Add cursor-index.svg and register bitmap and cursor definitions for the index cursor type used when hovering over clickable links.
Changed paths:
A gui/themes/scummmodern/cursor-index.svg
gui/themes/scummmodern/scummmodern_gfx.stx
diff --git a/gui/themes/scummmodern/cursor-index.svg b/gui/themes/scummmodern/cursor-index.svg
new file mode 100644
index 00000000000..b62ca83f9b7
--- /dev/null
+++ b/gui/themes/scummmodern/cursor-index.svg
@@ -0,0 +1,161 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ width="120"
+ height="120"
+ viewBox="0 0 120 120"
+ version="1.1"
+ id="svg1"
+ sodipodi:docname="index.svg"
+ inkscape:version="1.4.3 (0d15f75, 2025-12-25)"
+ inkscape:export-filename="index.svg"
+ inkscape:export-xdpi="25.6"
+ inkscape:export-ydpi="25.6"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg">
+ <sodipodi:namedview
+ id="namedview1"
+ pagecolor="#ffffff"
+ bordercolor="#000000"
+ borderopacity="0.25"
+ inkscape:showpageshadow="2"
+ inkscape:pageopacity="0.0"
+ inkscape:pagecheckerboard="0"
+ inkscape:deskcolor="#d1d1d1"
+ inkscape:document-units="px"
+ inkscape:zoom="3.22"
+ inkscape:cx="58.229814"
+ inkscape:cy="58.850932"
+ inkscape:window-width="1256"
+ inkscape:window-height="670"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="layer1" />
+ <defs
+ id="defs1">
+ <inkscape:path-effect
+ effect="fillet_chamfer"
+ id="path-effect2"
+ is_visible="true"
+ lpeversion="1"
+ nodesatellites_param="F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1"
+ radius="0"
+ unit="px"
+ method="auto"
+ mode="F"
+ chamfer_steps="1"
+ flexible="false"
+ use_knot_distance="true"
+ apply_no_radius="true"
+ apply_with_radius="true"
+ only_selected="false"
+ hide_knots="false" />
+ <inkscape:path-effect
+ effect="fillet_chamfer"
+ id="path-effect1"
+ is_visible="true"
+ lpeversion="1"
+ nodesatellites_param="F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1"
+ radius="0"
+ unit="px"
+ method="auto"
+ mode="F"
+ chamfer_steps="1"
+ flexible="false"
+ use_knot_distance="true"
+ apply_no_radius="true"
+ apply_with_radius="true"
+ only_selected="false"
+ hide_knots="false" />
+ <filter
+ style="color-interpolation-filters:sRGB;"
+ inkscape:label="Drop Shadow"
+ id="filter26"
+ x="-0.058424382"
+ y="-0.055173878"
+ width="1.1756984"
+ height="1.1676744">
+ <feFlood
+ result="flood"
+ in="SourceGraphic"
+ flood-opacity="0.498039"
+ flood-color="rgb(0,0,0)"
+ id="feFlood25" />
+ <feGaussianBlur
+ result="blur"
+ in="SourceGraphic"
+ stdDeviation="0.994256"
+ id="feGaussianBlur25" />
+ <feOffset
+ result="offset"
+ in="blur"
+ dx="6.000000"
+ dy="6.000000"
+ id="feOffset25" />
+ <feComposite
+ result="comp1"
+ operator="in"
+ in="flood"
+ in2="offset"
+ id="feComposite25" />
+ <feComposite
+ result="comp2"
+ operator="over"
+ in="SourceGraphic"
+ in2="comp1"
+ id="feComposite26" />
+ </filter>
+ <filter
+ style="color-interpolation-filters:sRGB;"
+ inkscape:label="Drop Shadow"
+ id="filter30"
+ x="-0.034993866"
+ y="-0.032994375"
+ width="1.1091992"
+ height="1.1047257">
+ <feFlood
+ result="flood"
+ in="SourceGraphic"
+ flood-opacity="0.498039"
+ flood-color="rgb(0,0,0)"
+ id="feFlood29" />
+ <feGaussianBlur
+ result="blur"
+ in="SourceGraphic"
+ stdDeviation="0.000000"
+ id="feGaussianBlur29" />
+ <feOffset
+ result="offset"
+ in="blur"
+ dx="4.000000"
+ dy="4.000000"
+ id="feOffset29" />
+ <feComposite
+ result="comp1"
+ operator="in"
+ in="flood"
+ in2="offset"
+ id="feComposite29" />
+ <feComposite
+ result="comp2"
+ operator="over"
+ in="SourceGraphic"
+ in2="comp1"
+ id="feComposite30" />
+ </filter>
+ </defs>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1">
+ <path
+ style="fill:#d40000;fill-opacity:1;stroke:#000000;stroke-width:7.11369;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers;filter:url(#filter30)"
+ d="M 19.035632,86.231873 C 10.823436,72.068901 4.0764109,60.065314 4.0422432,59.557234 3.9540582,58.2471 5.0671257,55.446069 6.1252904,54.314901 c 1.8632802,-1.991836 5.1214756,-2.70296 7.4081226,-1.616865 1.844208,0.87595 7.919204,6.576486 10.426433,9.783759 2.1226,2.715254 6.775938,10.379837 6.857483,11.295066 0.0237,0.265347 0.203731,0.565488 0.400196,0.666963 C 31.41399,74.54532 30.406191,60.546896 28.977978,43.336243 27.083787,20.510497 26.471742,11.573211 26.715775,10.303512 27.812044,4.5998392 33.591927,2.6024783 38.591174,6.1997199 c 3.073349,2.211447 3.154744,2.5139356 5.465702,20.3116251 l 2.089265,19.343698 10.369126,-3.396336 c 2.562029,-0.839175 7.852253,0.378594 17.801606,0.682189 9.824661,0.299792 10.923575,-4.507057 19.840032,2.687462 l 0.974204,0.786059 2.674224,3.724462 c 6.201467,8.636995 8.175517,27.178999 8.070147,33.491603 -0.10704,6.412 -0.46341,11.948582 -1.16754,18.138058 l -0.52662,4.62906 -35.107204,2.69268 -35.107193,2.6927 z"
+ id="path2-3-1"
+ sodipodi:nodetypes="ccssscsscsscssscssscccc" />
+ </g>
+</svg>
diff --git a/gui/themes/scummmodern/scummmodern_gfx.stx b/gui/themes/scummmodern/scummmodern_gfx.stx
index 34d5b75ae98..990fbceb6e1 100644
--- a/gui/themes/scummmodern/scummmodern_gfx.stx
+++ b/gui/themes/scummmodern/scummmodern_gfx.stx
@@ -111,6 +111,8 @@
<bitmap filename = 'logo.bmp'/>
<bitmap filename = 'cursor.bmp' scalable_file = 'cursor.svg' width = '24' height = '24'/>
<bitmap filename = 'cursor_small.bmp' scalable_file = 'cursor.svg' width = '16' height = '16'/>
+ <bitmap filename = 'cursor-index.bmp' scalable_file = 'cursor-index.svg' width = '24' height = '24'/>
+ <bitmap filename = 'cursor-index_small.bmp' scalable_file = 'cursor-index.svg' width = '16' height = '16'/>
<bitmap filename = 'checkbox.bmp'/>
<bitmap filename = 'checkbox_empty.bmp'/>
<bitmap filename = 'checkbox_disabled.bmp'/>
@@ -312,6 +314,9 @@
<cursor file = 'cursor.bmp' hotspot = '0, 0'/>
<cursor resolution = 'y<H' file = 'cursor_small.bmp' hotspot = '0, 0'/>
+ <cursor file = 'cursor-index.bmp' hotspot = '0, 0' type = 'index'/>
+ <cursor resolution = 'y<H' file = 'cursor-index_small.bmp' hotspot = '0, 0' type = 'index'/>
+
<!-- Selection (text or list items) -->
<drawdata id = 'text_selection' cache = 'false'>
<drawstep func = 'square'
Commit: 835863756b32bc78d089110b631b6f142449593d
https://github.com/scummvm/scummvm/commit/835863756b32bc78d089110b631b6f142449593d
Author: Marwane ElBaraka (marwane.elbaraka at gmail.com)
Date: 2026-04-03T15:52:43+02:00
Commit Message:
GUI: Switch to index cursor when hovering links in RichTextWidget
Use setActiveCursor() to switch between normal and index cursors based on whether the mouse is over a clickable link.
Changed paths:
gui/widgets/richtext.cpp
diff --git a/gui/widgets/richtext.cpp b/gui/widgets/richtext.cpp
index 3727fa98a5b..7959fdc41d3 100644
--- a/gui/widgets/richtext.cpp
+++ b/gui/widgets/richtext.cpp
@@ -124,6 +124,18 @@ void RichTextWidget::handleMouseUp(int x, int y, int button, int clickCount) {
}
void RichTextWidget::handleMouseMoved(int x, int y, int button) {
+ if (_txtWnd) {
+ Common::U32String link = _txtWnd->getMouseLink (
+ x - _innerMargin + _scrolledX,
+ y - _innerMargin + _scrolledY
+ );
+
+ if (!link.empty())
+ g_gui.theme()->setActiveCursor(GUI::ThemeEngine::kCursorIndex);
+ else
+ g_gui.theme()->setActiveCursor(GUI::ThemeEngine::kCursorNormal);
+ }
+
if (_mouseDownStartY == 0 || _mouseDownY == y || !_txtWnd)
return;
Commit: a4ae174a0a45dc906e308ed6041d4f6b576e9ae4
https://github.com/scummvm/scummvm/commit/a4ae174a0a45dc906e308ed6041d4f6b576e9ae4
Author: Marwane ElBaraka (marwane.elbaraka at gmail.com)
Date: 2026-04-03T15:52:43+02:00
Commit Message:
GUI: THEMES: Move cursor index SVG from scummodern theme folder to common-svg and update THEMERC to include common-svg
Changed paths:
A gui/themes/common-svg/cursor-index.svg
R gui/themes/scummmodern/cursor-index.svg
gui/themes/scummmodern/THEMERC
diff --git a/gui/themes/scummmodern/cursor-index.svg b/gui/themes/common-svg/cursor-index.svg
similarity index 100%
rename from gui/themes/scummmodern/cursor-index.svg
rename to gui/themes/common-svg/cursor-index.svg
diff --git a/gui/themes/scummmodern/THEMERC b/gui/themes/scummmodern/THEMERC
index c82ed30005a..b0561526755 100644
--- a/gui/themes/scummmodern/THEMERC
+++ b/gui/themes/scummmodern/THEMERC
@@ -1,2 +1,3 @@
[SCUMMVM_STX0.9.21:ScummVM Modern Theme:No Author]
%using ../common
+%using ../common-svg
Commit: 735223a5d694addcf3cad643b2d3ba80864ca0af
https://github.com/scummvm/scummvm/commit/735223a5d694addcf3cad643b2d3ba80864ca0af
Author: Marwane ElBaraka (marwane.elbaraka at gmail.com)
Date: 2026-04-03T15:52:43+02:00
Commit Message:
GUI: THEMES: Add cursor index bitmap files to common folder
Changed paths:
A gui/themes/common/cursor-index.bmp
A gui/themes/common/cursor-index_small.bmp
diff --git a/gui/themes/common/cursor-index.bmp b/gui/themes/common/cursor-index.bmp
new file mode 100644
index 00000000000..7601816595d
Binary files /dev/null and b/gui/themes/common/cursor-index.bmp differ
diff --git a/gui/themes/common/cursor-index_small.bmp b/gui/themes/common/cursor-index_small.bmp
new file mode 100644
index 00000000000..7a50bea6e8c
Binary files /dev/null and b/gui/themes/common/cursor-index_small.bmp differ
Commit: ca4e0a37ae9ee2c2c7686b5b6544a4221f6a13a7
https://github.com/scummvm/scummvm/commit/ca4e0a37ae9ee2c2c7686b5b6544a4221f6a13a7
Author: Marwane ElBaraka (marwane.elbaraka at gmail.com)
Date: 2026-04-03T15:52:43+02:00
Commit Message:
GUI: THEMES: Add cursor index bitmap and cursor definitions to .stx files of residualvm and scummremastered themes
Changed paths:
gui/themes/residualvm/remastered_gfx.stx
gui/themes/scummremastered/remastered_gfx.stx
diff --git a/gui/themes/residualvm/remastered_gfx.stx b/gui/themes/residualvm/remastered_gfx.stx
index c68557725be..a418d9e7c8e 100644
--- a/gui/themes/residualvm/remastered_gfx.stx
+++ b/gui/themes/residualvm/remastered_gfx.stx
@@ -112,6 +112,8 @@
<bitmap filename = 'logo.bmp' scalable_file = 'logo.svg' width = '287' height = '80'/>
<bitmap filename = 'cursor.bmp' scalable_file = 'cursor.svg' width = '24' height = '24'/>
<bitmap filename = 'cursor_small.bmp' scalable_file = 'cursor.svg' width = '16' height = '16'/>
+ <bitmap filename = 'cursor-index.bmp' scalable_file = 'cursor-index.svg' width = '24' height = '24'/>
+ <bitmap filename = 'cursor-index_small.bmp' scalable_file = 'cursor-index.svg' width = '16' height = '16'/>
<bitmap filename = 'checkbox.bmp' scalable_file = 'checkbox.svg' width = '15' height = '15'/>
<bitmap filename = 'checkbox_empty.bmp' scalable_file = 'checkbox_empty.svg' width = '15' height = '15'/>
<bitmap filename = 'checkbox_disabled.bmp' scalable_file = 'checkbox_disabled.svg' width = '15' height = '15'/>
@@ -313,6 +315,8 @@
<cursor file = 'cursor.bmp' hotspot = '0, 0'/>
<cursor resolution = 'y<H' file = 'cursor_small.bmp' hotspot = '0, 0'/>
+ <cursor file = 'cursor-index.bmp' hotspot = '0, 0' type = 'index'/>
+ <cursor resolution = 'y<H' file = 'cursor-index_small.bmp' hotspot = '0, 0' type = 'index'/>
<!-- Selection (text or list items) -->
<drawdata id = 'text_selection' cache = 'false'>
diff --git a/gui/themes/scummremastered/remastered_gfx.stx b/gui/themes/scummremastered/remastered_gfx.stx
index d289937a82f..4f928e6c5f2 100644
--- a/gui/themes/scummremastered/remastered_gfx.stx
+++ b/gui/themes/scummremastered/remastered_gfx.stx
@@ -112,6 +112,8 @@
<bitmap filename = 'logo.bmp' scalable_file = 'logo.svg' width = '287' height = '80'/>
<bitmap filename = 'cursor.bmp' scalable_file = 'cursor.svg' width = '24' height = '24'/>
<bitmap filename = 'cursor_small.bmp' scalable_file = 'cursor.svg' width = '16' height = '16'/>
+ <bitmap filename = 'cursor-index.bmp' scalable_file = 'cursor-index.svg' width = '24' height = '24'/>
+ <bitmap filename = 'cursor-index_small.bmp' scalable_file = 'cursor-index.svg' width = '16' height = '16'/>
<bitmap filename = 'checkbox.bmp' scalable_file = 'checkbox.svg' width = '15' height = '15'/>
<bitmap filename = 'checkbox_empty.bmp' scalable_file = 'checkbox_empty.svg' width = '15' height = '15'/>
<bitmap filename = 'checkbox_disabled.bmp' scalable_file = 'checkbox_disabled.svg' width = '15' height = '15'/>
@@ -313,6 +315,8 @@
<cursor file = 'cursor.bmp' hotspot = '0, 0'/>
<cursor resolution = 'y<H' file = 'cursor_small.bmp' hotspot = '0, 0'/>
+ <cursor file = 'cursor-index.bmp' hotspot = '0, 0' type = 'index'/>
+ <cursor resolution = 'y<H' file = 'cursor-index_small.bmp' hotspot = '0, 0' type = 'index'/>
<!-- Selection (text or list items) -->
<drawdata id = 'text_selection' cache = 'false'>
Commit: 20e7035e1431e0062b2fa0262363122b21f405fe
https://github.com/scummvm/scummvm/commit/20e7035e1431e0062b2fa0262363122b21f405fe
Author: Marwane ElBaraka (marwane.elbaraka at gmail.com)
Date: 2026-04-03T15:52:43+02:00
Commit Message:
GUI: THEMES: Regenerate .zip files of residualvm, scummclassic, scummmodern, and scummremastered themes to include the new cursor index svg and bitmap files
Changed paths:
gui/themes/residualvm.zip
gui/themes/scummclassic.zip
gui/themes/scummmodern.zip
gui/themes/scummremastered.zip
diff --git a/gui/themes/residualvm.zip b/gui/themes/residualvm.zip
index 82a12009fd4..68355b29be0 100644
Binary files a/gui/themes/residualvm.zip and b/gui/themes/residualvm.zip differ
diff --git a/gui/themes/scummclassic.zip b/gui/themes/scummclassic.zip
index c1b0876fff0..266a3bc46ee 100644
Binary files a/gui/themes/scummclassic.zip and b/gui/themes/scummclassic.zip differ
diff --git a/gui/themes/scummmodern.zip b/gui/themes/scummmodern.zip
index 8c029cae7c1..cd7e6f3274f 100644
Binary files a/gui/themes/scummmodern.zip and b/gui/themes/scummmodern.zip differ
diff --git a/gui/themes/scummremastered.zip b/gui/themes/scummremastered.zip
index d1b9cb2a9b1..dce1db48cb6 100644
Binary files a/gui/themes/scummremastered.zip and b/gui/themes/scummremastered.zip differ
Commit: d97dc54e8a47b3de765f889e72d379ee56c59287
https://github.com/scummvm/scummvm/commit/d97dc54e8a47b3de765f889e72d379ee56c59287
Author: Marwane ElBaraka (marwane.elbaraka at gmail.com)
Date: 2026-04-03T15:52:43+02:00
Commit Message:
GUI: Update cursor fallback logic in setActiveCursor function
When a theme doesn't define an index cursor fall back to the normal cursor.
In the case of the classic theme that has a hardcoded cursor, setActiveCursor fails silently.
Changed paths:
gui/ThemeEngine.cpp
diff --git a/gui/ThemeEngine.cpp b/gui/ThemeEngine.cpp
index 054238edda7..bfb97cdd425 100644
--- a/gui/ThemeEngine.cpp
+++ b/gui/ThemeEngine.cpp
@@ -1687,8 +1687,11 @@ bool ThemeEngine::createCursor(const Common::String &filename, int hotspotX, int
void ThemeEngine::setActiveCursor(CursorType type) {
if (type < 0 || type >= kCursorMax || !_cursors[type].data) {
- warning("setActiveCursor: Failed to switch - type=%d, data=%p", type, _cursors[type].data);
- return;
+ if (type == kCursorIndex && _cursors[kCursorNormal].data) {
+ type = kCursorNormal; // Fallback to normal cursor
+ } else {
+ return;
+ }
}
_activeCursorType = type;
Commit: 8d6c78473695a1efa2fbdacfb01211b466579c43
https://github.com/scummvm/scummvm/commit/8d6c78473695a1efa2fbdacfb01211b466579c43
Author: Marwane ElBaraka (marwane.elbaraka at gmail.com)
Date: 2026-04-03T15:52:43+02:00
Commit Message:
GUI: Increase palette size in CursorData structure from 3 * 255 to 3 * 256
Changed paths:
gui/ThemeEngine.h
diff --git a/gui/ThemeEngine.h b/gui/ThemeEngine.h
index 9fb077edccc..338e0f491cc 100644
--- a/gui/ThemeEngine.h
+++ b/gui/ThemeEngine.h
@@ -656,7 +656,7 @@ protected:
uint32 transparent = 255;
Graphics::PixelFormat format;
byte palSize = 0;
- byte pal[3 * 255];
+ byte pal[3 * 256];
};
CursorData _cursors[kCursorMax];
Commit: 6298f49ab3c1a38db310b0f68a7ed764f0999bde
https://github.com/scummvm/scummvm/commit/6298f49ab3c1a38db310b0f68a7ed764f0999bde
Author: Marwane ElBaraka (marwane.elbaraka at gmail.com)
Date: 2026-04-03T15:52:43+02:00
Commit Message:
GUI: Modify RichTextWidget::handleMouseMoved() to have conformant code formatting
Multi-line function call is now one-line with conformant spacing and formatting
Changed paths:
gui/widgets/richtext.cpp
diff --git a/gui/widgets/richtext.cpp b/gui/widgets/richtext.cpp
index 7959fdc41d3..557e149aef4 100644
--- a/gui/widgets/richtext.cpp
+++ b/gui/widgets/richtext.cpp
@@ -125,10 +125,7 @@ void RichTextWidget::handleMouseUp(int x, int y, int button, int clickCount) {
void RichTextWidget::handleMouseMoved(int x, int y, int button) {
if (_txtWnd) {
- Common::U32String link = _txtWnd->getMouseLink (
- x - _innerMargin + _scrolledX,
- y - _innerMargin + _scrolledY
- );
+ Common::U32String link = _txtWnd->getMouseLink(x - _innerMargin + _scrolledX, y - _innerMargin + _scrolledY);
if (!link.empty())
g_gui.theme()->setActiveCursor(GUI::ThemeEngine::kCursorIndex);
Commit: cbefd718ddd336db324bc797c00800ca90ea4549
https://github.com/scummvm/scummvm/commit/cbefd718ddd336db324bc797c00800ca90ea4549
Author: Marwane ElBaraka (marwane.elbaraka at gmail.com)
Date: 2026-04-03T15:52:43+02:00
Commit Message:
GUI: THEMES: Undo scummodern THEMERC modification and add cursor index SVG file to scummodern theme
Changed paths:
A gui/themes/scummmodern/cursor-index.svg
gui/themes/scummmodern/THEMERC
diff --git a/gui/themes/scummmodern/THEMERC b/gui/themes/scummmodern/THEMERC
index b0561526755..c82ed30005a 100644
--- a/gui/themes/scummmodern/THEMERC
+++ b/gui/themes/scummmodern/THEMERC
@@ -1,3 +1,2 @@
[SCUMMVM_STX0.9.21:ScummVM Modern Theme:No Author]
%using ../common
-%using ../common-svg
diff --git a/gui/themes/scummmodern/cursor-index.svg b/gui/themes/scummmodern/cursor-index.svg
new file mode 100644
index 00000000000..b62ca83f9b7
--- /dev/null
+++ b/gui/themes/scummmodern/cursor-index.svg
@@ -0,0 +1,161 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ width="120"
+ height="120"
+ viewBox="0 0 120 120"
+ version="1.1"
+ id="svg1"
+ sodipodi:docname="index.svg"
+ inkscape:version="1.4.3 (0d15f75, 2025-12-25)"
+ inkscape:export-filename="index.svg"
+ inkscape:export-xdpi="25.6"
+ inkscape:export-ydpi="25.6"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg">
+ <sodipodi:namedview
+ id="namedview1"
+ pagecolor="#ffffff"
+ bordercolor="#000000"
+ borderopacity="0.25"
+ inkscape:showpageshadow="2"
+ inkscape:pageopacity="0.0"
+ inkscape:pagecheckerboard="0"
+ inkscape:deskcolor="#d1d1d1"
+ inkscape:document-units="px"
+ inkscape:zoom="3.22"
+ inkscape:cx="58.229814"
+ inkscape:cy="58.850932"
+ inkscape:window-width="1256"
+ inkscape:window-height="670"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="layer1" />
+ <defs
+ id="defs1">
+ <inkscape:path-effect
+ effect="fillet_chamfer"
+ id="path-effect2"
+ is_visible="true"
+ lpeversion="1"
+ nodesatellites_param="F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1"
+ radius="0"
+ unit="px"
+ method="auto"
+ mode="F"
+ chamfer_steps="1"
+ flexible="false"
+ use_knot_distance="true"
+ apply_no_radius="true"
+ apply_with_radius="true"
+ only_selected="false"
+ hide_knots="false" />
+ <inkscape:path-effect
+ effect="fillet_chamfer"
+ id="path-effect1"
+ is_visible="true"
+ lpeversion="1"
+ nodesatellites_param="F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1"
+ radius="0"
+ unit="px"
+ method="auto"
+ mode="F"
+ chamfer_steps="1"
+ flexible="false"
+ use_knot_distance="true"
+ apply_no_radius="true"
+ apply_with_radius="true"
+ only_selected="false"
+ hide_knots="false" />
+ <filter
+ style="color-interpolation-filters:sRGB;"
+ inkscape:label="Drop Shadow"
+ id="filter26"
+ x="-0.058424382"
+ y="-0.055173878"
+ width="1.1756984"
+ height="1.1676744">
+ <feFlood
+ result="flood"
+ in="SourceGraphic"
+ flood-opacity="0.498039"
+ flood-color="rgb(0,0,0)"
+ id="feFlood25" />
+ <feGaussianBlur
+ result="blur"
+ in="SourceGraphic"
+ stdDeviation="0.994256"
+ id="feGaussianBlur25" />
+ <feOffset
+ result="offset"
+ in="blur"
+ dx="6.000000"
+ dy="6.000000"
+ id="feOffset25" />
+ <feComposite
+ result="comp1"
+ operator="in"
+ in="flood"
+ in2="offset"
+ id="feComposite25" />
+ <feComposite
+ result="comp2"
+ operator="over"
+ in="SourceGraphic"
+ in2="comp1"
+ id="feComposite26" />
+ </filter>
+ <filter
+ style="color-interpolation-filters:sRGB;"
+ inkscape:label="Drop Shadow"
+ id="filter30"
+ x="-0.034993866"
+ y="-0.032994375"
+ width="1.1091992"
+ height="1.1047257">
+ <feFlood
+ result="flood"
+ in="SourceGraphic"
+ flood-opacity="0.498039"
+ flood-color="rgb(0,0,0)"
+ id="feFlood29" />
+ <feGaussianBlur
+ result="blur"
+ in="SourceGraphic"
+ stdDeviation="0.000000"
+ id="feGaussianBlur29" />
+ <feOffset
+ result="offset"
+ in="blur"
+ dx="4.000000"
+ dy="4.000000"
+ id="feOffset29" />
+ <feComposite
+ result="comp1"
+ operator="in"
+ in="flood"
+ in2="offset"
+ id="feComposite29" />
+ <feComposite
+ result="comp2"
+ operator="over"
+ in="SourceGraphic"
+ in2="comp1"
+ id="feComposite30" />
+ </filter>
+ </defs>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1">
+ <path
+ style="fill:#d40000;fill-opacity:1;stroke:#000000;stroke-width:7.11369;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers;filter:url(#filter30)"
+ d="M 19.035632,86.231873 C 10.823436,72.068901 4.0764109,60.065314 4.0422432,59.557234 3.9540582,58.2471 5.0671257,55.446069 6.1252904,54.314901 c 1.8632802,-1.991836 5.1214756,-2.70296 7.4081226,-1.616865 1.844208,0.87595 7.919204,6.576486 10.426433,9.783759 2.1226,2.715254 6.775938,10.379837 6.857483,11.295066 0.0237,0.265347 0.203731,0.565488 0.400196,0.666963 C 31.41399,74.54532 30.406191,60.546896 28.977978,43.336243 27.083787,20.510497 26.471742,11.573211 26.715775,10.303512 27.812044,4.5998392 33.591927,2.6024783 38.591174,6.1997199 c 3.073349,2.211447 3.154744,2.5139356 5.465702,20.3116251 l 2.089265,19.343698 10.369126,-3.396336 c 2.562029,-0.839175 7.852253,0.378594 17.801606,0.682189 9.824661,0.299792 10.923575,-4.507057 19.840032,2.687462 l 0.974204,0.786059 2.674224,3.724462 c 6.201467,8.636995 8.175517,27.178999 8.070147,33.491603 -0.10704,6.412 -0.46341,11.948582 -1.16754,18.138058 l -0.52662,4.62906 -35.107204,2.69268 -35.107193,2.6927 z"
+ id="path2-3-1"
+ sodipodi:nodetypes="ccssscsscsscssscssscccc" />
+ </g>
+</svg>
Commit: b40af9a9308630b210bd570d8f5fc80102d624ca
https://github.com/scummvm/scummvm/commit/b40af9a9308630b210bd570d8f5fc80102d624ca
Author: Marwane ElBaraka (marwane.elbaraka at gmail.com)
Date: 2026-04-03T15:52:43+02:00
Commit Message:
GUI: THEMES: Regenerate residualvm, scummmodern, and scummremastered theme zip files
Changed paths:
gui/themes/residualvm.zip
gui/themes/scummmodern.zip
gui/themes/scummremastered.zip
diff --git a/gui/themes/residualvm.zip b/gui/themes/residualvm.zip
index 68355b29be0..b7d36ba4f12 100644
Binary files a/gui/themes/residualvm.zip and b/gui/themes/residualvm.zip differ
diff --git a/gui/themes/scummmodern.zip b/gui/themes/scummmodern.zip
index cd7e6f3274f..f0a0ac50dc1 100644
Binary files a/gui/themes/scummmodern.zip and b/gui/themes/scummmodern.zip differ
diff --git a/gui/themes/scummremastered.zip b/gui/themes/scummremastered.zip
index dce1db48cb6..07674bc1af9 100644
Binary files a/gui/themes/scummremastered.zip and b/gui/themes/scummremastered.zip differ
More information about the Scummvm-git-logs
mailing list