Create enum Fl_Wayland_Screen_Driver::cursor_shapes

This commit is contained in:
ManoloFLTK 2024-03-16 14:40:16 +01:00
parent 8b094e8af3
commit 3ec91d4c6d
3 changed files with 45 additions and 130 deletions

View File

@ -76,6 +76,9 @@ public:
bool done;
struct wl_list link;
};
enum cursor_shapes {arrow = 0, wait, insert, hand, help, cross, move,
north, south, west, east, north_south, west_east, south_west, south_east, north_east, north_west, nesw, nwse};
static const int cursor_count = nwse + 1; // nber of elements of 'enum cursor_shapes'
// static member variables
static FL_EXPORT struct wl_display *wl_display;
@ -91,25 +94,7 @@ public:
static void do_set_cursor(struct Fl_Wayland_Screen_Driver::seat *,
struct wl_cursor *wl_cursor = NULL);
// member variables
struct wl_cursor *xc_arrow;
struct wl_cursor *xc_ns;
struct wl_cursor *xc_wait;
struct wl_cursor *xc_insert;
struct wl_cursor *xc_hand;
struct wl_cursor *xc_help;
struct wl_cursor *xc_cross;
struct wl_cursor *xc_move;
struct wl_cursor *xc_north;
struct wl_cursor *xc_south;
struct wl_cursor *xc_west;
struct wl_cursor *xc_east;
struct wl_cursor *xc_we;
struct wl_cursor *xc_nesw;
struct wl_cursor *xc_nwse;
struct wl_cursor *xc_sw;
struct wl_cursor *xc_se;
struct wl_cursor *xc_ne;
struct wl_cursor *xc_nw;
struct wl_cursor *xc_cursor[cursor_count]; // one for each element of enum cursor_shapes
struct wl_registry *wl_registry;
struct wl_compositor *wl_compositor;
struct wl_subcompositor *wl_subcompositor;

View File

