mirror of
https://github.com/hyprwm/Hypr.git
synced 2024-11-26 06:45:58 +01:00
sloppy fix for new windows frozen sometimes
if anyone knows a better one feel free
This commit is contained in:
parent
24db17f139
commit
8aadccd9e4
6 changed files with 48 additions and 15 deletions
|
@ -69,6 +69,12 @@ void Events::eventEnter(xcb_generic_event_t* event) {
|
||||||
g_pWindowManager->setFocusedWindow(E->event);
|
g_pWindowManager->setFocusedWindow(E->event);
|
||||||
|
|
||||||
PENTERWINDOW->setDirty(true);
|
PENTERWINDOW->setDirty(true);
|
||||||
|
|
||||||
|
if (PENTERWINDOW->getIsSleeping()) {
|
||||||
|
// Wake it up, fixes some weird shenaningans
|
||||||
|
wakeUpEvent(E->event);
|
||||||
|
PENTERWINDOW->setIsSleeping(false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Events::eventLeave(xcb_generic_event_t* event) {
|
void Events::eventLeave(xcb_generic_event_t* event) {
|
||||||
|
@ -76,7 +82,16 @@ void Events::eventLeave(xcb_generic_event_t* event) {
|
||||||
|
|
||||||
RETURNIFBAR;
|
RETURNIFBAR;
|
||||||
|
|
||||||
//
|
const auto PENTERWINDOW = g_pWindowManager->getWindowFromDrawable(E->event);
|
||||||
|
|
||||||
|
if (!PENTERWINDOW)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (PENTERWINDOW->getIsSleeping()) {
|
||||||
|
// Wake it up, fixes some weird shenaningans
|
||||||
|
wakeUpEvent(E->event);
|
||||||
|
PENTERWINDOW->setIsSleeping(false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Events::eventDestroy(xcb_generic_event_t* event) {
|
void Events::eventDestroy(xcb_generic_event_t* event) {
|
||||||
|
@ -190,16 +205,14 @@ CWindow* Events::remapFloatingWindow(int windowID, int forcemonitor) {
|
||||||
|
|
||||||
window.setSize(window.getDefaultSize());
|
window.setSize(window.getDefaultSize());
|
||||||
window.setPosition(window.getDefaultPosition());
|
window.setPosition(window.getDefaultPosition());
|
||||||
|
|
||||||
|
// The anim util will take care of this.
|
||||||
window.setEffectiveSize(window.getDefaultSize());
|
window.setEffectiveSize(window.getDefaultSize());
|
||||||
window.setEffectivePosition(window.getDefaultPosition());
|
window.setEffectivePosition(window.getDefaultPosition());
|
||||||
|
|
||||||
// Also sets the old one
|
// Also sets the old one
|
||||||
g_pWindowManager->calculateNewWindowParams(&window);
|
g_pWindowManager->calculateNewWindowParams(&window);
|
||||||
|
|
||||||
// Set real size. No animations in the beginning. Maybe later. TODO?
|
|
||||||
window.setRealPosition(window.getEffectivePosition());
|
|
||||||
window.setRealSize(window.getEffectiveSize());
|
|
||||||
|
|
||||||
// Add to arr
|
// Add to arr
|
||||||
g_pWindowManager->addWindowToVectorSafe(window);
|
g_pWindowManager->addWindowToVectorSafe(window);
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,7 @@ void AnimationUtil::move() {
|
||||||
|
|
||||||
static std::chrono::time_point lastFrame = std::chrono::high_resolution_clock::now();
|
static std::chrono::time_point lastFrame = std::chrono::high_resolution_clock::now();
|
||||||
const double DELTA = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::high_resolution_clock::now() - lastFrame).count();
|
const double DELTA = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::high_resolution_clock::now() - lastFrame).count();
|
||||||
|
lastFrame = std::chrono::high_resolution_clock::now();
|
||||||
|
|
||||||
const double ANIMATIONSPEED = ((double)1 / (double)ConfigManager::getFloat("anim.speed")) * DELTA;
|
const double ANIMATIONSPEED = ((double)1 / (double)ConfigManager::getFloat("anim.speed")) * DELTA;
|
||||||
|
|
||||||
|
@ -22,10 +23,10 @@ void AnimationUtil::move() {
|
||||||
|| VECTORDELTANONZERO(window.getRealSize(), window.getEffectiveSize())) {
|
|| VECTORDELTANONZERO(window.getRealSize(), window.getEffectiveSize())) {
|
||||||
window.setDirty(true);
|
window.setDirty(true);
|
||||||
updateRequired = true;
|
updateRequired = true;
|
||||||
}
|
|
||||||
|
|
||||||
window.setRealPosition(window.getEffectivePosition());
|
window.setRealPosition(window.getEffectivePosition());
|
||||||
window.setRealSize(window.getEffectiveSize());
|
window.setRealSize(window.getEffectiveSize());
|
||||||
|
}
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -67,6 +68,4 @@ void AnimationUtil::move() {
|
||||||
|
|
||||||
if (updateRequired)
|
if (updateRequired)
|
||||||
emptyEvent(); // send a fake request to update dirty windows
|
emptyEvent(); // send a fake request to update dirty windows
|
||||||
|
|
||||||
lastFrame = std::chrono::high_resolution_clock::now();
|
|
||||||
}
|
}
|
|
@ -29,18 +29,35 @@ double parabolic(double from, double to, double incline) {
|
||||||
return from + ((to - from) / incline);
|
return from + ((to - from) / incline);
|
||||||
}
|
}
|
||||||
|
|
||||||
void emptyEvent() {
|
void emptyEvent(xcb_drawable_t window) {
|
||||||
xcb_expose_event_t exposeEvent;
|
xcb_expose_event_t exposeEvent;
|
||||||
exposeEvent.window = 0;
|
exposeEvent.window = window;
|
||||||
exposeEvent.response_type = 0;
|
exposeEvent.response_type = 0;
|
||||||
exposeEvent.x = 0;
|
exposeEvent.x = 0;
|
||||||
exposeEvent.y = 0;
|
exposeEvent.y = 0;
|
||||||
exposeEvent.width = g_pWindowManager->Screen->width_in_pixels;
|
exposeEvent.width = g_pWindowManager->Screen->width_in_pixels;
|
||||||
exposeEvent.height = g_pWindowManager->Screen->height_in_pixels;
|
exposeEvent.height = g_pWindowManager->Screen->height_in_pixels;
|
||||||
xcb_send_event(g_pWindowManager->DisplayConnection, false, g_pWindowManager->Screen->root, XCB_EVENT_MASK_EXPOSURE, (char*)&exposeEvent);
|
xcb_send_event(g_pWindowManager->DisplayConnection, false, window, XCB_EVENT_MASK_EXPOSURE, (char*)&exposeEvent);
|
||||||
xcb_flush(g_pWindowManager->DisplayConnection);
|
xcb_flush(g_pWindowManager->DisplayConnection);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void wakeUpEvent(xcb_drawable_t window) {
|
||||||
|
const auto PWINDOW = g_pWindowManager->getWindowFromDrawable(window);
|
||||||
|
|
||||||
|
if (!PWINDOW)
|
||||||
|
return;
|
||||||
|
|
||||||
|
PWINDOW->setRealPosition(PWINDOW->getRealPosition() + Vector2D(1, 1));
|
||||||
|
PWINDOW->setDirty(true);
|
||||||
|
|
||||||
|
g_pWindowManager->refreshDirtyWindows();
|
||||||
|
|
||||||
|
xcb_flush(g_pWindowManager->DisplayConnection);
|
||||||
|
|
||||||
|
PWINDOW->setRealPosition(PWINDOW->getRealPosition() - Vector2D(1, 1));
|
||||||
|
PWINDOW->setDirty(true);
|
||||||
|
}
|
||||||
|
|
||||||
bool xcbContainsAtom(xcb_get_property_reply_t* PROP, xcb_atom_t ATOM) {
|
bool xcbContainsAtom(xcb_get_property_reply_t* PROP, xcb_atom_t ATOM) {
|
||||||
if (PROP == NULL || xcb_get_property_value_length(PROP) == 0)
|
if (PROP == NULL || xcb_get_property_value_length(PROP) == 0)
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -5,7 +5,8 @@
|
||||||
|
|
||||||
std::string exec(const char* cmd);
|
std::string exec(const char* cmd);
|
||||||
void clearLogs();
|
void clearLogs();
|
||||||
void emptyEvent();
|
void emptyEvent(xcb_drawable_t window = 0);
|
||||||
|
void wakeUpEvent(xcb_drawable_t window);
|
||||||
bool xcbContainsAtom(xcb_get_property_reply_t* PROP, xcb_atom_t ATOM);
|
bool xcbContainsAtom(xcb_get_property_reply_t* PROP, xcb_atom_t ATOM);
|
||||||
|
|
||||||
double parabolic(double from, double to, double incline);
|
double parabolic(double from, double to, double incline);
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#include "window.hpp"
|
#include "window.hpp"
|
||||||
#include "windowManager.hpp"
|
#include "windowManager.hpp"
|
||||||
|
|
||||||
CWindow::CWindow() { this->setFirstAnimFrame(true); this->setIsAnimated(false); this->setDead(false); this->setMasterChildIndex(0); this->setMaster(false); this->setCanKill(false); this->setImmovable(false); this->setNoInterventions(false); this->setDirty(true); this->setFullscreen(false); this->setIsFloating(false); this->setParentNodeID(0); this->setChildNodeAID(0); this->setChildNodeBID(0); this->setName(""); }
|
CWindow::CWindow() { this->setIsSleeping(true); this->setFirstAnimFrame(true); this->setIsAnimated(false); this->setDead(false); this->setMasterChildIndex(0); this->setMaster(false); this->setCanKill(false); this->setImmovable(false); this->setNoInterventions(false); this->setDirty(true); this->setFullscreen(false); this->setIsFloating(false); this->setParentNodeID(0); this->setChildNodeAID(0); this->setChildNodeBID(0); this->setName(""); }
|
||||||
CWindow::~CWindow() { }
|
CWindow::~CWindow() { }
|
||||||
|
|
||||||
void CWindow::generateNodeID() {
|
void CWindow::generateNodeID() {
|
||||||
|
|
|
@ -80,6 +80,9 @@ public:
|
||||||
EXPOSED_MEMBER(IsAnimated, bool, b);
|
EXPOSED_MEMBER(IsAnimated, bool, b);
|
||||||
EXPOSED_MEMBER(FirstAnimFrame, bool, b);
|
EXPOSED_MEMBER(FirstAnimFrame, bool, b);
|
||||||
|
|
||||||
|
// Weird shenaningans
|
||||||
|
EXPOSED_MEMBER(IsSleeping, bool, b);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
};
|
};
|
Loading…
Reference in a new issue