我正在编写一个程序,该程序需要在 gtk 托盘栏的上方/下方设置一个窗口。我尝试使用两种失败的方法。一种是使用 gtk_status_icon_position_menu 函数并将窗口放置在用户单击的位置(在托盘栏中)。问题是这些解决方案在 gnome(Linux) 中有效,但在 Windows 中无效。在 Linux 中它们可以工作,因为窗口管理器似乎不允许将窗口放置在托盘面板中,以尽可能接近。在 Windows 中,这不会发生,并且窗口可以“走出”屏幕,这是可以理解的,这是不希望的。
有了这个说我出去工作了。我的想法是将窗口设置在鼠标单击的位置,并获取正常窗口位置的 x 和 y 坐标,并通过它的大小检查它是否在屏幕边界内。如果没有做出更正。我想出了所需的函数,但由于某种原因, gdk_drawable_get_size(window->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;
}
我怎样才能以便携的方式做我想做的事?