如何找到我的 Linux 桌面的有效工作(我的意思是:屏幕的高度 - 任务栏的高度)?
我的程序需要这个,我用 c++/gtkmm 编写。我想将窗口定位在屏幕右下角,任务栏上方。
起初我试图最大化窗口,检查它的高度并从屏幕的高度中减去它。出于某种原因,它给了我最大化之前的高度,所以它不起作用。
如何找到我的 Linux 桌面的有效工作(我的意思是:屏幕的高度 - 任务栏的高度)?
我的程序需要这个,我用 c++/gtkmm 编写。我想将窗口定位在屏幕右下角,任务栏上方。
起初我试图最大化窗口,检查它的高度并从屏幕的高度中减去它。出于某种原因,它给了我最大化之前的高度,所以它不起作用。
您不太可能可靠地确定这一点,尤其是当用户不使用同一个桌面时(例如,KDE 与 GNOME 与 Unity)。您最好使用libnotify在任务栏旁边显示通知。您可以在通知中添加按钮以触发程序中的回调。
map-event
在检查窗口大小之前,您需要等待事件。
与 apmasell 和 senshikaze 所说的不同,您可以使用 GTK+ 非常可靠地做到这一点。但是,您应该连接到相关信号(map-event
、configure-event
、和可能),因此当屏幕分辨率或工具栏发生变化时,您的小窗口将正确移动/调整大小screen-changed
。visibility-notify-event
window-state-event
例如,我个人在 XFCE4 上使用了两个自动隐藏栏。如果有一个小工具窗口“停靠”在右下角,我希望它在显示我的底栏时移开。
如果该窗口是纯通知窗口,那么我同意 apmasell 的观点,即您最好使用libnotify
(例如,notify-send ...
作为子进程运行)来生成正常的通知窗口。
作为概念证明,这里有一个小 C 程序 ,size.c
它使用完全透明的未装饰窗口获取信息:
#include <gtk/gtk.h>
#include <gdk/gdk.h>
#include <stdio.h>
int screen_width = -1;
int screen_height = -1;
int window_left = -1;
int window_top = -1;
int window_width = -1;
int window_height = -1;
void done(GtkWidget *widget, void *payload)
{
GdkScreen *screen = gtk_widget_get_screen(widget);
screen_width = gdk_screen_get_width(screen);
screen_height = gdk_screen_get_height(screen);
gtk_window_get_position((GtkWindow *)widget, &window_left, &window_top);
gtk_window_get_size((GtkWindow *)widget, &window_width, &window_height);
gtk_widget_destroy(widget);
gtk_main_quit();
}
int main(int argc, char *argv[])
{
GtkWidget *window;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_opacity((GtkWindow *)window, 0.0);
gtk_window_set_decorated((GtkWindow *)window, (gboolean)FALSE);
gtk_window_maximize((GtkWindow *)window);
gtk_widget_show(window);
g_signal_connect(window, "map-event", G_CALLBACK(done), NULL);
gtk_main();
if (screen_width > 0 && screen_height > 0)
printf("Screen is %d x %d pixels\n", screen_width, screen_height);
if (window_width > 0 && window_height > 0)
printf("Window is %d x %d pixels\n", window_width, window_height);
if (window_left > 0)
printf("There is a %d pixel wide left bar\n", window_left);
if (window_left >= 0 && window_width > 0 && screen_width > 0 && window_width + window_left < screen_width)
printf("There is a %d pixel wide right bar\n", screen_width - (window_width + window_left));
if (window_top > 0)
printf("There is a %d pixel tall top bar\n", window_top);
if (window_top >= 0 && window_height > 0 && screen_height > 0 && window_height + window_top < screen_height)
printf("There is a %d pixel tall bottom bar\n", screen_height - (window_height + window_top));
return 0;
}
编译使用
gcc -W -Wall size.c `pkg-config --cflags --libs gtk+-3.0` -o size
或者,如果仍在使用 GTK+ 2,
gcc -W -Wall size.c `pkg-config --cflags --libs gtk+-2.0` -o size
使用./size
. 请注意,测试程序仅提供快照;一个真实的程序应该连接到上述信号以检测屏幕或工具栏的变化,并相应地更新窗口大小/位置。
希望您觉得这个有帮助。