LINUX.ORG.RU

tk: Сделать мозаику из окон

 , ,


0

1

Хочу сделать автоматический layout своих нескольких toplevel окон, чтобы они разлеглись мозаикой. Если монитора более одного, то они должны разлечься на одном из мониторов.

Причём мозаика может быть неравного размера. Допустим, редактор занимает 3/4 экрана, а остальные окошки к нему сбоку прилеплены (как это обычно бывает в IDE)

★★★★★

Последнее исправление: Klymedy (всего исправлений: 1)

Ответ на: комментарий от Begemoth

Я понимаю, но у меня нет ресурсов это делать. Весьма вероятно, что средствами tk это сделать совсем нельзя.

Лично мне было бы достаточно просто запоминания текущих положений, причём я обычно занимаю более одного монитора окнами IDE.

Но для первого знакомства нужно что-то осмысленное по умолчанию. Если док сделать не могу, то хотя бы задать предопределённые положения окон в виде долей от размера экрана. И тут я уже столкнулся с тем, что у окон есть рамки, а инфу о рамках tk не даёт. Ща попробую потыкать в экран иголкой, может быть, так удастся нащупать границы окна.

den73 ★★★★★
() автор топика
Последнее исправление: den73 (всего исправлений: 2)

Самые продвинутые IDE реализованы на Java :-) А не на каких-то там прочих цепепе и, тем более, tcl/tk :-) Взял бы уже Java для своего Яра и уже бы заключал контракты на поддержку пользователей :-) Лол :-)

anonymous
()
Ответ на: комментарий от den73

Похоже, что на моём LXDE работает totalGeometry, однако в 2004 году сообщалось, что оно не работает «под X11», без указания оконного менеджера. Мне думается, что мне просто повезло с оконным менеджером.

den73 ★★★★★
() автор топика
Ответ на: комментарий от den73

Метод тыкания иголкой состоит в том, что окно максимизируется, а потом путём многократного вызова winfo containing находятся части экрана, к-рые не принадлежат этому окну. Правда, так мы нащупаем и панель задач. Похоже, надо померять размеры рамок, а потом надеяться, что такие же размеры рамок будут и у другого окна, а размеры экрана определять как размеры максимизированного окна + размеры рамок.

den73 ★★★★★
() автор топика
Последнее исправление: den73 (всего исправлений: 1)
Ответ на: комментарий от den73

Похоже, решение существует.

1. Делаем окно .q на весь экран.

2. Делаем окно .w намного поменьше (размером 1х1 пиксел) и располагаем его внутри содержимого окна .q (всё же winfo geometry показывает нам, где находится содержимое окна .q, а wm geometry показывает, где начинается рамка окна .q. Гарантии успеха у нас, тем не менее, нет.

3. Отступая разное расстояние наружу от содержимого окна .w, расположение к-рого мы знаем из .winfo geometry, ждём, пока winfo containing начнёт возвращать .w , а не пустоту. Так мы делаем для всех 4 сторон.

Если этого не случится, значит рамка в этом направлении слишком большая и нам не удастся сделать мозаику. Либо мы неудачно расположили окно .q внутри окна .w, но лично я ничего продумывать для этого случая не буду. В нормальных условиях рамки должны быть достаточно тонкими, чтобы окно размером 1х1 заведомо поместилось внутри окна, развёрнутого на весь экран.

Я хотел опереться на размеры экрана, но в офтопике они возвращаются неправильные для двух мониторов.

den73 ★★★★★
() автор топика
Последнее исправление: den73 (всего исправлений: 1)
Ответ на: комментарий от bvn13

язык, к-рый я разрабатываю, ставлю такую метку на темы, к-рые относятся к нему или к его IDE

den73 ★★★★★
() автор топика
Ответ на: комментарий от Aswed

Там же, где и IDE - в альфе, но факториал уже считает, см. профиль.

den73 ★★★★★
() автор топика
Последнее исправление: den73 (всего исправлений: 1)
Ответ на: комментарий от bvn13

Это древнеславянский корень, который означал что-то вроде духа яркости, возрождения и плодородия. Отсюда ярость, яркость, ярило, яровые и так далее. Ярило — божество, воплощающее этот дух.

numbershnumber
()
Ответ на: комментарий от bvn13

Автор назвал свой язык, насколько я понял, таким образом, в контексте возрождения национального духа, что само по себе, конечно, похвально

numbershnumber
()
Ответ на: комментарий от den73

В офтопике развёрнутое окно имеет другие рамки, чем обычное. Блин.

den73 ★★★★★
() автор топика
Ответ на: комментарий от numbershnumber

У тебя не может быть своего Яра, эта торговая марка запатентована древними славянами

Причём тут я? :-) Это проблема изобретателей очередного 100500-го кулязычка :-) В частности, таких персонажей как den73 и некоего анонiмуса или как там правильно :-) Лол :-)

anonymous
()
Ответ на: комментарий от den73

panedwindow спасут «отца русской демократии» и язык Яр заодно :-)

