diff --git a/overlay/rootfs/usr/bin/snake b/overlay/rootfs/usr/bin/snake index a199a73..6207e5f 100755 Binary files a/overlay/rootfs/usr/bin/snake and b/overlay/rootfs/usr/bin/snake differ diff --git a/overlay/rootfs/usr/bin/tetris b/overlay/rootfs/usr/bin/tetris index 1858184..e434bbe 100755 Binary files a/overlay/rootfs/usr/bin/tetris and b/overlay/rootfs/usr/bin/tetris differ diff --git a/overlay/rootfs/usr/lib/dwm/plugins/dmenu.so b/overlay/rootfs/usr/lib/dwm/plugins/dmenu.so index 2033225..40f7bf8 100755 Binary files a/overlay/rootfs/usr/lib/dwm/plugins/dmenu.so and b/overlay/rootfs/usr/lib/dwm/plugins/dmenu.so differ diff --git a/prebuilt/games/usr/bin/snake b/prebuilt/games/usr/bin/snake index a199a73..6207e5f 100755 Binary files a/prebuilt/games/usr/bin/snake and b/prebuilt/games/usr/bin/snake differ diff --git a/prebuilt/games/usr/bin/tetris b/prebuilt/games/usr/bin/tetris index 1858184..e434bbe 100755 Binary files a/prebuilt/games/usr/bin/tetris and b/prebuilt/games/usr/bin/tetris differ diff --git a/prebuilt/sxmo-x11/usr/lib/dwm/plugins/dmenu.so b/prebuilt/sxmo-x11/usr/lib/dwm/plugins/dmenu.so index 2033225..40f7bf8 100755 Binary files a/prebuilt/sxmo-x11/usr/lib/dwm/plugins/dmenu.so and b/prebuilt/sxmo-x11/usr/lib/dwm/plugins/dmenu.so differ diff --git a/scripts/build-dmenu.sh b/scripts/build-dmenu.sh new file mode 100755 index 0000000..6c76d63 --- /dev/null +++ b/scripts/build-dmenu.sh @@ -0,0 +1,78 @@ +#!/bin/sh +# Cross-compile the patched sxmo-dmenu plugin (dmenu.so) for armv7. +# Mirrors the dmenu section of scripts/build-sxmo-x11.sh. +set -eu + +BASE_DIR="$(cd "$(dirname "$0")/.." && pwd)" +ROOTFS_DIR="${ROOTFS_DIR:-$BASE_DIR/rootfs}" +if [ -e "$ROOTFS_DIR" ]; then + ROOTFS_DIR="$(realpath "$ROOTFS_DIR")" +fi + +exec docker run --rm --network=host \ + -e HOST_UID="$(id -u)" \ + -e HOST_GID="$(id -g)" \ + -v "$BASE_DIR:/bananarchy" \ + -v "$ROOTFS_DIR:/target-rootfs" \ + alpine:3.24 sh -eu -c ' + cat > /etc/apk/repositories </dev/null + + echo "[2/3] Preparing armv7 sysroot (X11 + xinerama/xft/fontconfig)..." + SYSROOT="/tmp/armv7-sysroot" + mkdir -p "$SYSROOT/etc/apk/keys" + cp /etc/apk/repositories "$SYSROOT/etc/apk/repositories" + cp /etc/apk/keys/* "$SYSROOT/etc/apk/keys/" + apk --root "$SYSROOT" --initdb --arch armv7 add --no-scripts \ + alpine-baselayout \ + musl-dev \ + linux-headers \ + libx11-dev \ + libxinerama-dev \ + libxft-dev \ + fontconfig-dev \ + freetype-dev >/dev/null + + export PKG_CONFIG_SYSROOT_DIR="$SYSROOT" + export PKG_CONFIG_LIBDIR="$SYSROOT/usr/lib/pkgconfig:$SYSROOT/usr/share/pkgconfig" + CC="armv7-alpine-linux-musleabihf-gcc --sysroot=$SYSROOT" + STRIP="armv7-alpine-linux-musleabihf-strip" + OPT_CFLAGS="-O2 -march=armv7-a -mtune=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=hard -fno-plt -fomit-frame-pointer" + + mkdir -p /bananarchy/prebuilt/sxmo-x11/usr/lib/dwm/plugins + + echo "[3/3] Compiling dmenu.so..." + cd /bananarchy/src/sxmo-dmenu + cp -f config.def.h config.h + DMENU_INCS="$(pkgconf --cflags x11 xinerama xft fontconfig freetype2)" + DMENU_LIBS="$(pkgconf --libs x11 xinerama xft fontconfig freetype2)" + $CC $OPT_CFLAGS -fPIC -shared -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_XOPEN_SOURCE=700 -D_POSIX_C_SOURCE=200809L -DVERSION=\"5.0.14-bananarchy\" -DXINERAMA $DMENU_INCS \ + dmenu.c drw.c util.c $DMENU_LIBS -o /bananarchy/prebuilt/sxmo-x11/usr/lib/dwm/plugins/dmenu.so + $STRIP --strip-unneeded /bananarchy/prebuilt/sxmo-x11/usr/lib/dwm/plugins/dmenu.so + + echo "Installing into overlay and (optional) target rootfs..." + mkdir -p /bananarchy/overlay/rootfs/usr/lib/dwm/plugins + cp -f /bananarchy/prebuilt/sxmo-x11/usr/lib/dwm/plugins/dmenu.so /bananarchy/overlay/rootfs/usr/lib/dwm/plugins/dmenu.so + if [ -d /target-rootfs/usr/lib/dwm/plugins ]; then + cp -f /bananarchy/prebuilt/sxmo-x11/usr/lib/dwm/plugins/dmenu.so /target-rootfs/usr/lib/dwm/plugins/dmenu.so + fi + + chown -R "$HOST_UID:$HOST_GID" \ + /bananarchy/prebuilt/sxmo-x11/usr/lib/dwm/plugins \ + /bananarchy/overlay/rootfs/usr/lib/dwm/plugins \ + /bananarchy/src/sxmo-dmenu + ls -lh /bananarchy/prebuilt/sxmo-x11/usr/lib/dwm/plugins/dmenu.so +' diff --git a/src/games/snake.cpp b/src/games/snake.cpp index 40d5d96..b1d261e 100644 --- a/src/games/snake.cpp +++ b/src/games/snake.cpp @@ -141,7 +141,7 @@ static void reset_game() { snakelen = 4; int cx = COLS / 2, cy = ROWS / 2; for (int i = 0; i < snakelen; i++) { - snake[i][0] = cx - i; // tail to the left, head at cx + snake[i][0] = cx - (snakelen - 1 - i); // head at cx, tail to the left snake[i][1] = cy; } dirx = 1; diry = 0; @@ -306,7 +306,7 @@ static void setup_window() { C_FG = 0x33ff33; C_HEAD = 0x99ff99; C_FOOD = 0x66ff66; - C_DIM = 0x0a3a0a; + C_DIM = 0x2f9f2f; XSelectInput(dpy, win, KeyPressMask | StructureNotifyMask | ExposureMask); XMapWindow(dpy, win); diff --git a/src/games/tetris.cpp b/src/games/tetris.cpp index 51c62ab..d72015c 100644 --- a/src/games/tetris.cpp +++ b/src/games/tetris.cpp @@ -27,7 +27,7 @@ static const int WIN_W = 240; static const int WIN_H = 296; static const int PCOLS = 10; static const int PROWS = 20; -static const int CELL = 10; +static const int CELL = 12; // ---- 5x7 bitmap font ---- struct Glyph { char ch; unsigned char r[7]; }; @@ -101,7 +101,7 @@ static int board[PCOLS][PROWS]; // 0 empty, else type+1 static int curType = 0, curRot = 0, curX = 3, curY = 0; static int nextType = 0; static int score = 0, best = 0, lines = 0, level = 1; -static int speed = 600; // ms per gravity step +static int speed = 800; // ms per gravity step static unsigned long nextTick = 0; static bool running = true; @@ -176,7 +176,7 @@ static void lock_piece() { score += pts[cleared] * level; if (score > best) best = score; int nl = 1 + lines / 10; - if (nl != level) { level = nl; speed = 600 - (level - 1) * 50; if (speed < 120) speed = 120; } + if (nl != level) { level = nl; speed = 800 - (level - 1) * 40; if (speed < 250) speed = 250; } } spawn(); } @@ -341,7 +341,7 @@ static void setup_window() { C_FG = 0x33ff33; C_HEAD = 0x99ff99; C_FOOD = 0x66ff66; - C_DIM = 0x0a3a0a; + C_DIM = 0x2f9f2f; XSelectInput(dpy, win, KeyPressMask | StructureNotifyMask | ExposureMask); XMapWindow(dpy, win); diff --git a/src/sxmo-dmenu/dmenu.c b/src/sxmo-dmenu/dmenu.c index 21f4e3a..8119b58 100644 --- a/src/sxmo-dmenu/dmenu.c +++ b/src/sxmo-dmenu/dmenu.c @@ -157,6 +157,7 @@ static const char *ICON_ZMO = "\xf3\xb0\x9b\xac"; static const char *ICON_A2X = "\xe2\x87\x84"; static const char *ICON_KBD = "\xef\x84\x9c"; static const char *ICON_THM = "\xf3\xb0\x8f\x98"; +static const char *ICON_GAM = "\xf3\xb0\x8a\xb4"; static void drawmenu(void); static void show_menu(void); @@ -1682,6 +1683,9 @@ open_builtin_menu(const char *menu_name, int keep_idx) snprintf(label, sizeof(label), "%s Apps", ICON_GRD); add_menu_item(label, "@menu:applications", 1); + snprintf(label, sizeof(label), "%s Games", ICON_GAM); + add_menu_item(label, "@menu:games", 1); + snprintf(label, sizeof(label), "%s Scripts", ICON_GRD); add_menu_item(label, "@menu:scripts", 1); @@ -1764,7 +1768,15 @@ open_builtin_menu(const char *menu_name, int keep_idx) add_menu_item(label, "@menu:sys", 1); snprintf(label, sizeof(label), "%s Close Menu", ICON_CLS); add_menu_item(label, "@close", 0); - } else if (strcmp(menu_name, "scripts") == 0) { + } else if (strcmp(menu_name, "games") == 0) { + reset_session_defaults(1, "Games"); + append_active_call_entries(); + load_cache_or_hook("sxmo_games.cache", "sxmo_hook_games.sh"); + snprintf(label, sizeof(label), "%s System Menu", ICON_MNU); + add_menu_item(label, "@menu:sys", 1); + snprintf(label, sizeof(label), "%s Close Menu", ICON_CLS); + add_menu_item(label, "@close", 0); + } else if (strcmp(menu_name, "modem") == 0) { reset_session_defaults(1, "Scripts"); append_active_call_entries(); load_cache_or_hook("sxmo_scripts.cache", "sxmo_hook_scripts.sh");