diff --git a/applications/display-server/connection.cpp b/applications/display-server/connection.cpp index 75ace823a..3ffc11224 100644 --- a/applications/display-server/connection.cpp +++ b/applications/display-server/connection.cpp @@ -196,6 +196,8 @@ std::shared_ptr Connection::addSurface(int fd, QRect geometry, int stri auto id = ++m_surfaceId; auto surface = std::shared_ptr(new Surface(this, fd, id, geometry, stride, format)); surfaces.insert_or_assign(id, surface); + dbusInterface->sortZ(); + surface->repaint(); return surface; } @@ -382,8 +384,7 @@ void Connection::readSocket(){ surface->move(move.x, move.y); guiThread->enqueue( surface, - // Surface repaints are local to their coordinates, thus (0,0) - QRect(QPoint(0, 0), surface->size()), + surface->rect(), EPFrameBuffer::WaveformMode::HighQualityGrayscale, message->header.ackid, false, @@ -467,8 +468,7 @@ void Connection::readSocket(){ #ifdef EPAPER guiThread->enqueue( surface, - // Surface repaints are local to their coordinates, thus (0,0) - QRect(QPoint(0, 0), surface->size()), + surface->rect(), EPFrameBuffer::WaveformMode::HighQualityGrayscale, message->header.ackid, false, diff --git a/applications/display-server/dbusinterface.cpp b/applications/display-server/dbusinterface.cpp index 505453f6b..2dec6faaa 100644 --- a/applications/display-server/dbusinterface.cpp +++ b/applications/display-server/dbusinterface.cpp @@ -287,6 +287,7 @@ void DbusInterface::lower(QString identifier, QDBusMessage message){ if(surface != nullptr){ surface->setVisible(false); sortZ(); + surface->repaint(); return; } auto connection = getConnection(identifier); @@ -299,6 +300,7 @@ void DbusInterface::lower(QString identifier, QDBusMessage message){ } for(auto& surface : connection->getSurfaces()){ surface->setVisible(false); + surface->repaint(); } sortZ(); } @@ -311,6 +313,7 @@ void DbusInterface::raise(QString identifier, QDBusMessage message){ surface->setVisible(true); surface->setZ(std::numeric_limits::max()); sortZ(); + surface->repaint(); return; } auto connection = getConnection(identifier); @@ -321,6 +324,7 @@ void DbusInterface::raise(QString identifier, QDBusMessage message){ for(auto& surface : connection->getSurfaces()){ surface->setVisible(true); surface->setZ(std::numeric_limits::max()); + surface->repaint(); } sortZ(); } @@ -549,7 +553,7 @@ void DbusInterface::sortZ(){ if( !connection->isRunning() || connection->isStopped() - || connection->has("system") + || connection->has("system") ){ continue; } diff --git a/applications/display-server/surface.cpp b/applications/display-server/surface.cpp index f9ac092d9..9801abeb1 100644 --- a/applications/display-server/surface.cpp +++ b/applications/display-server/surface.cpp @@ -68,6 +68,7 @@ Surface::Surface( connect(widget, &SurfaceWidget::activeFocusChanged, this, &Surface::activeFocusChanged); emit connection->focused(); setVisible(true); + setZ(std::numeric_limits::max()); S_INFO("Surface created"); } @@ -75,6 +76,9 @@ Surface::~Surface(){ S_INFO("Surface destroyed"); file.close(); setVisible(false); +#ifdef EPAPER + repaint(); +#endif if(component != nullptr){ component->deleteLater(); component = nullptr; @@ -87,7 +91,22 @@ bool Surface::isValid(){ return component != nullptr; } std::shared_ptr Surface::image(){ return m_image; } -void Surface::repaint(){ emit update(QRect(QPoint(0, 0), m_geometry.size())); } +void Surface::repaint(QRect rect){ + if(rect.isEmpty()){ + rect = this->rect(); + } +#ifdef EPAPER + guiThread->enqueue( + nullptr, + geometry(), + EPFrameBuffer::HighQualityGrayscale, + 0, + true + ); +#else + emit update(rect); +#endif +} int Surface::fd(){ return file.handle(); } @@ -95,6 +114,8 @@ const QRect& Surface::geometry(){ return m_geometry; } const QSize Surface::size(){ return m_geometry.size(); } +const QRect Surface::rect(){ return QRect(QPoint(0, 0), size()); } + int Surface::stride(){ return m_stride; } QImage::Format Surface::format(){ return m_format; } @@ -108,15 +129,6 @@ void Surface::move(int x, int y){ void Surface::setVisible(bool visible){ if(component != nullptr){ component->setVisible(visible); -#ifdef EPAPER - guiThread->enqueue( - nullptr, - geometry(), - EPFrameBuffer::HighQualityGrayscale, - 0, - true - ); -#endif } } diff --git a/applications/display-server/surface.h b/applications/display-server/surface.h index 7726ec1a0..468465d54 100644 --- a/applications/display-server/surface.h +++ b/applications/display-server/surface.h @@ -31,10 +31,11 @@ class Surface : public QObject { Blight::surface_id_t identifier(){ return m_identifier; } bool isValid(); std::shared_ptr image(); - void repaint(); + void repaint(QRect rect = QRect()); int fd(); const QRect& geometry(); const QSize size(); + const QRect rect(); int stride(); QImage::Format format(); void move(int x, int y); diff --git a/assets/opt/usr/share/applications/codes.eeems.anxiety.oxide b/assets/opt/usr/share/applications/codes.eeems.anxiety.oxide index 217f3c799..601540da4 100644 --- a/assets/opt/usr/share/applications/codes.eeems.anxiety.oxide +++ b/assets/opt/usr/share/applications/codes.eeems.anxiety.oxide @@ -4,5 +4,6 @@ "bin": "/opt/bin/anxiety", "icon": "oxide:image-48", "type": "foreground", - "permissions": ["screen"] + "permissions": ["screen"], + "flags": ["nopreload"] } diff --git a/assets/opt/usr/share/applications/codes.eeems.corrupt.oxide b/assets/opt/usr/share/applications/codes.eeems.corrupt.oxide index 92def3099..bc9f8d7f4 100644 --- a/assets/opt/usr/share/applications/codes.eeems.corrupt.oxide +++ b/assets/opt/usr/share/applications/codes.eeems.corrupt.oxide @@ -2,7 +2,7 @@ "displayName": "Task Switcher", "description": "Handles switching applications", "bin": "/opt/bin/corrupt", - "flags": ["hidden", "nosavescreen", "nosplash"], + "flags": ["hidden", "nosavescreen", "nosplash", "nopreload"], "type": "backgroundable", "permissions": ["apps"] } diff --git a/assets/opt/usr/share/applications/codes.eeems.decay.oxide b/assets/opt/usr/share/applications/codes.eeems.decay.oxide index 53e2806f1..c1eaf065c 100644 --- a/assets/opt/usr/share/applications/codes.eeems.decay.oxide +++ b/assets/opt/usr/share/applications/codes.eeems.decay.oxide @@ -2,7 +2,7 @@ "displayName": "Startup application", "description": "Handles the password screen on resume", "bin": "/opt/bin/decay", - "flags": ["hidden"], + "flags": ["hidden", "nopreload"], "type": "foreground", "permissions": ["apps", "power", "system", "wifi"] } diff --git a/assets/opt/usr/share/applications/codes.eeems.erode.oxide b/assets/opt/usr/share/applications/codes.eeems.erode.oxide index a0343ddd8..6ef16e5dd 100644 --- a/assets/opt/usr/share/applications/codes.eeems.erode.oxide +++ b/assets/opt/usr/share/applications/codes.eeems.erode.oxide @@ -2,5 +2,6 @@ "displayName": "Process Manager", "description": "List and kill running processes", "icon": "oxide:erode-48", - "bin": "/opt/bin/erode" + "bin": "/opt/bin/erode", + "flags": ["nopreload"] } diff --git a/assets/opt/usr/share/applications/codes.eeems.fret.oxide b/assets/opt/usr/share/applications/codes.eeems.fret.oxide index 3888ec069..f3dbc1e39 100644 --- a/assets/opt/usr/share/applications/codes.eeems.fret.oxide +++ b/assets/opt/usr/share/applications/codes.eeems.fret.oxide @@ -2,7 +2,7 @@ "displayName": "Screenshot daemon", "description": "Takes screenshots and displays notifications", "bin": "/opt/bin/fret", - "flags": ["autoStart", "hidden"], + "flags": ["autoStart", "hidden", "nopreload"], "type": "background", "permissions": ["notification", "screen", "system"] } diff --git a/assets/opt/usr/share/applications/codes.eeems.oxide.oxide b/assets/opt/usr/share/applications/codes.eeems.oxide.oxide index 4f2d68d37..357178aa6 100644 --- a/assets/opt/usr/share/applications/codes.eeems.oxide.oxide +++ b/assets/opt/usr/share/applications/codes.eeems.oxide.oxide @@ -3,6 +3,6 @@ "description": "Application launcher", "bin": "/opt/bin/oxide", "type": "foreground", - "flags": ["hidden"], + "flags": ["hidden", "nopreload"], "permissions": ["apps", "wifi", "power", "system", "notification"] } diff --git a/shared/libblight_client/main.cpp b/shared/libblight_client/main.cpp index 64c913571..be25be5cd 100644 --- a/shared/libblight_client/main.cpp +++ b/shared/libblight_client/main.cpp @@ -485,9 +485,10 @@ int __open(const char* pathname, int flags){ if(res < 0){ _CRIT("Failed to create buffer: %s", std::strerror(errno)); std::exit(errno); - }else{ - _INFO("Created buffer %s on fd %d", blightBuffer->uuid.c_str(), blightBuffer->fd); } + // Initialize the buffer with white + memset((std::uint16_t*)blightBuffer->data, std::uint16_t(0xFFFFFFFF), 2808 * 1872); + _INFO("Created buffer %s on fd %d", blightBuffer->uuid.c_str(), blightBuffer->fd); return res; } }else if(actualpath.starts_with("/dev/input/event")){