или grid менеджер..

и там и там можно задавать %%

hint: растягиваешь toplevel на весь screen и получаешь искомое, вложенные виджеты ложаться как задумывает автор

hint2: расположением самих toplevel должен ведать windowmanager и не дело приклада их таскать. Хотя и можно :-) просто позиционируйте окна поверх виджетов «full-screen окна»

MKuznetsov ★★★★★
()
Ответ на: комментарий от numbershnumber

Ты конформист?

Если ты под этим имеешь в виду отказ изобретать свой 100500-й кулязычок, отличающийся от 100499 ранее изобретённых лишь добавлением некоей собственной ахинеи, то таки да, ответ положительный :-) А ты, зачится, хочешь изобрести свой кулязычок c кулООП поддержкой? :-) А den73 хочет кулязычок с поддержкой кириллицы, так? :-) Лол :-)

anonymous
()
Ответ на: комментарий от MKuznetsov

Спасибо! Тут проблема в том, что в 10-м офтопике у окна есть невидимая рамка шириной 10, а также видимая шириной 1. Когда я ставлю окошки «вроде бы вплотную», между ними остаются дыры. Когда я отнимаю невидимую рамку шириной 10, то они слегка перехлёстываются. Сам офтопик, сцуко, умеет определять, что рамка невидимая, и ставит окошки аккурат рядом друг с другом. Но когда начинаешь их тащить мышью, эта рамка видна.

К ночи я пришёл к выводу, что изнутри tcl эту проблему не решить, нашёл twapi (интерфейс к win32), но уже не осилил. Да и не нужно это - под Linux всё равно нужно будет искать другое решение.

С линуксом пока толком не разбирался, но там тоже что-то как-то всё плохо, судя по tcl.tk. Мои эксперименты тоже дают зазоры, хотя перекрытий вроде не было.

Думаю, что если я попытаюсь позиционировать окна поверх чего-то там, то эта проблема всё равно всплывёт.

panedwindow нужно было сразу внедрять, теперь поздно. У меня toplevel-ы со своими меню и своими (пересекающимися) сочетаниями клавиш. Т.е. это нужно всё переделывать, а это много (до месяца, допустим, ну или хотя бы пара недель). В ситуации, когда надо просто решить проблему отсутствия выставения окон по умолчанию, я лучше просто допущу наличие перекрытий.

Насчёт того, что приложение не должно таскать окна - в идеальном мире это может быть было бы и так, но в реальном бывает по всякому. Если бы можно было WM-у заказать «сделай такую-то мозаику», да ещё и кросс-платформенно, я был бы только за.

den73 ★★★★★
() автор топика
Ответ на: комментарий от den73

«wm overrideredirect $toplevel true» возможно поможет. Но тогда рисовать оконные рамочки и распалогать окно придётся самому.

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

В общем, я забил на это и сделал, чтобы окна чуть перекрывались.

Это вроде работает в двух разных офтопиках и в одном линуксе. Перекрытие может скрыть часть содержимого у самого края неактивных окон, зато активное окно визуально выглядит больше и фон не просвечивает. Если рамки будут паталогически широкими, то ббудут проблемы. В этом случае нужно будет подправить размещение окон руками (но ведь это не так часто, так что не страшно).

Код,меряющий экран и рисующий 4 окна, здесь здесь, пока он переусложнён, да и не всё доделано. Наверное, выкину часть экспериментальных проверок чуть позже.

Это я здесь даю ссылку просто для полноты темы.

den73 ★★★★★
() автор топика
Последнее исправление: den73 (всего исправлений: 1)
Ответ на: комментарий от anonymous

Самые продвинутые IDE реализованы на Java :-) А не на каких-то там прочих цепепе и, тем более, tcl/tk :-)

А мне кажется, что IDEйно правильная IDE для Яра должна быть написана на Яре!

hobbit ★★★★★
()
Ответ на: комментарий от anonymous

Спасибо, не смотрел. Скачал себе в копилку, при следующем подходе к этой проблеме рассмотрю его как вариант. Вообще RAMDebugger на вид вполне похож на «правильную» IDE. Есть вариант взять его за основу, тем более там есть раскраска кода tcl и более-менее работающий пошаговый отладчик для TCL (впрочем, я пока не смог понять, способен ли он отлаживать мою среду).

den73 ★★★★★
() автор топика
Ответ на: комментарий от hobbit

Это слишком дорого, поскольку до создания Яра придётся жить вообще без IDE.

den73 ★★★★★
() автор топика
Ответ на: комментарий от den73

В общем, в исходниках clcon нужно искать ::win_lay:: и откроется весь код, имеющий отношение к делу.

den73 ★★★★★
() автор топика
Ответ на: комментарий от anonymous

интересно. если поставить tcl плагином в браузер, можно tclets плагином запускать.

а можно ли вот так clcon запустить? просто заходишь по одной ссылке специально настроенным браузером — и, бац, у тебя последняя сборка Common Lisp IDE

