c++ - 找出Linux中任务栏的大小(C/C++/gtkmm/其他)

标签 c++ c linux user-interface gtkmm

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

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

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

最佳答案

在检查窗口大小之前,您需要等待 map-event 事件。

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

希望您觉得这很有用。

关于c++ - 找出Linux中任务栏的大小(C/C++/gtkmm/其他),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12331486/

相关文章:

c++ - 为 ISO 8859-1 实现 basic_string<unsigned char>

c++ - 如何将 C++ 目标文件与 ld 链接

c++ - 为什么添加两个值在运行时有如此高的可变性?

我可以在没有 fork 的情况下执行 shell 或系统调用吗?

c - 如何从C中的数字中提取数字?从最高位开始?

linux - Linux 和 Windows socket 编程中 INADDR_ANY 的区别

c++ - 如何分析指针别名的性能影响?

c++ - 如何在C++中更清楚地包含头文件

php - Linux (centos) 上的 Codeigniter 类和文件名区分大小写

c - 在内核模块中,如何知道给定路径是文件还是目录?