commit:     1f452038d6b0f5b676e3d933d40f2fd5a797c576
Author:     Finn Rayment <finn <AT> rayment <DOT> fr>
AuthorDate: Wed Aug 24 04:22:13 2022 +0000
Commit:     James Le Cuirot <chewi <AT> gentoo <DOT> org>
CommitDate: Sun Oct  9 12:08:35 2022 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=1f452038

games-roguelike/dwarf-fortress: Added gui? USE flag and removed hard dep.

GTK was required for runtime but was only used for a single fullscreen
dialog prompt when the config [WINDOWED:PROMPT].

Now, if libgraphics is compiled without using GTK, the game will not ask
at all if run from a window manager, but instead open in windowed mode.
However, if the game is run from a terminal, a simple scanf procedure
will ask the user for yes/no before deciding.

Signed-off-by: Finn Rayment <finn <AT> rayment.fr>
Bug: https://bugs.gentoo.org/856685
Signed-off-by: James Le Cuirot <chewi <AT> gentoo.org>

 ....05.ebuild => dwarf-fortress-0.47.05-r1.ebuild} |   7 +-
 .../dwarf-fortress/files/Makefile.native           |   9 +-
 .../files/dwarf-fortress-0.47.05-nogtk.patch       | 119 +++++++++++++++++++++
 .../dwarf-fortress-0.47.05-segfault-fixes.patch    |  16 ++-
 4 files changed, 143 insertions(+), 8 deletions(-)

diff --git a/games-roguelike/dwarf-fortress/dwarf-fortress-0.47.05.ebuild 
b/games-roguelike/dwarf-fortress/dwarf-fortress-0.47.05-r1.ebuild
similarity index 94%
rename from games-roguelike/dwarf-fortress/dwarf-fortress-0.47.05.ebuild
rename to games-roguelike/dwarf-fortress/dwarf-fortress-0.47.05-r1.ebuild
index dac5c1c75c94..09f1a0c25b24 100644
--- a/games-roguelike/dwarf-fortress/dwarf-fortress-0.47.05.ebuild
+++ b/games-roguelike/dwarf-fortress/dwarf-fortress-0.47.05-r1.ebuild
@@ -18,7 +18,7 @@ S="${WORKDIR}/df_linux"
 LICENSE="free-noncomm BSD BitstreamVera"
 SLOT="0"
 KEYWORDS="-* ~amd64 ~x86"
-IUSE="debug"
+IUSE="debug gui"
 
 RDEPEND="
        dev-libs/glib:2
@@ -29,7 +29,7 @@ RDEPEND="
        media-libs/sdl-ttf
        sys-libs/zlib:=
        virtual/glu
-       x11-libs/gtk+:2"
+       gui? ( x11-libs/gtk+:2 )"
 # libsndfile, openal and ncurses are only needed at compile-time,
 # optfeature through dlopen() at runtime if requested
 DEPEND="
@@ -44,6 +44,7 @@ QA_PREBUILT="opt/${PN}/libs/Dwarf_Fortress"
 PATCHES=(
        "${FILESDIR}"/${P}-missing-cmath.patch
        "${FILESDIR}"/${P}-ncurses6.patch
+       "${FILESDIR}"/${P}-nogtk.patch
        "${FILESDIR}"/${P}-segfault-fixes.patch
 )
 
