Баги или ошибки библиотеки
|
|
electrik | Дата: Суббота, 22.01.2022, 14:23 | Сообщение # 91 |
Полковник
Группа: Друзья
Сообщений: 182
Статус: Offline
| Попробуй реализовать. Это правильное поведение, и не только в диалогах. Если взять всеми любимый удот нет, там при возврате в приложение, фокус так же становится на ту кнопку с которой ушёл. Это accessibility, и это очень ценно что ты делаешь доступность с клавиатуры. Во всяком случае, незрячие программисты будут благодарны, что им не придётся городить огороды. Сейчас вообще пошла мода на доступность. Есть, к примеру, C++ фреймворк Juce, Так они завезли в него доступность чтецам экрана и теперь незрячие могут пользоваться некоторыми приложениями или VST плагинами построенными на этом фреймворке. Раньше, мы писали костыли ввиде автокликеров по кнопкам. ПРиходилось просить зрячих находить кнопки или распознавать экран. Есть открытый VST синтезатор Surge, как раз он построен на Juce, так там разработчики серьёзно заинтересовались доступностью, активно правят баги доступности, их прямо прёт. Теперь синт почти полностью доступен с клавиатуры.
|
|
| |
haav | Дата: Суббота, 22.01.2022, 14:46 | Сообщение # 92 |
Генералиссимус
Группа: Администраторы
Сообщений: 1366
Статус: Offline
| Вроде теперь работает фокус при активации окна. Попробуйте , я залил версию с последними изменениями. Кстати , TABSTOP будет переключаться по номерам гаджетов по умолчанию (бинарники собраны с учетом этого). То есть при создании окна , сами уже учитывайте каким гаджетам какие идентификаторы давать , чтобы поведение переключения по табам соответствовало вашим ожиданиям. Особенно это актуально для OptionGadget.
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
zamabuvaraeu | Дата: Суббота, 22.01.2022, 16:54 | Сообщение # 93 |
Подполковник
Группа: Друзья
Сообщений: 149
Статус: Offline
| Интересно, а как вообще возникает ситуация, когда фокус переходит с дочернего окна на главное, а не на следующее дочернее окно?
|
|
| |
haav | Дата: Суббота, 22.01.2022, 17:51 | Сообщение # 94 |
Генералиссимус
Группа: Администраторы
Сообщений: 1366
Статус: Offline
| Цитата zamabuvaraeu ( ) Интересно, а как вообще возникает ситуация, когда фокус переходит с дочернего окна на главное, а не на следующее дочернее окно?
Не уверен , что я правильно понял вопрос. Но если все таки я понял правильно, то речь НЕ идет о переходе с дочерних окон на главное при помощи клавиш. Ясно , что при нажатии табов , этого не нужно. Но остается вариант с SetFocus. И для своей законченной программы я возможно никогда бы и думать об этом не стал. Но у меня не законченная программа , а часть других программ (библиотека). И здесь , то что кажется сегодня ненужным или абсурдным , завтра окажется для кого-то востребованным. Я не могу пока найти практическую причину , но вдруг это понадобится? Поэтому , даже с последним изменением , я оставляю такую возможность.
Я кстати пробовал перевести фокус на главное окно у диалогов, но там фокус железно сидит на дочерних элементах , никаким SetFocus его на главное окно не перебросить. А при попытке это сделать , фокус лишь на доли секунды застревает на главном окне и сразу же улетает на самый нижний элемент , вне зависимости от того где он был раньше (по крайней мере с моим примером было так).
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
haav | Дата: Воскресенье, 23.01.2022, 09:23 | Сообщение # 95 |
Генералиссимус
Группа: Администраторы
Сообщений: 1366
Статус: Offline
| Все время забываю обновлять заголовок window9.bi в каталоге архива include. Там где лежат все исходные файлы , window9.bi новый , а в каталоге include от прошлой версии. Надеюсь electrik ты сумел разобраться или по крайней мере еще не успел попробовать. Архивы обновил. Прошу прощения.
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
electrik | Дата: Среда, 02.02.2022, 21:05 | Сообщение # 96 |
Полковник
Группа: Друзья
Сообщений: 182
Статус: Offline
| Привет. Пару дней назад, ты, Станислав, помогал мне в теме про события в Window9. Всё работает, но я ещё отловил несколько багов. открываем мою программу, можешь и свою, но чтобы было такое же поведение с дочерним окном настроек. 1. закроем все окна в проводнике и оставим только окно своей программы. 2. заходим как бы в настройки своей программы. 3. жмякаем мышкой свернуть все окна, или windows+m. 4. открываем с рабочего стола любую программу или этот компьютер. 5. Жмякаем Alt+Tab и мы попадаем не в окно настроек своей программы а в родительское. поскольку оно заблокировано, мы не можем нажать кнопки. Я при помощи скринридера по дереву окон могу найти окно настроек, и его активировать. Тут такое дело, если окно заблокировано, в него фокус ни как не может попасть и так должно быть. Пример второй. 1. оставим в проводнике открытую только свою папку. 2. Запустим из неё свою программу. 3. перейдём в настройки своей программы. 4. жмякнем ALT+TAB. мы попадём в папку откуда запустили программу - всё правильно. 5. жмякнем alt+tab, мы попадём снова в настройки своей программы - это тоже правильно. 6. жмякаем Alt+F4 и мы попадаем не в родительское окно своей программы, а в проводник, в папку откуда запустили свою программу. Ну по Alt+tab, естественно я могу зайти в главное окно программы. Ещё в ShellFolder тоже фокус не встаёт куда надо, приходится два раза ALT+табаться, но это я не точно проверил, возможно это из-за того, что я не указал папку по умолчанию. А вообще, там фокус вроде должен падать при доступной кнопке ОК на неё, если она не доступна то на дерево. С этим потом разберёмся.
|
|
| |
haav | Дата: Четверг, 03.02.2022, 08:26 | Сообщение # 97 |
Генералиссимус
Группа: Администраторы
Сообщений: 1366
Статус: Offline
| Цитата electrik ( ) Тут такое дело, если окно заблокировано, в него фокус ни как не может попасть и так должно быть.
А разве ты в своей программе заблокировал главное окно при вызове окна настроек? Чтобы его заблокировать , нужно вызвать DisableWindow. После того , как окно настроек закрывается , нужно опять вызвать DisableWindow , но с флагом разблокировки. И конечно после разблокировки нужно установить фокус на главное окно , ведь винда после закрытия окна установит фокус по своим правилам (винда просто не знает , что ты приспособил обычные окна как диалоговые).
По поводу ShellFolder, я понятия ни имею , как он должен себя вести по умолчанию. Это диалог винды и какие там правила для установки или переключения фокуса , мне это неведомо. Эта функция автономная , ты можешь вытащить ее из исходников и тестировать как тебе вздумается. Если найдешь явные ошибки или покажешь , как нужно изменить, чтобы это работало правильно , я готов буду изменить код. Только это должны быть не просто твои хотелки , а во первых я должен знать , что это точно будет правильно и во вторых от тебя код изменения. В справке я прямо написал , что код для функции я не писал , а взял практически готовым из поставки FB.
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
zamabuvaraeu | Дата: Четверг, 03.02.2022, 09:50 | Сообщение # 98 |
Подполковник
Группа: Друзья
Сообщений: 149
Статус: Offline
| А зачем нужно делать ProcessEventsLoop для окна настроек?
|
|
| |
electrik | Дата: Четверг, 03.02.2022, 15:50 | Сообщение # 99 |
Полковник
Группа: Друзья
Сообщений: 182
Статус: Offline
| Ага, спасибо, всё понял. Надо учесть тот факт, что при создании окон window9 сама не блокирует окна, и при закрытии не ставит фокус в родителя. Пожалуй это относится вообще к виндовым окнам, кроме диалоговых. Это всё прежние привычки. Когда-то я на WinApi фигачил, и даже не задумывался а что и как, оно само получалось. Но я всётаки юзал главное окно обычное, а всякие настройки - диалоговые окна из ресурсов, ну а они сами как-то возвращали фокус в главное окно, и блокировали главное окно. Добавлено (03.02.2022, 17:05) --------------------------------------------- Всё работает с отключением окна и установкой фокуса. Только вот одна фигня, и понятная, после того, как я возвращаюсь в главное окно при помощи SetFocus, фокус естественно становится на него, а не на последний гаджет. Нужно будет запоминать фокус последнего гаджета, и потом при возврате в это окно, его возвращать. Опять таки привычки от диалоговых окон, там много не надо было костылить, если создал дочернее окно, родитель заблокировался, ибо не может быть два окна сразу. Закрыл дочернее, фокус упал в родителя и на последний элемент выбранный клавишей таб. На сто процентов насчёт простого главного окна утверждать не буду, но если как основное используешь диалог, и как дочернее тоже диалог, все возвраты происходили с сохранением фокусов. Ну это ладно, привыкнем по-новому, иногда привычки нужно ломать. Посути две строчки GetFocus и SetFocus написать не сложно. Добавлено (03.02.2022, 19:30) ---------------------------------------------
Цитата А зачем нужно делать ProcessEventsLoop для окна настроек?
ДА это просто для разделения событий. Оно не удобнно когда всё скопом. В двух файлах эта функция у меня объявлена как приватная.
Сейчас собираю Window9, хотя для ShellFolder это было делать не обязательно, ух уж и тормозной FreeBasic. Складывается ощущение, что для него не важен размер компилируемого файла, оно работает почти как секундомер, один .o файл примерно за одинаковое время.
|
|
| |
haav | Дата: Четверг, 03.02.2022, 20:01 | Сообщение # 100 |
Генералиссимус
Группа: Администраторы
Сообщений: 1366
Статус: Offline
| Цитата electrik ( ) Сейчас собираю Window9, хотя для ShellFolder это было делать не обязательно, ух уж и тормозной FreeBasic. Складывается ощущение, что для него не важен размер компилируемого файла, оно работает почти как секундомер, один .o файл примерно за одинаковое время.
У тебя правильное ощущение насчет компилируемого файла и то , что примерно одно время на компиляцию каждого объектного файла. Ты посмотри сколько заголовков подключается. Чтобы было понятно , можешь собрать один файл с опцией -pp и поймешь , какое кол-во информации нужно обработать при работе с каждым файлом. Когда-то в первых версиях библиотеки для каждого файла я определял нужные заголовки. Компиляция была очень шустрой , но потом Джоши все преобразовал к тому , что к каждому файлу нужно просто подключить общий заголовок. Это удобно при редактировании кода библиотеки , но долго при полной компиляции. У версии win32 компиляция быстрее. Для win32 и linux я использую makefile , там по сути компилируешь только те файлы , которые добавлены или отредактированы , но под win64 приходится ждать пока не выполнится полная перекомпиляция. Под Win64 утилита make работает хреново , сейчас уже не помню , но чего-то там для нее не хватает. Возможно у меня версия какая-то стремная , я особо не разбирался.
Кстати , насчет версий компилятора 32-bit и 64-bit: мой редактор на 32-bit собирается максимум за 10 секунд вместе со всеми плагинами. А на win64 только редактор собирается секунд 30-40.
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
electrik | Дата: Четверг, 03.02.2022, 20:16 | Сообщение # 101 |
Полковник
Группа: Друзья
Сообщений: 182
Статус: Offline
| Со ShellFolder разобрался. То что он в себе не всегда ставит фокус, это его глюк. Если выбрать папкой по умолчанию диск C, или любую папку, тогда с фокусом всё норм. А вот то что из него по ALT-tab можно вывалиться в окно настроек - это плохо. Есть два решения,. первое - завести необязательный параметр родительского окна, и в hwndOwner его передавать. Если не охото заводить параметр, можно в hwndOwner передать GetForegroundWindow. Незнаю,Правильно ли юзать GetForegroundWindow? И есть ли аналог в LINUX? В обоих случаях, из окна ShellFolder, по Alt+Tab не вываливаешься в окно настроек. Кстати у OpenFileRequester у тебя есть этот необязательный параметр. Его я тоже естественно не заполнил, и получаю такую же хрень с возвратом по Alt+tab. Ух уж эти либы и пурики, подрасслабили меня. Я смотрю свои старые проекты, где юзаю WinApi, везде где положено заполнять члены структур родителей, всё заполнено, поэтому и работает правильно. Всё ооочень быстро забывается, когда нет практики. И это не только программирование. Я вон раньше на баяне шпарил, в музыкалке учился, а теперь уже почти разучился играть, потому что раз в год, на работе в праздник по пьянке играю.
|
|
| |
haav | Дата: Четверг, 03.02.2022, 20:30 | Сообщение # 102 |
Генералиссимус
Группа: Администраторы
Сообщений: 1366
Статус: Offline
| Цитата electrik ( ) Есть два решения,. первое - завести необязательный параметр родительского окна, и в hwndOwner его передавать. Если не охото заводить параметр, можно в hwndOwner передать GetForegroundWindow. Незнаю,Правильно ли юзать GetForegroundWindow?
GetForegroundWindow мне не нравится, я лучше добавлю необязательный параметр.
Цитата И есть ли аналог в LINUX?
В linux для выбора папок юзай OpenFileRequester с флажком для выбора папок.
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
electrik | Дата: Четверг, 03.02.2022, 20:35 | Сообщение # 103 |
Полковник
Группа: Друзья
Сообщений: 182
Статус: Offline
| Подозреваю, что тут с Win64 хрень такая, что он по умолчанию гонит кот в C backend. Естественно, что потом C его гонит в Asm, но насколько оно там оптимизировано? В новых версиях реализовано -gen Gas64, но почему-то по умолчанию, пока в x64 юзается -gen gcc. Может ещё есть баги, обкатывают. Во всяком случае если написать: fbc64 -R test.bas, на выходе получим test.c, а если написать: fbc64 -R -gen gas64 то получим test.asm с кодом на ассемблере.Добавлено (03.02.2022, 20:41) ---------------------------------------------
Цитата В linux для выбора папок юзай OpenFileRequester с флажком для выбора папок.
Видимо я вопрос поставил не правильно, есть ли аналог GetForegroundWindow в linux. Ну теперь уже не важно, раз будет по аналогии с OpenFileRequester. Да и наверное, оно надёжней, я буду передавать явный хендл, а не тот что система через GetForegroundWindow подсунет.
Сообщение отредактировал electrik - Четверг, 03.02.2022, 20:37 |
|
| |
haav | Дата: Пятница, 04.02.2022, 05:51 | Сообщение # 104 |
Генералиссимус
Группа: Администраторы
Сообщений: 1366
Статус: Offline
| Цитата electrik ( ) В новых версиях реализовано -gen Gas64, но почему-то по умолчанию, пока в x64 юзается -gen gcc. Может ещё есть баги, обкатывают.
Скорость компиляции у Gas64 в среднем ненамного выше , а например отладка невозможна с GDB. GAS64 разрабатывает один человек. Об ошибках на форуме нередко сообщается. Надо признать , что ошибки быстро исправляются. Старые пользователи юзают привычный бэкэнд gcc (то есть тот , который создан еще при dkl). Оно и понятно , некогда заниматься тестированием новых инструментов и ловить баги в чужих программах , своих багов хватает. А новым пользователям вообще пофиалетово , они на форуме в основном чисто ради общения.
Функции SetFocus | GetFocus я написал для linux. Но надо понимать , что в среде linux из-за различных ограничений безопасности , данные функции будут работать только с окнами своего приложения. Параметр для ShellFolder так же добавил. Пока эти изменения только на моем компе.
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
zamabuvaraeu | Дата: Пятница, 04.02.2022, 11:27 | Сообщение # 105 |
Подполковник
Группа: Друзья
Сообщений: 149
Статус: Offline
| Подождите. А почему нельзя отобразить окно настроек модально? Например, как это делает функция MessageBox: любой ввод перехватывается окном MessageBox, на предыдущее окно нельзя вернуться, пока этот MessageBox открыт. Тогда не потребуются возня с передачей фокуса.
|
|
| |
|