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); +}