Skip to content

Commit 31cd82d

Browse files
Merge pull request #426 from Hedgehogsoft/main
add missing mouse icons
2 parents b2f7958 + ede6863 commit 31cd82d

File tree

2 files changed

+161
-31
lines changed

2 files changed

+161
-31
lines changed

CHANGELOG

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,17 @@ In this PR I am redefining how RGFW handles versioning. Breaking changes are goi
2020
- fix window not hiding after it's first shown (X11)
2121
- fix fullscreen bugs when a hidden window is created (X11)
2222
- add RGFW_equal and RGFW_kpEquals alts for consistency
23+
- add `RGFW_mouseText` as an altname for `RGFW_mouseIbeam`
24+
- add `RGFW_mouseResizeNW`
25+
- add `RGFW_mouseResizeN`
26+
- add `RGFW_mouseResizeNE`
27+
- add `RGFW_mouseResizeE`
28+
- add `RGFW_mouseResizeSE`
29+
- add `RGFW_mouseResizeS`
30+
- add `RGFW_mouseResizeSW`
31+
- add `RGFW_mouseResizeW`
32+
- add `RGFW_mouseWait`
33+
- add `RGFW_mouseProgress`
2334

2435
Release: RGFW 1.8.0
2536
-----------------------------------------------

RGFW.h

Lines changed: 150 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -830,14 +830,25 @@ typedef RGFW_ENUM(u8, RGFW_mouseIcons) {
830830
RGFW_mouseNormal = 0,
831831
RGFW_mouseArrow,
832832
RGFW_mouseIbeam,
833+
RGFW_mouseText = RGFW_mouseIbeam,
833834
RGFW_mouseCrosshair,
834835
RGFW_mousePointingHand,
835836
RGFW_mouseResizeEW,
836837
RGFW_mouseResizeNS,
837838
RGFW_mouseResizeNWSE,
838839
RGFW_mouseResizeNESW,
840+
RGFW_mouseResizeNW,
841+
RGFW_mouseResizeN,
842+
RGFW_mouseResizeNE,
843+
RGFW_mouseResizeE,
844+
RGFW_mouseResizeSE,
845+
RGFW_mouseResizeS,
846+
RGFW_mouseResizeSW,
847+
RGFW_mouseResizeW,
839848
RGFW_mouseResizeAll,
840849
RGFW_mouseNotAllowed,
850+
RGFW_mouseWait,
851+
RGFW_mouseProgress,
841852
RGFW_mouseIconCount,
842853
RGFW_mouseIconFinal = 16 /* padding for alignment */
843854
};
@@ -5764,7 +5775,7 @@ void RGFW_XHandleEvent(void) {
57645775
event.type = RGFW_mouseButtonPressed;
57655776
}
57665777

