Skip to content
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

Closed
wants to merge 2 commits into from

Conversation

DarkContact
Copy link
Contributor

I compare cursor behaviour on SDL Window, and fix to be similar. Also added hand cursor.

Before fix:
Before
After fix:
After

@eliasdaler
Copy link
Contributor

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 ImGuiMouseCursor_Hand, but as the separate PR.

@eliasdaler eliasdaler closed this Oct 10, 2019
@DarkContact
Copy link
Contributor Author

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)

@eliasdaler
Copy link
Contributor

eliasdaler commented Oct 10, 2019

How does ImGuiConfigFlags_NoMouseCursorChange change the behavior of ImGui widgets?
(Кстати можешь писать по-русски, т.к. иногда английский не очень понятен)

@DarkContact
Copy link
Contributor Author

Ок. Я сейчас ещё раз обдумал и кажется что проблема может быть на стороне SFML. Ожидается что window.setMouseCursor, изменит курсор только в области окна. Но мне кажется стандартное поведение когда подносишь курсор к границе окна не должно изменяться при реализации backend для ImGui

@eliasdaler
Copy link
Contributor

setMouseCursor использует системные API, и они позволяют тебе менять курсор даже когда окно не в фокусе... Это юзер должен хэндлить ивенты LostFocus, GainedFocus, etc. и восстанавливать курсор. То же касается выхода курсора за пределы окна.

Если поставить ImGuiConfigFlags_NoMouseCursorChange - курсор ведёт себя правильно?

@DarkContact
Copy link
Contributor Author

Если поставить флаг курсор ведёт себя правильно у границ, но пропадает изменение курсора в виджетах. Да можно сделать и так, указав этот флаг за границами окна, но согласись, что когда ты создаёшь окно, ты ожидаешь что оно не будет изменять стандартное поведение. Я просто взял за основу другой пример из ImGui, основанный на SDL, он такого не делает.

@eliasdaler
Copy link
Contributor

Ок, я посмотрю как это реализовано в SDL, и если это достижимо в SFML без сложных хаков, то сделаю это.
Открыл #111
Насколько я вижу в коде SDL примера, они не чекают позицию курсора, видимо нужно как-то иначе это обрабатывать.

@DarkContact
Copy link
Contributor Author

Хорошо. В SDL не чекают, потому что функция смены курсора в SDL не меняет курсор если он за границами окна, а SFML меняет. Если получиться найти способ проще чем проверка границ окна, я только за )

@eliasdaler
Copy link
Contributor

А ты не смотрел, как в SDL это работает? Будет очень полезно, если найдёшь кусок кода, который за это отвечает - если он правда есть, то можно будет в SFML это затащить

@DarkContact
Copy link
Contributor Author

Немного смотрел, но достаточно бегло, надо глубже копать:
http://hg.libsdl.org/SDL/file/074c42dbf8c9/src/video/windows/SDL_windowsmouse.c#l209
http://hg.libsdl.org/SDL/file/074c42dbf8c9/src/video/windows/SDL_windowsevents.c#l653

@eliasdaler
Copy link
Contributor

Судя по всему, посылается ивент WM_SETCURSOR, который SFML хэндлит... Так что не очень понятно, почему это не работает

@DarkContact
Copy link
Contributor Author

DarkContact commented Oct 10, 2019

Всё-таки обработка хоть и незначительно, но отличается:
http://hg.libsdl.org/SDL/file/074c42dbf8c9/src/video/windows/SDL_windowsevents.c#l900
https://github.com/SFML/SFML/blob/master/src/SFML/Window/Win32/WindowImplWin32.cpp#L579

@DarkContact
Copy link
Contributor Author

Вообщем я думаю это потому что в SDL учитывается hittest, а в версии SFML - нет, т.к. в SFML чтобы скрыть курсор анализируется признак m_cursorVisible, а не hittest = LOWORD(lParam)

@eliasdaler
Copy link
Contributor

Да, кажется фишка в этом - было бы хорошо пересобрать SFML с похожим кодом, и посмотреть, изменит ли это поведение. Я смогу это сделать сегодня чуть позже.

@DarkContact
Copy link
Contributor Author

Я попробовал пересобрать SFML. Пробовал вариант как в SDL и попробовал полностью закомментировать обработку WM_SETCURSOR - разницы не было )

@eliasdaler
Copy link
Contributor

Странно... Надо будет покопаться, но наверное про баг можно им написать, если в минимальном примере это воспроизводится (т.е. создаёшь окно, ставишь курсор - и он уже не ведёт себя нормально)

@DarkContact
Copy link
Contributor Author

Я немного поэкспериментировал с SFML и вот какие результаты. Если менять курсор в игровом цикле, после обработки событий, то на границах окна и в titlebar курсор изменяется на тот который мы указали. Если до обработки событий, то во время движения курсор заменяется на системный, а по остановке движения курсора, на тот который мы изменили. Если же просто изменить курсор во время инициализации до игрового цикла, то работает как и ожидалось, курсор изменяется только в рабочей области окна.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants