Compare commits

..

2 Commits

Author SHA1 Message Date
jettis
62a7f58342 Makefile and INSTALL doc changes 2025-08-13 23:33:28 +03:00
jettis
031e37f6e3 main: add tray 2025-08-13 23:30:26 +03:00
5 changed files with 139 additions and 2 deletions

33
INSTALL.linux-static Normal file
View File

@@ -0,0 +1,33 @@
Compile on older container to get binary that runs on older OS too (SDL doesn't compile on older than 20.04):
docker run -v .:/SDLRousku -it --rm ubuntu:20.04
On Linux, install the packages listed at
https://github.com/libsdl-org/SDL/blob/main/docs/README-linux.md#build-dependencies
in addition apt install xdd nasm libwayland-dev
mkdir vendored
cd vendored
git clone https://github.com/libsdl-org/SDL.git
cd SDL
cmake -S . -B build -DBUILD_SHARED_LIBS=OFF
cmake --build build
git clone https://github.com/libsdl-org/SDL_image.git
cd SDL_image/external
./download.sh
cd ..
cmake -S . -B build -DBUILD_SHARED_LIBS=OFF -DSDLIMAGE_VENDORED=ON -DCMAKE_PREFIX_PATH=../SDL/build
cmake --build build
git clone https://github.com/libsdl-org/SDL_ttf.git
cd SDL_ttf/external/
./download.sh
cd ..
cmake -S . -B build -DBUILD_SHARED_LIBS=OFF -DSDLTTF_VENDORED=ON -DCMAKE_PREFIX_PATH=../SDL/build
cmake --build build
AppImage:
make install DESTDIR=AppDir
appimage-builder

View File

@@ -120,3 +120,6 @@ package() {
done done
} }
------------------------------------ ------------------------------------
x86_64-w64-mingw32-make -f Makefile.mingw
x86_64-w64-mingw32-strip Rousku.exe

View File

@@ -8,7 +8,7 @@ NEW_DIALOG_OBJECTS = Dialog Item Button Checkbox DropDownList Scrollbar Listbox
OBJECTS=main Animal Sound $(addprefix NewDialogs/,$(NEW_DIALOG_OBJECTS)) OBJECTS=main Animal Sound $(addprefix NewDialogs/,$(NEW_DIALOG_OBJECTS))
EXECUTABLE=Rousku EXECUTABLE=Rousku
all: $(EXECUTABLE) all: embed_data.h menu_png.h $(EXECUTABLE)
$(EXECUTABLE): $(OBJECTS:%=%.o) $(EXECUTABLE): $(OBJECTS:%=%.o)
$(CXX) $^ $(LDFLAGS) -o $@ $(CXX) $^ $(LDFLAGS) -o $@
@@ -20,6 +20,25 @@ $(EXECUTABLE): $(OBJECTS:%=%.o)
$(CXX) $(CXXFLAGS) $< -o $@ $(CXX) $(CXXFLAGS) $< -o $@
$(CXX) -MM $(CXXFLAGS) $*.cpp > $*.d $(CXX) -MM $(CXXFLAGS) $*.cpp > $*.d
embed_data.h:
@echo "Generating embed_data.h..."
@{ \
find skin -name "*.png"; \
find skin -name "*.wav"; \
find skin -name "*.tsk"; \
} | while read n; do \
xxd -i "$$n"; \
done > embed_data.h
menu_png.h:
xxd -i menu.png > menu_png.h
.PHONY: clean .PHONY: clean
clean: clean:
rm `find . -name "*.o"` `find . -name "*.d"` $(EXECUTABLE) rm `find . -name "*.o"` `find . -name "*.d"` embed_data.h menu_png.h $(EXECUTABLE)
install:
mkdir -p $(DESTDIR)/usr/bin/
cp $(EXECUTABLE) $(DESTDIR)/usr/bin/$(EXECUTABLE)
mkdir -p $(DESTDIR)/usr/share/icons/
cp skin/Tavallinen/paikka/1.png $(DESTDIR)/usr/share/icons/rousku.png

45
Makefile.linux-static Normal file
View File

