Как определить область Desktop-а с учетом Taskbar-а ?

Это русская секция форума wxWidjets. В этой секции вы можете обсуждать любые вопросы, связанные с wxWidgets на вашем родном языке.
Odin_KG
In need of some credit
In need of some credit
Posts: 9
Joined: Wed Mar 10, 2021 6:08 am

Как определить область Desktop-а с учетом Taskbar-а ?

Post by Odin_KG »

Добрый день,

В справке вижу следующие варианты решения, которые работают на Windows, но не работают в Linux-ах (в частности, на Fedora). А именно:

1)

Code: Select all

wxDisplay display((unsigned int)0);
wxRect r=display.GetClientArea();
2)

Code: Select all

wxRect r=wxGetClientDisplayRect();
В обоих случаях на Linux-ах вместо реальной области Desktop-а, которая, по моему мнению, просто обязана учитывать Панель задач и исключать её из результата, мне возвращается размер монитора. Далее в описании функции wxGetClientDisplayRect() я наблюдаю шикарную фразу: On Windows this means the area not covered by the taskbar, etc. Other platforms are currently defaulting to the whole display until a way is found to provide this info for all window managers, etc. которая означает примерно следующее: "Да мы и сами не знаем, как правильно определить этот Desktop на Linux-ах."
В связи с этим вопрос... а чё делать-то ?
Например, я вижу, что Code::Blocks, который использует wxWidgets прекрасно осведомлён о правильном положении Desktop-а, так как умеет правильно разворачиваться на весь Desktop не залезая на Панель задач.
Также я не очень понимаю, почему при попытках таскать моё окно по экрану, я не могу увести это окно за область Desktop-а - окно просто упирается в край, причем прекрасно учитывается Панель задач, которая служит таким же препятствием, как и край монитора.

Тех. данные:
Версия wxWidgets: 3.1.14
Версия используемого Code::Blocks-а: 20.3
OS: Fedora (запускается под виртуалкой)
Использую xwWidgets для создания одного единственного окна без заголовка, бордера и прочего. Содержимое окна рисую самостоятельно через OpenGL.
ONEEYEMAN
Part Of The Furniture
Part Of The Furniture
Posts: 7456
Joined: Sat Apr 16, 2005 7:22 am
Location: USA, Ukraine

Re: Как определить область Desktop-а с учетом Taskbar-а ?

Post by ONEEYEMAN »

Dobrogo vremeni sutok,
V kakom meste vy nashli etu citatu?
Returns the client area of the display.

The client area is the part of the display available for the normal (non full screen) windows, usually it is the same as GetGeometry() but it could be less if there is a taskbar (or equivalent) on this display.
Eto iz opisanija "wxRect wxDisplay::GetClientArea ( ) const" v Git master.

Dolgno rabotat.

Kakoj Windows Manager u vas ustanovlen?

Spasibo.

P.S.: See also here: https://discourse.gnome.org/t/get-clien ... tor/5794/3
Odin_KG
In need of some credit
In need of some credit
Posts: 9
Joined: Wed Mar 10, 2021 6:08 am

Re: Как определить область Desktop-а с учетом Taskbar-а ?

Post by Odin_KG »

Здравствуйте,
V kakom meste vy nashli etu citatu?
В этом: https://docs.wxwidgets.org/3.0/group__g ... 7e909bcd8d
Eto iz opisanija "wxRect wxDisplay::GetClientArea ( ) const" v Git master.
Я это читал, но здесь авторы просто забыли упомянуть о том, что функция по факту бесполезна для Linux-ов. Когда справку генерируют из комментариев в исходниках, то она часто бывает очень обрывочная.
Dolgno rabotat.
Если бы работало, то я бы не создавал эту тему.
Kakoj Windows Manager u vas ustanovlen?
При старте OS вижу надпись: Plasma made by KDE

Спасибо
ONEEYEMAN
Part Of The Furniture
Part Of The Furniture
Posts: 7456
Joined: Sat Apr 16, 2005 7:22 am
Location: USA, Ukraine

Re: Как определить область Desktop-а с учетом Taskbar-а ?

Post by ONEEYEMAN »

Dobrogo vremeni sutok,
Sudja po ssylke kotoruju ja privel, GTK devs govorjat chto pod Linux eto ne vozmogno dlja GNOME/KDE. Tolko dlja X11.
A s uchetom togo chto vse moern distro perehodjat na Wayland...

Skoree vsego GTK ne imeet dostupa k etoj infe dlja raznyh okonnyh manadgerov/tem.

Mogete poprobovat dobavit svoj komentarij k moemu zaprosu na GTK forum, no bojus vam otvetjat to ge samoe...

Po povodu OSX - ne znaju voobsche.

Spasibo.
Odin_KG
In need of some credit
In need of some credit
Posts: 9
Joined: Wed Mar 10, 2021 6:08 am

Re: Как определить область Desktop-а с учетом Taskbar-а ?

Post by Odin_KG »

