libnma/0001-Ship-and-compile-both-GTK3-and-GTK4-UI-files.patch
2022-03-18 16:27:22 -07:00

2745 lines
107 KiB
Diff
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

From fadd3096a2f621f2aafe16543abc64179b45dcb4 Mon Sep 17 00:00:00 2001
From: Brandon Nielsen <nielsenb@jetfuse.net>
Date: Thu, 10 Mar 2022 20:00:23 -0600
Subject: [PATCH] Ship and compile both GTK3 and GTK4 UI files
For layouts that used to use GtkButtonBox with packing[0], the packing was
removed because a matching layout was not immediately apparent. The UIs
should all be checked for correctness.
This is an attempt to start fixing #10, and gnome-control-center issue
1688[1] (and matching Fedora downstream issues[2][3]).
[0] - https://docs.gtk.org/gtk4/migrating-3to4.html#adapt-to-gtkcontainer-removal
[1] - https://gitlab.gnome.org/GNOME/gnome-control-center/-/issues/1688
[2] - https://bugzilla.redhat.com/show_bug.cgi?id=2062507
[3] - https://bugzilla.redhat.com/show_bug.cgi?id=2060868
---
Makefile.am | 75 ++--
po/POTFILES.in | 51 ++-
src/meson.build | 20 +-
src/nma-ws/meson.build | 14 -
src/{ => ui/gtk3}/nma-bar-code-widget.ui | 0
src/{ => ui/gtk3}/nma-mobile-wizard.ui | 0
.../gtk3}/nma-pkcs11-cert-chooser-dialog.ui | 0
.../gtk3}/nma-pkcs11-token-login-dialog.ui | 0
src/{ => ui/gtk3}/nma-vpn-password-dialog.ui | 0
src/{ => ui/gtk3}/nma-ws/nma-eap-fast.ui | 0
src/{ => ui/gtk3}/nma-ws/nma-eap-leap.ui | 0
src/{ => ui/gtk3}/nma-ws/nma-eap-peap.ui | 0
src/{ => ui/gtk3}/nma-ws/nma-eap-simple.ui | 0
src/{ => ui/gtk3}/nma-ws/nma-eap-tls.ui | 0
src/{ => ui/gtk3}/nma-ws/nma-eap-ttls.ui | 0
src/{ => ui/gtk3}/nma-ws/nma-ws-802-1x.ui | 0
src/{ => ui/gtk3}/nma-ws/nma-ws-leap.ui | 0
src/{ => ui/gtk3}/nma-ws/nma-ws-sae.ui | 0
src/{ => ui/gtk3}/nma-ws/nma-ws-wep-key.ui | 0
src/{ => ui/gtk3}/nma-ws/nma-ws-wpa-psk.ui | 0
src/{ => ui/gtk3}/nma.gresource.xml | 0
src/{ => ui/gtk3}/wifi.ui | 0
src/ui/gtk4/nma-bar-code-widget.ui | 30 ++
src/ui/gtk4/nma-mobile-wizard.ui | 417 ++++++++++++++++++
src/ui/gtk4/nma-pkcs11-cert-chooser-dialog.ui | 105 +++++
src/ui/gtk4/nma-pkcs11-token-login-dialog.ui | 69 +++
src/ui/gtk4/nma-vpn-password-dialog.ui | 186 ++++++++
src/ui/gtk4/nma-ws/nma-eap-fast.ui | 196 ++++++++
src/ui/gtk4/nma-ws/nma-eap-leap.ui | 70 +++
src/ui/gtk4/nma-ws/nma-eap-peap.ui | 171 +++++++
src/ui/gtk4/nma-ws/nma-eap-simple.ui | 117 +++++
src/ui/gtk4/nma-ws/nma-eap-tls.ui | 77 ++++
src/ui/gtk4/nma-ws/nma-eap-ttls.ui | 129 ++++++
src/ui/gtk4/nma-ws/nma-ws-802-1x.ui | 62 +++
src/ui/gtk4/nma-ws/nma-ws-leap.ui | 74 ++++
src/ui/gtk4/nma-ws/nma-ws-sae.ui | 71 +++
src/ui/gtk4/nma-ws/nma-ws-wep-key.ui | 142 ++++++
src/ui/gtk4/nma-ws/nma-ws-wpa-psk.ui | 70 +++
src/ui/gtk4/nma.gresource.xml | 22 +
src/ui/gtk4/wifi.ui | 187 ++++++++
src/ui/meson.build | 11 +
41 files changed, 2288 insertions(+), 78 deletions(-)
rename src/{ => ui/gtk3}/nma-bar-code-widget.ui (100%)
rename src/{ => ui/gtk3}/nma-mobile-wizard.ui (100%)
rename src/{ => ui/gtk3}/nma-pkcs11-cert-chooser-dialog.ui (100%)
rename src/{ => ui/gtk3}/nma-pkcs11-token-login-dialog.ui (100%)
rename src/{ => ui/gtk3}/nma-vpn-password-dialog.ui (100%)
rename src/{ => ui/gtk3}/nma-ws/nma-eap-fast.ui (100%)
rename src/{ => ui/gtk3}/nma-ws/nma-eap-leap.ui (100%)
rename src/{ => ui/gtk3}/nma-ws/nma-eap-peap.ui (100%)
rename src/{ => ui/gtk3}/nma-ws/nma-eap-simple.ui (100%)
rename src/{ => ui/gtk3}/nma-ws/nma-eap-tls.ui (100%)
rename src/{ => ui/gtk3}/nma-ws/nma-eap-ttls.ui (100%)
rename src/{ => ui/gtk3}/nma-ws/nma-ws-802-1x.ui (100%)
rename src/{ => ui/gtk3}/nma-ws/nma-ws-leap.ui (100%)
rename src/{ => ui/gtk3}/nma-ws/nma-ws-sae.ui (100%)
rename src/{ => ui/gtk3}/nma-ws/nma-ws-wep-key.ui (100%)
rename src/{ => ui/gtk3}/nma-ws/nma-ws-wpa-psk.ui (100%)
rename src/{ => ui/gtk3}/nma.gresource.xml (100%)
rename src/{ => ui/gtk3}/wifi.ui (100%)
create mode 100644 src/ui/gtk4/nma-bar-code-widget.ui
create mode 100644 src/ui/gtk4/nma-mobile-wizard.ui
create mode 100644 src/ui/gtk4/nma-pkcs11-cert-chooser-dialog.ui
create mode 100644 src/ui/gtk4/nma-pkcs11-token-login-dialog.ui
create mode 100644 src/ui/gtk4/nma-vpn-password-dialog.ui
create mode 100644 src/ui/gtk4/nma-ws/nma-eap-fast.ui
create mode 100644 src/ui/gtk4/nma-ws/nma-eap-leap.ui
create mode 100644 src/ui/gtk4/nma-ws/nma-eap-peap.ui
create mode 100644 src/ui/gtk4/nma-ws/nma-eap-simple.ui
create mode 100644 src/ui/gtk4/nma-ws/nma-eap-tls.ui
create mode 100644 src/ui/gtk4/nma-ws/nma-eap-ttls.ui
create mode 100644 src/ui/gtk4/nma-ws/nma-ws-802-1x.ui
create mode 100644 src/ui/gtk4/nma-ws/nma-ws-leap.ui
create mode 100644 src/ui/gtk4/nma-ws/nma-ws-sae.ui
create mode 100644 src/ui/gtk4/nma-ws/nma-ws-wep-key.ui
create mode 100644 src/ui/gtk4/nma-ws/nma-ws-wpa-psk.ui
create mode 100644 src/ui/gtk4/nma.gresource.xml
create mode 100644 src/ui/gtk4/wifi.ui
create mode 100644 src/ui/meson.build
diff --git a/Makefile.am b/Makefile.am
index b60baf41..fa371080 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -128,20 +128,17 @@ EXTRA_DIST += src/utils/meson.build
###############################################################################
-src/nma-resources.h: src/nma.gresource.xml
- $(AM_V_GEN) $(GLIB_COMPILE_RESOURCES) $< --target=$@ --sourcedir=$(srcdir)/src --generate-header --internal
+src/nma-resources.h: src/ui/gtk3/nma.gresource.xml
+ $(AM_V_GEN) $(GLIB_COMPILE_RESOURCES) $< --target=$@ --sourcedir=$(srcdir)/src/ui/gtk3 --generate-header --internal
-src/nma-resources.c: src/nma.gresource.xml $(shell $(GLIB_COMPILE_RESOURCES) --sourcedir=$(srcdir)/src --generate-dependencies $(srcdir)/src/nma.gresource.xml)
- $(AM_V_GEN) $(GLIB_COMPILE_RESOURCES) $< --target=$@ --sourcedir=$(srcdir)/src --generate-source --internal
+src/nma-resources.c: src/ui/gtk3/nma.gresource.xml $(shell $(GLIB_COMPILE_RESOURCES) --sourcedir=$(srcdir)/src/ui/gtk3 --generate-dependencies $(srcdir)/src/ui/gtk3/nma.gresource.xml)
+ $(AM_V_GEN) $(GLIB_COMPILE_RESOURCES) $< --target=$@ --sourcedir=$(srcdir)/src/ui/gtk3 --generate-source --internal
-src/libnma-gtk4/nma-resources.c: src/nma.gresource.xml $(shell $(GLIB_COMPILE_RESOURCES) --generate-dependencies $(srcdir)/src/nma.gresource.xml |sed "s,^,$(builddir)/src/libnma-gtk4/,")
- @mkdir -p $(builddir)/src/libnma-gtk4 $(builddir)/src/libnma-gtk4/nma-ws
- $(AM_V_GEN) $(GLIB_COMPILE_RESOURCES) $< --target=$@ --sourcedir=$(builddir)/src/libnma-gtk4 --generate-source --internal
+src/libnma-gtk4/nma-resources.h: src/ui/gtk4/nma.gresource.xml
+ $(AM_V_GEN) $(GLIB_COMPILE_RESOURCES) $< --target=$@ --sourcedir=$(srcdir)/src/ui/gtk4 --generate-header --internal
-
-src/libnma-gtk4/%.ui: src/%.ui
- @mkdir -p $(builddir)/src/libnma-gtk4 $(builddir)/src/libnma-gtk4/nma-ws
- gtk4-builder-tool simplify --3to4 $< |grep -v can.default >$@
+src/libnma-gtk4/nma-resources.c: src/ui/gtk4/nma.gresource.xml $(shell $(GLIB_COMPILE_RESOURCES) --sourcedir=$(srcdir)/src/ui/gtk4 --generate-dependencies $(srcdir)/src/ui/gtk4/nma.gresource.xml)
+ $(AM_V_GEN) $(GLIB_COMPILE_RESOURCES) $< --target=$@ --sourcedir=$(srcdir)/src/ui/gtk4 --generate-source --internal
CLEANFILES += \
$(libnma_h_priv_gen) \
@@ -695,28 +692,46 @@ EXTRA_DIST += \
src/libnma.ver \
src/libnma-gtk4.deps \
src/libnma.deps \
- src/wifi.ui \
- src/nma-mobile-wizard.ui \
- src/nma-bar-code-widget.ui \
- src/nma-pkcs11-token-login-dialog.ui \
- src/nma-pkcs11-cert-chooser-dialog.ui \
- src/nma-vpn-password-dialog.ui \
- src/nma.gresource.xml \
+ src/ui/meson.build \
+ src/ui/gtk3/wifi.ui \
+ src/ui/gtk3/nma-mobile-wizard.ui \
+ src/ui/gtk3/nma-bar-code-widget.ui \
+ src/ui/gtk3/nma-pkcs11-token-login-dialog.ui \
+ src/ui/gtk3/nma-pkcs11-cert-chooser-dialog.ui \
+ src/ui/gtk3/nma-vpn-password-dialog.ui \
+ src/ui/gtk3/nma.gresource.xml \
+ src/ui/gtk3/nma-ws/nma-eap-fast.ui \
+ src/ui/gtk3/nma-ws/nma-eap-leap.ui \
+ src/ui/gtk3/nma-ws/nma-eap-peap.ui \
+ src/ui/gtk3/nma-ws/nma-eap-simple.ui \
+ src/ui/gtk3/nma-ws/nma-eap-tls.ui \
+ src/ui/gtk3/nma-ws/nma-eap-ttls.ui \
+ src/ui/gtk3/nma-ws/nma-ws-802-1x.ui \
+ src/ui/gtk3/nma-ws/nma-ws-leap.ui \
+ src/ui/gtk3/nma-ws/nma-ws-sae.ui \
+ src/ui/gtk3/nma-ws/nma-ws-wep-key.ui \
+ src/ui/gtk3/nma-ws/nma-ws-wpa-psk.ui \
+ src/ui/gtk4/wifi.ui \
+ src/ui/gtk4/nma-mobile-wizard.ui \
+ src/ui/gtk4/nma-bar-code-widget.ui \
+ src/ui/gtk4/nma-pkcs11-token-login-dialog.ui \
+ src/ui/gtk4/nma-pkcs11-cert-chooser-dialog.ui \
+ src/ui/gtk4/nma-vpn-password-dialog.ui \
+ src/ui/gtk4/nma.gresource.xml \
+ src/ui/gtk4/nma-ws/nma-eap-fast.ui \
+ src/ui/gtk4/nma-ws/nma-eap-leap.ui \
+ src/ui/gtk4/nma-ws/nma-eap-peap.ui \
+ src/ui/gtk4/nma-ws/nma-eap-simple.ui \
+ src/ui/gtk4/nma-ws/nma-eap-tls.ui \
+ src/ui/gtk4/nma-ws/nma-eap-ttls.ui \
+ src/ui/gtk4/nma-ws/nma-ws-802-1x.ui \
+ src/ui/gtk4/nma-ws/nma-ws-leap.ui \
+ src/ui/gtk4/nma-ws/nma-ws-sae.ui \
+ src/ui/gtk4/nma-ws/nma-ws-wep-key.ui \
+ src/ui/gtk4/nma-ws/nma-ws-wpa-psk.ui \
src/meson.build \
src/tests/meson.build \
- \
src/nma-ws/meson.build \
- src/nma-ws/nma-eap-fast.ui \
- src/nma-ws/nma-eap-leap.ui \
- src/nma-ws/nma-eap-peap.ui \
- src/nma-ws/nma-eap-simple.ui \
- src/nma-ws/nma-eap-tls.ui \
- src/nma-ws/nma-eap-ttls.ui \
- src/nma-ws/nma-ws-802-1x.ui \
- src/nma-ws/nma-ws-leap.ui \
- src/nma-ws/nma-ws-sae.ui \
- src/nma-ws/nma-ws-wep-key.ui \
- src/nma-ws/nma-ws-wpa-psk.ui \
$(NULL)
###############################################################################
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 8a3b2136..87c8b2bf 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -3,45 +3,62 @@
org.gnome.nm-applet.gschema.xml.in
shared/nm-utils/nm-shared-utils.c
src/nma-bar-code-widget.c
-src/nma-bar-code-widget.ui
src/nma-cert-chooser-button.c
src/nma-mobile-providers.c
src/nma-mobile-wizard.c
-src/nma-mobile-wizard.ui
src/nma-pkcs11-cert-chooser-dialog.c
-src/nma-pkcs11-cert-chooser-dialog.ui
src/nma-pkcs11-token-login-dialog.c
-src/nma-pkcs11-token-login-dialog.ui
src/nma-ui-utils.c
src/nma-vpn-password-dialog.c
-src/nma-vpn-password-dialog.ui
src/nma-wifi-dialog.c
src/nma-ws/nma-eap-fast.c
-src/nma-ws/nma-eap-fast.ui
src/nma-ws/nma-eap-leap.c
-src/nma-ws/nma-eap-leap.ui
src/nma-ws/nma-eap-peap.c
-src/nma-ws/nma-eap-peap.ui
src/nma-ws/nma-eap-simple.c
-src/nma-ws/nma-eap-simple.ui
src/nma-ws/nma-eap-tls.c
-src/nma-ws/nma-eap-tls.ui
src/nma-ws/nma-eap-ttls.c
-src/nma-ws/nma-eap-ttls.ui
src/nma-ws/nma-eap.c
src/nma-ws/nma-ws-802-1x.c
-src/nma-ws/nma-ws-802-1x.ui
src/nma-ws/nma-ws-dynamic-wep.c
src/nma-ws/nma-ws-helpers.c
src/nma-ws/nma-ws-leap.c
-src/nma-ws/nma-ws-leap.ui
src/nma-ws/nma-ws-sae.c
-src/nma-ws/nma-ws-sae.ui
src/nma-ws/nma-ws-wep-key.c
-src/nma-ws/nma-ws-wep-key.ui
src/nma-ws/nma-ws-wpa-eap.c
src/nma-ws/nma-ws-wpa-psk.c
-src/nma-ws/nma-ws-wpa-psk.ui
src/nma-ws/nma-ws.c
+src/ui/gtk3/nma-bar-code-widget.ui
+src/ui/gtk3/nma-mobile-wizard.ui
+src/ui/gtk3/nma-pkcs11-cert-chooser-dialog.ui
+src/ui/gtk3/nma-pkcs11-token-login-dialog.ui
+src/ui/gtk3/nma-vpn-password-dialog.ui
+src/ui/gtk3/nma-ws/nma-eap-fast.ui
+src/ui/gtk3/nma-ws/nma-eap-leap.ui
+src/ui/gtk3/nma-ws/nma-eap-peap.ui
+src/ui/gtk3/nma-ws/nma-eap-simple.ui
+src/ui/gtk3/nma-ws/nma-eap-tls.ui
+src/ui/gtk3/nma-ws/nma-eap-ttls.ui
+src/ui/gtk3/nma-ws/nma-ws-802-1x.ui
+src/ui/gtk3/nma-ws/nma-ws-leap.ui
+src/ui/gtk3/nma-ws/nma-ws-sae.ui
+src/ui/gtk3/nma-ws/nma-ws-wep-key.ui
+src/ui/gtk3/nma-ws/nma-ws-wpa-psk.ui
+src/ui/gtk3/wifi.ui
+src/ui/gtk4/nma-bar-code-widget.ui
+src/ui/gtk4/nma-mobile-wizard.ui
+src/ui/gtk4/nma-pkcs11-cert-chooser-dialog.ui
+src/ui/gtk4/nma-pkcs11-token-login-dialog.ui
+src/ui/gtk4/nma-vpn-password-dialog.ui
+src/ui/gtk4/nma-ws/nma-eap-fast.ui
+src/ui/gtk4/nma-ws/nma-eap-leap.ui
+src/ui/gtk4/nma-ws/nma-eap-peap.ui
+src/ui/gtk4/nma-ws/nma-eap-simple.ui
+src/ui/gtk4/nma-ws/nma-eap-tls.ui
+src/ui/gtk4/nma-ws/nma-eap-ttls.ui
+src/ui/gtk4/nma-ws/nma-ws-802-1x.ui
+src/ui/gtk4/nma-ws/nma-ws-leap.ui
+src/ui/gtk4/nma-ws/nma-ws-sae.ui
+src/ui/gtk4/nma-ws/nma-ws-wep-key.ui
+src/ui/gtk4/nma-ws/nma-ws-wpa-psk.ui
+src/ui/gtk4/wifi.ui
src/utils/utils.c
-src/wifi.ui
diff --git a/src/meson.build b/src/meson.build
index 2064ddb0..6e1a15e4 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -16,21 +16,7 @@ version_header = configure_file(
subdir('utils')
subdir('nma-ws')
-
-resource_data = nma_ws_resource_data + files(
- 'nma-bar-code-widget.ui',
- 'nma-mobile-wizard.ui',
- 'nma-pkcs11-cert-chooser-dialog.ui',
- 'nma-pkcs11-token-login-dialog.ui',
- 'nma-vpn-password-dialog.ui',
- 'wifi.ui'
-)
-
-built_sources = gnome.compile_resources(
- 'nma-resources',
- 'nma.gresource.xml',
- dependencies: resource_data
-)
+subdir('ui')
gir_headers = nma_ws_headers + files(
'nma-bar-code-widget.h',
@@ -87,7 +73,7 @@ cflags = [
symbol_map = join_paths(meson.current_source_dir(), 'libnma.ver')
nma_deps = [ deps, gtk_dep ]
-nma_sources = [ gir_sources, built_sources ]
+nma_sources = [ gir_sources, ui_sources ]
if enable_gcr
nma_sources += files(
'nma-pkcs11-cert-chooser-dialog.c',
@@ -117,7 +103,7 @@ libnma_dep = declare_dependency(
if enable_libnma_gtk4
libnma_gtk4 = shared_library(
'nma-gtk4',
- sources: gir_sources + built_sources,
+ sources: gir_sources + ui_sources,
version: libversion,
include_directories: incs,
dependencies: [ deps, gtk4_dep ],
diff --git a/src/nma-ws/meson.build b/src/nma-ws/meson.build
index 7b94d4be..01db916e 100644
--- a/src/nma-ws/meson.build
+++ b/src/nma-ws/meson.build
@@ -1,19 +1,5 @@
nma_ws_inc = include_directories('.')
-nma_ws_resource_data = files(
- 'nma-eap-fast.ui',
- 'nma-eap-leap.ui',
- 'nma-eap-peap.ui',
- 'nma-eap-simple.ui',
- 'nma-eap-tls.ui',
- 'nma-eap-ttls.ui',
- 'nma-ws-802-1x.ui',
- 'nma-ws-leap.ui',
- 'nma-ws-sae.ui',
- 'nma-ws-wep-key.ui',
- 'nma-ws-wpa-psk.ui',
-)
-
nma_ws_headers = files(
'nma-ws-802-1x.h',
'nma-ws-dynamic-wep.h',
diff --git a/src/nma-bar-code-widget.ui b/src/ui/gtk3/nma-bar-code-widget.ui
similarity index 100%
rename from src/nma-bar-code-widget.ui
rename to src/ui/gtk3/nma-bar-code-widget.ui
diff --git a/src/nma-mobile-wizard.ui b/src/ui/gtk3/nma-mobile-wizard.ui
similarity index 100%
rename from src/nma-mobile-wizard.ui
rename to src/ui/gtk3/nma-mobile-wizard.ui
diff --git a/src/nma-pkcs11-cert-chooser-dialog.ui b/src/ui/gtk3/nma-pkcs11-cert-chooser-dialog.ui
similarity index 100%
rename from src/nma-pkcs11-cert-chooser-dialog.ui
rename to src/ui/gtk3/nma-pkcs11-cert-chooser-dialog.ui
diff --git a/src/nma-pkcs11-token-login-dialog.ui b/src/ui/gtk3/nma-pkcs11-token-login-dialog.ui
similarity index 100%
rename from src/nma-pkcs11-token-login-dialog.ui
rename to src/ui/gtk3/nma-pkcs11-token-login-dialog.ui
diff --git a/src/nma-vpn-password-dialog.ui b/src/ui/gtk3/nma-vpn-password-dialog.ui
similarity index 100%
rename from src/nma-vpn-password-dialog.ui
rename to src/ui/gtk3/nma-vpn-password-dialog.ui
diff --git a/src/nma-ws/nma-eap-fast.ui b/src/ui/gtk3/nma-ws/nma-eap-fast.ui
similarity index 100%
rename from src/nma-ws/nma-eap-fast.ui
rename to src/ui/gtk3/nma-ws/nma-eap-fast.ui
diff --git a/src/nma-ws/nma-eap-leap.ui b/src/ui/gtk3/nma-ws/nma-eap-leap.ui
similarity index 100%
rename from src/nma-ws/nma-eap-leap.ui
rename to src/ui/gtk3/nma-ws/nma-eap-leap.ui
diff --git a/src/nma-ws/nma-eap-peap.ui b/src/ui/gtk3/nma-ws/nma-eap-peap.ui
similarity index 100%
rename from src/nma-ws/nma-eap-peap.ui
rename to src/ui/gtk3/nma-ws/nma-eap-peap.ui
diff --git a/src/nma-ws/nma-eap-simple.ui b/src/ui/gtk3/nma-ws/nma-eap-simple.ui
similarity index 100%
rename from src/nma-ws/nma-eap-simple.ui
rename to src/ui/gtk3/nma-ws/nma-eap-simple.ui
diff --git a/src/nma-ws/nma-eap-tls.ui b/src/ui/gtk3/nma-ws/nma-eap-tls.ui
similarity index 100%
rename from src/nma-ws/nma-eap-tls.ui
rename to src/ui/gtk3/nma-ws/nma-eap-tls.ui
diff --git a/src/nma-ws/nma-eap-ttls.ui b/src/ui/gtk3/nma-ws/nma-eap-ttls.ui
similarity index 100%
rename from src/nma-ws/nma-eap-ttls.ui
rename to src/ui/gtk3/nma-ws/nma-eap-ttls.ui
diff --git a/src/nma-ws/nma-ws-802-1x.ui b/src/ui/gtk3/nma-ws/nma-ws-802-1x.ui
similarity index 100%
rename from src/nma-ws/nma-ws-802-1x.ui
rename to src/ui/gtk3/nma-ws/nma-ws-802-1x.ui
diff --git a/src/nma-ws/nma-ws-leap.ui b/src/ui/gtk3/nma-ws/nma-ws-leap.ui
similarity index 100%
rename from src/nma-ws/nma-ws-leap.ui
rename to src/ui/gtk3/nma-ws/nma-ws-leap.ui
diff --git a/src/nma-ws/nma-ws-sae.ui b/src/ui/gtk3/nma-ws/nma-ws-sae.ui
similarity index 100%
rename from src/nma-ws/nma-ws-sae.ui
rename to src/ui/gtk3/nma-ws/nma-ws-sae.ui
diff --git a/src/nma-ws/nma-ws-wep-key.ui b/src/ui/gtk3/nma-ws/nma-ws-wep-key.ui
similarity index 100%
rename from src/nma-ws/nma-ws-wep-key.ui
rename to src/ui/gtk3/nma-ws/nma-ws-wep-key.ui
diff --git a/src/nma-ws/nma-ws-wpa-psk.ui b/src/ui/gtk3/nma-ws/nma-ws-wpa-psk.ui
similarity index 100%
rename from src/nma-ws/nma-ws-wpa-psk.ui
rename to src/ui/gtk3/nma-ws/nma-ws-wpa-psk.ui
diff --git a/src/nma.gresource.xml b/src/ui/gtk3/nma.gresource.xml
similarity index 100%
rename from src/nma.gresource.xml
rename to src/ui/gtk3/nma.gresource.xml
diff --git a/src/wifi.ui b/src/ui/gtk3/wifi.ui
similarity index 100%
rename from src/wifi.ui
rename to src/ui/gtk3/wifi.ui
diff --git a/src/ui/gtk4/nma-bar-code-widget.ui b/src/ui/gtk4/nma-bar-code-widget.ui
new file mode 100644
index 00000000..a3c97e5b
--- /dev/null
+++ b/src/ui/gtk4/nma-bar-code-widget.ui
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface domain="libnma">
+ <requires lib="gtk" version="4.0"/>
+ <template class="NMABarCodeWidget" parent="GtkBox">
+ <property name="margin_start">6</property>
+ <property name="margin_end">6</property>
+ <property name="margin_top">6</property>
+ <property name="margin_bottom">6</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkAspectFrame">
+ <property name="hexpand">1</property>
+ <property name="vexpand">1</property>
+ <property name="child">
+ <object class="GtkDrawingArea" id="qr_code"/>
+ </property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="hexpand">0</property>
+ <property name="vexpand">0</property>
+ <property name="label" translatable="yes">Scan with your phone or &lt;a href=&quot;nma:print&quot;&gt;Print&lt;/a&gt;</property>
+ <property name="use_markup">1</property>
+ <signal name="activate-link" handler="link_activated" swapped="no"/>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/src/ui/gtk4/nma-mobile-wizard.ui b/src/ui/gtk4/nma-mobile-wizard.ui
new file mode 100644
index 00000000..f1264e9e
--- /dev/null
+++ b/src/ui/gtk4/nma-mobile-wizard.ui
@@ -0,0 +1,417 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface domain="libnma">
+ <requires lib="gtk" version="4.0"/>
+ <requires lib="gtk" version="4.0"/>
+ <object class="GtkTreeStore" id="country_store">
+ <columns>
+ <column type="gchararray"/>
+ <column type="NMACountryInfo"/>
+ </columns>
+ </object>
+ <object class="GtkTreeModelSort" id="country_sort">
+ <property name="model">country_store</property>
+ </object>
+ <object class="GtkTreeStore" id="dev_store">
+ <columns>
+ <column type="gchararray"/>
+ <column type="NMDevice"/>
+ <column type="gboolean"/>
+ </columns>
+ </object>
+ <object class="GtkTreeStore" id="plan_store">
+ <columns>
+ <column type="gchararray"/>
+ <column type="NMAMobileAccessMethod"/>
+ <column type="gboolean"/>
+ </columns>
+ </object>
+ <object class="GtkTreeStore" id="providers_store">
+ <columns>
+ <column type="gchararray"/>
+ <column type="NMAMobileProvider"/>
+ </columns>
+ </object>
+ <object class="GtkTreeModelSort" id="providers_sort">
+ <property name="model">providers_store</property>
+ </object>
+ <object class="GtkAssistant" id="assistant">
+ <property name="title" translatable="yes">New Mobile Broadband Connection</property>
+ <property name="modal">1</property>
+ <property name="use_header_bar">1</property>
+ <signal name="cancel" handler="assistant_cancel" swapped="no"/>
+ <signal name="close" handler="assistant_closed" swapped="no"/>
+ <signal name="prepare" handler="assistant_prepare" swapped="no"/>
+ <child>
+ <object class="GtkAssistantPage">
+ <property name="page_type">intro</property>
+ <property name="title" translatable="yes">Set up a Mobile Broadband Connection</property>
+ <property name="complete">1</property>
+ <property name="child">
+ <object class="GtkBox" id="intro_page">
+ <property name="visible">0</property>
+ <property name="margin_start">12</property>
+ <property name="margin_end">12</property>
+ <property name="margin_top">12</property>
+ <property name="margin_bottom">12</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="visible">0</property>
+ <property name="label" translatable="yes">This assistant helps you easily set up a mobile broadband connection to a cellular (3G) network.</property>
+ <property name="wrap">1</property>
+ <property name="max_width_chars">60</property>
+ <property name="xalign">0</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="visible">0</property>
+ <property name="label" translatable="yes">You will need the following information:</property>
+ <property name="wrap">1</property>
+ <property name="xalign">0</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="provider_name_label">
+ <property name="visible">0</property>
+ <property name="margin_start">25</property>
+ <property name="label" translatable="yes">Your broadband providers name</property>
+ <property name="xalign">0</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="plan_name_label">
+ <property name="visible">0</property>
+ <property name="margin_start">25</property>
+ <property name="label" translatable="yes">Your broadband billing plan name</property>
+ <property name="xalign">0</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="apn_label">
+ <property name="visible">0</property>
+ <property name="margin_start">25</property>
+ <property name="label" translatable="yes">(in some cases) Your broadband billing plan APN (Access Point Name)</property>
+ <property name="xalign">0</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="dev_combo_label">
+ <property name="visible">0</property>
+ <property name="valign">end</property>
+ <property name="vexpand">1</property>
+ <property name="label" translatable="yes">Create a connection for _this mobile broadband device:</property>
+ <property name="use_underline">1</property>
+ <property name="xalign">0</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkComboBox" id="dev_combo">
+ <property name="visible">0</property>
+ <property name="sensitive">0</property>
+ <property name="model">dev_store</property>
+ <property name="active">0</property>
+ <signal name="changed" handler="intro_combo_changed" swapped="yes"/>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkAssistantPage">
+ <property name="title" translatable="yes">Choose your Providers Country or Region</property>
+ <property name="child">
+ <object class="GtkBox" id="country_page">
+ <property name="visible">0</property>
+ <property name="margin_start">12</property>
+ <property name="margin_end">12</property>
+ <property name="margin_top">12</property>
+ <property name="margin_bottom">12</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="visible">0</property>
+ <property name="label" translatable="yes">Country or region:</property>
+ <property name="xalign">0</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow">
+ <property name="visible">0</property>
+ <property name="focusable">1</property>
+ <property name="vexpand">1</property>
+ <property name="hscrollbar_policy">never</property>
+ <property name="child">
+ <object class="GtkTreeView" id="country_view">
+ <property name="visible">0</property>
+ <property name="focusable">1</property>
+ <property name="hexpand">1</property>
+ <property name="vexpand">1</property>
+ <property name="model">country_sort</property>
+ <property name="headers_visible">0</property>
+ <property name="search_column">0</property>
+ <signal name="row-activated" handler="country_update_continue" swapped="yes"/>
+ <child internal-child="selection">
+ <object class="GtkTreeSelection"/>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkAssistantPage">
+ <property name="title" translatable="yes">Choose your Provider</property>
+ <property name="child">
+ <object class="GtkBox" id="providers_page">
+ <property name="visible">0</property>
+ <property name="margin_start">12</property>
+ <property name="margin_end">12</property>
+ <property name="margin_top">12</property>
+ <property name="margin_bottom">12</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkCheckButton" id="providers_view_radio">
+ <property name="visible">0</property>
+ <property name="label" translatable="yes">Select your provider from a _list:</property>
+ <property name="use_underline">1</property>
+ <property name="active">1</property>
+ <signal name="toggled" handler="providers_radio_toggled" swapped="no"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow">
+ <property name="visible">0</property>
+ <property name="height_request">140</property>
+ <property name="focusable">1</property>
+ <property name="margin_start">25</property>
+ <property name="vexpand">1</property>
+ <property name="hscrollbar_policy">never</property>
+ <property name="child">
+ <object class="GtkTreeView" id="providers_view">
+ <property name="visible">0</property>
+ <property name="focusable">1</property>
+ <property name="model">providers_sort</property>
+ <property name="search_column">0</property>
+ <signal name="row-activated" handler="providers_update_continue" swapped="yes"/>
+ <child internal-child="selection">
+ <object class="GtkTreeSelection"/>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="provider_unlisted_radio">
+ <property name="visible">0</property>
+ <property name="label" translatable="yes">I cant find my provider and I wish to set up the connection _manually:</property>
+ <property name="use_underline">1</property>
+ <property name="group">providers_view_radio</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkComboBoxText" id="provider_unlisted_type_combo">
+ <property name="visible">0</property>
+ <property name="margin_start">25</property>
+ <property name="active">0</property>
+ <items>
+ <item id="0" translatable="yes">My provider uses GSM technology (GPRS, EDGE, UMTS, HSPA)</item>
+ <item id="1" translatable="yes">My provider uses CDMA technology (1xRTT, EVDO)</item>
+ </items>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkAssistantPage">
+ <property name="title" translatable="yes">Choose your Billing Plan</property>
+ <property name="child">
+ <object class="GtkBox" id="plan_page">
+ <property name="visible">0</property>
+ <property name="margin_start">12</property>
+ <property name="margin_end">12</property>
+ <property name="margin_top">12</property>
+ <property name="margin_bottom">12</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="visible">0</property>
+ <property name="label" translatable="yes">_Select your plan:</property>
+ <property name="use_underline">1</property>
+ <property name="xalign">0</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkComboBox" id="plan_combo">
+ <property name="visible">0</property>
+ <property name="model">plan_store</property>
+ <signal name="changed" handler="plan_combo_changed" swapped="yes"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="visible">0</property>
+ <property name="label" translatable="yes">Selected plan _APN (Access Point Name):</property>
+ <property name="use_underline">1</property>
+ <property name="xalign">0</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkEntry" id="plan_apn_entry">
+ <property name="visible">0</property>
+ <property name="focusable">1</property>
+ <property name="max_length">64</property>
+ <signal name="changed" handler="plan_update_complete" swapped="yes"/>
+ <signal name="insert-text" handler="apn_filter_cb" swapped="no"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">0</property>
+ <property name="valign">end</property>
+ <property name="vexpand">1</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkImage">
+ <property name="visible">0</property>
+ <property name="valign">start</property>
+ <property name="icon_name">dialog-warning</property>
+ <property name="icon_size">6</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="visible">0</property>
+ <property name="width_request">500</property>
+ <property name="label" translatable="yes">Warning: Selecting an incorrect plan may result in billing issues for your broadband account or may prevent connectivity.
+
+If you are unsure of your plan please ask your provider for your plans APN.</property>
+ <property name="wrap">1</property>
+ <property name="max_width_chars">60</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkAssistantPage">
+ <property name="page_type">confirm</property>
+ <property name="title" translatable="yes">Confirm Mobile Broadband Settings</property>
+ <property name="complete">1</property>
+ <property name="child">
+ <object class="GtkBox" id="confirm_page">
+ <property name="visible">0</property>
+ <property name="margin_start">12</property>
+ <property name="margin_end">12</property>
+ <property name="margin_top">12</property>
+ <property name="margin_bottom">12</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="visible">0</property>
+ <property name="width_request">500</property>
+ <property name="label" translatable="yes">Your mobile broadband connection is configured with the following settings:</property>
+ <property name="wrap">1</property>
+ <property name="xalign">0</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="confirm_device_label">
+ <property name="visible">0</property>
+ <property name="label" translatable="yes">Your Device:</property>
+ <property name="xalign">0</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="confirm_device">
+ <property name="visible">0</property>
+ <property name="margin_start">25</property>
+ <property name="xalign">0</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="visible">0</property>
+ <property name="label" translatable="yes">Your Provider:</property>
+ <property name="xalign">0</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="confirm_provider">
+ <property name="visible">0</property>
+ <property name="margin_start">25</property>
+ <property name="xalign">0</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="confirm_plan_label">
+ <property name="visible">0</property>
+ <property name="label" translatable="yes">Your Plan:</property>
+ <property name="xalign">0</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">0</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkLabel" id="confirm_plan">
+ <property name="visible">0</property>
+ <property name="margin_start">25</property>
+ <property name="xalign">0</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="confirm_apn">
+ <property name="visible">0</property>
+ <property name="margin_start">25</property>
+ <property name="xalign">0</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="confirm_connect_after_label">
+ <property name="visible">0</property>
+ <property name="width_request">500</property>
+ <property name="valign">end</property>
+ <property name="vexpand">1</property>
+ <property name="label" translatable="yes">A connection will now be made to your mobile broadband provider using the settings you selected. If the connection fails or you cannot access network resources, double-check your settings. To modify your mobile broadband connection settings, choose “Network Connections” from the System → Preferences menu.</property>
+ <property name="wrap">1</property>
+ <property name="max_width_chars">60</property>
+ <property name="xalign">0</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child internal-child="action_area">
+ <object class="GtkAssistantPage">
+ <property name="child">
+ <object class="GtkBox">
+ <property name="visible">0</property>
+ </object>
+ </property>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/src/ui/gtk4/nma-pkcs11-cert-chooser-dialog.ui b/src/ui/gtk4/nma-pkcs11-cert-chooser-dialog.ui
new file mode 100644
index 00000000..0327dea3
--- /dev/null
+++ b/src/ui/gtk4/nma-pkcs11-cert-chooser-dialog.ui
@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface domain="gtk30">
+ <requires lib="gtk" version="4.0"/>
+ <requires lib="gtk" version="4.0"/>
+ <template class="NMAPkcs11CertChooserDialog" parent="GtkDialog">
+ <property name="accessible_role">NMAPkcs11CertChooserDialog</property>
+ <child internal-child="content_area">
+ <object class="GtkBox" id="dialog-vbox1">
+ <property name="visible">0</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">0</property>
+ <property name="vexpand">1</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkRevealer" id="error_revealer">
+ <property name="visible">0</property>
+ <property name="child">
+ <object class="GtkInfoBar" id="error_bar">
+ <property name="visible">0</property>
+ <property name="message_type">error</property>
+ <property name="show_close_button">1</property>
+ <signal name="response" handler="error_close" swapped="no"/>
+ <child internal-child="action_area">
+ <object class="GtkBox">
+ <property name="visible">0</property>
+ </object>
+ </child>
+ <child internal-child="content_area">
+ <object class="GtkBox">
+ <property name="visible">0</property>
+ <child>
+ <object class="GtkLabel" id="error_label">
+ <property name="visible">0</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow">
+ <property name="visible">0</property>
+ <property name="vexpand">1</property>
+ <property name="width_request">300</property>
+ <property name="height_request">200</property>
+ <property name="hscrollbar_policy">never</property>
+ <property name="child">
+ <object class="GtkTreeView" id="objects_view">
+ <property name="visible">0</property>
+ <property name="enable_search">0</property>
+ <signal name="cursor-changed" handler="cursor_changed" swapped="no"/>
+ <signal name="row-activated" handler="row_activated" swapped="no"/>
+ <child internal-child="selection">
+ <object class="GtkTreeSelection" id="objects_view_selection"/>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn" id="list_name_column">
+ <property name="title" translatable="yes">Name</property>
+ <child>
+ <object class="GtkCellRendererText" id="list_name_renderer">
+ <property name="xpad">6</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn" id="list_issued_by_column">
+ <property name="title" translatable="yes">Issued By</property>
+ <child>
+ <object class="GtkCellRendererText" id="list_issued_by_renderer">
+ <property name="xpad">6</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child internal-child="action_area">
+ <object class="GtkBox" id="dialog-action_area1">
+ <property name="visible">0</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkButton" id="login_button">
+ <property name="visible">0</property>
+ <property name="label" translatable="yes">_Unlock token</property>
+ <property name="focusable">1</property>
+ <property name="receives_default">1</property>
+ <property name="use_underline">1</property>
+ <signal name="clicked" handler="login_clicked" swapped="no"/>
+ </object>
+ </child>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/src/ui/gtk4/nma-pkcs11-token-login-dialog.ui b/src/ui/gtk4/nma-pkcs11-token-login-dialog.ui
new file mode 100644
index 00000000..f095361b
--- /dev/null
+++ b/src/ui/gtk4/nma-pkcs11-token-login-dialog.ui
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface domain="libnma">
+ <requires lib="gtk" version="4.0"/>
+ <requires lib="gtk" version="4.0"/>
+ <template class="NMAPkcs11TokenLoginDialog" parent="GtkDialog">
+ <child internal-child="content_area">
+ <object class="GtkBox">
+ <property name="visible">0</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">2</property>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">0</property>
+ <property name="margin_start">12</property>
+ <property name="margin_end">12</property>
+ <property name="margin_top">12</property>
+ <property name="margin_bottom">12</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkEntry" id="pin_entry">
+ <property name="visible">0</property>
+ <property name="focusable">1</property>
+ <property name="visibility">0</property>
+ <property name="input_purpose">password</property>
+ <signal name="activate" handler="pin_activate" swapped="no"/>
+ <signal name="changed" handler="pin_changed" swapped="no"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="remember">
+ <property name="visible">0</property>
+ <property name="label" translatable="yes">_Remember PIN</property>
+ <property name="focusable">1</property>
+ <property name="halign">start</property>
+ <property name="use_underline">1</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="-6">cancel</action-widget>
+ <action-widget response="-3">login</action-widget>
+ </action-widgets>
+ <child internal-child="action_area">
+ <object class="GtkBox">
+ <property name="visible">0</property>
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkButton" id="cancel">
+ <property name="hexpand">1</property>
+ <property name="visible">0</property>
+ <property name="label" translatable="yes">_Cancel</property>
+ <property name="use_underline">1</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="login">
+ <property name="hexpand">1</property>
+ <property name="visible">0</property>
+ <property name="label" translatable="yes">_Login</property>
+ <property name="use_underline">1</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/src/ui/gtk4/nma-vpn-password-dialog.ui b/src/ui/gtk4/nma-vpn-password-dialog.ui
new file mode 100644
index 00000000..e94fc92d
--- /dev/null
+++ b/src/ui/gtk4/nma-vpn-password-dialog.ui
@@ -0,0 +1,186 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface domain="libnma">
+ <requires lib="gtk" version="4.0"/>
+ <template class="NMAVpnPasswordDialog" parent="GtkDialog">
+ <property name="resizable">0</property>
+ <property name="modal">1</property>
+ <signal name="close" handler="dialog_close_callback" swapped="no"/>
+ <signal name="show" handler="dialog_show_callback" swapped="no"/>
+ <signal name="response" handler="dialog_response_callback" swapped="no"/>
+ <child internal-child="content_area">
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkGrid">
+ <property name="margin_start">12</property>
+ <property name="margin_end">12</property>
+ <property name="margin_top">12</property>
+ <property name="margin_bottom">12</property>
+ <property name="row_spacing">6</property>
+ <property name="column_spacing">12</property>
+ <child>
+ <object class="GtkCheckButton" id="show_passwords_checkbox">
+ <property name="label" translatable="yes">Sh_ow passwords</property>
+ <property name="focusable">1</property>
+ <property name="use_underline">1</property>
+ <property name="halign">start</property>
+ <signal name="toggled" handler="show_passwords_toggled_cb" swapped="no"/>
+ <layout>
+ <property name="column">2</property>
+ <property name="row">4</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkEntry" id="password_entry_tertiary">
+ <property name="visible">0</property>
+ <property name="focusable">1</property>
+ <property name="visibility">0</property>
+ <property name="width_chars">20</property>
+ <signal name="activate" handler="entry_activate_cb"/>
+ <layout>
+ <property name="column">2</property>
+ <property name="row">3</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkEntry" id="password_entry_secondary">
+ <property name="visible">0</property>
+ <property name="focusable">1</property>
+ <property name="visibility">0</property>
+ <property name="width_chars">20</property>
+ <signal name="activate" handler="entry_activate_cb"/>
+ <layout>
+ <property name="column">2</property>
+ <property name="row">2</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkEntry" id="password_entry">
+ <property name="focusable">1</property>
+ <property name="visibility">0</property>
+ <property name="width_chars">20</property>
+ <signal name="activate" handler="entry_activate_cb"/>
+ <layout>
+ <property name="column">2</property>
+ <property name="row">1</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="password_label_tertiary">
+ <property name="visible">0</property>
+ <property name="label" translatable="yes">_Tertiary Password:</property>
+ <property name="use_underline">1</property>
+ <property name="mnemonic_widget">password_entry_tertiary</property>
+ <property name="xalign">0</property>
+ <layout>
+ <property name="column">1</property>
+ <property name="row">3</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="password_label_secondary">
+ <property name="visible">0</property>
+ <property name="label" translatable="yes">_Secondary Password:</property>
+ <property name="use_underline">1</property>
+ <property name="mnemonic_widget">password_entry_secondary</property>
+ <property name="xalign">0</property>
+ <layout>
+ <property name="column">1</property>
+ <property name="row">2</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="password_label">
+ <property name="label" translatable="yes">_Password:</property>
+ <property name="use_underline">1</property>
+ <property name="mnemonic_widget">password_entry</property>
+ <property name="xalign">0</property>
+ <layout>
+ <property name="column">1</property>
+ <property name="row">1</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="message_label">
+ <property name="visible">0</property>
+ <property name="halign">start</property>
+ <property name="margin_bottom">12</property>
+ <property name="hexpand">1</property>
+ <property name="wrap">1</property>
+ <property name="max_width_chars">35</property>
+ <layout>
+ <property name="column">1</property>
+ <property name="row">0</property>
+ <property name="column-span">2</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImage">
+ <property name="margin_start">6</property>
+ <property name="margin_end">12</property>
+ <property name="margin_top">6</property>
+ <property name="margin_bottom">6</property>
+ <property name="valign">start</property>
+ <property name="icon_name">dialog-password</property>
+ <property name="icon_size">6</property>
+ <layout>
+ <property name="column">0</property>
+ <property name="row">0</property>
+ <property name="row-span">5</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="-6">cancel_button</action-widget>
+ <action-widget response="-5">ok_button</action-widget>
+ </action-widgets>
+ <child>
+ <placeholder/>
+ </child>
+ <child internal-child="action_area">
+ <object class="GtkBox">
+ <property name="valign">center</property>
+ <property name="spacing">6</property>
+ <property name="margin_start">6</property>
+ <property name="margin_end">6</property>
+ <property name="margin_top">6</property>
+ <property name="margin_bottom">6</property>
+ <child>
+ <object class="GtkButton" id="cancel_button">
+ <property name="hexpand">1</property>
+ <property name="label" translatable="yes">_Cancel</property>
+ <property name="focusable">1</property>
+ <property name="receives_default">1</property>
+ <property name="valign">baseline</property>
+ <property name="use_underline">1</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="ok_button">
+ <property name="hexpand">1</property>
+ <property name="label" translatable="yes">_OK</property>
+ <property name="focusable">1</property>
+ <property name="receives_default">1</property>
+ <property name="valign">baseline</property>
+ <property name="use_underline">1</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/src/ui/gtk4/nma-ws/nma-eap-fast.ui b/src/ui/gtk4/nma-ws/nma-eap-fast.ui
new file mode 100644
index 00000000..1c3621cc
--- /dev/null
+++ b/src/ui/gtk4/nma-ws/nma-eap-fast.ui
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface domain="libnma">
+ <requires lib="gtk" version="4.0"/>
+ <object class="GtkFileChooserDialog" id="eap_fast_pac_file_chooser">
+ <action-widgets>
+ <action-widget response="-6">cancel_button</action-widget>
+ <action-widget response="-3">open_button</action-widget>
+ </action-widgets>
+ <child type="titlebar">
+ <object class="GtkHeaderBar">
+ <child type="title">
+ <object class="GtkLabel">
+ <property name="label" translatable="yes">Choose a PAC file</property>
+ <style>
+ <class name="title"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="cancel_button">
+ <property name="label" translatable="yes">_Cancel</property>
+ <property name="focusable">1</property>
+ <property name="receives-default">1</property>
+ <property name="use-underline">1</property>
+ </object>
+ </child>
+ <child type="end">
+ <object class="GtkButton" id="open_button">
+ <property name="label" translatable="yes">_Open</property>
+ <property name="focusable">1</property>
+ <property name="receives-default">1</property>
+ <property name="use-underline">1</property>
+ <style>
+ <class name="default"/>
+ <class name="suggested-action"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ <object class="GtkListStore" id="model8">
+ <columns>
+ <column type="gchararray"/>
+ </columns>
+ <data>
+ <row>
+ <col id="0"> </col>
+ </row>
+ </data>
+ </object>
+ <object class="GtkListStore" id="model9">
+ <columns>
+ <column type="gchararray"/>
+ </columns>
+ <data>
+ <row>
+ <col id="0" translatable="yes">Anonymous</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">Authenticated</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">Both</col>
+ </row>
+ </data>
+ </object>
+ <object class="GtkGrid" id="eap_fast_grid">
+ <property name="row_spacing">6</property>
+ <property name="column_spacing">6</property>
+ <child>
+ <object class="GtkLabel" id="eap_fast_anon_identity_label">
+ <property name="label" translatable="yes">Anony_mous identity</property>
+ <property name="use_underline">1</property>
+ <property name="mnemonic_widget">eap_fast_anon_identity_entry</property>
+ <property name="xalign">1</property>
+ <layout>
+ <property name="column">0</property>
+ <property name="row">0</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkEntry" id="eap_fast_anon_identity_entry">
+ <property name="focusable">1</property>
+ <property name="hexpand">1</property>
+ <property name="activates_default">1</property>
+ <layout>
+ <property name="column">1</property>
+ <property name="row">0</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="eap_fast_pac_file_label">
+ <property name="label" translatable="yes">PAC _file</property>
+ <property name="use_underline">1</property>
+ <property name="mnemonic_widget">eap_fast_pac_file_button</property>
+ <property name="xalign">1</property>
+ <layout>
+ <property name="column">0</property>
+ <property name="row">2</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="eap_fast_pac_file_button">
+ <child>
+ <object class="GtkBox">
+ <child>
+ <object class="GtkLabel" id="eap_fast_pac_file_button_label">
+ <property name="hexpand">1</property>
+ <property name="xalign">0</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImage">
+ <property name="icon-name">document-open-symbolic</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <layout>
+ <property name="column">1</property>
+ <property name="row">2</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="eap_fast_inner_auth_vbox">
+ <property name="orientation">vertical</property>
+ <child>
+ <placeholder/>
+ </child>
+ <layout>
+ <property name="column">0</property>
+ <property name="row">4</property>
+ <property name="column-span">2</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="eap_fast_inner_auth_label">
+ <property name="label" translatable="yes">_Inner authentication</property>
+ <property name="use_underline">1</property>
+ <property name="mnemonic_widget">eap_fast_inner_auth_combo</property>
+ <property name="xalign">1</property>
+ <layout>
+ <property name="column">0</property>
+ <property name="row">3</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkComboBox" id="eap_fast_inner_auth_combo">
+ <property name="model">model8</property>
+ <child>
+ <object class="GtkCellRendererText" id="renderer8"/>
+ <attributes>
+ <attribute name="text">0</attribute>
+ </attributes>
+ </child>
+ <layout>
+ <property name="column">1</property>
+ <property name="row">3</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="eap_fast_pac_provision_checkbutton">
+ <property name="label" translatable="yes">Allow automatic PAC pro_visioning</property>
+ <property name="focusable">1</property>
+ <property name="use_underline">1</property>
+ <layout>
+ <property name="column">0</property>
+ <property name="row">1</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkComboBox" id="eap_fast_pac_provision_combo">
+ <property name="model">model9</property>
+ <child>
+ <object class="GtkCellRendererText" id="renderer9"/>
+ <attributes>
+ <attribute name="text">0</attribute>
+ </attributes>
+ </child>
+ <layout>
+ <property name="column">1</property>
+ <property name="row">1</property>
+ </layout>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/src/ui/gtk4/nma-ws/nma-eap-leap.ui b/src/ui/gtk4/nma-ws/nma-eap-leap.ui
new file mode 100644
index 00000000..89f6f4f2
--- /dev/null
+++ b/src/ui/gtk4/nma-ws/nma-eap-leap.ui
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface domain="libnma">
+ <requires lib="gtk" version="4.0"/>
+ <object class="GtkGrid" id="eap_leap_grid">
+ <property name="valign">start</property>
+ <property name="row_spacing">6</property>
+ <property name="column_spacing">6</property>
+ <child>
+ <object class="GtkLabel" id="eap_leap_username_label">
+ <property name="label" translatable="yes">_Username</property>
+ <property name="use_underline">1</property>
+ <property name="mnemonic_widget">eap_leap_username_entry</property>
+ <property name="xalign">1</property>
+ <layout>
+ <property name="column">0</property>
+ <property name="row">0</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="eap_leap_password_label">
+ <property name="label" translatable="yes">_Password</property>
+ <property name="use_underline">1</property>
+ <property name="mnemonic_widget">eap_leap_password_entry</property>
+ <property name="xalign">1</property>
+ <layout>
+ <property name="column">0</property>
+ <property name="row">1</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkEntry" id="eap_leap_password_entry">
+ <property name="focusable">1</property>
+ <property name="hexpand">1</property>
+ <property name="visibility">0</property>
+ <property name="activates_default">1</property>
+ <layout>
+ <property name="column">1</property>
+ <property name="row">1</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="show_checkbutton_eapleap">
+ <property name="label" translatable="yes">Sho_w password</property>
+ <property name="focusable">1</property>
+ <property name="hexpand">1</property>
+ <property name="use_underline">1</property>
+ <layout>
+ <property name="column">1</property>
+ <property name="row">2</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkEntry" id="eap_leap_username_entry">
+ <property name="focusable">1</property>
+ <property name="hexpand">1</property>
+ <layout>
+ <property name="column">1</property>
+ <property name="row">0</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+</interface>
diff --git a/src/ui/gtk4/nma-ws/nma-eap-peap.ui b/src/ui/gtk4/nma-ws/nma-eap-peap.ui
new file mode 100644
index 00000000..2673f9ed
--- /dev/null
+++ b/src/ui/gtk4/nma-ws/nma-eap-peap.ui
@@ -0,0 +1,171 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface domain="libnma">
+ <requires lib="gtk" version="4.0"/>
+ <object class="GtkListStore" id="model8">
+ <columns>
+ <column type="gchararray"/>
+ </columns>
+ <data>
+ <row>
+ <col id="0"> </col>
+ </row>
+ </data>
+ </object>
+ <object class="GtkListStore" id="model9">
+ <columns>
+ <column type="gchararray"/>
+ </columns>
+ <data>
+ <row>
+ <col id="0" translatable="yes">Automatic</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">Version 0</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">Version 1</col>
+ </row>
+ </data>
+ </object>
+ <object class="GtkGrid" id="eap_peap_grid">
+ <property name="row_spacing">6</property>
+ <property name="column_spacing">6</property>
+ <child>
+ <object class="GtkLabel" id="eap_peap_anon_identity_label">
+ <property name="label" translatable="yes">Anony_mous identity</property>
+ <property name="use_underline">1</property>
+ <property name="mnemonic_widget">eap_peap_anon_identity_entry</property>
+ <property name="xalign">1</property>
+ <layout>
+ <property name="column">0</property>
+ <property name="row">0</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkEntry" id="eap_peap_anon_identity_entry">
+ <property name="focusable">1</property>
+ <property name="hexpand">1</property>
+ <property name="activates_default">1</property>
+ <layout>
+ <property name="column">1</property>
+ <property name="row">0</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="eap_peap_ca_cert_not_required_checkbox">
+ <property name="label" translatable="yes">No CA certificate is _required</property>
+ <property name="focusable">1</property>
+ <property name="hexpand">1</property>
+ <property name="use_underline">1</property>
+ <layout>
+ <property name="column">1</property>
+ <property name="row">3</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="eap_peap_version_label">
+ <property name="label" translatable="yes">PEAP _version</property>
+ <property name="use_underline">1</property>
+ <property name="mnemonic_widget">eap_peap_version_combo</property>
+ <property name="xalign">1</property>
+ <layout>
+ <property name="column">0</property>
+ <property name="row">4</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkComboBox" id="eap_peap_version_combo">
+ <property name="hexpand">1</property>
+ <property name="model">model9</property>
+ <child>
+ <object class="GtkCellRendererText" id="renderer9"/>
+ <attributes>
+ <attribute name="text">0</attribute>
+ </attributes>
+ </child>
+ <layout>
+ <property name="column">1</property>
+ <property name="row">4</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="eap_peap_inner_auth_label">
+ <property name="label" translatable="yes">_Inner authentication</property>
+ <property name="use_underline">1</property>
+ <property name="mnemonic_widget">eap_peap_inner_auth_combo</property>
+ <property name="xalign">1</property>
+ <layout>
+ <property name="column">0</property>
+ <property name="row">5</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkComboBox" id="eap_peap_inner_auth_combo">
+ <property name="hexpand">1</property>
+ <property name="model">model8</property>
+ <child>
+ <object class="GtkCellRendererText" id="renderer8"/>
+ <attributes>
+ <attribute name="text">0</attribute>
+ </attributes>
+ </child>
+ <layout>
+ <property name="column">1</property>
+ <property name="row">5</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="eap_peap_inner_auth_vbox">
+ <property name="orientation">vertical</property>
+ <child>
+ <placeholder/>
+ </child>
+ <layout>
+ <property name="column">0</property>
+ <property name="row">6</property>
+ <property name="column-span">2</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="eap_peap_domain_label">
+ <property name="tooltip_text" translatable="yes">Suffix of the server certificate name.</property>
+ <property name="label" translatable="yes">_Domain</property>
+ <property name="use_underline">1</property>
+ <property name="mnemonic_widget">eap_peap_domain_entry</property>
+ <property name="xalign">1</property>
+ <layout>
+ <property name="column">0</property>
+ <property name="row">1</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkEntry" id="eap_peap_domain_entry">
+ <property name="focusable">1</property>
+ <property name="hexpand">1</property>
+ <property name="activates_default">1</property>
+ <layout>
+ <property name="column">1</property>
+ <property name="row">1</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+</interface>
diff --git a/src/ui/gtk4/nma-ws/nma-eap-simple.ui b/src/ui/gtk4/nma-ws/nma-eap-simple.ui
new file mode 100644
index 00000000..fab6fdb0
--- /dev/null
+++ b/src/ui/gtk4/nma-ws/nma-eap-simple.ui
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface domain="libnma">
+ <requires lib="gtk" version="4.0"/>
+ <object class="GtkGrid" id="eap_simple_grid">
+ <property name="valign">start</property>
+ <property name="row_spacing">6</property>
+ <property name="column_spacing">6</property>
+ <child>
+ <object class="GtkLabel" id="eap_simple_username_label">
+ <property name="label" translatable="yes">_Username</property>
+ <property name="use_underline">1</property>
+ <property name="mnemonic_widget">eap_simple_username_entry</property>
+ <property name="xalign">1</property>
+ <layout>
+ <property name="column">0</property>
+ <property name="row">0</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="eap_simple_password_label">
+ <property name="label" translatable="yes">_Password</property>
+ <property name="use_underline">1</property>
+ <property name="mnemonic_widget">eap_simple_password_entry</property>
+ <property name="xalign">1</property>
+ <layout>
+ <property name="column">0</property>
+ <property name="row">1</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkEntry" id="eap_simple_password_entry">
+ <property name="focusable">1</property>
+ <property name="hexpand">1</property>
+ <property name="visibility">0</property>
+ <property name="activates_default">1</property>
+ <layout>
+ <property name="column">1</property>
+ <property name="row">1</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkEntry" id="eap_simple_username_entry">
+ <property name="focusable">1</property>
+ <property name="hexpand">1</property>
+ <property name="activates_default">1</property>
+ <layout>
+ <property name="column">1</property>
+ <property name="row">0</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="vbox5">
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkCheckButton" id="show_checkbutton_eapsimple">
+ <property name="vexpand">1</property>
+ <property name="label" translatable="yes">Sho_w password</property>
+ <property name="focusable">1</property>
+ <property name="use_underline">1</property>
+ </object>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <layout>
+ <property name="column">1</property>
+ <property name="row">2</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="eap_simple_pkey_passphrase_label">
+ <property name="label" translatable="yes">P_rivate Key Passphrase</property>
+ <property name="use_underline">1</property>
+ <property name="mnemonic_widget">eap_simple_pkey_passphrase_entry</property>
+ <property name="xalign">1</property>
+ <layout>
+ <property name="column">0</property>
+ <property name="row">3</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkEntry" id="eap_simple_pkey_passphrase_entry">
+ <property name="focusable">1</property>
+ <property name="hexpand">1</property>
+ <property name="visibility">0</property>
+ <property name="activates_default">1</property>
+ <layout>
+ <property name="column">1</property>
+ <property name="row">3</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="eap_simple_show_pkey_passphrase_checkbutton">
+ <property name="label" translatable="yes">Sh_ow passphrase</property>
+ <property name="focusable">1</property>
+ <property name="use_underline">1</property>
+ <layout>
+ <property name="column">1</property>
+ <property name="row">4</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+</interface>
diff --git a/src/ui/gtk4/nma-ws/nma-eap-tls.ui b/src/ui/gtk4/nma-ws/nma-eap-tls.ui
new file mode 100644
index 00000000..07126fb9
--- /dev/null
+++ b/src/ui/gtk4/nma-ws/nma-eap-tls.ui
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface domain="libnma">
+ <requires lib="gtk" version="4.0"/>
+ <object class="GtkGrid" id="eap_tls_grid">
+ <property name="row_spacing">6</property>
+ <property name="column_spacing">6</property>
+ <child>
+ <object class="GtkLabel" id="eap_tls_identity_label">
+ <property name="label" translatable="yes">I_dentity</property>
+ <property name="use_underline">1</property>
+ <property name="mnemonic_widget">eap_tls_identity_entry</property>
+ <property name="xalign">1</property>
+ <layout>
+ <property name="column">0</property>
+ <property name="row">0</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkEntry" id="eap_tls_identity_entry">
+ <property name="focusable">1</property>
+ <property name="hexpand">1</property>
+ <property name="activates_default">1</property>
+ <layout>
+ <property name="column">1</property>
+ <property name="row">0</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="eap_tls_ca_cert_not_required_checkbox">
+ <property name="label" translatable="yes">No CA certificate is _required</property>
+ <property name="focusable">1</property>
+ <property name="halign">start</property>
+ <property name="hexpand">1</property>
+ <property name="use_underline">1</property>
+ <layout>
+ <property name="column">1</property>
+ <property name="row">3</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="eap_tls_domain_label">
+ <property name="tooltip_text" translatable="yes">Suffix of the server certificate name.</property>
+ <property name="label" translatable="yes">_Domain</property>
+ <property name="use_underline">1</property>
+ <property name="mnemonic_widget">eap_tls_domain_entry</property>
+ <property name="xalign">1</property>
+ <layout>
+ <property name="column">0</property>
+ <property name="row">1</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkEntry" id="eap_tls_domain_entry">
+ <property name="focusable">1</property>
+ <property name="hexpand">1</property>
+ <property name="activates_default">1</property>
+ <layout>
+ <property name="column">1</property>
+ <property name="row">1</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+</interface>
diff --git a/src/ui/gtk4/nma-ws/nma-eap-ttls.ui b/src/ui/gtk4/nma-ws/nma-eap-ttls.ui
new file mode 100644
index 00000000..04f726c6
--- /dev/null
+++ b/src/ui/gtk4/nma-ws/nma-eap-ttls.ui
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface domain="libnma">
+ <requires lib="gtk" version="4.0"/>
+ <object class="GtkListStore" id="model6">
+ <columns>
+ <column type="gchararray"/>
+ </columns>
+ <data>
+ <row>
+ <col id="0"> </col>
+ </row>
+ </data>
+ </object>
+ <object class="GtkGrid" id="eap_ttls_grid">
+ <property name="row_spacing">6</property>
+ <property name="column_spacing">6</property>
+ <child>
+ <object class="GtkEntry" id="eap_ttls_anon_identity_entry">
+ <property name="focusable">1</property>
+ <property name="hexpand">1</property>
+ <property name="activates_default">1</property>
+ <layout>
+ <property name="column">1</property>
+ <property name="row">0</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="eap_ttls_inner_auth_vbox">
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child>
+ <placeholder/>
+ </child>
+ <layout>
+ <property name="column">0</property>
+ <property name="row">5</property>
+ <property name="column-span">2</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkComboBox" id="eap_ttls_inner_auth_combo">
+ <property name="hexpand">1</property>
+ <property name="model">model6</property>
+ <child>
+ <object class="GtkCellRendererText" id="renderer6"/>
+ <attributes>
+ <attribute name="text">0</attribute>
+ </attributes>
+ </child>
+ <layout>
+ <property name="column">1</property>
+ <property name="row">4</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="eap_ttls_inner_auth_label">
+ <property name="label" translatable="yes">_Inner authentication</property>
+ <property name="use_underline">1</property>
+ <property name="mnemonic_widget">eap_ttls_inner_auth_combo</property>
+ <property name="xalign">1</property>
+ <layout>
+ <property name="column">0</property>
+ <property name="row">4</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="eap_ttls_ca_cert_not_required_checkbox">
+ <property name="label" translatable="yes">No CA certificate is _required</property>
+ <property name="focusable">1</property>
+ <property name="halign">start</property>
+ <property name="hexpand">1</property>
+ <property name="use_underline">1</property>
+ <layout>
+ <property name="column">1</property>
+ <property name="row">3</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkEntry" id="eap_ttls_domain_entry">
+ <property name="focusable">1</property>
+ <property name="hexpand">1</property>
+ <property name="activates_default">1</property>
+ <layout>
+ <property name="column">1</property>
+ <property name="row">1</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="eap_ttls_anon_identity_label">
+ <property name="label" translatable="yes">Anony_mous identity</property>
+ <property name="use_underline">1</property>
+ <property name="mnemonic_widget">eap_ttls_anon_identity_entry</property>
+ <property name="xalign">1</property>
+ <layout>
+ <property name="column">0</property>
+ <property name="row">0</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="eap_ttls_domain_label">
+ <property name="tooltip_text" translatable="yes">Suffix of the server certificate name.</property>
+ <property name="label" translatable="yes">_Domain</property>
+ <property name="use_underline">1</property>
+ <property name="mnemonic_widget">eap_ttls_domain_entry</property>
+ <property name="xalign">1</property>
+ <layout>
+ <property name="column">0</property>
+ <property name="row">1</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+</interface>
diff --git a/src/ui/gtk4/nma-ws/nma-ws-802-1x.ui b/src/ui/gtk4/nma-ws/nma-ws-802-1x.ui
new file mode 100644
index 00000000..8baaab99
--- /dev/null
+++ b/src/ui/gtk4/nma-ws/nma-ws-802-1x.ui
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface domain="libnma">
+ <requires lib="gtk" version="4.0"/>
+ <object class="GtkListStore" id="model5">
+ <columns>
+ <column type="gchararray"/>
+ </columns>
+ <data>
+ <row>
+ <col id="0"> </col>
+ </row>
+ </data>
+ </object>
+ <template class="NMAWs8021x" parent="GtkGrid">
+ <property name="row_spacing">6</property>
+ <property name="column_spacing">6</property>
+ <child>
+ <object class="GtkLabel" id="eap_auth_label">
+ <property name="label" translatable="yes">Au_thentication</property>
+ <property name="use_underline">1</property>
+ <property name="mnemonic_widget">eap_auth_combo</property>
+ <property name="xalign">1</property>
+ <layout>
+ <property name="column">0</property>
+ <property name="row">0</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkComboBox" id="eap_auth_combo">
+ <property name="hexpand">1</property>
+ <property name="model">model5</property>
+ <child>
+ <object class="GtkCellRendererText" id="renderer5"/>
+ <attributes>
+ <attribute name="text">0</attribute>
+ </attributes>
+ </child>
+ <signal name="changed" handler="auth_combo_changed_cb" swapped="no"/>
+ <layout>
+ <property name="column">1</property>
+ <property name="row">0</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="eap_vbox">
+ <property name="hexpand">1</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">6</property>
+ <child>
+ <placeholder/>
+ </child>
+ <layout>
+ <property name="column">0</property>
+ <property name="row">1</property>
+ <property name="column-span">2</property>
+ </layout>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/src/ui/gtk4/nma-ws/nma-ws-leap.ui b/src/ui/gtk4/nma-ws/nma-ws-leap.ui
new file mode 100644
index 00000000..167ecc68
--- /dev/null
+++ b/src/ui/gtk4/nma-ws/nma-ws-leap.ui
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface domain="libnma">
+ <requires lib="gtk" version="4.0"/>
+ <template class="NMAWsLeap" parent="GtkGrid">
+ <property name="valign">start</property>
+ <property name="row_spacing">6</property>
+ <property name="column_spacing">6</property>
+ <child>
+ <object class="GtkLabel" id="leap_username_label">
+ <property name="label" translatable="yes">_Username</property>
+ <property name="use_underline">1</property>
+ <property name="mnemonic_widget">leap_username_entry</property>
+ <property name="xalign">1</property>
+ <layout>
+ <property name="column">0</property>
+ <property name="row">0</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="leap_password_label">
+ <property name="label" translatable="yes">_Password</property>
+ <property name="use_underline">1</property>
+ <property name="mnemonic_widget">leap_password_entry</property>
+ <property name="xalign">1</property>
+ <layout>
+ <property name="column">0</property>
+ <property name="row">1</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkEntry" id="leap_password_entry">
+ <property name="focusable">1</property>
+ <property name="hexpand">1</property>
+ <property name="visibility">0</property>
+ <property name="activates_default">1</property>
+ <signal name="changed" handler="nma_ws_changed_cb" swapped="no"/>
+ <layout>
+ <property name="column">1</property>
+ <property name="row">1</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="show_checkbutton_leap">
+ <property name="label" translatable="yes">Sho_w password</property>
+ <property name="focusable">1</property>
+ <property name="hexpand">1</property>
+ <property name="use_underline">1</property>
+ <signal name="toggled" handler="show_toggled_cb" swapped="no"/>
+ <layout>
+ <property name="column">1</property>
+ <property name="row">2</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkEntry" id="leap_username_entry">
+ <property name="focusable">1</property>
+ <property name="hexpand">1</property>
+ <property name="activates_default">1</property>
+ <signal name="changed" handler="nma_ws_changed_cb" swapped="no"/>
+ <layout>
+ <property name="column">1</property>
+ <property name="row">0</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </template>
+</interface>
diff --git a/src/ui/gtk4/nma-ws/nma-ws-sae.ui b/src/ui/gtk4/nma-ws/nma-ws-sae.ui
new file mode 100644
index 00000000..9f01eaf7
--- /dev/null
+++ b/src/ui/gtk4/nma-ws/nma-ws-sae.ui
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface domain="libnma">
+ <requires lib="gtk" version="4.0"/>
+ <template class="NMAWsSae" parent="GtkGrid">
+ <property name="row_spacing">6</property>
+ <property name="column_spacing">6</property>
+ <child>
+ <object class="GtkLabel" id="sae_label">
+ <property name="label" translatable="yes">_Password</property>
+ <property name="use_underline">1</property>
+ <property name="mnemonic_widget">psk_entry</property>
+ <property name="xalign">1</property>
+ <layout>
+ <property name="column">0</property>
+ <property name="row">0</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkEntry" id="psk_entry">
+ <property name="focusable">1</property>
+ <property name="hexpand">1</property>
+ <property name="max_length">64</property>
+ <property name="visibility">0</property>
+ <property name="activates_default">1</property>
+ <property name="width_chars">28</property>
+ <signal name="changed" handler="nma_ws_changed_cb" swapped="no"/>
+ <layout>
+ <property name="column">1</property>
+ <property name="row">0</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="sae_type_label">
+ <property name="label" translatable="yes">_Type</property>
+ <property name="use_underline">1</property>
+ <property name="mnemonic_widget">sae_type_combo</property>
+ <property name="xalign">1</property>
+ <layout>
+ <property name="column">0</property>
+ <property name="row">2</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="show_checkbutton_sae">
+ <property name="label" translatable="yes">Sho_w password</property>
+ <property name="focusable">1</property>
+ <property name="hexpand">1</property>
+ <property name="use_underline">1</property>
+ <signal name="toggled" handler="show_toggled_cb" swapped="no"/>
+ <layout>
+ <property name="column">1</property>
+ <property name="row">1</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkComboBox" id="sae_type_combo">
+ <layout>
+ <property name="column">1</property>
+ <property name="row">2</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </template>
+</interface>
diff --git a/src/ui/gtk4/nma-ws/nma-ws-wep-key.ui b/src/ui/gtk4/nma-ws/nma-ws-wep-key.ui
new file mode 100644
index 00000000..18901cd4
--- /dev/null
+++ b/src/ui/gtk4/nma-ws/nma-ws-wep-key.ui
@@ -0,0 +1,142 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface domain="libnma">
+ <requires lib="gtk" version="4.0"/>
+ <object class="GtkListStore" id="model3">
+ <columns>
+ <column type="gchararray"/>
+ </columns>
+ <data>
+ <row>
+ <col id="0" translatable="yes">Open System</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">Shared Key</col>
+ </row>
+ </data>
+ </object>
+ <object class="GtkListStore" id="model4">
+ <columns>
+ <column type="gchararray"/>
+ </columns>
+ <data>
+ <row>
+ <col id="0" translatable="yes">1 (Default)</col>
+ </row>
+ <row>
+ <col id="0">2</col>
+ </row>
+ <row>
+ <col id="0">3</col>
+ </row>
+ <row>
+ <col id="0">4</col>
+ </row>
+ </data>
+ </object>
+ <template class="NMAWsWepKey" parent="GtkGrid">
+ <property name="row_spacing">6</property>
+ <property name="column_spacing">6</property>
+ <child>
+ <object class="GtkLabel" id="wep_key_label">
+ <property name="label" translatable="yes">_Key</property>
+ <property name="use_underline">1</property>
+ <property name="mnemonic_widget">wep_key_entry</property>
+ <property name="xalign">1</property>
+ <layout>
+ <property name="column">0</property>
+ <property name="row">0</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkEntry" id="wep_key_entry">
+ <property name="focusable">1</property>
+ <property name="hexpand">1</property>
+ <property name="max_length">64</property>
+ <property name="visibility">0</property>
+ <property name="activates_default">1</property>
+ <property name="width_chars">28</property>
+ <signal name="changed" handler="nma_ws_changed_cb" swapped="no"/>
+ <signal name="insert-text" handler="wep_entry_filter_cb" swapped="no"/>
+ <layout>
+ <property name="column">1</property>
+ <property name="row">0</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="show_checkbutton_wep">
+ <property name="label" translatable="yes">Sho_w key</property>
+ <property name="focusable">1</property>
+ <property name="hexpand">1</property>
+ <property name="use_underline">1</property>
+ <signal name="toggled" handler="show_toggled_cb" swapped="no"/>
+ <layout>
+ <property name="column">1</property>
+ <property name="row">1</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="auth_method_label">
+ <property name="label" translatable="yes">Au_thentication</property>
+ <property name="use_underline">1</property>
+ <property name="mnemonic_widget">auth_method_combo</property>
+ <property name="xalign">1</property>
+ <layout>
+ <property name="column">0</property>
+ <property name="row">3</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkComboBox" id="auth_method_combo">
+ <property name="hexpand">1</property>
+ <property name="model">model3</property>
+ <child>
+ <object class="GtkCellRendererText" id="renderer3"/>
+ <attributes>
+ <attribute name="text">0</attribute>
+ </attributes>
+ </child>
+ <signal name="changed" handler="nma_ws_changed_cb" swapped="no"/>
+ <layout>
+ <property name="column">1</property>
+ <property name="row">3</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="key_index_label">
+ <property name="label" translatable="yes">WEP inde_x</property>
+ <property name="use_underline">1</property>
+ <property name="mnemonic_widget">key_index_combo</property>
+ <property name="xalign">1</property>
+ <layout>
+ <property name="column">0</property>
+ <property name="row">2</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkComboBox" id="key_index_combo">
+ <property name="hexpand">1</property>
+ <property name="model">model4</property>
+ <child>
+ <object class="GtkCellRendererText" id="renderer4"/>
+ <attributes>
+ <attribute name="text">0</attribute>
+ </attributes>
+ </child>
+ <signal name="changed" handler="key_index_combo_changed_cb" swapped="no"/>
+ <layout>
+ <property name="column">1</property>
+ <property name="row">2</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </template>
+</interface>
diff --git a/src/ui/gtk4/nma-ws/nma-ws-wpa-psk.ui b/src/ui/gtk4/nma-ws/nma-ws-wpa-psk.ui
new file mode 100644
index 00000000..c8d0749c
--- /dev/null
+++ b/src/ui/gtk4/nma-ws/nma-ws-wpa-psk.ui
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface domain="libnma">
+ <requires lib="gtk" version="4.0"/>
+ <template class="NMAWsWpaPsk" parent="GtkGrid">
+ <property name="row_spacing">6</property>
+ <property name="column_spacing">6</property>
+ <child>
+ <object class="GtkLabel" id="wpa_psk_label">
+ <property name="label" translatable="yes">_Password</property>
+ <property name="use_underline">1</property>
+ <property name="mnemonic_widget">wpa_psk_entry</property>
+ <property name="xalign">1</property>
+ <layout>
+ <property name="column">0</property>
+ <property name="row">0</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkEntry" id="wpa_psk_entry">
+ <property name="focusable">1</property>
+ <property name="hexpand">1</property>
+ <property name="max_length">64</property>
+ <property name="visibility">0</property>
+ <property name="activates_default">1</property>
+ <signal name="changed" handler="nma_ws_changed_cb" swapped="no"/>
+ <layout>
+ <property name="column">1</property>
+ <property name="row">0</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="wpa_psk_type_label">
+ <property name="label" translatable="yes">_Type</property>
+ <property name="use_underline">1</property>
+ <property name="mnemonic_widget">wpa_psk_type_combo</property>
+ <property name="xalign">1</property>
+ <layout>
+ <property name="column">0</property>
+ <property name="row">2</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="show_checkbutton_wpa">
+ <property name="label" translatable="yes">Sho_w password</property>
+ <property name="focusable">1</property>
+ <property name="hexpand">1</property>
+ <property name="use_underline">1</property>
+ <signal name="toggled" handler="show_toggled_cb" swapped="no"/>
+ <layout>
+ <property name="column">1</property>
+ <property name="row">1</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkComboBox" id="wpa_psk_type_combo">
+ <layout>
+ <property name="column">1</property>
+ <property name="row">2</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </template>
+</interface>
diff --git a/src/ui/gtk4/nma.gresource.xml b/src/ui/gtk4/nma.gresource.xml
new file mode 100644
index 00000000..5c75f112
--- /dev/null
+++ b/src/ui/gtk4/nma.gresource.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<gresources>
+ <gresource prefix="/org/gnome/libnma">
+ <file preprocess="xml-stripblanks">wifi.ui</file>
+ <file preprocess="xml-stripblanks">nma-pkcs11-token-login-dialog.ui</file>
+ <file preprocess="xml-stripblanks">nma-pkcs11-cert-chooser-dialog.ui</file>
+ <file preprocess="xml-stripblanks">nma-mobile-wizard.ui</file>
+ <file preprocess="xml-stripblanks">nma-vpn-password-dialog.ui</file>
+ <file preprocess="xml-stripblanks">nma-bar-code-widget.ui</file>
+ <file preprocess="xml-stripblanks" alias="nma-ws-802-1x.ui">nma-ws/nma-ws-802-1x.ui</file>
+ <file preprocess="xml-stripblanks" alias="nma-ws-leap.ui">nma-ws/nma-ws-leap.ui</file>
+ <file preprocess="xml-stripblanks" alias="nma-ws-sae.ui">nma-ws/nma-ws-sae.ui</file>
+ <file preprocess="xml-stripblanks" alias="nma-ws-wep-key.ui">nma-ws/nma-ws-wep-key.ui</file>
+ <file preprocess="xml-stripblanks" alias="nma-ws-wpa-psk.ui">nma-ws/nma-ws-wpa-psk.ui</file>
+ <file preprocess="xml-stripblanks" alias="nma-eap-fast.ui">nma-ws/nma-eap-fast.ui</file>
+ <file preprocess="xml-stripblanks" alias="nma-eap-leap.ui">nma-ws/nma-eap-leap.ui</file>
+ <file preprocess="xml-stripblanks" alias="nma-eap-peap.ui">nma-ws/nma-eap-peap.ui</file>
+ <file preprocess="xml-stripblanks" alias="nma-eap-simple.ui">nma-ws/nma-eap-simple.ui</file>
+ <file preprocess="xml-stripblanks" alias="nma-eap-tls.ui">nma-ws/nma-eap-tls.ui</file>
+ <file preprocess="xml-stripblanks" alias="nma-eap-ttls.ui">nma-ws/nma-eap-ttls.ui</file>
+ </gresource>
+</gresources>
diff --git a/src/ui/gtk4/wifi.ui b/src/ui/gtk4/wifi.ui
new file mode 100644
index 00000000..bddd30a3
--- /dev/null
+++ b/src/ui/gtk4/wifi.ui
@@ -0,0 +1,187 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface domain="libnma">
+ <requires lib="gtk" version="4.0"/>
+ <object class="GtkListStore" id="model1">
+ <columns>
+ <column type="gchararray"/>
+ </columns>
+ <data>
+ <row>
+ <col id="0"> </col>
+ </row>
+ </data>
+ </object>
+ <object class="GtkListStore" id="model2">
+ <columns>
+ <column type="gchararray"/>
+ </columns>
+ <data>
+ <row>
+ <col id="0"> </col>
+ </row>
+ </data>
+ </object>
+ <object class="GtkGrid" id="wifi_dialog">
+ <property name="margin_start">12</property>
+ <property name="margin_end">12</property>
+ <property name="margin_top">12</property>
+ <property name="margin_bottom">12</property>
+ <property name="row_spacing">12</property>
+ <property name="column_spacing">12</property>
+ <child>
+ <object class="GtkImage" id="image1">
+ <property name="valign">start</property>
+ <property name="margin_start">12</property>
+ <property name="margin_end">12</property>
+ <property name="margin_top">12</property>
+ <property name="margin_bottom">12</property>
+ <property name="icon_name">network-wireless</property>
+ <property name="icon_size">6</property>
+ <layout>
+ <property name="column">0</property>
+ <property name="row">0</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="caption_label">
+ <property name="margin_start">12</property>
+ <property name="margin_end">12</property>
+ <property name="margin_top">12</property>
+ <property name="margin_bottom">12</property>
+ <property name="use_markup">1</property>
+ <property name="wrap">1</property>
+ <property name="max_width_chars">50</property>
+ <property name="xalign">0</property>
+ <layout>
+ <property name="column">1</property>
+ <property name="row">0</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkGrid" id="table1">
+ <property name="row_spacing">6</property>
+ <property name="column_spacing">6</property>
+ <child>
+ <object class="GtkBox" id="security_vbox">
+ <property name="hexpand">1</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <placeholder/>
+ </child>
+ <layout>
+ <property name="column">0</property>
+ <property name="row">4</property>
+ <property name="column-span">2</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="security_combo_label">
+ <property name="label" translatable="yes">Wi-Fi _security</property>
+ <property name="use_underline">1</property>
+ <property name="mnemonic_widget">security_combo</property>
+ <property name="xalign">1</property>
+ <layout>
+ <property name="column">0</property>
+ <property name="row">3</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkComboBox" id="security_combo">
+ <property name="hexpand">1</property>
+ <property name="model">model1</property>
+ <child>
+ <object class="GtkCellRendererText" id="renderer1"/>
+ <attributes>
+ <attribute name="text">0</attribute>
+ </attributes>
+ </child>
+ <layout>
+ <property name="column">1</property>
+ <property name="row">3</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="network_name_label">
+ <property name="label" translatable="yes">_Network name</property>
+ <property name="use_underline">1</property>
+ <property name="mnemonic_widget">network_name_entry</property>
+ <property name="xalign">1</property>
+ <layout>
+ <property name="column">0</property>
+ <property name="row">2</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkEntry" id="network_name_entry">
+ <property name="focusable">1</property>
+ <property name="activates_default">1</property>
+ <layout>
+ <property name="column">1</property>
+ <property name="row">2</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="connection_label">
+ <property name="label" translatable="yes">C_onnection</property>
+ <property name="use_underline">1</property>
+ <property name="mnemonic_widget">connection_combo</property>
+ <property name="xalign">1</property>
+ <layout>
+ <property name="column">0</property>
+ <property name="row">1</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkComboBox" id="connection_combo">
+ <property name="hexpand">1</property>
+ <layout>
+ <property name="column">1</property>
+ <property name="row">1</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="device_label">
+ <property name="label" translatable="yes">Wi-Fi _adapter</property>
+ <property name="use_underline">1</property>
+ <property name="mnemonic_widget">device_combo</property>
+ <property name="xalign">1</property>
+ <layout>
+ <property name="column">0</property>
+ <property name="row">0</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkComboBox" id="device_combo">
+ <property name="hexpand">1</property>
+ <property name="model">model2</property>
+ <child>
+ <object class="GtkCellRendererText" id="renderer2"/>
+ <attributes>
+ <attribute name="text">0</attribute>
+ </attributes>
+ </child>
+ <layout>
+ <property name="column">1</property>
+ <property name="row">0</property>
+ </layout>
+ </object>
+ </child>
+ <layout>
+ <property name="column">0</property>
+ <property name="row">1</property>
+ <property name="column-span">2</property>
+ </layout>
+ </object>
+ </child>
+ </object>
+</interface>
diff --git a/src/ui/meson.build b/src/ui/meson.build
new file mode 100644
index 00000000..2f8eec99
--- /dev/null
+++ b/src/ui/meson.build
@@ -0,0 +1,11 @@
+if enable_libnma_gtk4
+ ui_dir = 'gtk4'
+else
+ ui_dir = 'gtk3'
+endif
+
+ui_sources = gnome.compile_resources(
+ 'nma-resources',
+ join_paths(ui_dir, 'nma.gresource.xml'),
+ source_dir: ui_dir
+)
--
2.35.1