sloppy fix for new windows frozen sometimes

if anyone knows a better one feel free
This commit is contained in:
vaxerski 2021-12-09 21:58:20 +01:00
parent 24db17f139
commit 8aadccd9e4
6 changed files with 48 additions and 15 deletions

View File

@ -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);

View File

@ -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();
} }

View File

@ -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;

View File

@ -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);

View File

@ -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() {

View File

@ -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:
}; };