Определение размера панели задач в Linux (C / C ++ / gtkmm / other)

Как я могу найти эффективную работу моего рабочего стола Linux (что я имею в виду: высота экрана — высота панели задач)?

Мне это нужно для моей программы, которую я пишу на c ++ / gtkmm. Я хочу расположить окно в правом нижнем углу экрана над панелью задач.

Сначала я попытался максимизировать окно, проверить его высоту и вычесть его из высоты экрана. По какой-то причине он дает мне высоту до максимизации, поэтому он не работает.

1

Решение

Вам нужно подождать 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, Обратите внимание, что тестовая программа предоставляет только снимок; настоящая программа должна подключаться к вышеупомянутым сигналам для обнаружения изменений экрана или панели инструментов и соответственно обновлять размер / положение окна.

Надеюсь, вы найдете это полезным.

1

Другие решения

Маловероятно, что вы сможете достоверно определить это, особенно если пользователь не использует один и тот же рабочий стол (например, KDE против GNOME и Unity). Вы, вероятно, лучше использовать libnotify отобразить уведомление рядом с панелью задач. Вы можете добавить кнопки к уведомлению, которые вызывают обратные вызовы в вашей программе.

1

По вопросам рекламы [email protected]