Как сделать иконку в трее с меню 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;
}