wind+libui+taskbar: Add various window types and never focus the taskbar
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
apio 2023-09-27 18:14:32 +02:00
parent f0844c9f69
commit 9a9c7e577a
Signed by: apio
GPG Key ID: B8A7D06E42258954
9 changed files with 24 additions and 14 deletions

View File

@ -26,7 +26,7 @@ Result<int> luna_main(int argc, char** argv)
ui::Rect bar = ui::Rect { ui::Point { 0, screen.height - 50 }, screen.width, 50 }; ui::Rect bar = ui::Rect { ui::Point { 0, screen.height - 50 }, screen.width, 50 };
auto window = TRY(ui::Window::create(bar, false)); auto window = TRY(ui::Window::create(bar, ui::WindowType::System));
app.set_main_window(window); app.set_main_window(window);
window->set_background(TASKBAR_COLOR); window->set_background(TASKBAR_COLOR);

View File

@ -14,13 +14,14 @@
#include <ui/Mouse.h> #include <ui/Mouse.h>
#include <ui/Rect.h> #include <ui/Rect.h>
#include <ui/Widget.h> #include <ui/Widget.h>
#include <ui/ipc/Server.h>
namespace ui namespace ui
{ {
class Window class Window
{ {
public: public:
static Result<Window*> create(Rect rect, bool decorated = true); static Result<Window*> create(Rect rect, WindowType type = WindowType::Normal);
void set_title(StringView title); void set_title(StringView title);

View File

@ -25,13 +25,20 @@ namespace ui
GET_SCREEN_RECT_ID, GET_SCREEN_RECT_ID,
}; };
enum class WindowType : u8
{
Normal,
NotDecorated,
System,
};
struct CreateWindowRequest struct CreateWindowRequest
{ {
using ResponseType = CreateWindowResponse; using ResponseType = CreateWindowResponse;
static constexpr u8 ID = CREATE_WINDOW_ID; static constexpr u8 ID = CREATE_WINDOW_ID;
ui::Rect rect; ui::Rect rect;
bool decorated; WindowType type;
}; };
struct SetWindowTitleRequest struct SetWindowTitleRequest

View File

@ -16,13 +16,13 @@
namespace ui namespace ui
{ {
Result<Window*> Window::create(Rect rect, bool decorated) Result<Window*> Window::create(Rect rect, WindowType type)
{ {
auto window = TRY(make_owned<Window>()); auto window = TRY(make_owned<Window>());
ui::CreateWindowRequest request; ui::CreateWindowRequest request;
request.rect = rect; request.rect = rect;
request.decorated = decorated; request.type = type;
auto response = TRY(os::IPC::send_sync<ui::CreateWindowResponse>(App::the().client(), request)); auto response = TRY(os::IPC::send_sync<ui::CreateWindowResponse>(App::the().client(), request));
auto path = COPY_IPC_STRING(response.shm_path); auto path = COPY_IPC_STRING(response.shm_path);

View File

@ -56,7 +56,7 @@ static Result<void> handle_create_window_message(Client& client)
ui::CreateWindowRequest request; ui::CreateWindowRequest request;
READ_MESSAGE(request); READ_MESSAGE(request);
if (request.decorated) if (request.type == ui::WindowType::Normal)
{ {
request.rect.height += request.rect.height +=
Window::titlebar_height(); // Make sure we provide the full contents rect that was asked for. Window::titlebar_height(); // Make sure we provide the full contents rect that was asked for.
@ -69,7 +69,7 @@ static Result<void> handle_create_window_message(Client& client)
auto shm_path = TRY(String::format("/wind-shm-%d-%lu"_sv, client.conn.fd(), time(NULL))); auto shm_path = TRY(String::format("/wind-shm-%d-%lu"_sv, client.conn.fd(), time(NULL)));
auto* window = new (std::nothrow) Window(request.rect, move(name), request.decorated); auto* window = new (std::nothrow) Window(request.rect, move(name), request.type);
if (!window) if (!window)
{ {
os::IPC::send_error(client.conn, ENOMEM); os::IPC::send_error(client.conn, ENOMEM);

View File

@ -82,7 +82,7 @@ void Mouse::update(const moon::MousePacket& packet)
} }
else if (window->surface.absolute(window->contents).contains(m_position)) else if (window->surface.absolute(window->contents).contains(m_position))
{ {
window->focus(); if (window->type != ui::WindowType::System) window->focus();
break; // We don't want to continue iterating, otherwise this would take into account windows whose break; // We don't want to continue iterating, otherwise this would take into account windows whose
// titlebar is underneath another window's contents! // titlebar is underneath another window's contents!
} }

View File

@ -43,9 +43,10 @@ void Window::focus()
g_windows.append(this); g_windows.append(this);
} }
Window::Window(ui::Rect r, String&& n, bool d) : surface(r), name(move(n)), decorated(d) Window::Window(ui::Rect r, String&& n, ui::WindowType t) : surface(r), name(move(n)), type(t)
{ {
auto font = ui::Font::default_font(); auto font = ui::Font::default_font();
bool decorated { type == ui::WindowType::Normal };
if (decorated && surface.width < 36) surface.width = 36; if (decorated && surface.width < 36) surface.width = 36;
if (decorated && surface.height < (font->height() + 20)) surface.height = font->height() + 20; if (decorated && surface.height < (font->height() + 20)) surface.height = font->height() + 20;
titlebar = decorated ? ui::Rect { 0, 0, surface.width, font->height() + 20 } : ui::Rect { 0, 0, 0, 0 }; titlebar = decorated ? ui::Rect { 0, 0, surface.width, font->height() + 20 } : ui::Rect { 0, 0, 0, 0 };

View File

@ -4,6 +4,7 @@
#include <ui/Canvas.h> #include <ui/Canvas.h>
#include <ui/Color.h> #include <ui/Color.h>
#include <ui/Rect.h> #include <ui/Rect.h>
#include <ui/ipc/Server.h>
struct Client; struct Client;
@ -18,11 +19,11 @@ struct Window : public LinkedListNode<Window>
bool dirty { false }; bool dirty { false };
Client* client; Client* client;
int id; int id;
bool decorated; ui::WindowType type;
static int titlebar_height(); static int titlebar_height();
Window(ui::Rect, String&&, bool); Window(ui::Rect, String&&, ui::WindowType);
~Window(); ~Window();
void focus(); void focus();

View File

@ -36,9 +36,9 @@ static void debug(const Vector<OwnedPtr<Client>>& clients)
for (const auto& window : g_windows) for (const auto& window : g_windows)
{ {
os::println("Window of client (fd %d), id %d, %sdecorated, %sdirty (\"%s\") (%d,%d,%d,%d)", os::println("Window of client (fd %d), id %d, %sdecorated, %sdirty (\"%s\") (%d,%d,%d,%d)",
window->client->conn.fd(), window->id, window->decorated ? "" : "not ", window->dirty ? "" : "not ", window->client->conn.fd(), window->id, window->type == ui::WindowType::Normal ? "" : "not ",
window->name.chars(), window->surface.pos.x, window->surface.pos.y, window->surface.width, window->dirty ? "" : "not ", window->name.chars(), window->surface.pos.x, window->surface.pos.y,
window->surface.height); window->surface.width, window->surface.height);
} }
os::println("-- wind: Listing processes --"); os::println("-- wind: Listing processes --");