Здравствуйте
Skoree vsego GTK ne imeet dostupa k etoj infe dlja raznyh okonnyh manadgerov/tem.
Тогда я не очень понимаю, как этот wxWidgets используют под Linux-ами, ведь операции типа "развернуть окно" являются базовыми, а в данном случае эта функция window->Maximize() просто игнорируется. И очевидно, что это опять же происходит потому, что авторы не знают как определить область рабочего стола. Я просто реально не понимаю, как пользоваться таким продуктом, ведь это убивает переносимость между OS, а именно в этом и есть весь смысл подобных технологий.
Правда, как я выше написал, Code::blocks использующий wxWidgets, каким-то образом определяет размер рабочего стола, так как запускается первый раз в развернутом виде, а это значит, что размер окна выставлен программно.
A s uchetom togo chto vse moern distro perehodjat na Wayland...
Я из мира Windows, поэтому мне нужно кое-что уточнить...
Если я правильно понимаю, то вы мне говорите, что нужно попробовать поставить библиотеку wxWidgets+X11, но в жизни этот X11 уже используется редко, поэтому даже если эта связка и будет работать на конкретной OS, то у большинства пользователей она опять же работать не будет. Я правильно понимаю ?
Или всё же я могу, например, таскать эту библиотеку wxWidgets+X11 вместе с программой или требовать у пользователя её установки и в этом случае всё будет работать ?

Проблема сейчас в том, что я уже более-менее реализовал задуманное, т.е. у меня сейчас работает почти ВСЁ, но я уперся в этот размер Рабочего стола и немного криво работает Drag & Drop, но это можно пережить. Я потратил на это точно больше недели времени, а сейчас если я откажусь от GTK, то, вероятно, перестанет работать что-то другое, что уже работает.
Po povodu OSX - ne znaju voobsche.
Так как MAC OS - это коммерческий продукт, который имеет, практически, одну реализацию, то я надеюсь, что там проблемы быть не должно, ибо никто не пишет своих личных дисплейных менеджеров.

Спасибо
Odin_KG
In need of some credit
In need of some credit
Posts: 9
Joined: Wed Mar 10, 2021 6:08 am

Re: Как определить область Desktop-а с учетом Taskbar-а ?

Post by Odin_KG »

Так... вдруг выяснилось, что функция frame->Maximize() вполне нормально работает для примеров.
Однако в моём случае это всё равно не работает:
// Получение положения Рабочего стола
void GPlatformWidgets::GetDesktopRect(CMagicRect* rect)
{
wxFrame temp(NULL, wxID_ANY, "");
temp.Show(true);
temp.Maximize();

wxPoint pos=temp.GetPosition();
rect->left=pos.x;
rect->top=pos.y;
temp.GetSize(&rect->right, &rect->bottom);
}
И я подозреваю, что проблема в том, что я сразу же уничтожаю wxFrame, после того, как вытаскиваю из него размер и положение. Вероятно, само разворачивание выполняется позднее, а Maximize() просто устанавливает какой-то флаг.

А можно каким-то способом сразу же обновить положение wxFrame ? Я пробовал temp.Update(), но эффекта нет.
Kvaz1r
Super wx Problem Solver
Super wx Problem Solver
Posts: 357
Joined: Tue Jun 07, 2016 1:07 pm

Re: Как определить область Desktop-а с учетом Taskbar-а ?

Post by Kvaz1r »

Мне эта затея кажется странной, но попробуйте добавить

Code: Select all

temp.Layout();
и посмотреть изменится ли что-нибудь.
ONEEYEMAN
Part Of The Furniture
Part Of The Furniture
Posts: 7456
Joined: Sat Apr 16, 2005 7:22 am
Location: USA, Ukraine

Re: Как определить область Desktop-а с учетом Taskbar-а ?

Post by ONEEYEMAN »

Dobrogo vremeni sutok,
A dlja chego vam nugna eta infa?
Tolko dlja togo chtoby pravilno maksimizirovat okno? Ili esche dlja chego?

V chem smysl poluchenija razmerov klientskoj chasti Desktop?

Spasibo.
Odin_KG
In need of some credit
In need of some credit
Posts: 9
Joined: Wed Mar 10, 2021 6:08 am

Re: Как определить область Desktop-а с учетом Taskbar-а ?

Post by Odin_KG »

Здравствуйте,

Kvaz1r
и посмотреть изменится ли что-нибудь.
Ничего не изменилось

ONEEYEMAN
A dlja chego vam nugna eta infa?
В моем случае содержимое окна полностью рисуется самостоятельно через OpenGL, включая область заголовка. Точнее реальной области заголовка у меня вообще нет, я её просто рисую сам как мне нравится. В результате у меня вообще не используются никакие стандартные действия типа "развернуть, свернуть, потянуть за бордер" и т.д. И эти действия я выполняю вручную. Поэтому мне нужен полный контроль над ситуацией.
ONEEYEMAN
Part Of The Furniture
Part Of The Furniture
Posts: 7456
Joined: Sat Apr 16, 2005 7:22 am
Location: USA, Ukraine

