From 09b7af61a763f8cd39a8398dbe6ccc93391584bd Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Wed, 29 Jul 2020 14:18:40 +0000 Subject: [PATCH 01/17] - Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild Signed-off-by: Fedora Release Engineering --- wordwarvi.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/wordwarvi.spec b/wordwarvi.spec index 982fb55..641c257 100644 --- a/wordwarvi.spec +++ b/wordwarvi.spec @@ -3,7 +3,7 @@ Name: wordwarvi Version: 1.1 -Release: 11.git%{shortcommit}%{?dist} +Release: 12.git%{shortcommit}%{?dist} Summary: Side-scrolling shoot 'em up '80s style arcade game License: GPLv2+ and CC-BY and CC-BY-SA URL: https://smcameron.github.io/wordwarvi/ @@ -62,6 +62,9 @@ appstream-util validate-relax --nonet \ %changelog +* Wed Jul 29 2020 Fedora Release Engineering - 1.1-12.git6beed31 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild + * Fri Jan 31 2020 Fedora Release Engineering - 1.1-11.git6beed31 - Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild From 09589c617c8f9c57b62e6269c1067e9a0d96d8e7 Mon Sep 17 00:00:00 2001 From: Tom Stellard Date: Sat, 9 Jan 2021 01:00:54 +0000 Subject: [PATCH 02/17] Add BuildRequires: make https://fedoraproject.org/wiki/Changes/Remove_make_from_BuildRoot --- wordwarvi.spec | 1 + 1 file changed, 1 insertion(+) diff --git a/wordwarvi.spec b/wordwarvi.spec index 641c257..73d377b 100644 --- a/wordwarvi.spec +++ b/wordwarvi.spec @@ -12,6 +12,7 @@ Source0: https://github.com/smcameron/wordwarvi/archive/%{commit}/%{name} Source1: %{name}.desktop Source2: %{name}.png Source3: %{name}.appdata.xml +BuildRequires: make BuildRequires: gcc BuildRequires: gtk2-devel portaudio-devel libvorbis-devel BuildRequires: desktop-file-utils libappstream-glib From 2ce471a7da09f720ccef09a0bb799fc560025b55 Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Wed, 27 Jan 2021 23:39:24 +0000 Subject: [PATCH 03/17] - Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild Signed-off-by: Fedora Release Engineering --- wordwarvi.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/wordwarvi.spec b/wordwarvi.spec index 73d377b..9d98c26 100644 --- a/wordwarvi.spec +++ b/wordwarvi.spec @@ -3,7 +3,7 @@ Name: wordwarvi Version: 1.1 -Release: 12.git%{shortcommit}%{?dist} +Release: 13.git%{shortcommit}%{?dist} Summary: Side-scrolling shoot 'em up '80s style arcade game License: GPLv2+ and CC-BY and CC-BY-SA URL: https://smcameron.github.io/wordwarvi/ @@ -63,6 +63,9 @@ appstream-util validate-relax --nonet \ %changelog +* Wed Jan 27 2021 Fedora Release Engineering - 1.1-13.git6beed31 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild + * Wed Jul 29 2020 Fedora Release Engineering - 1.1-12.git6beed31 - Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild From 9d95b1b32a7eba4a1008f373f1556775857adc1b Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Fri, 23 Jul 2021 21:07:32 +0000 Subject: [PATCH 04/17] - Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild Signed-off-by: Fedora Release Engineering --- wordwarvi.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/wordwarvi.spec b/wordwarvi.spec index 9d98c26..3605526 100644 --- a/wordwarvi.spec +++ b/wordwarvi.spec @@ -3,7 +3,7 @@ Name: wordwarvi Version: 1.1 -Release: 13.git%{shortcommit}%{?dist} +Release: 14.git%{shortcommit}%{?dist} Summary: Side-scrolling shoot 'em up '80s style arcade game License: GPLv2+ and CC-BY and CC-BY-SA URL: https://smcameron.github.io/wordwarvi/ @@ -63,6 +63,9 @@ appstream-util validate-relax --nonet \ %changelog +* Fri Jul 23 2021 Fedora Release Engineering - 1.1-14.git6beed31 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild + * Wed Jan 27 2021 Fedora Release Engineering - 1.1-13.git6beed31 - Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild From 1ea1c4052b254e59b5f5773111b66bbe4d82fc6a Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Sat, 22 Jan 2022 04:39:18 +0000 Subject: [PATCH 05/17] - Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild Signed-off-by: Fedora Release Engineering --- wordwarvi.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/wordwarvi.spec b/wordwarvi.spec index 3605526..08457c4 100644 --- a/wordwarvi.spec +++ b/wordwarvi.spec @@ -3,7 +3,7 @@ Name: wordwarvi Version: 1.1 -Release: 14.git%{shortcommit}%{?dist} +Release: 15.git%{shortcommit}%{?dist} Summary: Side-scrolling shoot 'em up '80s style arcade game License: GPLv2+ and CC-BY and CC-BY-SA URL: https://smcameron.github.io/wordwarvi/ @@ -63,6 +63,9 @@ appstream-util validate-relax --nonet \ %changelog +* Sat Jan 22 2022 Fedora Release Engineering - 1.1-15.git6beed31 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild + * Fri Jul 23 2021 Fedora Release Engineering - 1.1-14.git6beed31 - Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild From 3c9eb7c47631027ace78486a0d7696a4903989f5 Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Sat, 23 Jul 2022 12:36:54 +0000 Subject: [PATCH 06/17] Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild Signed-off-by: Fedora Release Engineering --- wordwarvi.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/wordwarvi.spec b/wordwarvi.spec index 08457c4..a4c1e05 100644 --- a/wordwarvi.spec +++ b/wordwarvi.spec @@ -3,7 +3,7 @@ Name: wordwarvi Version: 1.1 -Release: 15.git%{shortcommit}%{?dist} +Release: 16.git%{shortcommit}%{?dist} Summary: Side-scrolling shoot 'em up '80s style arcade game License: GPLv2+ and CC-BY and CC-BY-SA URL: https://smcameron.github.io/wordwarvi/ @@ -63,6 +63,9 @@ appstream-util validate-relax --nonet \ %changelog +* Sat Jul 23 2022 Fedora Release Engineering - 1.1-16.git6beed31 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild + * Sat Jan 22 2022 Fedora Release Engineering - 1.1-15.git6beed31 - Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild From 5c0a68151f2b57f4702ccc2dc15c7a8b49d914e2 Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Sat, 21 Jan 2023 06:58:49 +0000 Subject: [PATCH 07/17] Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild Signed-off-by: Fedora Release Engineering --- wordwarvi.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/wordwarvi.spec b/wordwarvi.spec index a4c1e05..8eb1e6e 100644 --- a/wordwarvi.spec +++ b/wordwarvi.spec @@ -3,7 +3,7 @@ Name: wordwarvi Version: 1.1 -Release: 16.git%{shortcommit}%{?dist} +Release: 17.git%{shortcommit}%{?dist} Summary: Side-scrolling shoot 'em up '80s style arcade game License: GPLv2+ and CC-BY and CC-BY-SA URL: https://smcameron.github.io/wordwarvi/ @@ -63,6 +63,9 @@ appstream-util validate-relax --nonet \ %changelog +* Sat Jan 21 2023 Fedora Release Engineering - 1.1-17.git6beed31 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild + * Sat Jul 23 2022 Fedora Release Engineering - 1.1-16.git6beed31 - Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild From 5c1d66bc2954bcf21b913efc8be917cdfd2cca2d Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Sat, 22 Jul 2023 18:21:43 +0000 Subject: [PATCH 08/17] Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild Signed-off-by: Fedora Release Engineering --- wordwarvi.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/wordwarvi.spec b/wordwarvi.spec index 8eb1e6e..2f44b8a 100644 --- a/wordwarvi.spec +++ b/wordwarvi.spec @@ -3,7 +3,7 @@ Name: wordwarvi Version: 1.1 -Release: 17.git%{shortcommit}%{?dist} +Release: 18.git%{shortcommit}%{?dist} Summary: Side-scrolling shoot 'em up '80s style arcade game License: GPLv2+ and CC-BY and CC-BY-SA URL: https://smcameron.github.io/wordwarvi/ @@ -63,6 +63,9 @@ appstream-util validate-relax --nonet \ %changelog +* Sat Jul 22 2023 Fedora Release Engineering - 1.1-18.git6beed31 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild + * Sat Jan 21 2023 Fedora Release Engineering - 1.1-17.git6beed31 - Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild From 5ff38d9dbe75b82ba704f174f3600a3099bf08f4 Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Sat, 27 Jan 2024 09:05:06 +0000 Subject: [PATCH 09/17] Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild --- wordwarvi.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/wordwarvi.spec b/wordwarvi.spec index 2f44b8a..7e3bc4c 100644 --- a/wordwarvi.spec +++ b/wordwarvi.spec @@ -3,7 +3,7 @@ Name: wordwarvi Version: 1.1 -Release: 18.git%{shortcommit}%{?dist} +Release: 19.git%{shortcommit}%{?dist} Summary: Side-scrolling shoot 'em up '80s style arcade game License: GPLv2+ and CC-BY and CC-BY-SA URL: https://smcameron.github.io/wordwarvi/ @@ -63,6 +63,9 @@ appstream-util validate-relax --nonet \ %changelog +* Sat Jan 27 2024 Fedora Release Engineering - 1.1-19.git6beed31 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild + * Sat Jul 22 2023 Fedora Release Engineering - 1.1-18.git6beed31 - Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild From b03daaf194838f76065d0b4e68e88e00e9d68e46 Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Sat, 20 Jul 2024 09:31:28 +0000 Subject: [PATCH 10/17] Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild --- wordwarvi.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/wordwarvi.spec b/wordwarvi.spec index 7e3bc4c..b1c54de 100644 --- a/wordwarvi.spec +++ b/wordwarvi.spec @@ -3,7 +3,7 @@ Name: wordwarvi Version: 1.1 -Release: 19.git%{shortcommit}%{?dist} +Release: 20.git%{shortcommit}%{?dist} Summary: Side-scrolling shoot 'em up '80s style arcade game License: GPLv2+ and CC-BY and CC-BY-SA URL: https://smcameron.github.io/wordwarvi/ @@ -63,6 +63,9 @@ appstream-util validate-relax --nonet \ %changelog +* Sat Jul 20 2024 Fedora Release Engineering - 1.1-20.git6beed31 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild + * Sat Jan 27 2024 Fedora Release Engineering - 1.1-19.git6beed31 - Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild From 9f54f1d83ff79fefec90cfee33693f46b11c1e35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miroslav=20Such=C3=BD?= Date: Wed, 4 Sep 2024 22:48:38 +0200 Subject: [PATCH 11/17] convert license to SPDX This is part of https://fedoraproject.org/wiki/Changes/SPDX_Licenses_Phase_4 --- wordwarvi.spec | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/wordwarvi.spec b/wordwarvi.spec index b1c54de..322c5b8 100644 --- a/wordwarvi.spec +++ b/wordwarvi.spec @@ -3,9 +3,10 @@ Name: wordwarvi Version: 1.1 -Release: 20.git%{shortcommit}%{?dist} +Release: 21.git%{shortcommit}%{?dist} Summary: Side-scrolling shoot 'em up '80s style arcade game -License: GPLv2+ and CC-BY and CC-BY-SA +# Automatically converted from old format: GPLv2+ and CC-BY and CC-BY-SA - review is highly recommended. +License: GPL-2.0-or-later AND LicenseRef-Callaway-CC-BY AND LicenseRef-Callaway-CC-BY-SA URL: https://smcameron.github.io/wordwarvi/ # The 1.1 release never got a tag in git, so we use the commit-id Source0: https://github.com/smcameron/wordwarvi/archive/%{commit}/%{name}-%{version}-%{shortcommit}.tar.gz @@ -63,6 +64,9 @@ appstream-util validate-relax --nonet \ %changelog +* Wed Sep 04 2024 Miroslav Suchý - 1.1-21.git6beed31 +- convert license to SPDX + * Sat Jul 20 2024 Fedora Release Engineering - 1.1-20.git6beed31 - Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild From 8484dcae94b36973a046ef2985edf67fba7a8720 Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Sun, 19 Jan 2025 15:13:57 +0000 Subject: [PATCH 12/17] Rebuilt for https://fedoraproject.org/wiki/Fedora_42_Mass_Rebuild --- wordwarvi.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/wordwarvi.spec b/wordwarvi.spec index 322c5b8..3b9f79e 100644 --- a/wordwarvi.spec +++ b/wordwarvi.spec @@ -3,7 +3,7 @@ Name: wordwarvi Version: 1.1 -Release: 21.git%{shortcommit}%{?dist} +Release: 22.git%{shortcommit}%{?dist} Summary: Side-scrolling shoot 'em up '80s style arcade game # Automatically converted from old format: GPLv2+ and CC-BY and CC-BY-SA - review is highly recommended. License: GPL-2.0-or-later AND LicenseRef-Callaway-CC-BY AND LicenseRef-Callaway-CC-BY-SA @@ -64,6 +64,9 @@ appstream-util validate-relax --nonet \ %changelog +* Sun Jan 19 2025 Fedora Release Engineering - 1.1-22.git6beed31 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_42_Mass_Rebuild + * Wed Sep 04 2024 Miroslav Suchý - 1.1-21.git6beed31 - convert license to SPDX From 3f81d47e9a2dfc8e70eb65644f0b11a077ee0efe Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Fri, 25 Jul 2025 20:31:45 +0000 Subject: [PATCH 13/17] Rebuilt for https://fedoraproject.org/wiki/Fedora_43_Mass_Rebuild --- wordwarvi.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/wordwarvi.spec b/wordwarvi.spec index 3b9f79e..a35b787 100644 --- a/wordwarvi.spec +++ b/wordwarvi.spec @@ -3,7 +3,7 @@ Name: wordwarvi Version: 1.1 -Release: 22.git%{shortcommit}%{?dist} +Release: 23.git%{shortcommit}%{?dist} Summary: Side-scrolling shoot 'em up '80s style arcade game # Automatically converted from old format: GPLv2+ and CC-BY and CC-BY-SA - review is highly recommended. License: GPL-2.0-or-later AND LicenseRef-Callaway-CC-BY AND LicenseRef-Callaway-CC-BY-SA @@ -64,6 +64,9 @@ appstream-util validate-relax --nonet \ %changelog +* Fri Jul 25 2025 Fedora Release Engineering - 1.1-23.git6beed31 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_43_Mass_Rebuild + * Sun Jan 19 2025 Fedora Release Engineering - 1.1-22.git6beed31 - Rebuilt for https://fedoraproject.org/wiki/Fedora_42_Mass_Rebuild From ff09d147193512dc05a1cd686650b86dfef6d595 Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Sat, 17 Jan 2026 20:21:09 +0000 Subject: [PATCH 14/17] Rebuilt for https://fedoraproject.org/wiki/Fedora_44_Mass_Rebuild --- wordwarvi.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/wordwarvi.spec b/wordwarvi.spec index a35b787..028c673 100644 --- a/wordwarvi.spec +++ b/wordwarvi.spec @@ -3,7 +3,7 @@ Name: wordwarvi Version: 1.1 -Release: 23.git%{shortcommit}%{?dist} +Release: 24.git%{shortcommit}%{?dist} Summary: Side-scrolling shoot 'em up '80s style arcade game # Automatically converted from old format: GPLv2+ and CC-BY and CC-BY-SA - review is highly recommended. License: GPL-2.0-or-later AND LicenseRef-Callaway-CC-BY AND LicenseRef-Callaway-CC-BY-SA @@ -64,6 +64,9 @@ appstream-util validate-relax --nonet \ %changelog +* Sat Jan 17 2026 Fedora Release Engineering - 1.1-24.git6beed31 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_44_Mass_Rebuild + * Fri Jul 25 2025 Fedora Release Engineering - 1.1-23.git6beed31 - Rebuilt for https://fedoraproject.org/wiki/Fedora_43_Mass_Rebuild From cfa0e59cd12e192727a9ce30b97e7c8d900deb36 Mon Sep 17 00:00:00 2001 From: Hans de Goede Date: Tue, 12 May 2026 20:01:49 +0200 Subject: [PATCH 15/17] Update to 1.0.4 release Add Epoch because the 1.1 release from git was 1.0.1 Add Debian patch to port to GTK3 --- .gitignore | 1 + Port-to-GTK-3.patch | 1072 +++++++++++++++++++++++++++++++++++++++++++ sources | 2 +- wordwarvi.rpmlintrc | 4 + wordwarvi.spec | 34 +- 5 files changed, 1099 insertions(+), 14 deletions(-) create mode 100644 Port-to-GTK-3.patch create mode 100644 wordwarvi.rpmlintrc diff --git a/.gitignore b/.gitignore index dc199b3..5bc55b9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ wordwarvi-0.25.tar.gz /wordwarvi-1.1-6beed31.tar.gz +/wordwarvi-1.0.4.tar.gz diff --git a/Port-to-GTK-3.patch b/Port-to-GTK-3.patch new file mode 100644 index 0000000..a12f21f --- /dev/null +++ b/Port-to-GTK-3.patch @@ -0,0 +1,1072 @@ +From: Bastian Germann +Subject: Port to GTK 3 +--- +--- a/Makefile ++++ b/Makefile +@@ -111,7 +111,7 @@ wordwarvi: wordwarvi.c joystick.o rumble.o ${OGGOBJ} wwviaudio.o wwvi_font.o \ + ${OGGOBJ} \ + wwviaudio.o \ + wordwarvi.c -o wordwarvi ${OPENLASELIBDIR} ${OPENLASELIB} -lm ${SNDLIBS} \ +- `$(PKG_CONFIG) --cflags gtk+-2.0` `$(PKG_CONFIG) --libs gtk+-2.0 gthread-2.0` ${LDFLAGS} ++ `$(PKG_CONFIG) --cflags gtk+-3.0` `$(PKG_CONFIG) --libs gtk+-3.0` ${LDFLAGS} + /bin/rm stamp.h + + wordwarvi.6.gz: wordwarvi.6 +--- a/wordwarvi.c ++++ b/wordwarvi.c +@@ -37,6 +37,7 @@ + #endif /* __WIN32__ */ + + #include ++#include /* GTK3: provides legacy GDK_foo aliases for GDK_KEY_foo */ + + #ifdef DO_INHIBIT_SCREENSAVER + #include /* for GDK_WINDOW_XWINDOW, for inhibiting screensaver. */ +@@ -64,6 +65,61 @@ + #define DATADIR "" + #endif + ++/* ---- GTK3 COMPATIBILITY LAYER ---- * ++ * GdkGC and GdkDrawable were removed from GTK3. We provide void* stubs so ++ * all existing drawing-function signatures and call-sites continue to ++ * compile unchanged. The actual drawing is done via a global cairo_t that ++ * is set at the start of every "draw" callback. ++ */ ++typedef void GdkDrawable; ++typedef void GdkGC; ++static cairo_t *current_cr = NULL; ++static gboolean drawing_initialized = FALSE; ++ ++/* Set the Cairo source colour from a (still-valid but deprecated) GdkColor */ ++static inline void wwvi_set_source_color(const GdkColor *color) ++{ ++ if (current_cr) ++ cairo_set_source_rgb(current_cr, ++ color->red / 65535.0, ++ color->green / 65535.0, ++ color->blue / 65535.0); ++} ++#define gdk_gc_set_foreground(gc_arg, color_ptr) wwvi_set_source_color(color_ptr) ++ ++/* GC creation and clip operations become no-ops */ ++#define gdk_gc_new(window_arg) (NULL) ++#define gdk_gc_set_clip_origin(a, b, c) ((void)0) ++#define gdk_gc_set_clip_rectangle(a, b) ((void)0) ++ ++/* Color-map allocation is not needed with Cairo */ ++#define gdk_colormap_alloc_color(a, b, c, d) ((void)0) ++ ++/* cairo-backed line drawing (drop drawable/gc args) */ ++static void wwvi_cairo_draw_line(GdkDrawable *d, GdkGC *g, ++ gint x1, gint y1, gint x2, gint y2) ++{ ++ (void)d; (void)g; ++ if (!current_cr) return; ++ cairo_move_to(current_cr, x1, y1); ++ cairo_line_to(current_cr, x2, y2); ++ cairo_stroke(current_cr); ++} ++#define gdk_draw_line wwvi_cairo_draw_line ++ ++/* cairo-backed rectangle drawing (drop drawable/gc args) */ ++static void wwvi_cairo_draw_rectangle(GdkDrawable *d, GdkGC *g, ++ gboolean filled, gint x, gint y, gint width, gint height) ++{ ++ (void)d; (void)g; ++ if (!current_cr) return; ++ cairo_rectangle(current_cr, x, y, width, height); ++ if (filled) cairo_fill(current_cr); ++ else cairo_stroke(current_cr); ++} ++#define gdk_draw_rectangle wwvi_cairo_draw_rectangle ++/* ---- END GTK3 COMPATIBILITY LAYER ---- */ ++ + #ifdef OPENLASE + /* openlase related defines */ + #define LASERTOP 0.03 +@@ -2698,9 +2754,9 @@ void incorrect_draw_stars(GtkWidget *w) + gl = approximate_horizon(worldx, worldy, &star[i].last_xi); + if (worldy < gl) { + if (star[i].bright && randomn(100) > 10) { +- wwvi_draw_line(w->window, gc, sx, sy-1, sx+1, sy-1); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, sx, sy-1, sx+1, sy-1); + } +- wwvi_draw_line(w->window, gc, sx, sy, sx+1, sy); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, sx, sy, sx+1, sy); + } + } + /* move stars */ +@@ -2728,9 +2784,9 @@ void correct_draw_stars(GtkWidget *w) + gl = approximate_horizon(worldx, worldy, &star[i].last_xi); + if (worldy < gl) { + if (star[i].bright && randomn(100) > 10) { +- wwvi_draw_line(w->window, gc, sx, sy-1, sx+1, sy-1); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, sx, sy-1, sx+1, sy-1); + } +- wwvi_draw_line(w->window, gc, sx, sy, sx+1, sy); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, sx, sy, sx+1, sy); + } + } + } +@@ -3362,7 +3418,7 @@ void fuel_draw(struct game_obj_t *o, GtkWidget *w) + 30 - (45 * o->tsd.fuel.level / FUELTANK_CAPACITY); + if (o->tsd.fuel.level > 0) { + gdk_gc_set_foreground(gc, &huex[DARKGREEN]); +- wwvi_draw_rectangle(w->window, gc, TRUE, x1, y1, 50, o->tsd.fuel.level * 45 / FUELTANK_CAPACITY); ++ wwvi_draw_rectangle(gtk_widget_get_window(w), gc, TRUE, x1, y1, 50, o->tsd.fuel.level * 45 / FUELTANK_CAPACITY); + } + + draw_generic(o, w); /* draw the fuel tank in the usual way... */ +@@ -3373,7 +3429,7 @@ void fuel_draw(struct game_obj_t *o, GtkWidget *w) + y1 = o->y - game_state.y + (SCREEN_HEIGHT/2); + x2 = player_target->x - game_state.x; + y2 = player_target->y - game_state.y + (SCREEN_HEIGHT/2); +- wwvi_draw_line(w->window, gc, x1, y1, x2, y2); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x1, y1, x2, y2); + } + } + +@@ -3397,16 +3453,16 @@ void jammer_draw(struct game_obj_t *o, GtkWidget *w) + x2 = x5 + o->tsd.jammer.width; + x3 = x5 - (o->tsd.jammer.width >> 1); + x4 = x5 + (o->tsd.jammer.width >> 1); +- wwvi_draw_line(w->window, gc, x1, y1, x2, y1); +- wwvi_draw_line(w->window, gc, x1, y2, x2, y2); +- wwvi_draw_line(w->window, gc, x1, y1, x1, y2); +- wwvi_draw_line(w->window, gc, x2, y1, x2, y2); +- wwvi_draw_line(w->window, gc, x3, y1, x3, y2); +- wwvi_draw_line(w->window, gc, x4, y1, x4, y2); +- wwvi_draw_line(w->window, gc, x5, y1, x5, y2); +- wwvi_draw_line(w->window, gc, x1, y2+4, x2, y2+4); +- wwvi_draw_line(w->window, gc, x1, y2+8, x2, y2+8); +- wwvi_draw_line(w->window, gc, x1, y2+12, x2, y2+12); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x1, y1, x2, y1); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x1, y2, x2, y2); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x1, y1, x1, y2); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x2, y1, x2, y2); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x3, y1, x3, y2); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x4, y1, x4, y2); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x5, y1, x5, y2); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x1, y2+4, x2, y2+4); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x1, y2+8, x2, y2+8); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x1, y2+12, x2, y2+12); + } + + void cron_draw(struct game_obj_t *o, GtkWidget *w) +@@ -3425,7 +3481,7 @@ void cron_draw(struct game_obj_t *o, GtkWidget *w) + x2 = o->tsd.cron.tx - game_state.x; + y2 = o->tsd.cron.ty + 7 - game_state.y + (SCREEN_HEIGHT/2); + if (x1 > 0 && x2 > 0) +- wwvi_draw_line(w->window, gc, x1, y1, x2, y2); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x1, y1, x2, y2); + } + #endif + +@@ -3434,7 +3490,7 @@ void cron_draw(struct game_obj_t *o, GtkWidget *w) + y1 = o->y - game_state.y + (SCREEN_HEIGHT/2) - 5; + x2 = x1 + 3; + gdk_gc_set_foreground(gc, &huex[WHITE]); +- wwvi_draw_line(w->window, gc, x1, y1, x2, y1); /* draw eye */ ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x1, y1, x2, y1); /* draw eye */ + + /* move the cron job's eye */ + o->tsd.cron.eyepos +=1; +@@ -3451,7 +3507,7 @@ void cron_draw(struct game_obj_t *o, GtkWidget *w) + if (xi != -1) { + y1 = o->y + 7 - game_state.y + (SCREEN_HEIGHT/2); + y2 = gy + (SCREEN_HEIGHT/2) - game_state.y; +- wwvi_bright_line(w->window, gc, x1, y1, x2, y2, ++ wwvi_bright_line(gtk_widget_get_window(w), gc, x1, y1, x2, y2, + randomn(NCOLORS+NSPARKCOLORS+NRAINBOWCOLORS)); /* draw beam. */ + explode(o->x + o->tsd.cron.beam_pos, gy, 0, 1, 20, 3, 10); /* make sparks. */ + } +@@ -3480,19 +3536,19 @@ void lightning_draw( GtkWidget *w, int x1, int y1, int x2, int y2) + /* terminal case, x1, y1, and x2, y2 are very close, just draw a line. */ + if (dx < 10 && dy < 10) { + gdk_gc_set_foreground(gc, &huex[WHITE]); +- wwvi_draw_line(w->window, gc, x1, y1, x2, y2); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x1, y1, x2, y2); + if (dx < dy) { +- wwvi_draw_line(w->window, gc, x1-1, y1, x2-1, y2); +- wwvi_draw_line(w->window, gc, x1+1, y1, x2+1, y2); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x1-1, y1, x2-1, y2); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x1+1, y1, x2+1, y2); + gdk_gc_set_foreground(gc, &huex[BLUE]); +- wwvi_draw_line(w->window, gc, x1-2, y1, x2-2, y2); +- wwvi_draw_line(w->window, gc, x1+2, y1, x2+2, y2); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x1-2, y1, x2-2, y2); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x1+2, y1, x2+2, y2); + } else { +- wwvi_draw_line(w->window, gc, x1, y1-1, x2, y2-1); +- wwvi_draw_line(w->window, gc, x1, y1+1, x2, y2+1); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x1, y1-1, x2, y2-1); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x1, y1+1, x2, y2+1); + gdk_gc_set_foreground(gc, &huex[BLUE]); +- wwvi_draw_line(w->window, gc, x1, y1-2, x2, y2-1); +- wwvi_draw_line(w->window, gc, x1, y1+2, x2, y2+1); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x1, y1-2, x2, y2-1); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x1, y1+2, x2, y2+1); + } + return; + } +@@ -3578,15 +3634,15 @@ void tentacle_draw(struct game_obj_t *o, GtkWidget *w) + } + #ifndef OPENLASE + if (thickness > 0) { +- wwvi_draw_line(w->window, gc, x1-thickness, y1, x2-thickness, y2); +- wwvi_draw_line(w->window, gc, x1+thickness, y1, x2+thickness, y2); +- wwvi_draw_line(w->window, gc, x1, y1-thickness, x2, y2-thickness); +- wwvi_draw_line(w->window, gc, x1, y1+thickness, x2, y2+thickness); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x1-thickness, y1, x2-thickness, y2); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x1+thickness, y1, x2+thickness, y2); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x1, y1-thickness, x2, y2-thickness); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x1, y1+thickness, x2, y2+thickness); + if (i & 0x01) + thickness--; + } else + #endif +- wwvi_draw_line(w->window, gc, x1, y1, x2, y2); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x1, y1, x2, y2); + x1 = x2; + y1 = y2; + } +@@ -5479,7 +5535,7 @@ void player_draw(struct game_obj_t *o, GtkWidget *w) + y1 = o->y + o->v->p[j].y*scale - game_state.y + (SCREEN_HEIGHT/2); + x2 = o->x + o->v->p[j+1].x*scale - game_state.x; + y2 = o->y + o->v->p[j+1].y*scale+(SCREEN_HEIGHT/2) - game_state.y; +- wwvi_draw_line(w->window, gc, x1, y1, x2, y2); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x1, y1, x2, y2); + } + scale = scale * scalefactor; + } +@@ -5506,7 +5562,7 @@ void xmas_player_draw(struct game_obj_t *o, GtkWidget *w) + x2 = o->bullseye->x - game_state.x; + y2 = o->bullseye->y - game_state.y + (SCREEN_HEIGHT/2); + if (x1 > 0 && x1 < SCREEN_WIDTH && y1 < SCREEN_HEIGHT && y1 > 0) { +- wwvi_draw_line(w->window, gc, x1, y1, x2, y2); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x1, y1, x2, y2); + } + } + if (o->tsd.reindeer.rudolph && (timer & 0x08)) { /* blink rudolph's nose. */ +@@ -5515,11 +5571,11 @@ void xmas_player_draw(struct game_obj_t *o, GtkWidget *w) + y2 = y1 - 2; + x2 = x1 + game_state.direction; + gdk_gc_set_foreground(gc, &huex[WHITE]); +- wwvi_draw_line(w->window, gc, x1, y1, x2, y1); +- wwvi_draw_line(w->window, gc, x1, y2, x2, y2); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x1, y1, x2, y1); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x1, y2, x2, y2); + --y1; + gdk_gc_set_foreground(gc, &huex[RED]); +- wwvi_draw_line(w->window, gc, x1, y1, x2, y1); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x1, y1, x2, y1); + } + } else { + /* this is the insanity that makes the player "zoom" into the game */ +@@ -5554,7 +5610,7 @@ void xmas_player_draw(struct game_obj_t *o, GtkWidget *w) + y1 = o->y + o->v->p[j].y*scale - game_state.y + (SCREEN_HEIGHT/2); + x2 = o->x + o->v->p[j+1].x*scale - game_state.x; + y2 = o->y + o->v->p[j+1].y*scale+(SCREEN_HEIGHT/2) - game_state.y; +- wwvi_draw_line(w->window, gc, x1, y1, x2, y2); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x1, y1, x2, y2); + } + scale = scale * scalefactor; + } +@@ -6029,12 +6085,12 @@ void laser_draw(struct game_obj_t *o, GtkWidget *w) + x2 = x1 - (15) * (21 - o->alive); + else + x2 = x1 + (15) * (21 - o->alive); +- wwvi_bright_line(w->window, gc, x1, y1, x2, y1, o->color); ++ wwvi_bright_line(gtk_widget_get_window(w), gc, x1, y1, x2, y1, o->color); + + #if DEBUG_HITZONE + gdk_gc_set_foreground(gc, &huex[WHITE]); +- wwvi_draw_line(w->window,gc, x1, y1 - LASER_Y_PROXIMITY, x1, y1 + LASER_Y_PROXIMITY); +- wwvi_draw_line(w->window,gc, x2, y1 - LASER_Y_PROXIMITY, x2, y1 + LASER_Y_PROXIMITY); ++ wwvi_draw_line(gtk_widget_get_window(w),gc, x1, y1 - LASER_Y_PROXIMITY, x1, y1 + LASER_Y_PROXIMITY); ++ wwvi_draw_line(gtk_widget_get_window(w),gc, x2, y1 - LASER_Y_PROXIMITY, x2, y1 + LASER_Y_PROXIMITY); + #endif + } + +@@ -6270,7 +6326,7 @@ void bright_spark_draw(struct game_obj_t *o, GtkWidget *w) + + y2 = o->y + (SCREEN_HEIGHT/2) - game_state.y; + y1 = y2 + o->vy; +- wwvi_bright_line(w->window, gc, x1, y1, x2, y2, o->color); ++ wwvi_bright_line(gtk_widget_get_window(w), gc, x1, y1, x2, y2, o->color); + } + + void spark_draw(struct game_obj_t *o, GtkWidget *w) +@@ -6289,7 +6345,7 @@ void spark_draw(struct game_obj_t *o, GtkWidget *w) + y2 = o->y + (SCREEN_HEIGHT/2) - game_state.y; + y1 = y2 + o->vy; + gdk_gc_set_foreground(gc, &huex[o->color]); +- wwvi_draw_line(w->window, gc, x1, y1, x2, y2); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x1, y1, x2, y2); + } + + void pixie_dust_draw(struct game_obj_t *o, GtkWidget *w) +@@ -6305,7 +6361,7 @@ void pixie_dust_draw(struct game_obj_t *o, GtkWidget *w) + y2 = o->y + (SCREEN_HEIGHT/2) - game_state.y; + y1 = y2 + randomn(4); + gdk_gc_set_foreground(gc, &huex[o->color]); +- wwvi_draw_line(w->window, gc, x1, y1, x2, y2); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x1, y1, x2, y2); + } + + void laserbolt_draw(struct game_obj_t *o, GtkWidget *w) +@@ -6324,7 +6380,7 @@ void laserbolt_draw(struct game_obj_t *o, GtkWidget *w) + y2 = o->y + (SCREEN_HEIGHT/2) - game_state.y; + y1 = y2 - o->vy; + +- wwvi_bright_line(w->window, gc, x1, y1, x2, y2, o->color); ++ wwvi_bright_line(gtk_widget_get_window(w), gc, x1, y1, x2, y2, o->color); + } + + void missile_draw(struct game_obj_t *o, GtkWidget *w) +@@ -6344,12 +6400,12 @@ void missile_draw(struct game_obj_t *o, GtkWidget *w) + rdy2 = dx / 4; + gdk_gc_set_foreground(gc, &huex[o->color]); + if (x1 > 0 && x1+dx*2 > 0 && x1 < SCREEN_WIDTH && x1+dx*2 < SCREEN_WIDTH) { +- wwvi_draw_line(w->window, gc, x1+rdx, y1+rdy, x1+dx*2+rdx, y1+dy*2+rdy); +- wwvi_draw_line(w->window, gc, x1-rdx, y1-rdy, x1+dx*2-rdx, y1+dy*2-rdy); +- wwvi_draw_line(w->window, gc, x1+dx*2+rdx, y1+dy*2+rdy, x1+dx*2-rdx, y1+dy*2-rdy); +- wwvi_draw_line(w->window, gc, x1-rdx2, y1-rdy2, x1+rdx2, y1+rdy2); +- wwvi_draw_line(w->window, gc, x1-rdx2, y1-rdy2, x1+(dx/2), y1+(dy/2)); +- wwvi_draw_line(w->window, gc, x1+rdx2, y1+rdy2, x1+(dx/2), y1+(dy/2)); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x1+rdx, y1+rdy, x1+dx*2+rdx, y1+dy*2+rdy); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x1-rdx, y1-rdy, x1+dx*2-rdx, y1+dy*2-rdy); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x1+dx*2+rdx, y1+dy*2+rdy, x1+dx*2-rdx, y1+dy*2-rdy); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x1-rdx2, y1-rdy2, x1+rdx2, y1+rdy2); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x1-rdx2, y1-rdy2, x1+(dx/2), y1+(dy/2)); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x1+rdx2, y1+rdy2, x1+(dx/2), y1+(dy/2)); + } + } + +@@ -6365,7 +6421,7 @@ void harpoon_draw(struct game_obj_t *o, GtkWidget *w) + dx = dx_from_vxy(o->vx, o->vy); + dy = -dy_from_vxy(o->vx, o->vy); + gdk_gc_set_foreground(gc, &huex[o->color]); +- wwvi_draw_line(w->window, gc, x1, y1, x1+dx, y1+dy); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x1, y1, x1+dx, y1+dy); + } + + void reindeer_move(struct game_obj_t *o) +@@ -7111,26 +7167,26 @@ void worm_draw(struct game_obj_t *o, GtkWidget *w) + if (o->tsd.worm.parent == NULL) { + /* int x3, y3; */ + gdk_gc_set_foreground(gc, &huex[o->color]); +- wwvi_draw_line(w->window, gc, x-2, y, x, y-2); +- wwvi_draw_line(w->window, gc, x, y-2, x+2, y); +- wwvi_draw_line(w->window, gc, x+2, y, x, y+2); +- wwvi_draw_line(w->window, gc, x, y+2, x-2, y); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x-2, y, x, y-2); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x, y-2, x+2, y); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x+2, y, x, y+2); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x, y+2, x-2, y); + /* + x3 = o->tsd.worm.tx - game_state.x; + y3 = o->tsd.worm.ty - game_state.y + (SCREEN_HEIGHT/2); +- wwvi_draw_line(w->window, gc, x, y, x3, y3); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x, y, x3, y3); + x3 = o->tsd.worm.ltx - game_state.x; + y3 = o->tsd.worm.lty - game_state.y + (SCREEN_HEIGHT/2); +- wwvi_draw_line(w->window, gc, x, y, x3, y3); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x, y, x3, y3); + */ + } else { + color = NCOLORS + NSPARKCOLORS + ((timer + o->tsd.worm.coloroffset) % NRAINBOWCOLORS); + gdk_gc_set_foreground(gc, &huex[color]); + if (o->tsd.worm.child == NULL) { +- wwvi_draw_line(w->window, gc, x-2, y, x, y-2); +- wwvi_draw_line(w->window, gc, x, y-2, x+2, y); +- wwvi_draw_line(w->window, gc, x+2, y, x, y+2); +- wwvi_draw_line(w->window, gc, x, y+2, x-2, y); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x-2, y, x, y-2); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x, y-2, x+2, y); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x+2, y, x, y+2); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x, y+2, x-2, y); + } + } + +@@ -7138,10 +7194,10 @@ void worm_draw(struct game_obj_t *o, GtkWidget *w) + if (o->tsd.worm.parent == NULL) { + x2 = o->tsd.worm.tx - game_state.x; + y2 = o->tsd.worm.ty - game_state.y + (SCREEN_HEIGHT/2); +- wwvi_draw_line(w->window, gc, x, y, x2, y2); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x, y, x2, y2); + x2 = o->tsd.worm.ltx - game_state.x; + y2 = o->tsd.worm.lty - game_state.y + (SCREEN_HEIGHT/2); +- wwvi_draw_line(w->window, gc, x, y, x2, y2); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x, y, x2, y2); + } else { + #endif + if (o->tsd.worm.parent != NULL) { +@@ -7155,10 +7211,10 @@ void worm_draw(struct game_obj_t *o, GtkWidget *w) + + x2 = o->tsd.worm.parent->x - game_state.x; + y2 = o->tsd.worm.parent->y - game_state.y + (SCREEN_HEIGHT/2); +- wwvi_draw_line(w->window, gc, x-delta1, y, x2-delta2, y2); +- wwvi_draw_line(w->window, gc, x+delta1, y, x2+delta2, y2); +- wwvi_draw_line(w->window, gc, x, y-delta1, x2, y2-delta2); +- wwvi_draw_line(w->window, gc, x, y+delta1, x2, y2+delta2); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x-delta1, y, x2-delta2, y2); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x+delta1, y, x2+delta2, y2); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x, y-delta1, x2, y2-delta2); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x, y+delta1, x2, y2+delta2); + } + } + +@@ -7384,10 +7440,10 @@ void gunwheel_draw(struct game_obj_t *o, GtkWidget *w) + + gdk_gc_set_foreground(gc, &huex[o->color]); + +- wwvi_draw_line(w->window, gc, x1-rx, y1-ry, x2-rx, y2-ry); +- wwvi_draw_line(w->window, gc, x1+rx, y1+ry, x2+rx, y2+ry); +- wwvi_draw_line(w->window, gc, x1-rx, y1-ry, x1+rx, y1+ry); +- wwvi_draw_line(w->window, gc, x2-rx, y2-ry, x2+rx, y2+ry); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x1-rx, y1-ry, x2-rx, y2-ry); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x1+rx, y1+ry, x2+rx, y2+ry); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x1-rx, y1-ry, x1+rx, y1+ry); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x2-rx, y2-ry, x2+rx, y2+ry); + + make_gunwheel_sound(); + } +@@ -7782,7 +7838,7 @@ void draw_abs_scaled_generic(int x, int y, + x2 = x + (v->p[j+1].x * xscale); + y2 = y + (v->p[j+1].y * yscale); + if (x1 > 0 && x2 > 0) +- wwvi_draw_line(w->window, gc, x1, y1, x2, y2); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x1, y1, x2, y2); + x1 = x2; + y1 = y2; + } +@@ -7814,7 +7870,7 @@ void draw_scaled_generic(struct game_obj_t *o, GtkWidget *w, float xscale, float + x2 = o->x + (o->v->p[j+1].x * xscale) - game_state.x; + y2 = o->y + (o->v->p[j+1].y * yscale) +(SCREEN_HEIGHT/2) - game_state.y; + if (x1 > 0 && x2 > 0) +- wwvi_draw_line(w->window, gc, x1, y1, x2, y2); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x1, y1, x2, y2); + x1 = x2; + y1 = y2; + } +@@ -7839,10 +7895,10 @@ void draw_generic(struct game_obj_t *o, GtkWidget *w) + x1 = o->x - game_state.x; + y1 = o->y - game_state.y + (SCREEN_HEIGHT/2); + if (x1 > 0 && x1 < SCREEN_WIDTH && y1 < SCREEN_HEIGHT && y1 > 0) { +- /* wwvi_draw_line(w->window, gc, x1-10, y1, x1+10, y1); */ +- wwvi_draw_line(w->window, gc, x1, y1-10, x1, y1+10); +- wwvi_draw_line(w->window, gc, x1-10, y1 + o->above_target_y, x1+10, y1 + o->above_target_y); +- wwvi_draw_line(w->window, gc, x1-10, y1 + o->below_target_y, x1+10, y1 + o->below_target_y); ++ /* wwvi_draw_line(gtk_widget_get_window(w), gc, x1-10, y1, x1+10, y1); */ ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x1, y1-10, x1, y1+10); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x1-10, y1 + o->above_target_y, x1+10, y1 + o->above_target_y); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x1-10, y1 + o->below_target_y, x1+10, y1 + o->below_target_y); + } + } + #endif +@@ -7864,7 +7920,7 @@ void draw_generic(struct game_obj_t *o, GtkWidget *w) + x2 = o->x + o->v->p[j+1].x - game_state.x; + y2 = o->y + o->v->p[j+1].y+(SCREEN_HEIGHT/2) - game_state.y; + if (x1 > 0 && x2 > 0) +- wwvi_draw_line(w->window, gc, x1, y1, x2, y2); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x1, y1, x2, y2); + x1 = x2; + y1 = y2; + } +@@ -7995,13 +8051,13 @@ void truss_draw(struct game_obj_t *o, GtkWidget *w) + x4 = x + o->tsd.truss.bottom_width / 2; /* bottom right corner */ + y4 = y + o->tsd.truss.height / 2; + +- wwvi_draw_line(w->window, gc, x3, y3, x1, y1); +- wwvi_draw_line(w->window, gc, x1, y1, x2, y2); +- wwvi_draw_line(w->window, gc, x2, y2, x4, y4); +- wwvi_draw_line(w->window, gc, x4, y4, x1, y1); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x3, y3, x1, y1); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x1, y1, x2, y2); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x2, y2, x4, y4); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x4, y4, x1, y1); + #ifndef OPENLASE +- wwvi_draw_line(w->window, gc, x2, y2, x3, y3); +- wwvi_draw_line(w->window, gc, x3, y3, x4, y4); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x2, y2, x3, y3); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x3, y3, x4, y4); + #endif + } + +@@ -8056,8 +8112,8 @@ void kgun_draw(struct game_obj_t *o, GtkWidget *w) + y1 = o->y+(5*invert) - game_state.y + (SCREEN_HEIGHT/2); + crossbeam_y = y1 + (20*invert); + +- wwvi_draw_line(w->window, gc, x1, y1, x1+5, crossbeam_y); +- wwvi_draw_line(w->window, gc, x1+10, y1, x1+6, crossbeam_y); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x1, y1, x1+5, crossbeam_y); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x1+10, y1, x1+6, crossbeam_y); + + /* We're going to draw a swivelling dual gun turret. Two */ + /* guns mounted on a crossbeam that kind of swivel around */ +@@ -8148,33 +8204,33 @@ void kgun_draw(struct game_obj_t *o, GtkWidget *w) + gunbacky += crossbeam_y + recoily; + + /* draw the crossbeam */ +- wwvi_draw_line(w->window, gc, crossbeam_x1, crossbeam_y, crossbeam_x2, crossbeam_y); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, crossbeam_x1, crossbeam_y, crossbeam_x2, crossbeam_y); + + /* draw the main barrels */ +- wwvi_draw_line(w->window, gc, gunbackx, gunbacky, guntipx, guntipy); +- wwvi_draw_line(w->window, gc, gunbackx+xoffset, gunbacky, guntipx+xoffset, guntipy); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, gunbackx, gunbacky, guntipx, guntipy); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, gunbackx+xoffset, gunbacky, guntipx+xoffset, guntipy); + + /* draw the back edges of the gun butts */ +- wwvi_draw_line(w->window, gc, gunbackx-thickxo, gunbacky-thickyo, ++ wwvi_draw_line(gtk_widget_get_window(w), gc, gunbackx-thickxo, gunbacky-thickyo, + gunbackx+thickxo, gunbacky+thickyo); +- wwvi_draw_line(w->window, gc, gunbackx-thickxo+xoffset, gunbacky-thickyo, ++ wwvi_draw_line(gtk_widget_get_window(w), gc, gunbackx-thickxo+xoffset, gunbacky-thickyo, + gunbackx+thickxo+xoffset, gunbacky+thickyo); + /* draw the front edges of the gun butts */ +- wwvi_draw_line(w->window, gc, crossbeam_x1-thickxo+recoilx, crossbeam_y-thickyo+recoily, ++ wwvi_draw_line(gtk_widget_get_window(w), gc, crossbeam_x1-thickxo+recoilx, crossbeam_y-thickyo+recoily, + crossbeam_x1+thickxo+recoilx, crossbeam_y+thickyo+recoily); +- wwvi_draw_line(w->window, gc, crossbeam_x1-thickxo+xoffset+recoilx, +- crossbeam_y-thickyo+recoily, +- crossbeam_x1+thickxo+xoffset+recoilx, ++ wwvi_draw_line(gtk_widget_get_window(w), gc, crossbeam_x1-thickxo+xoffset+recoilx, ++ crossbeam_y-thickyo+recoily, ++ crossbeam_x1+thickxo+xoffset+recoilx, + crossbeam_y+thickyo+recoily); + + /* draw the long sides of the gun butts */ +- wwvi_draw_line(w->window, gc, gunbackx-thickxo, gunbacky-thickyo, ++ wwvi_draw_line(gtk_widget_get_window(w), gc, gunbackx-thickxo, gunbacky-thickyo, + crossbeam_x1-thickxo+recoilx, crossbeam_y-thickyo+recoily); +- wwvi_draw_line(w->window, gc, gunbackx-thickxo+xoffset, gunbacky-thickyo, ++ wwvi_draw_line(gtk_widget_get_window(w), gc, gunbackx-thickxo+xoffset, gunbacky-thickyo, + crossbeam_x1-thickxo+xoffset+recoilx, crossbeam_y-thickyo+recoily); +- wwvi_draw_line(w->window, gc, gunbackx+thickxo, gunbacky+thickyo, ++ wwvi_draw_line(gtk_widget_get_window(w), gc, gunbackx+thickxo, gunbacky+thickyo, + crossbeam_x1+thickxo+recoilx, crossbeam_y+thickyo+recoily); +- wwvi_draw_line(w->window, gc, gunbackx+thickxo+xoffset, gunbacky+thickyo, ++ wwvi_draw_line(gtk_widget_get_window(w), gc, gunbackx+thickxo+xoffset, gunbacky+thickyo, + crossbeam_x1+thickxo+xoffset+recoilx, crossbeam_y+thickyo+recoily); + + } +@@ -8267,17 +8323,17 @@ static inline void draw_on_radar(GtkWidget *w, struct game_obj_t *o, int y_corre + if ((timer & 0x04) == 0x04) /* make 'em blink */ + return; + gdk_gc_set_foreground(gc, &huex[o->color]); +- wwvi_draw_line(w->window, gc, x1, y1, x2, y2); +- wwvi_draw_line(w->window, gc, x1, y2, x2, y1); +- wwvi_draw_line(w->window, gc, x1, y2, x1, y1); +- wwvi_draw_line(w->window, gc, x1, y1, x2, y1); +- wwvi_draw_line(w->window, gc, x2, y1, x2, y2); +- wwvi_draw_line(w->window, gc, x2, y2, x1, y2); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x1, y1, x2, y2); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x1, y2, x2, y1); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x1, y2, x1, y1); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x1, y1, x2, y1); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x2, y1, x2, y2); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x2, y2, x1, y2); + return; + } + gdk_gc_set_foreground(gc, &huex[o->color]); +- wwvi_draw_line(w->window, gc, x1, y1, x2, y2); +- wwvi_draw_line(w->window, gc, x1, y2, x2, y1); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x1, y1, x2, y2); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x1, y2, x2, y1); + } + + /* Here's where we put noise on the screen. total_radar_noise */ +@@ -8307,8 +8363,8 @@ static inline void draw_on_radar(GtkWidget *w, struct game_obj_t *o, int y_corre + x2 = xradarnoise[nx]+1; + y1 = yradarnoise[ny]-1; + y2 = yradarnoise[ny]+1; +- wwvi_draw_line(w->window, gc, x1, y1, x2, y2); +- wwvi_draw_line(w->window, gc, x1, y2, x2, y1); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x1, y1, x2, y2); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x1, y2, x2, y1); + nx++; if (nx >= XRADARN) nx = 0; + ny++; if (ny >= YRADARN) ny = 0; + nc++; if (nc >= CRADARN) nc = 0; +@@ -8346,8 +8402,8 @@ static inline void debug_draw_target_guidelines(GtkWidget *w, struct game_obj_t + gdk_gc_set_foreground(gc, &huex[WHITE]); + x1 = o->x - game_state.x; + y1 = o->y - game_state.y + (SCREEN_HEIGHT/2); +- wwvi_draw_line(w->window, gc, x1-5, y1, x1+5, y1); +- wwvi_draw_line(w->window, gc, x1, y1-5, x1, y1+5); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x1-5, y1, x1+5, y1); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x1, y1-5, x1, y1+5); + } + + static inline void debug_display_target_list_count(GtkWidget *w, int total) +@@ -8427,8 +8483,8 @@ static void draw_letter(GtkWidget *w, struct my_vect_obj **font, unsigned char l + } + x2 = livecursorx + font[letter]->p[i+1].x; + y2 = livecursory + font[letter]->p[i+1].y; +- wwvi_draw_line(w->window, gc, x1, y1, x2, y2); +- /*wwvi_draw_line(w->window, gc, x1-1, y1+1, x2-1, y2+1); */ ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x1, y1, x2, y2); ++ /*wwvi_draw_line(gtk_widget_get_window(w), gc, x1-1, y1+1, x2-1, y2+1); */ + x1 = x2; + y1 = y2; + } +@@ -8479,7 +8535,7 @@ static void abs_xy_draw_letter(GtkWidget *w, struct my_vect_obj **font, + x2 = x + font[letter]->p[i+1].x; + y2 = y + font[letter]->p[i+1].y; + if (x1 > 0 && x2 > 0) +- wwvi_draw_line(w->window, gc, x1, y1, x2, y2); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x1, y1, x2, y2); + } + } + +@@ -8533,8 +8589,8 @@ static void xy_draw_letter(GtkWidget *w, struct my_vect_obj **font, + x2 = x + font[letter]->p[i+1].x - game_state.x; + y2 = y + font[letter]->p[i+1].y - game_state.y + (SCREEN_HEIGHT/2); + if (x1 > 0 && x2 > 0) +- wwvi_draw_line(w->window, gc, x1, y1, x2, y2); +- /* wwvi_draw_line(w->window, gc, x1-1, y1+1, x2-1, y2+1); */ ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x1, y1, x2, y2); ++ /* wwvi_draw_line(gtk_widget_get_window(w), gc, x1-1, y1+1, x2-1, y2+1); */ + } + } + +@@ -10270,7 +10326,7 @@ static void do_newhighscore(GtkWidget *w, + #ifndef OPENLASE + rainbow_abs_xy_draw_string(w, message, BIG_FONT, x+1, y+1); + #endif +- wwvi_draw_line(w->window, gc, x-25, y+25, x+55, y+25); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x-25, y+25, x+55, y+25); + } + + /* Print the alphabet. */ +@@ -10287,10 +10343,10 @@ static void do_newhighscore(GtkWidget *w, + #endif + if (i == highscore_letter) { + x = 60 + (i%9)*80; +- wwvi_draw_line(w->window, gc, x-25, y-65, x-25, y+25); +- wwvi_draw_line(w->window, gc, x-25, y-65, x+55, y-65); +- wwvi_draw_line(w->window, gc, x-25, y+25, x+55, y+25); +- wwvi_draw_line(w->window, gc, x+55, y-65, x+55, y+25); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x-25, y-65, x-25, y+25); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x-25, y-65, x+55, y-65); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x-25, y+25, x+55, y+25); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x+55, y-65, x+55, y+25); + } + } + rainbow_abs_xy_draw_string(w, "Done", SMALL_FONT, 60 + 8*80, 80+100*4); +@@ -10309,10 +10365,10 @@ static void do_newhighscore(GtkWidget *w, + if (highscore_letter == 26 && !finished) { + x = 60 + 8*80; + y = 80+100*4; +- wwvi_draw_line(w->window, gc, x-25, y-65, x-25, y+25); +- wwvi_draw_line(w->window, gc, x-25, y-65, x+55, y-65); +- wwvi_draw_line(w->window, gc, x-25, y+25, x+55, y+25); +- wwvi_draw_line(w->window, gc, x+55, y-65, x+55, y+25); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x-25, y-65, x-25, y+25); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x-25, y-65, x+55, y-65); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x-25, y+25, x+55, y+25); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x+55, y-65, x+55, y+25); + } + + if (highscore_current_initial == 3 && finish_timer == 0) { +@@ -10408,7 +10464,7 @@ void update_intermission_starfield(GtkWidget *w) + y = (int) star[i].y; + x2 = (int) star[i].lx; + y2 = (int) star[i].ly; +- wwvi_draw_line(w->window, gc, x, y, x2, y2); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x, y, x2, y2); + } + } + +@@ -10611,15 +10667,15 @@ static void draw_radar(GtkWidget *w) + gdk_gc_set_foreground(gc, &huex[RED]); + + /* draw radar border */ +- wwvi_draw_line(w->window, gc, x1, y1, x1, y2); +- wwvi_draw_line(w->window, gc, x1, y2, x2, y2); +- wwvi_draw_line(w->window, gc, x2, y2, x2, y1); +- wwvi_draw_line(w->window, gc, x2, y1, x1, y1); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x1, y1, x1, y2); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x1, y2, x2, y2); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x2, y2, x2, y1); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x2, y1, x1, y1); + + /* draw health bar */ + gdk_gc_set_foreground(gc, &huex[ORANGE]); + if (game_state.health > 0) +- wwvi_draw_rectangle(w->window, gc, TRUE, RADAR_LEFT_MARGIN, ++ wwvi_draw_rectangle(gtk_widget_get_window(w), gc, TRUE, RADAR_LEFT_MARGIN, + SCREEN_HEIGHT - RADAR_HEIGHT - RADAR_YMARGIN - 10, + ((SCREEN_WIDTH - RADAR_LEFT_MARGIN - RADAR_RIGHT_MARGIN) * game_state.health / game_state.max_player_health), + RADAR_YMARGIN - 5); +@@ -10663,26 +10719,26 @@ static void draw_radar(GtkWidget *w) + gdk_gc_set_foreground(gc, &huex[WHITE]); + + /* draw upper left corner */ +- wwvi_draw_line(w->window, gc, viewport_left, viewport_top, viewport_left, viewport_top + 5); +- wwvi_draw_line(w->window, gc, viewport_left, viewport_top, viewport_left+5, viewport_top); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, viewport_left, viewport_top, viewport_left, viewport_top + 5); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, viewport_left, viewport_top, viewport_left+5, viewport_top); + + /* draw upper right corner */ +- wwvi_draw_line(w->window, gc, viewport_right, viewport_top, viewport_right, viewport_top + 5); +- wwvi_draw_line(w->window, gc, viewport_right, viewport_top, viewport_right-5, viewport_top); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, viewport_right, viewport_top, viewport_right, viewport_top + 5); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, viewport_right, viewport_top, viewport_right-5, viewport_top); + + /* draw lower left corner */ +- wwvi_draw_line(w->window, gc, viewport_left, viewport_bottom, viewport_left, viewport_bottom - 5); +- wwvi_draw_line(w->window, gc, viewport_left, viewport_bottom, viewport_left+5, viewport_bottom); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, viewport_left, viewport_bottom, viewport_left, viewport_bottom - 5); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, viewport_left, viewport_bottom, viewport_left+5, viewport_bottom); + + /* draw lower right corner */ +- wwvi_draw_line(w->window, gc, viewport_right, viewport_bottom, viewport_right, viewport_bottom - 5); +- wwvi_draw_line(w->window, gc, viewport_right, viewport_bottom, viewport_right-5, viewport_bottom); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, viewport_right, viewport_bottom, viewport_right, viewport_bottom - 5); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, viewport_right, viewport_bottom, viewport_right-5, viewport_bottom); + + #if 0 +- wwvi_draw_line(w->window, gc, viewport_left, viewport_top, viewport_left, viewport_bottom); +- wwvi_draw_line(w->window, gc, viewport_right, viewport_top, viewport_right, viewport_bottom); +- wwvi_draw_line(w->window, gc, viewport_left, viewport_top, viewport_right, viewport_top); +- wwvi_draw_line(w->window, gc, viewport_left, viewport_bottom, viewport_right, viewport_bottom); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, viewport_left, viewport_top, viewport_left, viewport_bottom); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, viewport_right, viewport_top, viewport_right, viewport_bottom); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, viewport_left, viewport_top, viewport_right, viewport_top); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, viewport_left, viewport_bottom, viewport_right, viewport_bottom); + #endif + } + #endif +@@ -10732,7 +10788,7 @@ static void draw_radar(GtkWidget *w) + + if (game_state.radar_state == RADAR_FRITZED) { + gdk_gc_set_foreground(gc, &huex[randomn(NCOLORS+NSPARKCOLORS+NRAINBOWCOLORS)]); +- wwvi_draw_line(w->window, gc, x1, y1 + timer % RADAR_HEIGHT, ++ wwvi_draw_line(gtk_widget_get_window(w), gc, x1, y1 + timer % RADAR_HEIGHT, + x2, y1 + timer % RADAR_HEIGHT); + } else if (game_state.radar_state <= RADAR_BOOTUP) { + /* radar is booting up, display bootup message. */ +@@ -10751,21 +10807,14 @@ static void draw_radar(GtkWidget *w) + static gint main_da_configure(GtkWidget *w, + __attribute__((unused)) GdkEventConfigure *event) + { +- GdkRectangle cliprect; +- +- /* first time through, gc is null, because gc can't be set without */ +- /* a window, but, the window isn't there yet until it's shown, but */ +- /* the show generates a configure... chicken and egg. And we can't */ +- /* proceed without gc != NULL... but, it's ok, because 1st time thru */ +- /* we already sort of know the drawing area/window size. */ +- +- if (gc == NULL) ++ /* Skip the first spurious configure that arrives before drawing is ready */ ++ if (!drawing_initialized) + return TRUE; + +- /* gtk_widget_set_size_request(w, w->allocation.width, w->allocation.height);*/ ++ /* gtk_widget_set_size_request(w, gtk_widget_get_allocated_width(w), gtk_widget_get_allocated_height(w));*/ + /* gtk_window_get_size(GTK_WINDOW (w), &real_screen_width, &real_screen_height);*/ +- real_screen_width = w->allocation.width; +- real_screen_height = w->allocation.height; ++ real_screen_width = gtk_widget_get_allocated_width(w); ++ real_screen_height = gtk_widget_get_allocated_height(w); + xscale_screen = (float) real_screen_width / (float) SCREEN_WIDTH; + yscale_screen = (float) real_screen_height / (float) SCREEN_HEIGHT; + if (real_screen_width == 800 && real_screen_height == 600) { +@@ -10779,12 +10828,6 @@ static gint main_da_configure(GtkWidget *w, + if (thicklines) + current_draw_line = thick_scaled_line; + } +- gdk_gc_set_clip_origin(gc, 0, 0); +- cliprect.x = 0; +- cliprect.y = 0; +- cliprect.width = real_screen_width; +- cliprect.height = real_screen_height; +- gdk_gc_set_clip_rectangle(gc, &cliprect); + return TRUE; + } + +@@ -10796,9 +10839,9 @@ static void draw_quit_screen(GtkWidget *w) + quittimer++; + + gdk_gc_set_foreground(gc, &huex[BLACK]); +- wwvi_draw_rectangle(w->window, gc, TRUE, 100, 100, SCREEN_WIDTH-200, SCREEN_HEIGHT-200); ++ wwvi_draw_rectangle(gtk_widget_get_window(w), gc, TRUE, 100, 100, SCREEN_WIDTH-200, SCREEN_HEIGHT-200); + gdk_gc_set_foreground(gc, &huex[RED]); +- wwvi_draw_rectangle(w->window, gc, FALSE, 100, 100, SCREEN_WIDTH-200, SCREEN_HEIGHT-200); ++ wwvi_draw_rectangle(gtk_widget_get_window(w), gc, FALSE, 100, 100, SCREEN_WIDTH-200, SCREEN_HEIGHT-200); + + gdk_gc_set_foreground(gc, &huex[WHITE]); + abs_xy_draw_string(w, "Quit?", BIG_FONT, 300, 280); +@@ -10819,35 +10862,41 @@ static void draw_quit_screen(GtkWidget *w) + + if ((quittimer & 0x04)) { + gdk_gc_set_foreground(gc, &huex[WHITE]); +- wwvi_draw_rectangle(w->window, gc, FALSE, x, 420, 200, 50); ++ wwvi_draw_rectangle(gtk_widget_get_window(w), gc, FALSE, x, 420, 200, 50); + } + } + + + + static void draw_help_screen(GtkWidget *w); +-/* This is the expose function of the main drawing area. This is */ +-/* where everything gets drawn. */ +-static int main_da_expose(GtkWidget *w, GdkEvent *event, gpointer p) ++/* This is the draw callback of the main drawing area (GTK3: "draw" signal). ++ * This is where everything gets drawn. */ ++static gboolean main_da_draw(GtkWidget *w, cairo_t *cr, gpointer p) + { + int i; + int sx1, sx2; + static int last_lowx = 0, last_highx = TERRAIN_LENGTH-1; + /* int last_lowx = 0, last_highx = TERRAIN_LENGTH-1;*/ + ++ /* Set up the cairo context for this frame */ ++ current_cr = cr; ++ cairo_set_line_width(cr, 1.0); ++ /* Clear drawing area to black */ ++ cairo_set_source_rgb(cr, 0.0, 0.0, 0.0); ++ cairo_paint(cr); ++ + if (timer_event == START_INTERMISSION_EVENT) { + openlase_startframe(); +- do_intermission(w, event, p); ++ do_intermission(w, NULL, p); + openlase_renderframe(); +- return 0; ++ return FALSE; + } + + if (timer_event == NEW_HIGH_SCORE_EVENT) { + openlase_startframe(); +- do_newhighscore(w, event, p); ++ do_newhighscore(w, NULL, p); + openlase_renderframe(); +- return 0; +- return 0; ++ return FALSE; + } + + openlase_startframe(); +@@ -10890,22 +10939,22 @@ static int main_da_expose(GtkWidget *w, GdkEvent *event, gpointer p) + printf(".\n"); + } + #endif +- wwvi_draw_line(w->window, gc, terrain.x[i] - game_state.x, terrain.y[i]+(SCREEN_HEIGHT/2) - game_state.y, ++ wwvi_draw_line(gtk_widget_get_window(w), gc, terrain.x[i] - game_state.x, terrain.y[i]+(SCREEN_HEIGHT/2) - game_state.y, + terrain.x[i+1] - game_state.x, terrain.y[i+1]+(SCREEN_HEIGHT/2) - game_state.y); + } + gdk_gc_set_foreground(gc, &huex[RED]); + + /* draw "system memory boundaries" (ha!) */ + if (game_state.x > terrain.x[0] - SCREEN_WIDTH && game_state.x < terrain.x[0] + SCREEN_WIDTH) +- wwvi_draw_line(w->window, gc, terrain.x[0] - game_state.x, 0, ++ wwvi_draw_line(gtk_widget_get_window(w), gc, terrain.x[0] - game_state.x, 0, + terrain.x[0] - game_state.x, SCREEN_HEIGHT); + if (game_state.x > terrain.x[TERRAIN_LENGTH - 1] - SCREEN_WIDTH && + game_state.x < terrain.x[TERRAIN_LENGTH - 1] + SCREEN_WIDTH) +- wwvi_draw_line(w->window, gc, terrain.x[TERRAIN_LENGTH-1] - game_state.x, 0, +- terrain.x[TERRAIN_LENGTH-1] - game_state.x, SCREEN_HEIGHT); ++ wwvi_draw_line(gtk_widget_get_window(w), gc, terrain.x[TERRAIN_LENGTH-1] - game_state.x, 0, ++ terrain.x[TERRAIN_LENGTH-1] - game_state.x, SCREEN_HEIGHT); + set_font(SMALL_FONT); + if (game_state.y < KERNEL_Y_BOUNDARY + SCREEN_HEIGHT) { +- wwvi_draw_line(w->window, gc, 0, KERNEL_Y_BOUNDARY - game_state.y + SCREEN_HEIGHT/2, ++ wwvi_draw_line(gtk_widget_get_window(w), gc, 0, KERNEL_Y_BOUNDARY - game_state.y + SCREEN_HEIGHT/2, + SCREEN_WIDTH, KERNEL_Y_BOUNDARY - game_state.y + SCREEN_HEIGHT/2); + livecursorx = (SCREEN_WIDTH - abs(game_state.x) % SCREEN_WIDTH); + livecursory = KERNEL_Y_BOUNDARY - game_state.y + SCREEN_HEIGHT/2 - 10; +@@ -10925,7 +10974,7 @@ static int main_da_expose(GtkWidget *w, GdkEvent *event, gpointer p) + draw_help_screen(w); + + openlase_renderframe(); +- return 0; ++ return FALSE; + } + static void do_game_pause(void) + { +@@ -10974,7 +11023,7 @@ void inhibit_screensaver( + char cmd[1024]; + return; + +- xwindow_id = GDK_WINDOW_XWINDOW (GTK_WIDGET (widget)->window); ++ xwindow_id = gdk_x11_window_get_xid(gtk_widget_get_window(GTK_WIDGET(widget))); + + sprintf(cmd, "xdg-screensaver suspend 0x%08x > /dev/null 2>&1 &", xwindow_id); + rc = system(cmd); +@@ -10994,7 +11043,7 @@ void resume_screensaver( + char cmd[1024]; + return; + +- xwindow_id = GDK_WINDOW_XWINDOW (GTK_WIDGET (widget)->window); ++ xwindow_id = gdk_x11_window_get_xid(gtk_widget_get_window(GTK_WIDGET(widget))); + + sprintf(cmd, "xdg-screensaver resume 0x%08x > /dev/null 2>&1 &", xwindow_id); + rc = system(cmd); +@@ -11350,10 +11399,8 @@ gint advance_game(__attribute__((unused)) gpointer data) + if (game_pause == 1) { + if (game_pause_help) { + deal_with_keyboard(); +- gdk_threads_enter(); + gtk_widget_queue_draw(main_da); + nframes++; +- gdk_threads_leave(); + } + return TRUE; + } +@@ -11364,16 +11411,13 @@ gint advance_game(__attribute__((unused)) gpointer data) + deal_with_keyboard(); + + if (in_the_process_of_quitting) { +- gdk_threads_enter(); + gtk_widget_queue_draw(main_da); + nframes++; +- gdk_threads_leave(); + if (final_quit_selection) + really_quit(); + return TRUE; + } + +- gdk_threads_enter(); + game_state.x += game_state.vx; + game_state.y += game_state.vy; + +@@ -11404,7 +11448,6 @@ gint advance_game(__attribute__((unused)) gpointer data) + } + gtk_widget_queue_draw(main_da); + nframes++; +- gdk_threads_leave(); + #if 0 + if (WORLDWIDTH - game_state.x < 100) + return FALSE; +@@ -12446,9 +12489,9 @@ static void draw_help_screen(GtkWidget *w) + + + gdk_gc_set_foreground(gc, &huex[BLACK]); +- wwvi_draw_rectangle(w->window, gc, TRUE, 50, 50, SCREEN_WIDTH-100, SCREEN_HEIGHT-100); ++ wwvi_draw_rectangle(gtk_widget_get_window(w), gc, TRUE, 50, 50, SCREEN_WIDTH-100, SCREEN_HEIGHT-100); + gdk_gc_set_foreground(gc, &huex[RED]); +- wwvi_draw_rectangle(w->window, gc, FALSE, 50, 50, SCREEN_WIDTH-100, SCREEN_HEIGHT-100); ++ wwvi_draw_rectangle(gtk_widget_get_window(w), gc, FALSE, 50, 50, SCREEN_WIDTH-100, SCREEN_HEIGHT-100); + + if (helpscreen_pixel_row > -30) + abs_xy_draw_string(w, "-- More Above -- (press 'up' arrow)", TINY_FONT, 80, 70); +@@ -12665,7 +12708,7 @@ static void draw_help_screen(GtkWidget *w) + + if ((quittimer & 0x04)) { + gdk_gc_set_foreground(gc, &huex[WHITE]); +- wwvi_draw_rectangle(w->window, gc, FALSE, x, 420, 200, 50); ++ wwvi_draw_rectangle(gtk_widget_get_window(w), gc, FALSE, x, 420, 200, 50); + } + #endif + } +@@ -13500,8 +13543,8 @@ void set_cursor(GtkWidget *window) + { + GdkCursor* cursor; + cursor = gdk_cursor_new(GDK_CROSS); +- gdk_window_set_cursor(window->window, cursor); +- gdk_cursor_destroy(cursor); ++ gdk_window_set_cursor(gtk_widget_get_window(window), cursor); ++ g_object_unref(cursor); + } + + char *trim_whitespace(char *s) +@@ -13907,7 +13950,6 @@ int main(int argc, char *argv[]) + { + /* GtkWidget is the storage type for widgets */ + GtkWidget *vbox; +- GdkRectangle cliprect; + int i; + int blueprint = 0; + int retrogreen = 0; +@@ -14184,7 +14226,6 @@ int main(int argc, char *argv[]) + else + init_clips(); + #endif +- gtk_set_locale(); + gtk_init (&argc, &argv); + + gdk_color_parse("white", &huex[WHITE]); +@@ -14229,7 +14270,7 @@ int main(int argc, char *argv[]) + gtk_window_fullscreen(GTK_WINDOW (window)); + gtk_window_set_decorated( GTK_WINDOW (window), FALSE); + +- real_screen_width = gdk_screen_get_width(screen); ++ real_screen_width = gdk_screen_get_width(screen); /* deprecated but GTK3-compatible */ + real_screen_height = gdk_screen_get_height(screen); + + current_draw_line = scaled_line; +@@ -14264,12 +14305,11 @@ int main(int argc, char *argv[]) + #endif + gtk_container_set_border_width (GTK_CONTAINER (window), 0); + +- vbox = gtk_vbox_new(FALSE, 0); ++ vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); + main_da = gtk_drawing_area_new(); +- gtk_widget_modify_bg(main_da, GTK_STATE_NORMAL, &huex[WHITE]); + /* gtk_widget_set_size_request(main_da, real_screen_width, real_screen_height);*/ + +- g_signal_connect(G_OBJECT (main_da), "expose_event", G_CALLBACK (main_da_expose), NULL); ++ g_signal_connect(G_OBJECT (main_da), "draw", G_CALLBACK (main_da_draw), NULL); + g_signal_connect(G_OBJECT (main_da), "configure_event", G_CALLBACK (main_da_configure), NULL); + + gtk_container_add (GTK_CONTAINER (window), vbox); +@@ -14288,9 +14328,7 @@ int main(int argc, char *argv[]) + + /* print_target_list();*/ + +- for (i=0;iwindow); ++ jsfd = open_joystick(joystick_device, gtk_widget_get_window(window)); + if (jsfd < 0) { + printf("No joystick...\n"); + } else + check_for_screensaver(); + +- gc = gdk_gc_new(GTK_WIDGET(main_da)->window); +- gdk_gc_set_foreground(gc, &huex[BLUE]); +- gdk_gc_set_foreground(gc, &huex[WHITE]); +- +- gdk_gc_set_clip_origin(gc, 0, 0); +- cliprect.x = 0; +- cliprect.y = 0; +- cliprect.width = real_screen_width; +- cliprect.height = real_screen_height; +- gdk_gc_set_clip_rectangle(gc, &cliprect); ++ /* gc is unused in GTK3 (replaced by cairo_t *current_cr, see compat layer) */ ++ gc = NULL; ++ drawing_initialized = TRUE; + + gtk_window_get_size(GTK_WINDOW (window), &real_screen_width, &real_screen_height); + if (real_screen_width == 800 && real_screen_height == 600) { +@@ -14360,17 +14391,6 @@ int main(int argc, char *argv[]) + + timer_tag = g_timeout_add(1000 / frame_rate_hz, advance_game, NULL); + +-#ifndef GLIB_VERSION_2_32 +- /* this is only needed in glibc versions before 2.32 */ +- +- /* Apparently (some versions of?) portaudio calls g_thread_init(). */ +- /* It may only be called once, and subsequent calls abort, so */ +- /* only call it if the thread system is not already initialized. */ +- if (!g_thread_supported ()) +- g_thread_init(NULL); +-#endif +- +- gdk_threads_init(); + + gettimeofday(&start_time, NULL); + diff --git a/sources b/sources index 3c28118..b5cf594 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -d7b1e62c72302d93d5f36b50500d9d31 wordwarvi-1.1-6beed31.tar.gz +SHA512 (wordwarvi-1.0.4.tar.gz) = 3bbb17f8c93aa0250ff25d0851c550872353fb0925a3495c8b073409094b4e8bbbb9c335c4ddd360588d29e27906624e3dfc61a5335dcfe6ca1fd5dfd6d26bca diff --git a/wordwarvi.rpmlintrc b/wordwarvi.rpmlintrc new file mode 100644 index 0000000..676802d --- /dev/null +++ b/wordwarvi.rpmlintrc @@ -0,0 +1,4 @@ +addFilter("E: spelling-error") +addFilter("E: incorrect-fsf-address") +addFilter("W: no-%check-section") +addFilter("W: invalid-license") diff --git a/wordwarvi.spec b/wordwarvi.spec index 028c673..92a2d45 100644 --- a/wordwarvi.spec +++ b/wordwarvi.spec @@ -1,21 +1,22 @@ -%global commit 6beed311c2ecb3f9662f35ecc06948bd89ed9455 -%global shortcommit %(c=%{commit}; echo ${c:0:7}) +%global forgeurl https://github.com/smcameron/wordwarvi/ Name: wordwarvi -Version: 1.1 -Release: 24.git%{shortcommit}%{?dist} +Version: 1.0.4 +Release: 1%{?dist} +# Accidentally used 1.1 for 1.0.1 +Epoch: 1 +%forgemeta Summary: Side-scrolling shoot 'em up '80s style arcade game # Automatically converted from old format: GPLv2+ and CC-BY and CC-BY-SA - review is highly recommended. License: GPL-2.0-or-later AND LicenseRef-Callaway-CC-BY AND LicenseRef-Callaway-CC-BY-SA URL: https://smcameron.github.io/wordwarvi/ -# The 1.1 release never got a tag in git, so we use the commit-id -Source0: https://github.com/smcameron/wordwarvi/archive/%{commit}/%{name}-%{version}-%{shortcommit}.tar.gz +Source0: %{forgesource} Source1: %{name}.desktop Source2: %{name}.png Source3: %{name}.appdata.xml -BuildRequires: make -BuildRequires: gcc -BuildRequires: gtk2-devel portaudio-devel libvorbis-devel +Patch1: Port-to-GTK-3.patch +BuildRequires: make gcc +BuildRequires: gtk3-devel portaudio-devel libvorbis-devel BuildRequires: desktop-file-utils libappstream-glib Requires: hicolor-icon-theme @@ -32,15 +33,15 @@ vi, mmm-kay? %prep -%setup -qn %{name}-%{commit} +%autosetup -p1 %build -make %{?_smp_mflags} PREFIX=%{_prefix} CFLAGS="$RPM_OPT_FLAGS" +%make_build PREFIX=%{_prefix} %install -make install PREFIX=%{_prefix} DESTDIR=$RPM_BUILD_ROOT +%make_install PREFIX=%{_prefix} BINDIR=%{_bindir} # below is the desktop file and icon stuff. mkdir -p $RPM_BUILD_ROOT%{_datadir}/applications @@ -53,8 +54,10 @@ install -p -m 644 %{SOURCE3} $RPM_BUILD_ROOT%{_datadir}/appdata appstream-util validate-relax --nonet \ $RPM_BUILD_ROOT%{_datadir}/appdata/%{name}.appdata.xml + %files -%doc AUTHORS COPYING README changelog.txt sounds/Attribution.txt +%doc AUTHORS README changelog.txt sounds/Attribution.txt +%license COPYING %{_bindir}/%{name} %{_datadir}/%{name} %{_mandir}/man6/%{name}.6* @@ -64,6 +67,11 @@ appstream-util validate-relax --nonet \ %changelog +* Tue May 12 2026 Hans de Goede - 1:1.0.4-1 +- Update to 1.0.4 release +- Add Epoch because the 1.1 release from git was 1.0.1 +- Add Debian patch to port to GTK3 + * Sat Jan 17 2026 Fedora Release Engineering - 1.1-24.git6beed31 - Rebuilt for https://fedoraproject.org/wiki/Fedora_44_Mass_Rebuild From f736f46c94a88d4ab5541aa42ad219cecf8f83a2 Mon Sep 17 00:00:00 2001 From: Michal Schorm Date: Tue, 14 Jul 2026 23:03:14 +0200 Subject: [PATCH 16/17] Fix SPDX license tag: 'GPL-2.0-only AND CC-BY-3.0 AND CC-BY-SA-3.0' 'ogg_to_pcm.c' and 'ogg_to_pcm.h' are derived from vorbis-tools 'oggdec.c' and licensed GPL-2.0-only ("version 2" with no "or later" clause). Since they are compiled and linked into the binary, the effective code license is GPL-2.0-only, not GPL-2.0-or-later. Sound files: two tracks by Lucky Lion Studios under CC-BY-3.0 (URL: creativecommons.org/licenses/by/3.0/), remaining 59 tracks from freesound.org under CC-BY-SA-3.0 (URL: creativecommons.org/licenses/by-sa/3.0/). Co-Authored-By: Claude AI --- wordwarvi.spec | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/wordwarvi.spec b/wordwarvi.spec index 92a2d45..c748f31 100644 --- a/wordwarvi.spec +++ b/wordwarvi.spec @@ -2,13 +2,15 @@ Name: wordwarvi Version: 1.0.4 -Release: 1%{?dist} +Release: 2%{?dist} # Accidentally used 1.1 for 1.0.1 Epoch: 1 %forgemeta Summary: Side-scrolling shoot 'em up '80s style arcade game -# Automatically converted from old format: GPLv2+ and CC-BY and CC-BY-SA - review is highly recommended. -License: GPL-2.0-or-later AND LicenseRef-Callaway-CC-BY AND LicenseRef-Callaway-CC-BY-SA +# Code is GPL-2.0-or-later except 'ogg_to_pcm.c' / 'ogg_to_pcm.h' which are +# GPL-2.0-only (from vorbis-tools 'oggdec.c'); effective code license is +# GPL-2.0-only. Some sounds are CC-BY-3.0, rest are CC-BY-SA-3.0. +License: GPL-2.0-only AND CC-BY-3.0 AND CC-BY-SA-3.0 URL: https://smcameron.github.io/wordwarvi/ Source0: %{forgesource} Source1: %{name}.desktop @@ -67,6 +69,10 @@ appstream-util validate-relax --nonet \ %changelog +* Tue Jul 14 2026 Michal Schorm - 1:1.0.4-2 +- Fix SPDX license expression: 'GPL-2.0-only AND CC-BY-3.0 AND CC-BY-SA-3.0' +- 'ogg_to_pcm.c' is GPL-2.0-only (from vorbis-tools), not GPL-2.0-or-later + * Tue May 12 2026 Hans de Goede - 1:1.0.4-1 - Update to 1.0.4 release - Add Epoch because the 1.1 release from git was 1.0.1 From decff7a1a677ce4bc246dd2a82262379768dec68 Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Fri, 17 Jul 2026 08:54:56 +0000 Subject: [PATCH 17/17] Rebuilt for https://fedoraproject.org/wiki/Fedora_45_Mass_Rebuild --- wordwarvi.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/wordwarvi.spec b/wordwarvi.spec index c748f31..b5954ad 100644 --- a/wordwarvi.spec +++ b/wordwarvi.spec @@ -2,7 +2,7 @@ Name: wordwarvi Version: 1.0.4 -Release: 2%{?dist} +Release: 3%{?dist} # Accidentally used 1.1 for 1.0.1 Epoch: 1 %forgemeta @@ -69,6 +69,9 @@ appstream-util validate-relax --nonet \ %changelog +* Fri Jul 17 2026 Fedora Release Engineering - 1:1.0.4-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_45_Mass_Rebuild + * Tue Jul 14 2026 Michal Schorm - 1:1.0.4-2 - Fix SPDX license expression: 'GPL-2.0-only AND CC-BY-3.0 AND CC-BY-SA-3.0' - 'ogg_to_pcm.c' is GPL-2.0-only (from vorbis-tools), not GPL-2.0-or-later