Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 查找Linux中任务栏的大小(C/C+;+;/gtkmm/other)_C++_C_Linux_User Interface_Gtkmm - Fatal编程技术网

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

C++ 查找Linux中任务栏的大小(C/C+;+;/gtkmm/other),c++,c,linux,user-interface,gtkmm,C++,C,Linux,User Interface,Gtkmm,我如何才能找到我的Linux桌面的有效工作空间(我的意思是:屏幕的高度-任务栏的高度) 我的程序需要这个,我是用c++/gtkmm编写的。我想把窗口放在屏幕右下角,任务栏上方 起初,我试图最大化窗口,检查它的高度,然后从屏幕高度中减去它。出于某种原因,它给出了最大化之前的高度,因此它不起作用。您不可能可靠地确定这一点,特别是如果用户没有使用相同的桌面(例如KDE与GNOME与Unity)。您最好使用在任务栏旁边显示通知。您可以向通知中添加触发程序回调的按钮。在检查窗口大小之前,您需要等待映射事件

我如何才能找到我的Linux桌面的有效工作空间(我的意思是:屏幕的高度-任务栏的高度)

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


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

您不可能可靠地确定这一点,特别是如果用户没有使用相同的桌面(例如KDE与GNOME与Unity)。您最好使用在任务栏旁边显示通知。您可以向通知中添加触发程序回调的按钮。

在检查窗口大小之前,您需要等待
映射事件

与apmasell和senshikaze所说的不同,使用GTK+可以非常可靠地实现这一点。但是,您应该连接到相关信号(
map event
configure event
screen changed
visibility notify 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;
}
或者,如果仍然使用GTK+2

gcc -W -Wall size.c `pkg-config --cflags --libs gtk+-2.0` -o size
使用
/size
运行。请注意,测试程序仅提供快照;真正的程序应该连接到上述信号,以检测屏幕或工具栏的变化,并相应地更新窗口大小/位置


希望您觉得这很有用。

如果您知道任务栏的位置,那就不是个好主意。我在windows上的其他程序中也看到过这种情况,因为我的任务栏不在“预期”的位置,所以有点浮动。这很酷。我还没有找到一个能很好地改变任务栏(windows&*nix)位置的应用程序。很高兴知道gtk可以做到这一点(即使有些开发人员很懒),我一直在寻找的是名义动物的答案,非常感谢。对其他人来说,我知道这一点,事实上我在过去也使用过它。我想做的是一个混合了tomboy便笺和igoogle“待办事项列表”的程序,它在桌面的选定区域(如左上角、右下角等)保持打开状态,并在需要时最小化到托盘。shenshikaze:是的,应用程序对工具栏的更改不作出反应纯粹是程序员的懒惰。我有相同的使用Qt的示例代码(确切地说是PyQt4),它也可以工作。GTK+和Qt版本都适用于我测试过的所有窗口管理器@用户1656791:我有预感你在做这样的事情;这就是为什么我发布了我的答案。以这种方式集成到桌面环境只需要程序员付出一点努力。请确保您的代码适用于所有四条边(如我的示例代码所示),并且不假设任何内容;我很想在应用程序中看到这种行为!
gcc -W -Wall size.c `pkg-config --cflags --libs gtk+-2.0` -o size