For GNotification to work, you need a .desktop file installed with the same name as your application-id
Otherwise you can use libnotify directly without a .desktop file On Tue, Dec 6, 2016, 2:01 PM eddie <mrcyberfigh...@gmail.com> wrote: > Hi everybody, > > I have write the following code but their is no way to send a > > notification even > > if it's say that isn't guarantee that something will happen in the > documentation > > concerning notifications with gtk/gio. > > ```C > > #include <gtk/gtk.h> > #include <stdlib.h> > #include <string.h> > > #define DEBUG_FUNC_MARK do { fprintf(stdout,"\n%s(...) called\n", > __func__) ; } while(0) ; > > /** GtkApplication example: > * > * To compile with: > * > * $ cc gtk_GtkApplication.c `pkg-config --cflags --libs gtk+-3.0` > * > *****************************************************************/ > static void activate (GApplication *application, gpointer user_data) ; > > static void startup(GApplication *application, gpointer user_data) ; > > static void open_files(GApplication *application, GFile **files, gint > n_files, const gchar *hint) ; > > > > static void about_activated(GSimpleAction *action, GVariant *parameter, > gpointer app) ; > > static void preferences_activated(GSimpleAction *action, GVariant > *parameter, gpointer app) ; > > static void quit_activated(GSimpleAction *action, GVariant *parameter, > gpointer app) ; > > static void shutdown_app(GApplication *application, gpointer user_data) ; > > > > void destroy(GtkWidget *widget, gpointer pointer) ; > > static gboolean delete_event(GtkWidget *widget,GdkEvent *event,gpointer > pointer) ; > > GtkApplication *app; > > int main (int argc, char **argv) { > > int status; > > GtkWidget *window ; > > > // Given the program a name to displaying to the user through: > g_get_application_name(). > g_set_application_name("myapp") ; > > const char *app_id = "myapp.org" ; > > if ( ! g_application_id_is_valid(app_id) ) { > > fprintf(stderr, "Wrong app id\n") ; > exit(EXIT_FAILURE) ; > > } > > > // Setting the applications flags > int app_flags = G_APPLICATION_HANDLES_OPEN ; > > app_flags |= G_APPLICATION_NON_UNIQUE ; > app_flags |= G_APPLICATION_SEND_ENVIRONMENT ; > > > app = gtk_application_new(app_id, (GApplicationFlags) app_flags) ; > > // The ::activate signal is emitted on the primary instance when an > activation occurs. When g_application_activate() is called. > g_signal_connect( G_APPLICATION(app), "activate", > G_CALLBACK(activate), NULL) ; > // The ::open signal is emitted on the primary instance when there > are files to open. > g_signal_connect( G_APPLICATION(app), "open", > G_CALLBACK(open_files), NULL) ; > // The ::startup signal is emitted on the primary instance > immediately after registration. When g_application_register() is called. > g_signal_connect( G_APPLICATION(app), "startup", > G_CALLBACK(startup), NULL) ; > // The ::shutdown signal is emitted only on the registered primary > instance immediately after the main loop terminates. > g_signal_connect( G_APPLICATION(app), "shutdown", > G_CALLBACK(shutdown_app), NULL) ; > > GError *err = NULL ; > > g_application_register(G_APPLICATION(app), NULL, &err) ; > > if (err != NULL) { > > fprintf(stderr,"Cannot register app: %s\n", err->message) ; > exit(EXIT_FAILURE) ; > > } > > > > fprintf(stdout,"GtkApplication DBUS path: %s\n", > g_application_get_dbus_object_path(G_APPLICATION(app)) ) ; > > GtkBuilder *builder; > GMenuModel *app_menu ; > > static GActionEntry app_entries[] = { > > { "preferences", preferences_activated, NULL, NULL, NULL }, > { "about", about_activated, NULL, NULL, NULL }, > { "quit", quit_activated, NULL, NULL, NULL } > > }; > > g_action_map_add_action_entries(G_ACTION_MAP(app), app_entries, > G_N_ELEMENTS(app_entries), app); > > builder = gtk_builder_new_from_file("./GtkApplication/menus.ui"); > > fprintf(stdout,"builder: %p\n", builder) ; > > app_menu = G_MENU_MODEL (gtk_builder_get_object (builder, "appmenu")); > > if (gtk_application_prefers_app_menu(app)) { > > gtk_application_set_app_menu(GTK_APPLICATION(app), app_menu); > > } > > g_object_unref (builder); > > > //g_application_set_inactivity_timeout( G_APPLICATION(app), 10000) ; > > > window = gtk_application_window_new(app) ; > > g_signal_connect(G_OBJECT(window),"destroy",G_CALLBACK(destroy),NULL) ; > > > g_signal_connect(G_OBJECT(window),"delete-event",G_CALLBACK(delete_event),NULL) > ; > > gtk_widget_show_all(window) ; > > > > > g_application_set_default(g_application_get_default()) ; > > g_application_activate(G_APPLICATION(app)) ; > > status = g_application_run(G_APPLICATION(app), argc, argv) ; > > g_object_unref (app); > > return status; > } > > static void activate(GApplication *application, gpointer user_data) { > > #ifdef DEBUG > DEBUG_FUNC_MARK > #endif > > g_application_hold(application) ; > > GNotification *notification = g_notification_new( > g_get_application_name() ) ; > > g_notification_set_title(notification, "title") ; > > g_notification_set_default_action(notification, "app.actions") ; > > gchar *notification_body = g_strdup_printf("Test notification body\n") ; > > g_notification_set_body(notification, notification_body) ; > > g_notification_set_priority(notification, > G_NOTIFICATION_PRIORITY_NORMAL) ; > > g_application_send_notification( G_APPLICATION(application), > "notification", notification); > > g_application_release(application) ; > > /** @Note: when doing a longer-lasting action here that returns > ** to the mainloop, you should use g_application_hold() and > ** g_application_release() to keep the application alive until > ** the action is completed. > ** Only by not intern done things like file opening not by toplevel > displaying . > > ********************************************************************************/ > } > > static void startup(GApplication *application, gpointer user_data) { > //#ifdef DEBUG > DEBUG_FUNC_MARK > //#endif > > g_print ("startup\n"); > > /** @Note: when doing a longer-lasting action here that returns > ** to the mainloop, you should use g_application_hold() and > ** g_application_release() to keep the application alive until > ** the action is completed. > ** Only by not intern done things like file opening not by toplevel > displaying . > > ********************************************************************************/ > } > > static void open_files(GApplication *application, GFile **files, gint > n_files, const gchar *hint) { > > //#ifdef DEBUG > DEBUG_FUNC_MARK > //#endif > > gint i; > > for (i = 0; i < n_files; i++) { > > gchar *uri = g_file_get_uri (files[i]); > g_print ("open %s\n", uri); > > g_free (uri); > > } > > /** @Note: when doing a longer-lasting action here that returns > ** to the mainloop, you should use g_application_hold() and > ** g_application_release() to keep the application alive until > ** the action is completed. > ** Only by not intern done things like file opening not by toplevel > displaying . > > ********************************************************************************/ > } > > static void about_activated(GSimpleAction *action, GVariant *parameter, > gpointer app) { > > //display_about_dialog(NULL, NULL) ; > > return ; > > } > > static void preferences_activated(GSimpleAction *action, GVariant > *parameter, gpointer app) { > > //configure_program_dialog(NULL, NULL) ; > > return ; > > } > > static void quit_activated(GSimpleAction *action, GVariant *parameter, > gpointer app) { > > //#ifdef DEBUG > DEBUG_FUNC_MARK > //#endif > > destroy(NULL, NULL) ; > > return ; > > } > > static void shutdown_app(GApplication *application, gpointer user_data) { > > //#ifdef DEBUG > DEBUG_FUNC_MARK > //#endif > > fprintf(stdout,"application shutdown\n") ; > > destroy(NULL, NULL) ; > > return ; > > } > > void destroy(GtkWidget *widget, gpointer pointer) { > > //#ifdef DEBUG > DEBUG_FUNC_MARK > //#endif > > exit(EXIT_SUCCESS) ; > > } > > static gboolean delete_event(GtkWidget *widget,GdkEvent *event,gpointer > pointer) { > > #ifdef DEBUG > DEBUG_FUNC_MARK > #endif > > if (event->type == GDK_DELETE) { > > > #ifdef DEBUG > fprintf(stdout,"%s delete_event catch\n", __func__) ; > #endif > > return FALSE ; > } > else { > > #ifdef DEBUG > fprintf(stdout,"%s delete_event not catch\n", __func__) ; > #endif > > return FALSE ; > } > } > > ``` > > I work on a Ubuntu-Gnome system 16.10. > > I don't understand why my application doesn't send any notification. > > Is it a DBus problem or some other kind of underlying problem. > > > Thanks for your answers, > > best regards, > > mrcyberfighter. > > > -- > > 3D imaging web-site: www.3dreaming-imaging.net > <http://www.3dreaming-imaging.net/> > > International web-site: www.open-source-projects.net > <http://www.open-source-projects.net/> > > > -- > 3D imaging web-site: www.3dreaming-imaging.net > <http://www.3dreaming-imaging.net/> > International web-site: www.open-source-projects.net > <http://www.open-source-projects.net/> > _______________________________________________ > gtk-app-devel-list mailing list > gtk-app-devel-list@gnome.org > https://mail.gnome.org/mailman/listinfo/gtk-app-devel-list > _______________________________________________ gtk-app-devel-list mailing list gtk-app-devel-list@gnome.org https://mail.gnome.org/mailman/listinfo/gtk-app-devel-list