diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 8610691ab..5740e3f6e 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -511,7 +511,7 @@ set( PLAT_SDL_SOURCES posix/sdl/st_start.cpp ) set( PLAT_UNIX_SOURCES posix/unix/i_specialpaths.cpp - posix/unix/iwadpicker_gtk.cpp ) + posix/unix/gtk_dialogs.cpp ) set( PLAT_OSX_SOURCES posix/osx/iwadpicker_cocoa.mm posix/osx/i_specialpaths.mm diff --git a/src/gl/stereo3d/gl_stereo_cvars.cpp b/src/gl/stereo3d/gl_stereo_cvars.cpp index 47b7ff217..e7ce699f5 100644 --- a/src/gl/stereo3d/gl_stereo_cvars.cpp +++ b/src/gl/stereo3d/gl_stereo_cvars.cpp @@ -43,7 +43,7 @@ CVAR(Bool, vr_swap_eyes, false, CVAR_GLOBALCONFIG) // For broadest GL compatibility, require user to explicitly enable quad-buffered stereo mode. // Setting vr_enable_quadbuffered_stereo does not automatically invoke quad-buffered stereo, // but makes it possible for subsequent "vr_mode 7" to invoke quad-buffered stereo -CUSTOM_CVAR(Bool, vr_enable_quadbuffered, false, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) +CUSTOM_CVAR(Bool, vr_enable_quadbuffered, false, CVAR_ARCHIVE | CVAR_GLOBALCONFIG | CVAR_NOINITCALL) { Printf("You must restart " GAMENAME " to switch quad stereo mode\n"); } diff --git a/src/posix/sdl/i_main.cpp b/src/posix/sdl/i_main.cpp index 21f58e71e..95ed8322e 100644 --- a/src/posix/sdl/i_main.cpp +++ b/src/posix/sdl/i_main.cpp @@ -73,6 +73,10 @@ extern "C" int cc_install_handlers(int, char**, int, int*, const char*, int(*)(c void Mac_I_FatalError(const char* errortext); #endif +#ifdef __linux__ +void Linux_I_FatalError(const char* errortext); +#endif + // PUBLIC FUNCTION PROTOTYPES ---------------------------------------------- // PRIVATE FUNCTION PROTOTYPES --------------------------------------------- @@ -268,6 +272,10 @@ int main (int argc, char **argv) Mac_I_FatalError(error.GetMessage()); #endif // __APPLE__ +#ifdef __linux__ + Linux_I_FatalError(error.GetMessage()); +#endif // __linux__ + exit (-1); } catch (...) diff --git a/src/posix/sdl/i_system.cpp b/src/posix/sdl/i_system.cpp index b71acb8f8..f980e2598 100644 --- a/src/posix/sdl/i_system.cpp +++ b/src/posix/sdl/i_system.cpp @@ -79,6 +79,7 @@ extern "C" #ifndef NO_GTK bool I_GtkAvailable (); int I_PickIWad_Gtk (WadStuff *wads, int numwads, bool showwin, int defaultiwad); +void I_FatalError_Gtk(const char* errortext); #elif defined(__APPLE__) int I_PickIWad_Cocoa (WadStuff *wads, int numwads, bool showwin, int defaultiwad); #endif @@ -157,6 +158,37 @@ bool gameisdead; void Mac_I_FatalError(const char* errortext); #endif +#ifdef __linux__ +void Linux_I_FatalError(const char* errortext) +{ + // Close window or exit fullscreen and release mouse capture + SDL_Quit(); + + const char *str; + if((str=getenv("KDE_FULL_SESSION")) && strcmp(str, "true") == 0) + { + FString cmd; + cmd << "kdialog --title \"" GAMESIG " "; + cmd << GetVersionString() << ": No IWAD found\" "; + cmd << "--msgbox \"" << errortext << "\""; + popen(cmd, "r"); + } +#ifndef NO_GTK + else if (I_GtkAvailable()) + { + I_FatalError_Gtk(errortext); + } +#endif + else + { + FString message; + message << GAMESIG " "; + message << GetVersionString() << ": No IWAD found"; + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, message, errortext, NULL); + } +} +#endif + void I_FatalError (const char *error, ...) { static bool alreadyThrown = false; @@ -175,6 +207,10 @@ void I_FatalError (const char *error, ...) #ifdef __APPLE__ Mac_I_FatalError(errortext); #endif // __APPLE__ + +#ifdef __linux__ + Linux_I_FatalError(errortext); +#endif // Record error to log (if logging) if (Logfile) diff --git a/src/posix/unix/iwadpicker_gtk.cpp b/src/posix/unix/gtk_dialogs.cpp similarity index 83% rename from src/posix/unix/iwadpicker_gtk.cpp rename to src/posix/unix/gtk_dialogs.cpp index ebaab609f..658f8cbc5 100644 --- a/src/posix/unix/iwadpicker_gtk.cpp +++ b/src/posix/unix/gtk_dialogs.cpp @@ -1,5 +1,5 @@ /* -** iwadpicker_gtk.cpp +** gtk_dialogs.cpp ** **--------------------------------------------------------------------------- ** Copyright 2008-2016 Braden Obrzut @@ -126,12 +126,16 @@ DYN_GTK_SYM(gtk_window_new); DYN_GTK_SYM(gtk_window_set_gravity); DYN_GTK_SYM(gtk_window_set_position); DYN_GTK_SYM(gtk_window_set_title); +DYN_GTK_SYM(gtk_window_set_resizable); +DYN_GTK_SYM(gtk_dialog_run); +DYN_GTK_SYM(gtk_dialog_get_type); // Gtk3 Only DYN_GTK_OPT3_SYM(gtk_box_new, GtkWidget *(*)(GtkOrientation, gint)); DYN_GTK_OPT3_SYM(gtk_button_box_new, GtkWidget *(*)(GtkOrientation)); DYN_GTK_OPT3_SYM(gtk_widget_set_halign, void(*)(GtkWidget *, GtkAlign)); DYN_GTK_OPT3_SYM(gtk_widget_set_valign, void(*)(GtkWidget *, GtkAlign)); +DYN_GTK_OPT3_SYM(gtk_message_dialog_new, GtkWidget* (*)(GtkWindow*, GtkDialogFlags, GtkMessageType, GtkButtonsType, const gchar*, ...)); // Gtk2 Only DYN_GTK_OPT2_SYM(gtk_misc_get_type, GType(*)()); @@ -342,6 +346,70 @@ static int PickIWad (WadStuff *wads, int numwads, bool showwin, int defaultiwad) return i; } +static void ShowError(const char* errortext) +{ + GtkWidget *window; + GtkWidget *widget; + GtkWidget *vbox = nullptr; + GtkWidget *bbox = nullptr; + + window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_window_set_title (GTK_WINDOW(window), "Fatal error"); + gtk_window_set_position (GTK_WINDOW(window), GTK_WIN_POS_CENTER); + gtk_window_set_gravity (GTK_WINDOW(window), GDK_GRAVITY_CENTER); + gtk_window_set_resizable (GTK_WINDOW(window), false); + gtk_container_set_border_width (GTK_CONTAINER(window), 10); + g_signal_connect (window, "delete_event", G_CALLBACK(gtk_main_quit), NULL); + g_signal_connect (window, "key_press_event", G_CALLBACK(CheckEscape), NULL); + + // Create the vbox container. + if (gtk_box_new) // Gtk3 + vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 10); + else if (gtk_vbox_new) // Gtk2 + vbox = gtk_vbox_new (FALSE, 10); + + gtk_container_add (GTK_CONTAINER(window), vbox); + + // Create the label. + widget = gtk_label_new ((const gchar *) errortext); + gtk_box_pack_start (GTK_BOX(vbox), widget, false, false, 0); + + if (gtk_widget_set_halign && gtk_widget_set_valign) // Gtk3 + { + gtk_widget_set_halign (widget, GTK_ALIGN_START); + gtk_widget_set_valign (widget, GTK_ALIGN_START); + } + else if (gtk_misc_set_alignment && gtk_misc_get_type) // Gtk2 + gtk_misc_set_alignment (GTK_MISC(widget), 0, 0); + + // Create the Exit button box. + if (gtk_button_box_new) // Gtk3 + bbox = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL); + else if (gtk_hbutton_box_new) // Gtk2 + bbox = gtk_hbutton_box_new (); + + gtk_button_box_set_layout (GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_END); + gtk_box_set_spacing (GTK_BOX(bbox), 10); + gtk_box_pack_end (GTK_BOX(vbox), bbox, false, false, 0); + + // Create the cancel button. + widget = gtk_button_new_with_label ("Exit"); + gtk_box_pack_start (GTK_BOX(bbox), widget, false, false, 0); + g_signal_connect (widget, "clicked", G_CALLBACK(gtk_main_quit), &window); + + // Finally we can show everything. + gtk_widget_show_all (window); + + gtk_main (); + + if (GTK_IS_WINDOW(window)) + { + gtk_widget_destroy (window); + // If we don't do this, then the X window might not actually disappear. + while (g_main_context_iteration (NULL, FALSE)) {} + } +} + } // namespace Gtk int I_PickIWad_Gtk (WadStuff *wads, int numwads, bool showwin, int defaultiwad) @@ -349,6 +417,10 @@ int I_PickIWad_Gtk (WadStuff *wads, int numwads, bool showwin, int defaultiwad) return Gtk::PickIWad (wads, numwads, showwin, defaultiwad); } +void I_FatalError_Gtk(const char* errortext) { + Gtk::ShowError(errortext); +} + bool I_GtkAvailable() { using namespace Gtk; diff --git a/src/textures/texturemanager.cpp b/src/textures/texturemanager.cpp index 5039f48b6..613aa3be9 100644 --- a/src/textures/texturemanager.cpp +++ b/src/textures/texturemanager.cpp @@ -1206,8 +1206,21 @@ DEFINE_ACTION_FUNCTION(_TexMan, GetName) { PARAM_PROLOGUE; PARAM_INT(texid); - const FTexture* const tex = TexMan.ByIndex(texid); - ACTION_RETURN_STRING(nullptr == tex ? FString() : tex->Name); + auto tex = TexMan.ByIndex(texid); + FString retval; + + if (tex != nullptr) + { + if (tex->Name.IsNotEmpty()) retval = tex->Name; + else + { + // Textures for full path names do not have their own name, they merely link to the source lump. + auto lump = tex->GetSourceLump(); + if (Wads.GetLinkedTexture(lump) == tex) + retval = Wads.GetLumpFullName(lump); + } + } + ACTION_RETURN_STRING(retval); } //========================================================================== diff --git a/wadsrc/static/compatibility.txt b/wadsrc/static/compatibility.txt index 245c45052..ff360f96b 100644 --- a/wadsrc/static/compatibility.txt +++ b/wadsrc/static/compatibility.txt @@ -685,6 +685,10 @@ EBDAC00E9D25D884B2C8F4B1F0390539 // doom2.wad map21 setsectoroffset 50 ceil -56 setsectoroffset 54 ceil -56 } +94893A0DC429A22ADC4B3A73DA537E16 // DOOM2.WAD map25 +{ + rebuildnodes +} 110F84DE041052B59307FAF0293E6BC0 // Doom II, map27 { setsectorspecial 93 0 @@ -844,3 +848,8 @@ CA3773ED313E8899311F3DD0CA195A68 // e3m6 setthingz 403 168 setthingz 404 168 } + +6D4156EE0D12B77AD143A37C4D3DCF98 // dmonfear.wad map22 +{ + shorttex +} diff --git a/wadsrc/static/credits/rsmk.txt b/wadsrc/static/credits/rsmk.txt new file mode 100644 index 000000000..e37c20086 --- /dev/null +++ b/wadsrc/static/credits/rsmk.txt @@ -0,0 +1,3 @@ +These sprites were made by Talon1024 and have been put in the public domain: + +https://forum.zdoom.org/viewtopic.php?f=15&t=59245 diff --git a/wadsrc/static/sprites/rsmka0.png b/wadsrc/static/sprites/rsmka0.png new file mode 100644 index 000000000..8387c2244 Binary files /dev/null and b/wadsrc/static/sprites/rsmka0.png differ diff --git a/wadsrc/static/sprites/rsmkb0.png b/wadsrc/static/sprites/rsmkb0.png new file mode 100644 index 000000000..7417f7982 Binary files /dev/null and b/wadsrc/static/sprites/rsmkb0.png differ diff --git a/wadsrc/static/sprites/rsmkc0.png b/wadsrc/static/sprites/rsmkc0.png new file mode 100644 index 000000000..d1ec18068 Binary files /dev/null and b/wadsrc/static/sprites/rsmkc0.png differ diff --git a/wadsrc/static/sprites/rsmkd0.png b/wadsrc/static/sprites/rsmkd0.png new file mode 100644 index 000000000..08d3c95e5 Binary files /dev/null and b/wadsrc/static/sprites/rsmkd0.png differ diff --git a/wadsrc/static/sprites/rsmke0.png b/wadsrc/static/sprites/rsmke0.png new file mode 100644 index 000000000..ab4ddb55a Binary files /dev/null and b/wadsrc/static/sprites/rsmke0.png differ diff --git a/wadsrc_extra/static/sprites/rsmka0.png b/wadsrc_extra/static/sprites/rsmka0.png deleted file mode 100644 index 761e09170..000000000 Binary files a/wadsrc_extra/static/sprites/rsmka0.png and /dev/null differ diff --git a/wadsrc_extra/static/sprites/rsmkb0.png b/wadsrc_extra/static/sprites/rsmkb0.png deleted file mode 100644 index 0bcfef43d..000000000 Binary files a/wadsrc_extra/static/sprites/rsmkb0.png and /dev/null differ diff --git a/wadsrc_extra/static/sprites/rsmkc0.png b/wadsrc_extra/static/sprites/rsmkc0.png deleted file mode 100644 index 3e952cdba..000000000 Binary files a/wadsrc_extra/static/sprites/rsmkc0.png and /dev/null differ diff --git a/wadsrc_extra/static/sprites/rsmkd0.png b/wadsrc_extra/static/sprites/rsmkd0.png deleted file mode 100644 index 60827b6dc..000000000 Binary files a/wadsrc_extra/static/sprites/rsmkd0.png and /dev/null differ diff --git a/wadsrc_extra/static/sprites/rsmke0.png b/wadsrc_extra/static/sprites/rsmke0.png deleted file mode 100644 index 9d5652bd2..000000000 Binary files a/wadsrc_extra/static/sprites/rsmke0.png and /dev/null differ