找出 Linux 中任务栏的大小 (C/C++/gtkmm/other)

Posted

技术标签:

【中文标题】找出 Linux 中任务栏的大小 (C/C++/gtkmm/other)【英文标题】:Finding out the size of taskbar in Linux (C/C++/gtkmm/other) 【发布时间】:2012-09-08 14:13:01 【问题描述】:

如何找到我的 Linux 桌面的有效工作区域(我的意思是:屏幕高度 - 任务栏高度)?

我的程序需要这个,我用 c++/gtkmm 编写。我想将窗口定位在屏幕右下角,任务栏上方。

起初我试图最大化窗口,检查它的高度并从屏幕的高度中减去它。出于某种原因,它给了我最大化之前的高度,所以它不起作用。

【问题讨论】:

假设您知道任务栏的位置是个坏主意。我在 Windows 上的其他程序中看到过这种情况,因为我的任务栏不在“预期”的位置。 【参考方案1】:

您需要等待map-event 事件才能检查窗口大小。

与 apmasell 和 senshikaze 所说的不同,您可以使用 GTK+ 非常可靠地做到这一点。但是,您应该连接到相关信号(map-eventconfigure-eventscreen-changedvisibility-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 运行。请注意,测试程序仅提供快照;真正的程序应该连接到上述信号以检测屏幕或工具栏的变化,并相应地更新窗口大小/位置。

希望你觉得这很有用。

【讨论】:

这很酷。我还没有找到一个可以很好地改变任务栏(windows 和 *nix)位置的应用程序。很高兴知道 gtk 可以做到(即使有些开发者很懒) Nominal Animal 的答案正是我想要的,非常感谢。对于建议 libnotify 的其他人 - 我知道这一点,实际上过去曾使用过它。我想做的是一个混合了假小子笔记和 igoogle 的“待办事项”的程序,它在桌面的选定区域(如左上角、右下角等)保持打开状态,并在请求时最小化到托盘. shenshikaze:是的,应用程序对工具栏的更改没有反应,这纯粹是程序员的懒惰。我有使用 Qt(确切地说是 PyQt4)的相同示例代码,它也同样有效。 GTK+ 和 Qt 版本都适用于我测试过的所有窗口管理器。 @user1656791:我有预感你在做这样的事情;这就是我发布答案的原因。以这种方式集成到桌面环境只需要程序员付出一点努力。请确保您的代码适应所有四个边缘(如我的示例代码所示),并且不假设任何内容;我很想在应用中看到这种行为!【参考方案2】:

您不太可能可靠地确定这一点,尤其是当用户使用的不是同一个桌面时(例如,KDE 与 GNOME 与 Unity)。您最好使用libnotify 在任务栏旁边显示通知。您可以在通知中添加按钮来触发程序中的回调。

【讨论】:

以上是关于找出 Linux 中任务栏的大小 (C/C++/gtkmm/other)的主要内容,如果未能解决你的问题,请参考以下文章

C/C++中判断两个变量的大小相等关系时要特别注意数据深度不够带来的影响

如何找出 C/C++ 代码中每一行花费了多少时间?

win10任务栏图标大小设置了不生效?

Visual Studio 2010 C++:malloc()/HeapAlloc 总是为最小的分配大小分配新页面

unix/linux下通过c/c++获取内存大小的方法。

自定义大小的表格视图仍然使用导航栏的偏移量