5767-
switch(E.xbutton.button) {
5778+
switch (E.xbutton.button) {
57685779
case Button1: event.button.value = RGFW_mouseLeft; break;
57695780
case Button2: event.button.value = RGFW_mouseMiddle; break;
57705781
case Button3: event.button.value = RGFW_mouseRight; break;
@@ -6576,14 +6587,33 @@ RGFW_bool RGFW_FUNC(RGFW_window_setMouseDefault) (RGFW_window* win) {
65766587
RGFW_bool RGFW_FUNC(RGFW_window_setMouseStandard) (RGFW_window* win, u8 mouse) {
65776588
RGFW_ASSERT(win != NULL);
65786589

6579-
static const u8 mouseIconSrc[16] = { XC_arrow, XC_left_ptr, XC_xterm, XC_crosshair, XC_hand2, XC_sb_h_double_arrow, XC_sb_v_double_arrow, XC_bottom_left_corner, XC_bottom_right_corner, XC_fleur, XC_X_cursor};
6580-
6581-
if (mouse > (sizeof(mouseIconSrc) / sizeof(u8)))
6582-
return RGFW_FALSE;
6583-
6584-
mouse = mouseIconSrc[mouse];
6585-
6586-
Cursor cursor = XCreateFontCursor(_RGFW->display, mouse);
6590+
u32 mouseIcon = 0;
6591+
6592+
switch (mouse) {
6593+
case RGFW_mouseNormal: mouseIcon = XC_left_ptr; break;
6594+
case RGFW_mouseIbeam: mouseIcon = XC_xterm; break;
6595+
case RGFW_mouseWait: mouseIcon = XC_watch; break;
6596+
case RGFW_mouseCrosshair: mouseIcon = XC_tcross; break;
6597+
case RGFW_mouseProgress: mouseIcon = XC_watch; break;
6598+
case RGFW_mouseResizeNWSE: mouseIcon = XC_top_left_corner; break;
6599+
case RGFW_mouseResizeNESW: mouseIcon = XC_top_right_corner; break;
6600+
case RGFW_mouseResizeEW: mouseIcon = XC_sb_h_double_arrow; break;
6601+
case RGFW_mouseResizeNS: mouseIcon = XC_sb_v_double_arrow; break;
6602+
case RGFW_mouseResizeNW: mouseIcon = XC_top_left_corner; break;
6603+
case RGFW_mouseResizeN: mouseIcon = XC_top_side; break;
6604+
case RGFW_mouseResizeNE: mouseIcon = XC_top_right_corner; break;
6605+
case RGFW_mouseResizeE: mouseIcon = XC_right_side; break;
6606+
case RGFW_mouseResizeSE: mouseIcon = XC_bottom_right_corner; break;
6607+
case RGFW_mouseResizeS: mouseIcon = XC_bottom_side; break;
6608+
case RGFW_mouseResizeSW: mouseIcon = XC_bottom_left_corner; break;
6609+
case RGFW_mouseResizeW: mouseIcon = XC_left_side; break;
6610+
case RGFW_mouseResizeAll: mouseIcon = XC_fleur; break;
6611+
case RGFW_mouseNotAllowed: mouseIcon = XC_pirate; break;
6612+
case RGFW_mousePointingHand: mouseIcon = XC_hand2; break;
6613+
default: return RGFW_FALSE;
6614+
}
6615+
6616+
Cursor cursor = XCreateFontCursor(_RGFW->display, mouseIcon);
65876617
XDefineCursor(_RGFW->display, win->src.window, (Cursor) cursor);
65886618
XFreeCursor(_RGFW->display, (Cursor) cursor);
65896619
return RGFW_TRUE;
@@ -8758,13 +8788,36 @@ RGFW_bool RGFW_FUNC(RGFW_window_setMouseDefault)(RGFW_window* win) {
87588788

87598789
RGFW_bool RGFW_FUNC(RGFW_window_setMouseStandard)(RGFW_window* win, u8 mouse) {
87608790
RGFW_ASSERT(win != NULL);
8761-
static const char* iconStrings[16] = { "arrow", "left_ptr", "xterm", "crosshair", "hand2", "sb_h_double_arrow", "sb_v_double_arrow", "bottom_left_corner", "bottom_right_corner", "fleur", "forbidden" };
87628791

8763-
win->src.using_custom_cursor = RGFW_FALSE;
8792+
char* cursorName = NULL;
8793+
switch (mouse) {
8794+
case RGFW_mouseNormal: cursorName = (char*)"left_ptr"; break;
8795+
case RGFW_mouseArrow: cursorName = (char*)"left_ptr"; break;
8796+
case RGFW_mouseIbeam: cursorName = (char*)"xterm"; break;
8797+
case RGFW_mouseCrosshair: cursorName = (char*)"crosshair"; break;
8798+
case RGFW_mousePointingHand: cursorName = (char*)"hand2"; break;
8799+
case RGFW_mouseResizeEW: cursorName = (char*)"sb_h_double_arrow"; break;
8800+
case RGFW_mouseResizeNS: cursorName = (char*)"sb_v_double_arrow"; break;
8801+
case RGFW_mouseResizeNWSE: cursorName = (char*)"top_left_corner"; break; /* or fd_double_arrow */
8802+
case RGFW_mouseResizeNESW: cursorName = (char*)"top_right_corner"; break; /* or bd_double_arrow */
8803+
case RGFW_mouseResizeNW: cursorName = (char*)"top_left_corner"; break;
8804+
case RGFW_mouseResizeN: cursorName = (char*)"top_side"; break;
8805+
case RGFW_mouseResizeNE: cursorName = (char*)"top_right_corner"; break;
8806+
case RGFW_mouseResizeE: cursorName = (char*)"right_side"; break;
8807+
case RGFW_mouseResizeSE: cursorName = (char*)"bottom_right_corner"; break;
8808+
case RGFW_mouseResizeS: cursorName = (char*)"bottom_side"; break;
8809+
case RGFW_mouseResizeSW: cursorName = (char*)"bottom_left_corner"; break;
8810+
case RGFW_mouseResizeW: cursorName = (char*)"left_side"; break;
8811+
case RGFW_mouseResizeAll: cursorName = (char*)"fleur"; break;
8812+
case RGFW_mouseNotAllowed: cursorName = (char*)"not-allowed"; break;
8813+
case RGFW_mouseWait: cursorName = (char*)"watch"; break;
8814+
case RGFW_mouseProgress: cursorName = (char*)"watch"; break;
8815+
default: return RGFW_FALSE;
8816+
}
87648817

8765-
if (mouse > RGFW_mouseIconCount - 1) return RGFW_FALSE;
8818+
win->src.using_custom_cursor = RGFW_FALSE;
87668819

8767-
struct wl_cursor* wlcursor = wl_cursor_theme_get_cursor(_RGFW->wl_cursor_theme, iconStrings[mouse]);
8820+
struct wl_cursor* wlcursor = wl_cursor_theme_get_cursor(_RGFW->wl_cursor_theme, cursorName);
87688821
struct wl_cursor_image* cursor_image = wlcursor->images[0];
87698822
struct wl_buffer* cursor_buffer = wl_cursor_image_get_buffer(cursor_image);
87708823
wl_pointer_set_cursor(_RGFW->wl_pointer, _RGFW->mouse_enter_serial, _RGFW->cursor_surface, (i32)cursor_image->hotspot_x, (i32)cursor_image->hotspot_y);
@@ -10265,11 +10318,34 @@ RGFW_bool RGFW_window_setMouseDefault(RGFW_window* win) {
1026510318
RGFW_bool RGFW_window_setMouseStandard(RGFW_window* win, u8 mouse) {
1026610319
RGFW_ASSERT(win != NULL);
1026710320

10268-
static const u32 mouseIconSrc[16] = {OCR_NORMAL, OCR_NORMAL, OCR_IBEAM, OCR_CROSS, OCR_HAND, OCR_SIZEWE, OCR_SIZENS, OCR_SIZENWSE, OCR_SIZENESW, OCR_SIZEALL, OCR_NO};
10269-
if (mouse > (sizeof(mouseIconSrc) / sizeof(u32)))
10270-
return RGFW_FALSE;
10321+
u32 mouseIcon = 0;
10322+
10323+
switch (mouse) {
10324+
case RGFW_mouseNormal: mouseIcon = OCR_NORMAL; break;
10325+
case RGFW_mouseArrow: mouseIcon = OCR_NORMAL; break;
10326+
case RGFW_mouseIbeam: mouseIcon = OCR_IBEAM; break;
10327+
case RGFW_mouseWait: mouseIcon = OCR_WAIT; break;
10328+
case RGFW_mouseCrosshair: mouseIcon = OCR_CROSS; break;
10329+
case RGFW_mouseProgress: mouseIcon = OCR_APPSTARTING; break;
10330+
case RGFW_mouseResizeNWSE: mouseIcon = OCR_SIZENWSE; break;
10331+
case RGFW_mouseResizeNESW: mouseIcon = OCR_SIZENESW; break;
10332+
case RGFW_mouseResizeEW: mouseIcon = OCR_SIZEWE; break;
10333+
case RGFW_mouseResizeNS: mouseIcon = OCR_SIZENS; break;
10334+
case RGFW_mouseResizeAll: mouseIcon = OCR_SIZEALL; break;
10335+
case RGFW_mouseNotAllowed: mouseIcon = OCR_NO; break;
10336+
case RGFW_mousePointingHand: mouseIcon = OCR_HAND; break;
10337+
case RGFW_mouseResizeNW: mouseIcon = OCR_SIZENWSE; break;
10338+
case RGFW_mouseResizeN: mouseIcon = OCR_SIZENS; break;
10339+
case RGFW_mouseResizeNE: mouseIcon = OCR_SIZENESW; break;
10340+
case RGFW_mouseResizeE: mouseIcon = OCR_SIZEWE; break;
10341+
case RGFW_mouseResizeSE: mouseIcon = OCR_SIZENWSE; break;
10342+
case RGFW_mouseResizeS: mouseIcon = OCR_SIZENS; break;
10343+
case RGFW_mouseResizeSW: mouseIcon = OCR_SIZENESW; break;
10344+
case RGFW_mouseResizeW: mouseIcon = OCR_SIZEWE; break;
10345+
default: return RGFW_FALSE;
10346+
}
1027110347

10272-
char* icon = MAKEINTRESOURCEA(mouseIconSrc[mouse]);
10348+
char* icon = MAKEINTRESOURCEA(mouseIcon);
1027310349

1027410350
SetClassLongPtrA(win->src.window, GCLP_HCURSOR, (LPARAM) LoadCursorA(NULL, icon));
1027510351
SetCursor(LoadCursorA(NULL, icon));
@@ -12334,13 +12410,35 @@ void RGFW_window_showMouse(RGFW_window* win, RGFW_bool show) {
1233412410
else CGDisplayHideCursor(kCGDirectMainDisplay);
1233512411
}
1233612412

12337-
RGFW_bool RGFW_window_setMouseStandard(RGFW_window* win, u8 stdMouses) {
12338-
static const char* mouseIconSrc[16] = {"arrowCursor", "arrowCursor", "IBeamCursor", "crosshairCursor", "pointingHandCursor", "resizeLeftRightCursor", "resizeUpDownCursor", "_windowResizeNorthWestSouthEastCursor", "_windowResizeNorthEastSouthWestCursor", "closedHandCursor", "operationNotAllowedCursor"};
12339-
if (stdMouses > ((sizeof(mouseIconSrc)) / (sizeof(char*))))
12340-
return RGFW_FALSE;
12413+
RGFW_bool RGFW_window_setMouseStandard(RGFW_window* win, u8 stdMouse) {
12414+
const char* cursorSelectorStr;
12415+
switch (stdMouse) {
12416+
case RGFW_mouseNormal: cursorSelectorStr = "arrowCursor"; break;
12417+
case RGFW_mouseArrow: cursorSelectorStr = "arrowCursor"; break;
12418+
case RGFW_mouseIbeam: cursorSelectorStr = "IBeamCursor"; break;
12419+
case RGFW_mouseCrosshair: cursorSelectorStr = "crosshairCursor"; break;
12420+
case RGFW_mousePointingHand: cursorSelectorStr = "pointingHandCursor"; break;
12421+
case RGFW_mouseResizeEW: cursorSelectorStr = "resizeLeftRightCursor"; break;
12422+
case RGFW_mouseResizeE: cursorSelectorStr = "resizeLeftRightCursor"; break;
12423+
case RGFW_mouseResizeW: cursorSelectorStr = "resizeLeftRightCursor"; break;
12424+
case RGFW_mouseResizeNS: cursorSelectorStr = "resizeUpDownCursor"; break;
12425+
case RGFW_mouseResizeN: cursorSelectorStr = "resizeUpDownCursor"; break;
12426+
case RGFW_mouseResizeS: cursorSelectorStr = "resizeUpDownCursor"; break;
12427+
case RGFW_mouseResizeNWSE: cursorSelectorStr = "_windowResizeNorthWestSouthEastCursor"; break;
12428+
case RGFW_mouseResizeNW: cursorSelectorStr = "_windowResizeNorthWestSouthEastCursor"; break;
12429+
case RGFW_mouseResizeSE: cursorSelectorStr = "_windowResizeNorthWestSouthEastCursor"; break;
12430+
case RGFW_mouseResizeNESW: cursorSelectorStr = "_windowResizeNorthEastSouthWestCursor"; break;
12431+
case RGFW_mouseResizeNE: cursorSelectorStr = "_windowResizeNorthEastSouthWestCursor"; break;
12432+
case RGFW_mouseResizeSW: cursorSelectorStr = "_windowResizeNorthEastSouthWestCursor"; break;
12433+
case RGFW_mouseResizeAll: cursorSelectorStr = "openHandCursor"; break;
12434+
case RGFW_mouseNotAllowed: cursorSelectorStr = "operationNotAllowedCursor"; break;
12435+
case RGFW_mouseWait: cursorSelectorStr = "arrowCursor"; break;
12436+
case RGFW_mouseProgress: cursorSelectorStr = "arrowCursor"; break;
12437+
default:
12438+
return RGFW_FALSE;
12439+
}
1234112440

12342-
const char* mouseStr = mouseIconSrc[stdMouses];
12343-
id mouse = NSCursor_arrowStr(mouseStr);
12441+
id mouse = NSCursor_arrowStr(cursorSelectorStr);
1234412442

1234512443
if (mouse == NULL)
1234612444
return RGFW_FALSE;
@@ -13334,8 +13432,8 @@ u8 RGFW_rgfwToKeyChar(u32 rgfw_keycode) {
1333413432
}
1333513433

1333613434
void RGFW_pollEvents(void) {
13337-
emscripten_sleep(0);
1333813435
RGFW_resetPrevState();
13436+
emscripten_sleep(0);
1333913437
}
1334013438

1334113439
void RGFW_window_resize(RGFW_window* win, i32 w, i32 h) {
@@ -13352,14 +13450,35 @@ void RGFW_window_setMouse(RGFW_window* win, RGFW_mouse* mouse) { RGFW_UNUSED(win
1335213450
void RGFW_freeMouse(RGFW_mouse* mouse) { RGFW_UNUSED(mouse); }
1335313451

1335413452
RGFW_bool RGFW_window_setMouseStandard(RGFW_window* win, u8 mouse) {
13355-
static const char cursors[16][16] = {
13356-
"default", "default", "text", "crosshair",
13357-
"pointer", "ew-resize", "ns-resize", "nwse-resize", "nesw-resize",
13358-
"move", "not-allowed"
13359-
};
13360-
1336113453
RGFW_UNUSED(win);
13362-
EM_ASM( { document.getElementById("canvas").style.cursor = UTF8ToString($0); }, cursors[mouse]);
13454+
char* cursorName = NULL;
13455+
13456+
switch (mouse) {
13457+
case RGFW_mouseNormal: cursorName = (char*)"default"; break;
13458+
case RGFW_mouseArrow: cursorName = (char*)"default"; break;
13459+
case RGFW_mouseIbeam: cursorName = (char*)"text"; break;
13460+
case RGFW_mouseCrosshair: cursorName = (char*)"crosshair"; break;
13461+
case RGFW_mousePointingHand: cursorName = (char*)"pointer"; break;
13462+
case RGFW_mouseResizeEW: cursorName = (char*)"ew-resize"; break;
13463+
case RGFW_mouseResizeNS: cursorName = (char*)"ns-resize"; break;
13464+
case RGFW_mouseResizeNWSE: cursorName = (char*)"nwse-resize"; break;
13465+
case RGFW_mouseResizeNESW: cursorName = (char*)"nesw-resize"; break;
13466+
case RGFW_mouseResizeNW: cursorName = (char*)"nw-resize"; break;
13467+
case RGFW_mouseResizeN: cursorName = (char*)"n-resize"; break;
13468+
case RGFW_mouseResizeNE: cursorName = (char*)"ne-resize"; break;
13469+
case RGFW_mouseResizeE: cursorName = (char*)"e-resize"; break;
13470+
case RGFW_mouseResizeSE: cursorName = (char*)"se-resize"; break;
13471+
case RGFW_mouseResizeS: cursorName = (char*)"s-resize"; break;
13472+
case RGFW_mouseResizeSW: cursorName = (char*)"sw-resize"; break;
13473+
case RGFW_mouseResizeW: cursorName = (char*)"w-resize"; break;
13474+
case RGFW_mouseResizeAll: cursorName = (char*)"move"; break;
13475+
case RGFW_mouseNotAllowed: cursorName = (char*)"not-allowed"; break;
13476+
case RGFW_mouseWait: cursorName = (char*)"wait"; break;
13477+
case RGFW_mouseProgress: cursorName = (char*)"progress"; break;
13478+
default: return RGFW_FALSE;
13479+
}
13480+
13481+
EM_ASM( { document.getElementById("canvas").style.cursor = UTF8ToString($0); }, cursorName);
1336313482
return RGFW_TRUE;
1336413483
}
1336513484

0 commit comments

Comments
 (0)