Re: Как определить область Desktop-а с учетом Taskbar-а ?

Post by ONEEYEMAN »

Dobrogo vremeni sutok,
A zachem?
Esli ochen hochetsja - mogno otkryt ishodniki GTK i posmotret. Pravda tam vse na C....

A voobsche to - v chem togda smysl ispolzovanija wxWidgets?
Esli vse risuetsja samomu.

Spasibo.
Odin_KG
In need of some credit
In need of some credit
Posts: 9
Joined: Wed Mar 10, 2021 6:08 am

Re: Как определить область Desktop-а с учетом Taskbar-а ?

Post by Odin_KG »

Здравствуйте,
A voobsche to - v chem togda smysl ispolzovanija wxWidgets?
Смысл в том, что мне хочется портировать свой проект на Linux-ы, а их на свете дохрена. Разбираться с каждой OS и её личными заскоками не имею никакого желания и возможности.
Esli ochen hochetsja - mogno otkryt ishodniki GTK i posmotret. Pravda tam vse na C....
Смысл движков в том, что они работали, а не чтобы лазить в них и искать, почему они не работают. Просто если для того, чтобы пользоваться, нужно ковырять исходник, так проще вообще самому всё сделать с нуля.

Спасибо
ONEEYEMAN
Part Of The Furniture
Part Of The Furniture
Posts: 7456
Joined: Sat Apr 16, 2005 7:22 am
Location: USA, Ukraine

Re: Как определить область Desktop-а с учетом Taskbar-а ?

Post by ONEEYEMAN »

Dobrogo vremeni sutok,
Odin_KG wrote: Fri Mar 12, 2021 7:00 pm Здравствуйте,
A voobsche to - v chem togda smysl ispolzovanija wxWidgets?
Смысл в том, что мне хочется портировать свой проект на Linux-ы, а их на свете дохрена. Разбираться с каждой OS и её личными заскоками не имею никакого желания и возможности.
Tak v etom to vsja i ideja kross-platformennoj biblioteki - napisat odin kod i skompilirovat v razlichnyh sistemah.
wxWidgets ispolzuet GTK+ "under the hood" - biblioteku kotoraja dolgna rabotat pod ljubym distributivom Linux.

Ya ochen udivljus esli vy najdete takoj v kotorom prilogenie wxWidgets rabotat ne budet. Ot slova "voobsche".
Bez vsjakih "velosipedov".

A otrisovyvat okano ruchkami.. Nu ne znaju. Portirovat prilogenie na Linux zadacha elementarnaja osobenno esli na drugoj operacionke application uge rabotaet.
Odin_KG wrote: Fri Mar 12, 2021 7:00 pm
Esli ochen hochetsja - mogno otkryt ishodniki GTK i posmotret. Pravda tam vse na C....
Смысл движков в том, что они работали, а не чтобы лазить в них и искать, почему они не работают. Просто если для того, чтобы пользоваться, нужно ковырять исходник, так проще вообще самому всё сделать с нуля.

Спасибо
Nu da. Oni i rabotajut.
Tolko v Vashem sluchae ni wxWidgets, ni GTK+, ni Qt ne ispolzuetsja.

Poetomu dannoe vyragenie ni o chem.

Spasibo.
User avatar
T-Rex
Moderator
Moderator
Posts: 1248
Joined: Sat Oct 23, 2004 9:58 am
Location: Zaporizhzhya, Ukraine
Contact:

Re: Как определить область Desktop-а с учетом Taskbar-а ?

Post by T-Rex »

Если форма создается как локальная переменная внутри функции, то потом если сразу вызвать Maximize() и Show() - ничего не произойдет потому что event loop не отработал еще ни разу. Поэтому есть смысл, наверное wxYield() вызвать, а потом мерять размеры. Проверить пока нет возможности под Linux, но вроде должно быть логично.

ЗЫ: и да, это не проблема не во фреймворке, а в умении его применить.
ONEEYEMAN
Part Of The Furniture
Part Of The Furniture
Posts: 7456
Joined: Sat Apr 16, 2005 7:22 am
Location: USA, Ukraine

Re: Как определить область Desktop-а с учетом Taskbar-а ?

Post by ONEEYEMAN »

@T-Rex,
Cholovik bagae vidnovyty velosiped. ;-)

@OP,
V chem byla problem ispolzovanija wxFrame?

Spasibo.
User avatar
T-Rex
Moderator
Moderator
Posts: 1248
Joined: Sat Oct 23, 2004 9:58 am
Location: Zaporizhzhya, Ukraine
Contact:

Re: Как определить область Desktop-а с учетом Taskbar-а ?

Post by T-Rex »

В общем, вспомнил. В Linux окно не создается фактически пока не вызовется wxEVT_WINDOW_CREATE, поэтому внутри функции синхронно получить размер сразу после декларации скорее всего не получится. Если будет время, может напишу завтра пример, как посчитать размеры.
Post Reply