Skip to content
Snippets Groups Projects

qt: refactor CSD button handling on windows

Merged Prince Gupta requested to merge jagannatharjun/vlc:csd-refactor into master
1 file
+ 25
42
Compare changes
  • Side-by-side
  • Inline
@@ -405,54 +405,24 @@ public:
case WM_NCLBUTTONUP:
case WM_NCLBUTTONDOWN:
{
void (CSDButton::*function)();
void (CSDButton::*functionForOthers)() = nullptr;
if (msg->message == WM_NCLBUTTONDOWN)
function = &CSDButton::externalPress;
else if (msg->message == WM_NCLBUTTONUP)
{
function = &CSDButton::externalRelease;
functionForOthers = &CSDButton::unsetExternalPressed;
}
else
Q_UNREACHABLE();
const bool pressed = (msg->message == WM_NCLBUTTONDOWN);
// manually trigger button here, UI will never get click
// signal because we have captured the mouse in non client area
switch ( msg->wParam )
{
case HTCLOSE:
trigger(CSDButton::Close, function);
if (functionForOthers)
{
trigger(CSDButton::Minimize, functionForOthers);
trigger(CSDButton::MaximizeRestore, functionForOthers);
}
handleButtonActionExclusive(CSDButton::Close, pressed);
break;
case HTMINBUTTON:
trigger(CSDButton::Minimize, function);
if (functionForOthers)
{
trigger(CSDButton::Close, functionForOthers);
trigger(CSDButton::MaximizeRestore, functionForOthers);
}
handleButtonActionExclusive(CSDButton::Minimize, pressed);
break;
case HTMAXBUTTON:
trigger(CSDButton::MaximizeRestore, function);
if (functionForOthers)
{
trigger(CSDButton::Close, functionForOthers);
trigger(CSDButton::Minimize, functionForOthers);
}
handleButtonActionExclusive(CSDButton::MaximizeRestore, pressed);
break;
default:
if (functionForOthers)
{
trigger(CSDButton::Close, functionForOthers);
trigger(CSDButton::Minimize, functionForOthers);
trigger(CSDButton::MaximizeRestore, functionForOthers);
}
resetPressedState();
break;
}
@@ -536,16 +506,29 @@ private:
}
}
void trigger(CSDButton::ButtonType type, void (CSDButton::*function)())
void handleButtonActionExclusive(CSDButton::ButtonType type, bool pressed)
{
for (auto button : m_buttonmodel->windowCSDButtons()) {
if (button->type() == type) {
(button->*function)();
return ;
for (auto button : m_buttonmodel->windowCSDButtons())
{
if (pressed)
{
if (button->type() == type)
button->externalPress();
}
else
{
if (button->type() == type)
button->externalRelease();
else
button->unsetExternalPressed();
}
}
}
vlc_assert_unreachable();
void resetPressedState()
{
for (auto button : m_buttonmodel->windowCSDButtons())
button->unsetExternalPressed();
}
void setAllUnhovered()
Loading