Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: sendevent от Апрель 24, 2010, 19:56



Название: show desktop
Отправлено: sendevent от Апрель 24, 2010, 19:56
уже несколько раз проскакивал вопрос, да и самому надо:
как создать виджет, остающийся видимым после "свернуть все окна" ("показать рабочий стол", win+d, etc.)

Linux (KDE, ибо с другими DE не знаком)
KDE 4 с плазмой делают этот вопрос неактуальным - достаточно просто установить Qt::WindowStaysOnBottomHint, "показать рабочий стол" показывает нечто вроде макосевого дашборда, к виджетам-не-плазмоидам доступа нет (upd: наврал, виджет "поверх всех окон" - с флагами Qt::CustomizeWindowHint | Qt::WindowStaysOnTopHint | Qt::ToolTip | Qt::FramelessWindowHint -  вполне себе доступен).
в KDE 3 приходит уже не помню какой ивент, после которого можно просто показать виджет заново с маленькой задержкой (QTimer::singleShot(25) к show();). думаю, кому третьи кеды актуальны - сами могут посмотреть, что приходит при сабже.

Windows
про нее обычно и спрашивают =) вот, нарыл (ну как нарыл... вторая ссылка в гугле :-) ) на codeproject (http://www.codeproject.com/KB/gadgets/CalendarGadget.aspx).
суть: ставим хук на EVENT_SYSTEM_FOREGROUND, в нем проверяем, если для десктопа (GetClassName для целевого HWND -  "WorkerW") - bring-to-top'аем свой виджет:
Код:
SetWindowPos( widgetHwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE );
SetWindowPos( widgetHwnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE );
если нет акка или лень логиниться - исходники примера по ссылке приаттачил. отмечу сразу, что виджету-гаджету надо задавать те же флаги, что и в примере (Qt::CustomizeWindowHint | Qt::SplashScreen | Qt::FramelessWindowHint) - добавление WindowStaysOnBottomHint ломает костыль нафиг.

Mac OS
мак трогал один раз. чужой. в качестве пользователя. посему - хз че там да как=)

собсно, предлагаю поделиться опытом для мака и линуксовых WM'ов.


Название: Re: show desktop
Отправлено: crossly от Апрель 26, 2010, 11:47
Цитировать
KDE 4 с плазмой делают этот вопрос неактуальным - достаточно просто установить Qt::WindowStaysOnBottomHint.....
это изврат.... лучше написать плазмоид...


Название: Re: show desktop
Отправлено: fdn от Апрель 27, 2010, 08:01
Это плохой тон. Если есть "кнопка" свернуть все окна, то она должна сворачивать все окна без исключения.


Название: Re: show desktop
Отправлено: Igors от Апрель 27, 2010, 09:59
По поводу Mac. Там есть "Hide" - можно выбрать из контекстного меню или просто кликнуть в окно др. задачи с нажатой клавишей Option. Результат - все окна задачи скрываются (но не сбрасываются в minimize), хоть эти окна модальные, floating - хоть какие. Другой процесс получает фокус и захватывает меню.

Можно ли это победить - не знаю, но точно - надо прочитать apple буквари, нарыть системные ф-ции и.т.п. Вместо "легкой изящной вещицы" - нудная рутинная работа без всякого творческого элемента  :)