Как сделать иконку в трее с меню gtk+3.0?

Подумал что можно решить с помощью X11, но есть проблема в том - как обрабатывать потом нажатие клавиш по иконке в трее. Я не знаю как правильно делать и поэтому сделал gtk + x11. примеры сначала брал из документации, а потом в инете искал. в общем почему то тема плохо освещена. что делать? вот код, который я написал. Мне надо сделать иконку в системном трее, чтобы по правому клику мыши можно было вызвать меню. Я знаю что такое есть в wxWidgets и в qt, но я хотел бы попробывать в gtk, возможно ли это вообще?

#include <X11/Xlib.h>
#include <gdk/gdkx.h>
#include <gtk/gtk.h>
#include <time.h>
#define SYSTEM_TRAY_REQUEST_DOCK       0
GdkScreen *gdk_screen;
GdkDisplay *gdk_display;
Display *dpy;
GdkWindow *gdk_window;
Window wid, root;
Window tray;
int screen;

static void tray_icon ( ) {
    XEvent ev;
    Atom selection_atom = XInternAtom ( dpy, "_NET_SYSTEM_TRAY_S0", False );
    tray = XGetSelectionOwner ( dpy, selection_atom );
    if ( tray != None ) {
        XSelectInput ( dpy, tray, StructureNotifyMask );
    }

    memset ( &ev, 0, sizeof ( ev ) );

    ev.xclient.type = ClientMessage;
    ev.xclient.window = tray;
    ev.xclient.message_type = XInternAtom ( dpy, "_NET_SYSTEM_TRAY_OPCODE", False );
    ev.xclient.format = 32;
    ev.xclient.data.l[0] = CurrentTime;
    ev.xclient.data.l[1] = SYSTEM_TRAY_REQUEST_DOCK;
    ev.xclient.data.l[2] = wid;
    ev.xclient.data.l[3] = 0;

    XSendEvent ( dpy, tray, False, NoEventMask, &ev );
    XSync ( dpy, False );
}

static void g_startup ( GtkApplication *app, gpointer data ) {
    GMainLoop *loop = g_main_loop_new ( NULL, FALSE );

    gdk_screen = gdk_screen_get_default ( );
    gdk_display = gdk_screen_get_display ( gdk_screen );
    GtkWidget *window = gtk_application_window_new ( app );
    gtk_widget_show ( window );

    gdk_window = gtk_widget_get_window ( window );

    int width = 32;
    int height = 32;

    dpy = gdk_x11_display_get_xdisplay ( gdk_display );

    screen = DefaultScreen ( dpy );
    root = RootWindow ( dpy, screen );

    wid = XCreateSimpleWindow ( dpy, root, 0, 0, width, height, 0, 0, 0xFFFF99FF );

    tray_icon ( );

    XMapWindow ( dpy, wid );
    XSync ( dpy, False );



    g_main_loop_run ( loop );
}

int main ( int argc, char **argv ) {
    GtkApplication *app = gtk_application_new ( "org.xverizex.nguard", G_APPLICATION_FLAGS_NONE );
    g_application_register ( ( GApplication * ) app, NULL, NULL );
    g_signal_connect ( app, "activate", G_CALLBACK ( g_startup ), NULL );
    int ret = g_application_run ( ( GApplication * ) app, argc, argv );
    g_object_unref ( app );
    return ret;

}

Ответы (0 шт):