@ -471,7 +471,7 @@ static void init_cursors(struct Fl_Wayland_Screen_Driver::seat *seat) {
seat->cursor_theme = theme;
}
if (seat->cursor_theme) {
seat->default_cursor = scr_driver->xc_arrow =
seat->default_cursor = scr_driver->xc_cursor[Fl_Wayland_Screen_Driver::arrow] =
wl_cursor_theme_get_cursor(seat->cursor_theme, "left_ptr");
}
if (!seat->cursor_surface) {
@ -1731,9 +1731,7 @@ struct wl_cursor *Fl_Wayland_Screen_Driver::cache_cursor(const char *cursor_name
void Fl_Wayland_Screen_Driver::reset_cursor() {
xc_arrow = xc_ns = xc_wait = xc_insert = xc_hand = xc_help = xc_cross = xc_move =
xc_north = xc_south = xc_west = xc_east = xc_we = xc_nesw = xc_nwse = xc_sw = xc_se =
xc_ne = xc_nw = NULL;
for (int i = 0; i < cursor_count; i++) xc_cursor[i] = NULL;
}

View File

@ -89,7 +89,7 @@ void Fl_Wayland_Window_Driver::delete_cursor(
free(wl_cursor);
Fl_Wayland_Screen_Driver *scr_driver = (Fl_Wayland_Screen_Driver*)Fl::screen_driver();
if (scr_driver->default_cursor() == wl_cursor) {
scr_driver->default_cursor(scr_driver->xc_arrow);
scr_driver->default_cursor(scr_driver->xc_cursor[Fl_Wayland_Screen_Driver::arrow]);
}
if (delete_rgb) delete custom->rgb;
delete custom;
@ -1497,114 +1497,46 @@ int Fl_Wayland_Window_Driver::set_cursor(Fl_Cursor c) {
if (!scr_driver->seat->cursor_theme) return 1;
// Cursor names are the files of directory /usr/share/icons/XXXX/cursors/
// where XXXX is the name of the current 'cursor theme'.
switch (c) {
case FL_CURSOR_ARROW:
if (!scr_driver->xc_arrow) scr_driver->xc_arrow = scr_driver->cache_cursor("left_ptr");
scr_driver->default_cursor(scr_driver->xc_arrow);
static struct cursor_file_struct {
Fl_Cursor c;
const char *fname;
Fl_Wayland_Screen_Driver::cursor_shapes wld_c;
} cursor_file_array[] = {
{FL_CURSOR_ARROW, "left_ptr", Fl_Wayland_Screen_Driver::arrow },
{FL_CURSOR_CROSS, "cross", Fl_Wayland_Screen_Driver::cross },
{FL_CURSOR_WAIT, "watch", Fl_Wayland_Screen_Driver::wait },
{FL_CURSOR_INSERT, "xterm", Fl_Wayland_Screen_Driver::insert },
{FL_CURSOR_HAND, "hand1", Fl_Wayland_Screen_Driver::hand },
{FL_CURSOR_HELP, "help", Fl_Wayland_Screen_Driver::help },
{FL_CURSOR_MOVE, "move", Fl_Wayland_Screen_Driver::move },
{FL_CURSOR_N, "top_side", Fl_Wayland_Screen_Driver::north },
{FL_CURSOR_E, "right_side", Fl_Wayland_Screen_Driver::east },
{FL_CURSOR_W, "left_side", Fl_Wayland_Screen_Driver::west },
{FL_CURSOR_S, "bottom_side", Fl_Wayland_Screen_Driver::south },
{FL_CURSOR_NS, "sb_v_double_arrow", Fl_Wayland_Screen_Driver::north_south },
{FL_CURSOR_WE, "sb_h_double_arrow", Fl_Wayland_Screen_Driver::west_east },
{FL_CURSOR_SW, "bottom_left_corner", Fl_Wayland_Screen_Driver::south_west },
{FL_CURSOR_SE, "bottom_right_corner", Fl_Wayland_Screen_Driver::south_east },
{FL_CURSOR_NE, "top_right_corner", Fl_Wayland_Screen_Driver::north_east },
{FL_CURSOR_NW, "top_left_corner", Fl_Wayland_Screen_Driver::north_west },
{FL_CURSOR_NESW, "fd_double_arrow", Fl_Wayland_Screen_Driver::nesw },
{FL_CURSOR_NWSE, "bd_double_arrow", Fl_Wayland_Screen_Driver::nwse }
};
int found = -1;
for (unsigned i = 0; i < sizeof(cursor_file_array) / sizeof(struct cursor_file_struct); i++) {
if (cursor_file_array[i].c == c) {
found = cursor_file_array[i].wld_c;
if (!scr_driver->xc_cursor[found]) scr_driver->xc_cursor[found] =
scr_driver->cache_cursor(cursor_file_array[i].fname);
if (scr_driver->xc_cursor[found]) {
scr_driver->default_cursor(scr_driver->xc_cursor[found]);
}
break;
case FL_CURSOR_NS:
if (!scr_driver->xc_ns) scr_driver->xc_ns =
scr_driver->cache_cursor("sb_v_double_arrow");
if (!scr_driver->xc_ns) return 0;
scr_driver->default_cursor(scr_driver->xc_ns);
break;
case FL_CURSOR_CROSS:
if (!scr_driver->xc_cross) scr_driver->xc_cross = scr_driver->cache_cursor("cross");
if (!scr_driver->xc_cross) return 0;
scr_driver->default_cursor(scr_driver->xc_cross);
break;
case FL_CURSOR_WAIT:
if (!scr_driver->xc_wait) scr_driver->xc_wait = scr_driver->cache_cursor("wait");
if (!scr_driver->xc_wait) scr_driver->xc_wait = scr_driver->cache_cursor("watch");
if (!scr_driver->xc_wait) return 0;
scr_driver->default_cursor(scr_driver->xc_wait);
break;
case FL_CURSOR_INSERT:
if (!scr_driver->xc_insert) scr_driver->xc_insert = scr_driver->cache_cursor("xterm");
if (!scr_driver->xc_insert) return 0;
scr_driver->default_cursor(scr_driver->xc_insert);
break;
case FL_CURSOR_HAND:
if (!scr_driver->xc_hand) scr_driver->xc_hand = scr_driver->cache_cursor("hand");
if (!scr_driver->xc_hand) scr_driver->xc_hand = scr_driver->cache_cursor("hand1");
if (!scr_driver->xc_hand) return 0;
scr_driver->default_cursor(scr_driver->xc_hand);
break;
case FL_CURSOR_HELP:
if (!scr_driver->xc_help) scr_driver->xc_help = scr_driver->cache_cursor("help");
if (!scr_driver->xc_help) return 0;
scr_driver->default_cursor(scr_driver->xc_help);
break;
case FL_CURSOR_MOVE:
if (!scr_driver->xc_move) scr_driver->xc_move = scr_driver->cache_cursor("move");
if (!scr_driver->xc_move) return 0;
scr_driver->default_cursor(scr_driver->xc_move);
break;
case FL_CURSOR_WE:
if (!scr_driver->xc_we) scr_driver->xc_we =
scr_driver->cache_cursor("sb_h_double_arrow");
if (!scr_driver->xc_we) return 0;
scr_driver->default_cursor(scr_driver->xc_we);
break;
case FL_CURSOR_N:
if (!scr_driver->xc_north) scr_driver->xc_north = scr_driver->cache_cursor("top_side");
if (!scr_driver->xc_north) return 0;
scr_driver->default_cursor(scr_driver->xc_north);
break;
case FL_CURSOR_E:
if (!scr_driver->xc_east) scr_driver->xc_east = scr_driver->cache_cursor("right_side");
if (!scr_driver->xc_east) return 0;
scr_driver->default_cursor(scr_driver->xc_east);
break;
case FL_CURSOR_W:
if (!scr_driver->xc_west) scr_driver->xc_west = scr_driver->cache_cursor("left_side");
if (!scr_driver->xc_west) return 0;
scr_driver->default_cursor(scr_driver->xc_west);
break;
case FL_CURSOR_S:
if (!scr_driver->xc_south) scr_driver->xc_south =
scr_driver->cache_cursor("bottom_side");
if (!scr_driver->xc_south) return 0;
scr_driver->default_cursor(scr_driver->xc_south);
break;
case FL_CURSOR_NESW:
if (!scr_driver->xc_nesw) scr_driver->xc_nesw =
scr_driver->cache_cursor("fd_double_arrow");
if (!scr_driver->xc_nesw) return 0;
scr_driver->default_cursor(scr_driver->xc_nesw);
break;
case FL_CURSOR_NWSE:
if (!scr_driver->xc_nwse) scr_driver->xc_nwse =
scr_driver->cache_cursor("bd_double_arrow");
if (!scr_driver->xc_nwse) return 0;
scr_driver->default_cursor(scr_driver->xc_nwse);
break;
case FL_CURSOR_SW:
if (!scr_driver->xc_sw) scr_driver->xc_sw =
scr_driver->cache_cursor("bottom_left_corner");
if (!scr_driver->xc_sw) return 0;
scr_driver->default_cursor(scr_driver->xc_sw);
break;
case FL_CURSOR_SE:
if (!scr_driver->xc_se) scr_driver->xc_se =
scr_driver->cache_cursor("bottom_right_corner");
if (!scr_driver->xc_se) return 0;
scr_driver->default_cursor(scr_driver->xc_se);
break;
case FL_CURSOR_NE:
if (!scr_driver->xc_ne) scr_driver->xc_ne = scr_driver->cache_cursor("top_right_corner");
if (!scr_driver->xc_ne) return 0;
scr_driver->default_cursor(scr_driver->xc_ne);
break;
case FL_CURSOR_NW:
if (!scr_driver->xc_nw) scr_driver->xc_nw = scr_driver->cache_cursor("top_left_corner");
if (!scr_driver->xc_nw) return 0;
scr_driver->default_cursor(scr_driver->xc_nw);
break;
default:
return 0;
}
}
if (found < 0 || !scr_driver->xc_cursor[found]) return 0;
if (xid->custom_cursor) {
delete_cursor(xid->custom_cursor);
xid->custom_cursor = NULL;