@@ -60,7 +61,7 @@ src_compile() {
        # -DDEBUG is recognized to give additional debug output
        append-cppflags -D$(usev !debug N)DEBUG
 
-       emake -f "${FILESDIR}"/Makefile.native
+       emake -f "${FILESDIR}"/Makefile.native HAVE_GTK=$(usex gui 1 0)
 }
 
 src_install() {

diff --git a/games-roguelike/dwarf-fortress/files/Makefile.native 
b/games-roguelike/dwarf-fortress/files/Makefile.native
index 85383e5e2f1d..d22fb03f4694 100644
--- a/games-roguelike/dwarf-fortress/files/Makefile.native
+++ b/games-roguelike/dwarf-fortress/files/Makefile.native
@@ -1,6 +1,8 @@
 # Copyright 2014-2016 Alex Xu (Hello71)
 # Distributed under the terms of the GNU General Public License v2
 
+HAVE_GTK ?= 1
+
 SRCS := g_src/basics.cpp g_src/command_line.cpp g_src/enabler.cpp \
        g_src/files.cpp g_src/find_files_posix.cpp g_src/graphics.cpp \
        g_src/init.cpp g_src/interface.cpp g_src/keybindings.cpp \
@@ -11,7 +13,12 @@ SRCS := g_src/basics.cpp g_src/command_line.cpp 
g_src/enabler.cpp \
 OBJS := $(SRCS:.cpp=.o)
 
 BLIBS := ncursesw openal sndfile
-LIBS := glew glu gtk+-2.0 sdl SDL_image SDL_ttf zlib
+
+LIBS := glew glu sdl SDL_image SDL_ttf zlib
+ifeq ($(HAVE_GTK),1)
+LIBS += gtk+-2.0
+endif
+
 CXXFLAGS ?= -O2 -pipe -Wall -Wextra
 CXXFLAGS += $(shell $(PKG_CONFIG) --cflags $(BLIBS) $(LIBS)) -Dunix -Dlinux 
-fPIC -std=c++11 -D_GLIBCXX_USE_CXX11_ABI=0
 LDLIBS := $(shell $(PKG_CONFIG) --libs $(LIBS))

diff --git 
a/games-roguelike/dwarf-fortress/files/dwarf-fortress-0.47.05-nogtk.patch 
b/games-roguelike/dwarf-fortress/files/dwarf-fortress-0.47.05-nogtk.patch
new file mode 100644
index 000000000000..7702362b4a69
--- /dev/null
+++ b/games-roguelike/dwarf-fortress/files/dwarf-fortress-0.47.05-nogtk.patch
@@ -0,0 +1,119 @@
+Removes hard dependency on GTK in favour of stdin calls.
+
+--- a/g_src/KeybindingScreen.cpp
++++ b/g_src/KeybindingScreen.cpp
+@@ -1,7 +1,9 @@
+ #ifdef __APPLE__
+ # include "osx_messagebox.h"
+ #elif defined(unix)
+-# include <gtk/gtk.h>
++# ifdef HAVE_GTK
++#  include <gtk/gtk.h>
++# endif
+ #endif
+ 
+ #include "GL/glew.h"
+--- a/g_src/enabler.cpp
++++ b/g_src/enabler.cpp
+@@ -1,7 +1,9 @@
+ #ifdef __APPLE__
+ # include "osx_messagebox.h"
+ #elif defined(unix)
+-# include <gtk/gtk.h>
++# ifdef HAVE_GTK
++#  include <gtk/gtk.h>
++# endif
+ #endif
+ 
+ #include <cassert>
+@@ -713,7 +715,7 @@ int main (int argc, char* argv[]) {
+ #ifdef unix
+   setlocale(LC_ALL, "");
+ #endif
+-#if !defined(__APPLE__) && defined(unix)
++#if !defined(__APPLE__) && defined(unix) && defined(HAVE_GTK)
+   bool gtk_ok = false;
+   if (getenv("DISPLAY"))
+     gtk_ok = gtk_init_check(&argc, &argv);
+@@ -734,6 +736,7 @@ int main (int argc, char* argv[]) {
+   init.begin(); // Load init.txt settings
+   
+ #if !defined(__APPLE__) && defined(unix)
++ #if defined(HAVE_GTK)
+   if (!gtk_ok && !init.display.flag.has_flag(INIT_DISPLAY_FLAG_TEXT)) {
+     puts("Display not found and PRINT_MODE not set to TEXT, aborting.");
+     exit(EXIT_FAILURE);
+@@ -743,6 +746,7 @@ int main (int argc, char* argv[]) {
+     puts("Graphical tiles are not compatible with text output, sorry");
+     exit(EXIT_FAILURE);
+   }
++ #endif
+ #endif
+ 
+   // Initialize video, if we /use/ video
+--- a/g_src/renderer_curses.cpp
++++ b/g_src/renderer_curses.cpp
+@@ -1,3 +1,7 @@
++#if defined(__APPLE__) || defined(unix)
++# include <unistd.h>
++#endif
++
+ static bool curses_initialized = false;
+ 
+ static void endwin_void() {
+--- a/g_src/win32_compat.cpp
++++ b/g_src/win32_compat.cpp
+@@ -13,7 +13,11 @@
+ # ifdef __APPLE__
+ #  include "osx_messagebox.h"
+ # elif defined(unix)
+-#  include <gtk/gtk.h>
++#  ifdef HAVE_GTK
++#    include <gtk/gtk.h>
++#  else
++#    include <unistd.h>
++#  endif
+ # endif
+ #endif
+ 
+@@ -112,6 +116,7 @@ int MessageBox(HWND *dummy, const char *text, const char 
*caption, UINT type)
+   }
+ # else // GTK code
+   if (getenv("DISPLAY")) {
++  #ifdef HAVE_GTK
+     // Have X, will dialog
+     GtkWidget *dialog = gtk_message_dialog_new(NULL,
+                                                GTK_DIALOG_DESTROY_WITH_PARENT,
+@@ -141,6 +146,23 @@ int MessageBox(HWND *dummy, const char *text, const char 
*caption, UINT type)
+         break;
+       }
+     }
++  #else
++    if (isatty(fileno(stdin))) {
++      dprintf(2, "Alert %s:\n%s\n", caption ? caption : "", text ? text : "");
++      if (type & MB_YESNO) {
++        while(ret == IDOK) {
++          dprintf(2, "please answer with 'yes' or 'no'\n");
++          char buf[16];
++          fgets(buf, sizeof buf, stdin);
++          if(!strncmp(buf, "yes", 3)) ret = IDYES;
++          else if(!strncmp(buf, "no", 2)) ret = IDNO;
++        }
++      }
++    } else {
++      /* just assume windowed if no TTY is available to ask */
++      ret = IDNO;
++    }
++  #endif /* HAVE_GTK */
+   } else {
+     // Use curses
+     init_curses();
+@@ -173,7 +195,7 @@ int MessageBox(HWND *dummy, const char *text, const char 
*caption, UINT type)
+     }
+     nodelay(*stdscr_p, -1);
+   }
+-# endif
++  #endif
+   
+   if (toggle_screen) {
+     enabler.toggle_fullscreen();

diff --git 
a/games-roguelike/dwarf-fortress/files/dwarf-fortress-0.47.05-segfault-fixes.patch
 
b/games-roguelike/dwarf-fortress/files/dwarf-fortress-0.47.05-segfault-fixes.patch
index 24c43be41188..11a820ac97df 100644
--- 
a/games-roguelike/dwarf-fortress/files/dwarf-fortress-0.47.05-segfault-fixes.patch
+++ 
b/games-roguelike/dwarf-fortress/files/dwarf-fortress-0.47.05-segfault-fixes.patch
@@ -7,32 +7,40 @@ https://bugs.gentoo.org/729002
 https://www.bay12games.com/dwarves/mantisbt/view.php?id=11564
 --- a/g_src/enabler.cpp
 +++ b/g_src/enabler.cpp
-@@ -591,4 +591,6 @@
+@@ -592,6 +592,8 @@ int enablerst::loop(string cmdline) {
+ 
    // Clean up graphical resources
    delete renderer;
 +
 +  return 0;
  }
  
+ void enablerst::override_grid_size(int x, int y) {
 --- a/g_src/music_and_sound_openal.cpp
 +++ b/g_src/music_and_sound_openal.cpp
-@@ -251,5 +251,4 @@
+@@ -250,7 +250,6 @@ void musicsoundst::deinitsound() {
+     alDeleteBuffers(1, &buffer);
    }
    // Deinit OpenAL
 -  alcMakeContextCurrent(NULL);
    alcDestroyContext(context);
    alcCloseDevice(device);
-@@ -481,5 +480,5 @@
+ 
+@@ -480,7 +479,7 @@ static bool init_openal() {
+ 
  void alEnable( ALenum capability ) { _alEnable(capability); }
  void alDisable( ALenum capability ) { _alDisable(capability); }
 -ALboolean alIsEnabled( ALenum capability ) { _alIsEnabled(capability); }
 +ALboolean alIsEnabled( ALenum capability ) { return _alIsEnabled(capability); 
}
  const ALchar* alGetString( ALenum param ) { return _alGetString(param); }
  void alGetBooleanv( ALenum param, ALboolean* data ) { _alGetBooleanv(param, 
data); }
-@@ -491,5 +490,5 @@
+ void alGetIntegerv( ALenum param, ALint* data ) { _alGetIntegerv(param, 
data); }
+@@ -490,7 +489,7 @@ ALboolean alGetBoolean( ALenum param ) { return 
_alGetBoolean(param); }
+ ALint alGetInteger( ALenum param ) { return _alGetInteger(param); }
  ALfloat alGetFloat( ALenum param ) { return _alGetFloat(param); }
  ALdouble alGetDouble( ALenum param ) { return _alGetDouble(param); }
 -ALenum alGetError( void ) { _alGetError(); }
 +ALenum alGetError( void ) { return _alGetError(); }
  ALboolean alIsExtensionPresent( const ALchar* extname ) { return 
_alIsExtensionPresent(extname); }
  void* alGetProcAddress( const ALchar* fname ) { return 
_alGetProcAddress(fname); }
+ ALenum alGetEnumValue( const ALchar* ename ) { return _alGetEnumValue(ename); 
}

Reply via email to