вдругорядь прозреваю: браузеры уже не те, и NPAPI плагины уже отвалились. прогресс, достижения цивилизации, итить... хипстеры новомодныя опять всё сломали.

P.S. ещё есть inferno плагином. там кстати тоже tcl есть.

anonymous
()
Ответ на: комментарий от anonymous

вот тут курс по tcl/tk (правда, на португальском) где в HTML активно используются tcllet-ы (расчитано на tclplugin, установленный в браузер)

можно непосредственно интерактивно дёргать примеры с установленным плагином.

anonymous
()
Ответ на: комментарий от anonymous

Анонимус, спасибо. NPAPI действительно хипсторы сломали. И делать что-то в браузере - это совершенно другая логика, ограничения на кнопки, на меню, на переключение окон. Это совершенно другое, и tcl тут не нужен - тогда надо брать за основу какой-нибудь atom и использовать какой-нибудь Typescript.

А пока - завтра браузер обновится ещё раз и сломается, но tcl всё ещё будет работать. Чтобы сломать tcl, нужно сломать С и оконные менеджеры, а это пока хипсторам не по зубам. Да и то там есть какая-никакая команда, которая как-никак чинит.

Поэтому идея основывать IDE на браузере мне вообще никак не интересна.

На португальском сайте у меня предупреждение про вредоносный код.

den73 ★★★★★
() автор топика
Ответ на: комментарий от silver-bullet-bfg

Спасибо тебе за заботу и за высокую оценку моих способностей правильно поставить задачу, но на теме уже стоит галочка :)

den73 ★★★★★
() автор топика
Ответ на: комментарий от den73

Поэтому идея основывать IDE на браузере мне вообще никак не интересна.

не основывать, но как дополнительный способ запуска. допустим, кто-то хочет просто попробовать самую последнюю сборку, не скачивая и не устанавливая её руками. через плагин --- может.

ну вот для Inferno есть плагин в браузере, например: inferno plug-in для MSIE, описание, исходники плагина: 1 ie-win.c ieplugin.h

в итоге: попробовать что такое Inferno можно вполпинка: просто скачав плагин и зарегестрировав ActiveX, затем запуская примеры на Limbo (посмотри, кстати исходники *.b — очень компактный язык)

ничего не скачивая и не устанавливая (браузер сам в фоне чего-то скачает)

то есть, тестеры новички могут попробовать в полпинка, ничего не конфигурируя.

Inferno, кстати чем-то похожая вещь на твой clcon, только это ж целая операционная система. взяли Plan9 и в виртуальную машину Dis (регистровую, не стековую) засунули.

язык Limbo ( ещё здесь и здесь, вообще см. тут и &target_type=posts]тут) довольно простой: по сути это схема с корутинами, только с C-подобным сахаром.

модульность, ADT, tk встроенный (например стандартный shell инферно, sh — графический с модулями, рисовать можно), CSP с корутинами как в Go (собсно, в Go пришло оттуда), конкурентность

tk там кстати, «из коробки» (правда обкоцанный, устаревший и вырвиглазный): тут

дальше см. документацию

установить Inferno можно и отдельно, взяв из репозитория с битбакета последние исходники и собрав руками, или скачав zip с релизом с оффсайта.

деплоить свой софт тоже можно довольно просто

плюс в том, что софт разрабатывается как байткод, real write once - run everywhere, а не так как в Java.

можно разрабатывать из плагина, из emu под любой системой, из native inferno — а потом переписать *.dis в emu другой системы, протестировать кроссплатформную сборку.

работает везде одинаково.

есть репозитории софта, часть софта на bitbucket.

в общем, технически IDE типа clcon-а вполне могло бы быть разработано на чём-то типа Limbo, под что-то типа Inferno.

кроссплатформное сразу подо всё.

в инферно взяли kencc и rc, mk из plan9, портировали стд. libc библиотеку, засунули это в native/хост ОС/MSIE plugin конфигурации, добавили Dis VM

и получили по-настоящему кроссплатформное приложение «подо всё».

для юзера-тестера, имхо, было бы проще тыкнуть по ссылке на последнюю сборку в браузере и сразу запустить — ничего не конфигурируя.

anonymous
()

Писать приложения надо на нормальных SDK, вроде Qt, а не на говнотулкитах как у тебя. Вот мучайся теперь, рак.

anonymous
()
Ответ на: комментарий от anonymous

интересно, портирует ли кто-то вот это вот под новомодные стандарты плагинов браузеров, мать их так.

вроде бы сейчас WebAssembly актуален.

anonymous
()
Ответ на: комментарий от anonymous

гы, WebAssembly:

Компилятор внутри использует представление в виде s-выражения, которое содержит больше информации, чем «линейный ассемблерный байт-код».

anonymous
()
Ответ на: оно + CL + tcl от anonymous

о, не знал за wacl, благодарю за наводку

tcler
()
Ответ на: комментарий от den73

Просто почему-то иногда игнор не срабатывает и сообщения от анонимусов показываются.

den73 ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.