diff --git a/Gtk4/gtk155_applaunch/.vscode/settings.json b/Gtk4/gtk155_applaunch/.vscode/settings.json
new file mode 100644
index 0000000..6cdd3ad
--- /dev/null
+++ b/Gtk4/gtk155_applaunch/.vscode/settings.json
@@ -0,0 +1,6 @@
+{
+ "C_Cpp.default.configurationProvider": "ms-vscode.cmake-tools",
+ "files.associations": {
+ "cstring": "cpp"
+ }
+}
\ No newline at end of file
diff --git a/Gtk4/gtk155_applaunch/CMakeLists.txt b/Gtk4/gtk155_applaunch/CMakeLists.txt
new file mode 100644
index 0000000..8bf97f1
--- /dev/null
+++ b/Gtk4/gtk155_applaunch/CMakeLists.txt
@@ -0,0 +1,72 @@
+set(CMAKE_CXX_STANDARD 17)
+cmake_minimum_required(VERSION 3.5.0)
+project(gtk155_applaunch VERSION 1.0.0)
+
+list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/../../GCR_CMake/macros)
+include(GlibCompileResourcesSupport)
+
+include(CTest)
+enable_testing()
+
+set(CPACK_PROJECT_NAME ${PROJECT_NAME})
+set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
+
+include(CPack)
+include_directories(.)
+include_directories(..)
+
+#Find PkgConfig to use gtkmm3
+find_package (PkgConfig REQUIRED)
+pkg_check_modules (GTK4 REQUIRED gtk4)
+include_directories (${GTK4_INCLUDE_DIRS})
+link_directories (${GTK4_LIBRARY_DIRS})
+
+#Find Gettext
+# find_package (Gettext REQUIRED)
+# set(PO_DIR ${CMAKE_BINARY_DIR}/po/zh_CN/LC_MESSAGES)
+
+#Source files
+set(SOURCE_FILE src/main.cpp src/Applauncher.cpp src/AppView.cpp)
+
+#Compile Resource
+
+# set(RESOURCE_LIST
+# )
+
+# compile_gresources(RESOURCE_FILE
+# XML_OUT
+# TYPE EMBED_C
+# RESOURCES ${RESOURCE_LIST}
+# PREFIX "/org/gtk/daleclack"
+# SOURCE_DIR ${PROJECT_SOURCE_DIR}/res)
+
+# Add a custom target to the makefile. Now make builds our resource file.
+# It depends on the output RESOURCE_FILE.
+
+# add_custom_target(resource ALL DEPENDS ${RESOURCE_FILE})
+
+#For win32 platform,use rc resource and .ico icon
+if(WIN32)
+ SET(CMAKE_RC_COMPILER windres)
+ set(app_WINRC ../icon.rc)
+ set_property(SOURCE ../icon.rc APPEND PROPERTY
+ OBJECT_DEPENDS ${PROJECT_SOURCE_DIR}/../icon.ico
+ )
+ add_executable(${PROJECT_NAME} ${app_WINRC} ${SOURCE_FILE})
+ add_custom_command( TARGET ${PROJECT_NAME}
+ COMMAND echo * > ${CMAKE_BINARY_DIR}/.gitignore
+ COMMAND echo **/* > ${CMAKE_BINARY_DIR}/.hgignore)
+else()
+ add_executable(${PROJECT_NAME} ${SOURCE_FILE})
+ add_custom_command( TARGET ${PROJECT_NAME}
+ COMMAND echo \"*\" > ${CMAKE_BINARY_DIR}/.gitignore
+ COMMAND echo \"**/*\" > ${CMAKE_BINARY_DIR}/.hgignore)
+endif(WIN32)
+
+#Add command to generate .gitignore and .mo files
+# add_custom_command( TARGET ${PROJECT_NAME}
+# COMMAND mkdir -p ${PO_DIR}
+# COMMAND ${GETTEXT_MSGFMT_EXECUTABLE} ${CMAKE_SOURCE_DIR}/po/zh_CN.po -o ${PO_DIR}/${PROJECT_NAME}.mo)
+
+SET (CMAKE_EXTRA_CXX_FLAGS ${GTK4_CFLAGS_OTHER})
+target_link_libraries (${PROJECT_NAME} ${GTK4_LIBRARIES} -lpthread)
diff --git a/Gtk4/gtk155_applaunch/README b/Gtk4/gtk155_applaunch/README
new file mode 100644
index 0000000..ca496a2
--- /dev/null
+++ b/Gtk4/gtk155_applaunch/README
@@ -0,0 +1,5 @@
+# README of My Reminder
+This simple application is a reminder for the date,
+and the window show the days left for the deadline set by user
+
+The reminded date and color of text can be changed by preferences dialog.
\ No newline at end of file
diff --git a/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-eject-dark.svg b/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-eject-dark.svg
new file mode 100644
index 0000000..d174abd
--- /dev/null
+++ b/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-eject-dark.svg
@@ -0,0 +1,13 @@
+
diff --git a/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-eject.svg b/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-eject.svg
new file mode 100644
index 0000000..73841e7
--- /dev/null
+++ b/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-eject.svg
@@ -0,0 +1,13 @@
+
diff --git a/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-mount-dark.svg b/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-mount-dark.svg
new file mode 100644
index 0000000..b1fbe42
--- /dev/null
+++ b/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-mount-dark.svg
@@ -0,0 +1,13 @@
+
diff --git a/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-mount.svg b/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-mount.svg
new file mode 100644
index 0000000..cad6178
--- /dev/null
+++ b/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-mount.svg
@@ -0,0 +1,13 @@
+
diff --git a/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-playback-pause-dark.svg b/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-playback-pause-dark.svg
new file mode 100644
index 0000000..70309bd
--- /dev/null
+++ b/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-playback-pause-dark.svg
@@ -0,0 +1,13 @@
+
diff --git a/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-playback-pause.svg b/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-playback-pause.svg
new file mode 100644
index 0000000..2a9a7a5
--- /dev/null
+++ b/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-playback-pause.svg
@@ -0,0 +1,13 @@
+
diff --git a/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-playback-start-dark.svg b/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-playback-start-dark.svg
new file mode 100644
index 0000000..8bcc4ad
--- /dev/null
+++ b/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-playback-start-dark.svg
@@ -0,0 +1,13 @@
+
diff --git a/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-playback-start.svg b/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-playback-start.svg
new file mode 100644
index 0000000..28b7b44
--- /dev/null
+++ b/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-playback-start.svg
@@ -0,0 +1,13 @@
+
diff --git a/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-playback-stop-dark.svg b/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-playback-stop-dark.svg
new file mode 100644
index 0000000..6a3528c
--- /dev/null
+++ b/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-playback-stop-dark.svg
@@ -0,0 +1,13 @@
+
diff --git a/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-playback-stop.svg b/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-playback-stop.svg
new file mode 100644
index 0000000..7ba228d
--- /dev/null
+++ b/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-playback-stop.svg
@@ -0,0 +1,13 @@
+
diff --git a/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-playlist-append-dark.svg b/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-playlist-append-dark.svg
new file mode 100644
index 0000000..c363da5
--- /dev/null
+++ b/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-playlist-append-dark.svg
@@ -0,0 +1,13 @@
+
diff --git a/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-playlist-append.svg b/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-playlist-append.svg
new file mode 100644
index 0000000..41152de
--- /dev/null
+++ b/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-playlist-append.svg
@@ -0,0 +1,13 @@
+
diff --git a/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-playlist-normal-dark.svg b/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-playlist-normal-dark.svg
new file mode 100644
index 0000000..aadbd5d
--- /dev/null
+++ b/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-playlist-normal-dark.svg
@@ -0,0 +1,14 @@
+
diff --git a/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-playlist-normal.svg b/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-playlist-normal.svg
new file mode 100644
index 0000000..0cbf623
--- /dev/null
+++ b/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-playlist-normal.svg
@@ -0,0 +1,14 @@
+
diff --git a/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-playlist-play-dark.svg b/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-playlist-play-dark.svg
new file mode 100644
index 0000000..04fc475
--- /dev/null
+++ b/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-playlist-play-dark.svg
@@ -0,0 +1,14 @@
+
diff --git a/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-playlist-play.svg b/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-playlist-play.svg
new file mode 100644
index 0000000..07db50a
--- /dev/null
+++ b/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-playlist-play.svg
@@ -0,0 +1,13 @@
+
diff --git a/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-playlist-repeat-dark.svg b/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-playlist-repeat-dark.svg
new file mode 100644
index 0000000..ec8fe6e
--- /dev/null
+++ b/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-playlist-repeat-dark.svg
@@ -0,0 +1,13 @@
+
diff --git a/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-playlist-repeat-one-dark.svg b/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-playlist-repeat-one-dark.svg
new file mode 100644
index 0000000..bdd668a
--- /dev/null
+++ b/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-playlist-repeat-one-dark.svg
@@ -0,0 +1,7 @@
+
diff --git a/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-playlist-repeat-one.svg b/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-playlist-repeat-one.svg
new file mode 100644
index 0000000..6139e63
--- /dev/null
+++ b/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-playlist-repeat-one.svg
@@ -0,0 +1,7 @@
+
diff --git a/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-playlist-repeat.svg b/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-playlist-repeat.svg
new file mode 100644
index 0000000..d0562ee
--- /dev/null
+++ b/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-playlist-repeat.svg
@@ -0,0 +1,13 @@
+
diff --git a/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-playlist-shuffle-dark.svg b/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-playlist-shuffle-dark.svg
new file mode 100644
index 0000000..3d7cfec
--- /dev/null
+++ b/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-playlist-shuffle-dark.svg
@@ -0,0 +1,13 @@
+
diff --git a/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-playlist-shuffle.svg b/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-playlist-shuffle.svg
new file mode 100644
index 0000000..294d81a
--- /dev/null
+++ b/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-playlist-shuffle.svg
@@ -0,0 +1,13 @@
+
diff --git a/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-seek-backward-dark.svg b/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-seek-backward-dark.svg
new file mode 100644
index 0000000..82624ac
--- /dev/null
+++ b/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-seek-backward-dark.svg
@@ -0,0 +1,14 @@
+
diff --git a/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-seek-backward.svg b/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-seek-backward.svg
new file mode 100644
index 0000000..f5e24f4
--- /dev/null
+++ b/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-seek-backward.svg
@@ -0,0 +1,13 @@
+
diff --git a/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-seek-forward-dark.svg b/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-seek-forward-dark.svg
new file mode 100644
index 0000000..984cae5
--- /dev/null
+++ b/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-seek-forward-dark.svg
@@ -0,0 +1,14 @@
+
diff --git a/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-seek-forward.svg b/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-seek-forward.svg
new file mode 100644
index 0000000..4dc81fd
--- /dev/null
+++ b/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-seek-forward.svg
@@ -0,0 +1,13 @@
+
diff --git a/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-skip-backward-dark.svg b/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-skip-backward-dark.svg
new file mode 100644
index 0000000..683171c
--- /dev/null
+++ b/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-skip-backward-dark.svg
@@ -0,0 +1,14 @@
+
diff --git a/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-skip-backward.svg b/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-skip-backward.svg
new file mode 100644
index 0000000..3f97270
--- /dev/null
+++ b/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-skip-backward.svg
@@ -0,0 +1,13 @@
+
diff --git a/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-skip-forward-dark.svg b/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-skip-forward-dark.svg
new file mode 100644
index 0000000..bc05c67
--- /dev/null
+++ b/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-skip-forward-dark.svg
@@ -0,0 +1,14 @@
+
diff --git a/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-skip-forward.svg b/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-skip-forward.svg
new file mode 100644
index 0000000..a905ae1
--- /dev/null
+++ b/Gtk4/gtk155_applaunch/res/icons/scalable/status/media-skip-forward.svg
@@ -0,0 +1,13 @@
+
diff --git a/Gtk4/gtk155_applaunch/src/AppView.cpp b/Gtk4/gtk155_applaunch/src/AppView.cpp
new file mode 100644
index 0000000..1a0d4e3
--- /dev/null
+++ b/Gtk4/gtk155_applaunch/src/AppView.cpp
@@ -0,0 +1,126 @@
+#include "AppView.h"
+
+// Create a model for application
+static GListModel *create_app_model()
+{
+ GListStore *store;
+ GList *apps, *temp;
+
+ // Create a list contains the application info
+ store = g_list_store_new(G_TYPE_APP_INFO);
+
+ // Get Appication list
+ apps = g_app_info_get_all();
+
+ // Append apps item to the list
+ for (temp = apps; temp; temp = temp->next)
+ {
+ g_list_store_append(store, temp->data);
+ }
+
+ g_list_free_full(apps, g_object_unref);
+
+ return G_LIST_MODEL(store);
+}
+
+static void app_view_setup(GtkListItemFactory *factory, GtkListItem *item)
+{
+ GtkWidget *app_box, *image, *label;
+
+ // Create widgets
+ app_box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
+ image = gtk_image_new();
+ label = gtk_label_new(" ");
+ gtk_image_set_pixel_size(GTK_IMAGE(image), 48);
+ gtk_label_set_max_width_chars(GTK_LABEL(label), 5);
+ gtk_widget_set_size_request(image, 48, 48);
+
+ // Append widgets to the box
+ gtk_box_append(GTK_BOX(app_box), image);
+ gtk_box_append(GTK_BOX(app_box), label);
+
+ gtk_list_item_set_child(item, app_box);
+}
+
+static void app_view_bind(GtkListItemFactory *factory, GtkListItem *item)
+{
+ GtkWidget *image;
+ GtkWidget *label;
+ GAppInfo *app_info;
+
+ // Get Widgets
+ image = gtk_widget_get_first_child(gtk_list_item_get_child(item));
+ label = gtk_widget_get_next_sibling(image);
+ app_info = G_APP_INFO(gtk_list_item_get_item(item));
+
+ // Initalize widgets
+ gtk_image_set_from_gicon(GTK_IMAGE(image), g_app_info_get_icon(app_info));
+ gtk_label_set_label(GTK_LABEL(label), g_app_info_get_display_name(app_info));
+ gtk_label_set_max_width_chars(GTK_LABEL(label), 15);
+ gtk_label_set_ellipsize(GTK_LABEL(label), PANGO_ELLIPSIZE_END);
+}
+
+static void app_view_activate(GtkGridView *list, guint position, gpointer data)
+{
+ GAppInfo *app_info;
+ GdkAppLaunchContext *context;
+ GError *error = NULL;
+
+ app_info = G_APP_INFO(g_list_model_get_item(G_LIST_MODEL(gtk_grid_view_get_model(list)),
+ position));
+
+ /* Prepare the context for launching the application and launch it. This
+ * code is explained in detail in the documentation for GdkAppLaunchContext
+ * and GAppInfo.
+ */
+ context = gdk_display_get_app_launch_context(gtk_widget_get_display(GTK_WIDGET(list)));
+ if (!g_app_info_launch(app_info,
+ NULL,
+ G_APP_LAUNCH_CONTEXT(context),
+ &error))
+ {
+ // GtkAlertDialog *dialog;
+
+ // /* And because error handling is important, even a simple demo has it:
+ // * We display an error dialog that something went wrong.
+ // */
+ // dialog = gtk_alert_dialog_new("Could not launch %s", g_app_info_get_display_name(app_info));
+ // gtk_alert_dialog_set_detail(dialog, error->message);
+ // gtk_alert_dialog_show(dialog, GTK_WINDOW(gtk_widget_get_root(GTK_WIDGET(list))));
+ // g_object_unref(dialog);
+ // g_clear_error(&error);
+ }
+
+ g_object_unref(context);
+ g_object_unref(app_info);
+}
+
+GtkWidget *app_view_new()
+{
+ GtkWidget *list, *sw;
+ GListModel *model;
+ GtkListItemFactory *factory;
+
+ // Create widgets
+ sw = gtk_scrolled_window_new();
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw),
+ GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
+
+ // Create list item factory
+ factory = gtk_signal_list_item_factory_new();
+ g_signal_connect(factory, "setup", G_CALLBACK(app_view_setup), NULL);
+ g_signal_connect(factory, "bind", G_CALLBACK(app_view_bind), NULL);
+
+ // Create model and view
+ model = create_app_model();
+ list = gtk_grid_view_new(GTK_SELECTION_MODEL(
+ gtk_single_selection_new(model)),
+ factory);
+ g_signal_connect(list, "activate", G_CALLBACK(app_view_activate), NULL);
+ gtk_grid_view_set_min_columns(GTK_GRID_VIEW(list), 8);
+
+ // Add Child
+ gtk_scrolled_window_set_child(GTK_SCROLLED_WINDOW(sw), list);
+
+ return sw;
+}
diff --git a/Gtk4/gtk155_applaunch/src/AppView.h b/Gtk4/gtk155_applaunch/src/AppView.h
new file mode 100644
index 0000000..ca6fc99
--- /dev/null
+++ b/Gtk4/gtk155_applaunch/src/AppView.h
@@ -0,0 +1,5 @@
+#pragma once
+
+#include
+
+GtkWidget *app_view_new();
diff --git a/Gtk4/gtk155_applaunch/src/Applauncher.cpp b/Gtk4/gtk155_applaunch/src/Applauncher.cpp
new file mode 100644
index 0000000..c95f215
--- /dev/null
+++ b/Gtk4/gtk155_applaunch/src/Applauncher.cpp
@@ -0,0 +1,26 @@
+#include "Applauncher.h"
+#include "AppView.h"
+
+struct _AppLauncher{
+ GtkApplicationWindow parent_instance;
+};
+
+G_DEFINE_TYPE(AppLauncher, app_launcher, GTK_TYPE_APPLICATION_WINDOW)
+
+static void app_launcher_init(AppLauncher *self)
+{
+ GtkWidget *scrolled_window = app_view_new();
+ gtk_window_set_default_size(GTK_WINDOW(self), 624, 400);
+
+ // Add list to the window
+ gtk_window_set_child(GTK_WINDOW(self), scrolled_window);
+}
+
+static void app_launcher_class_init(AppLauncherClass *klass)
+{
+}
+
+AppLauncher *app_launcher_new(GtkApplication *app){
+ return APP_LAUNCHER(g_object_new(app_launcher_get_type(),
+ "application", app, NULL));
+}
\ No newline at end of file
diff --git a/Gtk4/gtk155_applaunch/src/Applauncher.h b/Gtk4/gtk155_applaunch/src/Applauncher.h
new file mode 100644
index 0000000..83d91c5
--- /dev/null
+++ b/Gtk4/gtk155_applaunch/src/Applauncher.h
@@ -0,0 +1,7 @@
+#pragma once
+
+#include
+
+G_DECLARE_FINAL_TYPE(AppLauncher, app_launcher, APP, LAUNCHER, GtkApplicationWindow)
+
+AppLauncher *app_launcher_new(GtkApplication *app);
diff --git a/Gtk4/gtk155_applaunch/src/main.cpp b/Gtk4/gtk155_applaunch/src/main.cpp
new file mode 100644
index 0000000..e9f9056
--- /dev/null
+++ b/Gtk4/gtk155_applaunch/src/main.cpp
@@ -0,0 +1,14 @@
+#include "Applauncher.h"
+
+static void gtkmain(GtkApplication *app, gpointer user_data)
+{
+ AppLauncher *launcher = app_launcher_new(app);
+ gtk_window_present(GTK_WINDOW(launcher));
+}
+
+int main(int argc, char **argv)
+{
+ GtkApplication *app = gtk_application_new("org.gtk.daleclack", G_APPLICATION_NON_UNIQUE);
+ g_signal_connect(app, "activate", G_CALLBACK(gtkmain), NULL);
+ return g_application_run(G_APPLICATION(app), argc, argv);
+}