获取监视器编号小部件在gtk 2中打开

时间:2014-01-16 08:38:04

标签: c gtk

所以有一个我想修补的应用程序。它使用GtkWidget作为其最顶层的容器。我想做以下操作,检查屏幕数量,如果是> 2则检查应用程序执行的屏幕宽度(焦点在屏幕上)。我可以使用Xinerama,但首先我想尝试原生Gtk的东西。我所做的是:

  num_monitors = gdk_screen_get_n_monitors (screen);

然后我找到了一个函数gdk_screen_get_monitor_at_window(screen, ?window?),但它以屏幕和GtkWindow为参数。不幸的是我没有窗口,只有小部件。我试图通过gtk_widget_get_parent_window(widget)gtk_widget_get_window(widget)获取窗口,这些总是导致我GDK_IS_WINDOW (widget)失败。另一方面,gtk_widget_get_has_window(window)返回1.

如何确定应用程序运行的屏幕?我需要它来设置宽度提示正确。

2 个答案:

答案 0 :(得分:1)

您可能无法获取窗口,因为窗口小部件尚未实现和/或映射。如果不是NULL,您将从gtk_widget_get_window()获得gtk_widget_get_has_window()

{{1}}的返回值可能是静态的;一个特定的小部件类总是有一个窗口,或者永远不会有一个窗口。

在解压缩窗口之前,尝试使用gtk_widget_realize()强制实现窗口小部件。如果失败,也尝试映射它。

您可能希望从另一端调查此问题,即决定您希望/希望窗口小部件使用哪个屏幕,并查看该屏幕的信息,而无需从窗口小部件本身开始。

答案 1 :(得分:0)

在函数返回正确的屏幕之前,必须实际显示该窗口。这使您的窗口管理器可以应用其放置策略。为了确保显示小部件,您可以使用gtk_main_iteration()对其进行调用,直到没有其他未决事件为止。

示例代码:

#include <stdio.h>
#include <gtk/gtk.h>

int main(int argc, char** argv)
{
    gtk_init(&argc, &argv);
    GtkWidget*const widget=gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_widget_show(widget);
    while(gtk_events_pending())
        gtk_main_iteration();

    GdkWindow*const window=gtk_widget_get_window(widget);
    GdkScreen*const screen=gdk_window_get_screen(window);
    const int monitor=gdk_screen_get_monitor_at_window(screen,window);
    printf("Monitor number: %d\n",monitor);
}