2017-09-26 5 views
2

Ich benutze die neueste GTK + mit MSYS2 installiert und wenn ich zu verwenden versuchen g_application_send_notification() es ergibt sich immer in der folgenden assert:g_object_new: behaupten von einem Aufruf von g_application_send_notification()

(Notification Project.exe:27780): GLib-GObject-CRITICAL **: g_object_new: 
assertion 'G_TYPE_IS_OBJECT (object_type)' failed 

Warum ich denke, es ist ein Bug - weil ich viele Code-Beispiele neben Minen (sie sind alle ganz wie Minen sowieso), von Menschen versucht, die es (von Lars Uebernickel einschließlich notifaction) bekam zu arbeiten und sie alle die gleiche klagen macht. Bestätigen, gefolgt von Absturz. Jetzt weiß ich wirklich nicht, was das bedeutet, wie es ist wahrscheinlich innerhalb gtk Interna, aber ich hoffe wirklich, einige von euch vielleicht haben Ahnung oder Erfahrung mit diesem.

  • installieren (GNU coreutils) 8,25
  • GIO Version 2.52.3
  • mingw32/mingw-w64-i686-gtk-engine-unico 1.0.2-2 [installiert]
  • mingw32/mingw -w64-i686-gtk3 3.22.16-1 [installiert]
  • mingw32/mingw-w64-i686-gtkmm3 3.22.0-1 [installiert]
  • mingw32/mingw-w64-i686-Gewürz-gtk 0.33- 1 [installiert]
  • mingw32/mingw-W64-i686-webkitgtk3 2.4.11-4 [inst ALLED]
  • mingw64/mingw-w64-x86_64-gtk-engine-unico 1.0.2-2 [installiert]
  • mingw64/mingw-w64-x86_64-gtk3 3.22.16-1 [installiert]
  • mingw64/mingw-w64-x86_64-gtkmm3 3.22.0-1 [installiert]
  • mingw64/mingw-w64-x86_64-Gewürz-gtk 0,33-1 [installiert]
  • mingw64/mingw-w64-x86_64-webkitgtk3 2.4. 11-4 [installiert]

Ein Beispiel des Codes, der gener Ates diese assert:

#ifdef HAVE_CONFIG_H 
#include "config.h" 
#endif 

#include <gtk/gtk.h> 

#define ICON_PATH "/path/trash_16x16.gif" 

int main (int argc, char *argv[]) 
{ 
    GApplication *app; 

    app = g_application_new ("org.one", G_APPLICATION_FLAGS_NONE); 
    if(!app) 
    { 
     g_print ("Error app\n"); 
    } 
    else 
    { 
     if(g_application_register (app, NULL, NULL)) 
     { 
      GNotification *notification; 
      GFile *file; 
      GIcon *icon; 
      notification = g_notification_new ("one"); 
      g_notification_set_body (notification, "Hello world"); 
      file = g_file_new_for_path (ICON_PATH); 
      icon = g_file_icon_new (file); 
      g_notification_set_icon (notification, G_ICON (icon)); 
      g_application_send_notification (app, NULL, notification); 
      g_object_unref (icon); 
      g_object_unref (file); 
      g_object_unref (notification); 
      g_object_unref (app); 
      g_print ("yes\n"); 
     } 
     else 
     { 
      g_print ("no\n"); 
     } 
    } 
    return 0; 
} 

Ist das alles, was ich dieses Problem tun können, umgehen, oder vielleicht sogar lösen?

+1

Zunächst einmal ist SO kein GTK-Bug-Tracker, also warum hier posten? Wenn Sie möchten, dass wir Sie beruhigen, sollten Sie einen MCVE veröffentlichen. –

+0

@EugeneSh Sorry, wenn ich falsch verstehe, aber was ist MCVE? Auch nicht für Programmierprobleme. Dies ist ein Programmierproblem. – Malina

+0

Ihre Frage wäre besser mit Ihrem Aufruf an g_application_send_notification in der Frage enthalten. Aber ich denke, es ist wahrscheinlich, dass es nicht viel ausmacht, also: Ich werde nicht –

Antwort

0

Es gibt noch keine Benachrichtigung Backends sind, die auf W32 arbeiten, bestätigt. Contributors wollten einmal solche erstellen, aber die API (W32 toast notifications), die benötigt wird, ist COM-only, und MinGW-w64 hat dafür noch nicht die notwendigen Header. enter image description here


Mit Blick auf die glib gio Quellcode und GNotificationBackend Schnittstelle speziell, können wir sehen, dass es einfach ist.

Nun könnten Sie tun es nur in GTK ... oder wir könnten es den richtigen Weg (TM) tun und einen D-Bus-Server für die es umzusetzen. Das Gute an einem Benachrichtigungsserver ist, dass Benachrichtigungen auch nach dem Beenden einer Anwendung bestehen bleiben können. Auch GTK hat bereits Backends zu einem Benachrichtigungsserver sprechen, so müssten Sie nur diese Backends auf W32 aktivieren (auf einen Blick, der Code nichts verwenden, die nicht auf W32 funktioniert bereits).Auf diese Weise würde der Server transparent Shell_NotifyIcon (unter Windows 7 und früher) oder Toast-Benachrichtigungen verwenden (unter Windows 8 und höher; wenn Sie jemals die Möglichkeit haben, diese zu implementieren).

Eine weitere Option, wenn Sie plattformübergreifend erhalten möchten, ist Shell_NotifyIcon Implementierung in einer DLL zu erstellen und wenn Windows erkannt wird, verwenden Sie Shell_NotifyIcon wenn nicht, GNotification wie Sie würden.

Verwandte Themen