我不确定有关 Gtk 的答案是否有帮助,这个问题用gtk 标记,作者似乎使用它。使用 GNOME,我可以在 Wayland 上为每个监视器应用不同的缩放因子,X11 对所有监视器使用缩放因子。以下代码报告了比例因子:
#include <gtk/gtk.h>
#include <stdio.h>
static void activate(GtkApplication *app, gpointer user_data) {
GtkWidget *window;
window = gtk_application_window_new(app); // creates GtkApplicationWindow, returns a GtkWidget*
gtk_window_set_title(GTK_WINDOW (window), "Window"); // macro, checks types and does function style cast
gtk_window_set_default_size(GTK_WINDOW (window), 200, 200);
gtk_widget_show_all(window);
GdkWindow* gdk_window = gtk_widget_get_window(window);
GdkDisplay* gdk_display = gdk_display_get_default();
// prints sadly always '1' on my system
GdkMonitor* gdk_monitor = gdk_display_get_monitor_at_window(gdk_display, gdk_window);
int scale = gdk_monitor_get_scale_factor(gdk_monitor);
printf("scale is %d\n", scale);
// seems to work fine
int n = gdk_display_get_n_monitors(gdk_display);
for (int i = 0; i < n; ++i) {
GdkMonitor* monitor = gdk_display_get_monitor(gdk_display, i);
int scale = gdk_monitor_get_scale_factor(monitor);
printf("monitor %d, scale %d\n", i, scale);
}
}
int main(int argc, char **argv) {
GtkApplication *app;
int status;
app = gtk_application_new("org.gtk.example", G_APPLICATION_FLAGS_NONE);
g_signal_connect(app, "activate", G_CALLBACK (activate), NULL);
status = g_application_run(G_APPLICATION (app), argc, argv);
g_object_unref(app); // free memory of GtkApplication
return status;
}
编译
gcc `pkg-config --cflags gtk+-3.0` -o gtk_scale gtk_scale.c `pkg-config --libs gtk+-3.0`
当我在 Wayland 上运行应用程序时,左侧监视器(主)设置为比例因子 1,右侧监视器设置为比例因子 2:
./gtk_scale
scale is 1 # wrong, application windows resides on right screen with scale factor 2
monitor 0, scale 2 # correct
monitor 1, scale 1 # correct
更方便的函数gdk_display_get_monitor_at_window() 似乎总是返回主监视器的比例因子,而不是应用程序窗口使用的实际比例因子。
获取最大窗口所在的监视器,或者
如果它在所有监视器之外,则监视器靠近窗口。
因此,我现在推荐gdk_monitor_get_scale_factor(),它提供了正确的结果。如果连接了多个显示器 - 就像在我的示例中一样 - 您现在需要弄清楚您的应用程序窗口显示在哪一个上。
获取从监视器坐标映射到的内部比例因子
实际的设备像素。在传统系统上,这是 1,但在
非常高密度的输出,这可能是一个更高的值(通常为 2)。
如果您想为
特定的监视器,但大多数时候您是在窗口中绘制
最好使用 gdk_window_get_scale_factor() 代替。
提到的另一个函数是 Andreas 最初调查的函数,对我来说它总是返回 2。