所以有一个我想修补的应用程序。它使用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.
如何确定应用程序运行的屏幕?我需要它来设置宽度提示正确。
答案 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);
}