在系统托盘附近放置一个窗口

时间:2009-12-10 14:11:30

标签: cross-platform menu gtk system-tray

我正在编写一个程序,需要在gtk的托盘栏上方/下方设置一个窗口。我尝试过使用失败的2种方法。一个是使用gtk_status_icon_position_menu函数并将窗口放在用户单击的位置(在托盘栏中)。问题是这些解决方案适用于gnome(Linux),但不适用于Windows。在Linux中它们起作用,因为窗口管理器似乎不允许在托盘面板中放置窗口,以纪念最接近的窗口。在Windows中,这不会发生,并且窗口可以“离开”屏幕,这是不可取的。

据说这个我出去工作了。我的想法是将窗口设置在鼠标单击的位置,并获取正常窗口放置的x和y坐标,并使用它的大小检查它是否在屏幕边界内。如果没有做出更正。我已经提出了所需的功能但由于某种原因gdk_drawable_get_size(window->窗口,& WindowWidth,& WindowHeight)和其他类似的功能仅在第二次运行信号功能后给出正确的大小值。第一次运行的结果只有1到大小和宽度。 (我已经读过X11没有给出正确结果的问题,但我认为这不是它)

event_button = (GdkEventButton *) event;
        if (event_button->button == 1)
        {
            if (active == 0)
            {
                gboolean dummy;
                gint WindowHeight, WindowWidth, WindowPosition[2];
                GdkScreen *screen;
                gint ScreenHeight, ScreenWidth;

                dummy = FALSE;
                gtk_widget_show_all(window);
                gtk_window_present(GTK_WINDOW(window));
                gtk_status_icon_position_menu(menu, &pos[X], &pos[Y], &dummy, statusicon);
                gtk_window_move(GTK_WINDOW(window), pos[X],pos[Y]);

                gdk_drawable_get_size(window->window ,&WindowWidth, &WindowHeight);

                screen = gtk_status_icon_get_screen(statusicon);
                ScreenWidth = gdk_screen_get_width(screen);
                ScreenHeight = gdk_screen_get_height(screen);
                g_print("Screen: %d, %d\nGeometry: %d, %d\n",ScreenWidth, ScreenHeight, WindowWidth, window->allocation.height);

                gtk_entry_set_text(GTK_ENTRY(entry),"");
                active = 1; 
                return TRUE;
            }

我怎样才能以便携的方式做我想做的事?

1 个答案:

答案 0 :(得分:0)

我认为gtk_status_icon_position_menu应该可以正常工作,因为我将它用于同一目的 你是否正在尝试使用X11,你得到的实际结果是什么。