@@ -0,0 +1,45 @@
CXX=g++
# needs "override" because x86_64-w64-mingw32-make sets these as cmdline parameters
override CXXFLAGS += -c -Wall -Ivendored/SDL/include -Ivendored/SDL_image/include -Ivendored/SDL_ttf/include
#override LDFLAGS += $(shell pkg-config --libs sdl3 sdl3-ttf sdl3-image)
override LDFLAGS += -Wl,-Bstatic vendored/SDL/build/libSDL3.a vendored/SDL_image/build/libSDL3_image.a vendored/SDL_ttf/build/libSDL3_ttf.a -Wl,-Bdynamic -lpthread -ldl -static-libgcc -static-libstdc++
NEW_DIALOG_OBJECTS = Dialog Item Button Checkbox DropDownList Scrollbar Listbox Frame DlgDropDownList DlgMainMenu
OBJECTS=main Animal Sound $(addprefix NewDialogs/,$(NEW_DIALOG_OBJECTS))
EXECUTABLE=Rousku
all: embed_data.h menu_png.h $(EXECUTABLE)
$(EXECUTABLE): $(OBJECTS:%=%.o)
$(CXX) $^ $(LDFLAGS) -o $@
# pull in dependency info for *existing* .o files
-include $(OBJECTS:%=%.d)
%.o: %.cpp
$(CXX) $(CXXFLAGS) $< -o $@
$(CXX) -MM $(CXXFLAGS) $*.cpp > $*.d
embed_data.h:
@echo "Generating embed_data.h..."
@{ \
find skin -name "*.png"; \
find skin -name "*.wav"; \
find skin -name "*.tsk"; \
} | while read n; do \
xxd -i "$$n"; \
done > embed_data.h
menu_png.h:
xxd -i menu.png > menu_png.h
.PHONY: clean
clean:
rm `find . -name "*.o"` `find . -name "*.d"` embed_data.h menu_png.h $(EXECUTABLE)
install:
mkdir -p $(DESTDIR)/usr/bin/
cp $(EXECUTABLE) $(DESTDIR)/usr/bin/$(EXECUTABLE)
mkdir -p $(DESTDIR)/usr/share/icons/
cp skin/Tavallinen/paikka/1.png $(DESTDIR)/usr/share/icons/rousku.png

View File

@@ -8,6 +8,35 @@
using namespace std; using namespace std;
class Tray {
private:
SDL_Tray *tray;
SDL_TrayMenu *menu;
SDL_TrayEntry *entry_open;
SDL_TrayEntry *entry_quit;
public:
Tray(SDL_Surface *icon, DlgMainMenu *dlg_menu) {
tray = SDL_CreateTray(icon, "Rousku");
menu = SDL_CreateTrayMenu(tray);
entry_open = SDL_InsertTrayEntryAt(menu, -1, "Avaa valikko", SDL_TRAYENTRY_BUTTON);
entry_quit = SDL_InsertTrayEntryAt(menu, -1, "Sulje Rousku", SDL_TRAYENTRY_BUTTON);
SDL_SetTrayEntryCallback(entry_open, callback_open, dlg_menu);
SDL_SetTrayEntryCallback(entry_quit, callback_quit, NULL);
}
~Tray() {
SDL_DestroyTray(tray);
}
static void callback_open(void *userdata, SDL_TrayEntry *invoker) {
DlgMainMenu *dlg_menu = (DlgMainMenu *) userdata;
dlg_menu->setExit(false);
}
static void callback_quit(void *userdata, SDL_TrayEntry *invoker) {
SDL_Event e;
e.type = SDL_EVENT_QUIT;
SDL_PushEvent(&e);
}
};
int main(int argc, char **argv) { int main(int argc, char **argv) {
if (!SDL_Init(SDL_INIT_AUDIO | SDL_INIT_VIDEO)) { if (!SDL_Init(SDL_INIT_AUDIO | SDL_INIT_VIDEO)) {
SDL_Log("Could not init SDL %s", SDL_GetError()); SDL_Log("Could not init SDL %s", SDL_GetError());
@@ -73,6 +102,9 @@ int main(int argc, char **argv) {
// Get MOUSE_DOWN event when clicking unfocused window // Get MOUSE_DOWN event when clicking unfocused window
SDL_SetHint(SDL_HINT_MOUSE_FOCUS_CLICKTHROUGH, "1"); SDL_SetHint(SDL_HINT_MOUSE_FOCUS_CLICKTHROUGH, "1");
SDL_Surface *icon_sfe = rousku.getPreviewSurface();
Tray *tray = new Tray(icon_sfe, dlg_menu);
while (!dlg_menu->isAppExit()) { while (!dlg_menu->isAppExit()) {
SDL_Event event; SDL_Event event;
SDL_zero(event); SDL_zero(event);
@@ -128,6 +160,9 @@ int main(int argc, char **argv) {
string changed_setting = dlg_menu->getChangedSetting(); string changed_setting = dlg_menu->getChangedSetting();
if (changed_setting == "skin_list") { if (changed_setting == "skin_list") {
rousku.readSkin(dlg_menu->getSkin()); rousku.readSkin(dlg_menu->getSkin());
icon_sfe = rousku.getPreviewSurface();
delete tray;
tray = new Tray(icon_sfe, dlg_menu);
rousku.setSpecialState(drop); rousku.setSpecialState(drop);
} }
Uint64 delay = rousku.step(SDL_GetTicks(), press); Uint64 delay = rousku.step(SDL_GetTicks(), press);
@@ -189,6 +224,8 @@ int main(int argc, char **argv) {
SDL_Delay(delay); SDL_Delay(delay);
} }
delete tray;
SDL_DestroyWindow(sdl_window); SDL_DestroyWindow(sdl_window);
SDL_Quit(); SDL_Quit();
TTF_Quit(); TTF_Quit();