-
Notifications
You must be signed in to change notification settings - Fork 173
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Fix change cursor on title and border window #110
Conversation
Hello. If you don't like how cursor behaves, do this on init or when you exit ImGui area / widgets: auto& io = ImGui::GetIO();
io.ConfigFlags |= ImGuiConfigFlags_NoMouseCursorChange I don't think it's ImGui-SFML's responsibility to properly simulate how OS cursor behaves when this flag is not set. I'll accept the part about |
Hello. Flag ImGuiConfigFlags_NoMouseCursorChange change behaviour Imgui Widgets. Please compare with Imgui SDL+OpenGL3. SFML set system cursor outside window area (for example mouse.x will be -1, cursor change to arrow, but expected OS change cursor to resize border) |
How does |
Ок. Я сейчас ещё раз обдумал и кажется что проблема может быть на стороне SFML. Ожидается что window.setMouseCursor, изменит курсор только в области окна. Но мне кажется стандартное поведение когда подносишь курсор к границе окна не должно изменяться при реализации backend для ImGui |
setMouseCursor использует системные API, и они позволяют тебе менять курсор даже когда окно не в фокусе... Это юзер должен хэндлить ивенты LostFocus, GainedFocus, etc. и восстанавливать курсор. То же касается выхода курсора за пределы окна. Если поставить |
Если поставить флаг курсор ведёт себя правильно у границ, но пропадает изменение курсора в виджетах. Да можно сделать и так, указав этот флаг за границами окна, но согласись, что когда ты создаёшь окно, ты ожидаешь что оно не будет изменять стандартное поведение. Я просто взял за основу другой пример из ImGui, основанный на SDL, он такого не делает. |
Ок, я посмотрю как это реализовано в SDL, и если это достижимо в SFML без сложных хаков, то сделаю это. |
Хорошо. В SDL не чекают, потому что функция смены курсора в SDL не меняет курсор если он за границами окна, а SFML меняет. Если получиться найти способ проще чем проверка границ окна, я только за ) |
А ты не смотрел, как в SDL это работает? Будет очень полезно, если найдёшь кусок кода, который за это отвечает - если он правда есть, то можно будет в SFML это затащить |
Немного смотрел, но достаточно бегло, надо глубже копать: |
Судя по всему, посылается ивент WM_SETCURSOR, который SFML хэндлит... Так что не очень понятно, почему это не работает |
Всё-таки обработка хоть и незначительно, но отличается: |
Вообщем я думаю это потому что в SDL учитывается hittest, а в версии SFML - нет, т.к. в SFML чтобы скрыть курсор анализируется признак m_cursorVisible, а не hittest = LOWORD(lParam) |
Да, кажется фишка в этом - было бы хорошо пересобрать SFML с похожим кодом, и посмотреть, изменит ли это поведение. Я смогу это сделать сегодня чуть позже. |
Я попробовал пересобрать SFML. Пробовал вариант как в SDL и попробовал полностью закомментировать обработку WM_SETCURSOR - разницы не было ) |
Странно... Надо будет покопаться, но наверное про баг можно им написать, если в минимальном примере это воспроизводится (т.е. создаёшь окно, ставишь курсор - и он уже не ведёт себя нормально) |
Я немного поэкспериментировал с SFML и вот какие результаты. Если менять курсор в игровом цикле, после обработки событий, то на границах окна и в titlebar курсор изменяется на тот который мы указали. Если до обработки событий, то во время движения курсор заменяется на системный, а по остановке движения курсора, на тот который мы изменили. Если же просто изменить курсор во время инициализации до игрового цикла, то работает как и ожидалось, курсор изменяется только в рабочей области окна. |
I compare cursor behaviour on SDL Window, and fix to be similar. Also added hand cursor.
Before fix:
After fix: