1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-24 22:27:42 +00:00

Make it possible for userspace to alter window title/geometry.

I'm not in love with this syscall API but it allows me to make progress.
This commit is contained in:
Andreas Kling 2019-01-20 06:02:09 +01:00
parent 8eae89a405
commit dbe83f3a83
11 changed files with 78 additions and 17 deletions

View file

@ -26,7 +26,7 @@ struct GUI_Rect {
GUI_Size size; GUI_Size size;
}; };
struct GUI_CreateWindowParameters { struct GUI_WindowParameters {
GUI_Rect rect; GUI_Rect rect;
Color background_color; Color background_color;
unsigned flags { 0 }; unsigned flags { 0 };

View file

@ -192,10 +192,12 @@ public:
Unix::clock_t sys$times(Unix::tms*); Unix::clock_t sys$times(Unix::tms*);
int sys$utime(const char* pathname, const struct Unix::utimbuf*); int sys$utime(const char* pathname, const struct Unix::utimbuf*);
int gui$create_window(const GUI_CreateWindowParameters*); int gui$create_window(const GUI_WindowParameters*);
int gui$destroy_window(int window_id); int gui$destroy_window(int window_id);
int gui$get_window_backing_store(int window_id, GUI_WindowBackingStoreInfo*); int gui$get_window_backing_store(int window_id, GUI_WindowBackingStoreInfo*);
int gui$invalidate_window(int window_id, const GUI_Rect*); int gui$invalidate_window(int window_id, const GUI_Rect*);
int gui$get_window_parameters(int window_id, GUI_WindowParameters*);
int gui$set_window_parameters(int window_id, const GUI_WindowParameters*);
DisplayInfo get_display_info(); DisplayInfo get_display_info();

View file

@ -35,7 +35,7 @@ static void wait_for_gui_server()
sleep(10); sleep(10);
} }
int Process::gui$create_window(const GUI_CreateWindowParameters* user_params) int Process::gui$create_window(const GUI_WindowParameters* user_params)
{ {
wait_for_gui_server(); wait_for_gui_server();
@ -122,3 +122,33 @@ int Process::gui$invalidate_window(int window_id, const GUI_Rect* rect)
WSEventLoop::the().server_process().request_wakeup(); WSEventLoop::the().server_process().request_wakeup();
return 0; return 0;
} }
int Process::gui$get_window_parameters(int window_id, GUI_WindowParameters* params)
{
if (window_id < 0)
return -EINVAL;
if (!validate_write_typed(params))
return -EFAULT;
auto it = m_windows.find(window_id);
if (it == m_windows.end())
return -EBADWINDOW;
auto& window = *(*it).value;
params->rect = window.rect();
strcpy(params->title, window.title().characters());
return 0;
}
int Process::gui$set_window_parameters(int window_id, const GUI_WindowParameters* params)
{
if (window_id < 0)
return -EINVAL;
if (!validate_read_typed(params))
return -EFAULT;
auto it = m_windows.find(window_id);
if (it == m_windows.end())
return -EBADWINDOW;
auto& window = *(*it).value;
window.set_rect(params->rect);
window.set_title(params->title);
return 0;
}

View file

@ -192,13 +192,17 @@ static dword handle(RegisterDump& regs, dword function, dword arg1, dword arg2,
case Syscall::SC_sync: case Syscall::SC_sync:
return sync(); return sync();
case Syscall::SC_gui_create_window: case Syscall::SC_gui_create_window:
return current->gui$create_window((const GUI_CreateWindowParameters*)arg1); return current->gui$create_window((const GUI_WindowParameters*)arg1);
case Syscall::SC_gui_destroy_window: case Syscall::SC_gui_destroy_window:
return current->gui$destroy_window((int)arg1); return current->gui$destroy_window((int)arg1);
case Syscall::SC_gui_get_window_backing_store: case Syscall::SC_gui_get_window_backing_store:
return current->gui$get_window_backing_store((int)arg1, (GUI_WindowBackingStoreInfo*)arg2); return current->gui$get_window_backing_store((int)arg1, (GUI_WindowBackingStoreInfo*)arg2);
case Syscall::SC_gui_invalidate_window: case Syscall::SC_gui_invalidate_window:
return current->gui$invalidate_window((int)arg1, (const GUI_Rect*)arg2); return current->gui$invalidate_window((int)arg1, (const GUI_Rect*)arg2);
case Syscall::SC_gui_set_window_parameters:
return current->gui$set_window_parameters((int)arg1, (const GUI_WindowParameters*)arg2);
case Syscall::SC_gui_get_window_parameters:
return current->gui$get_window_parameters((int)arg1, (GUI_WindowParameters*)arg2);
default: default:
kprintf("<%u> int0x80: Unknown function %u requested {%x, %x, %x}\n", current->pid(), function, arg1, arg2, arg3); kprintf("<%u> int0x80: Unknown function %u requested {%x, %x, %x}\n", current->pid(), function, arg1, arg2, arg3);
break; break;

View file

@ -72,6 +72,8 @@
__ENUMERATE_SYSCALL(gui_get_window_backing_store) \ __ENUMERATE_SYSCALL(gui_get_window_backing_store) \
__ENUMERATE_SYSCALL(gui_invalidate_window) \ __ENUMERATE_SYSCALL(gui_invalidate_window) \
__ENUMERATE_SYSCALL(select) \ __ENUMERATE_SYSCALL(select) \
__ENUMERATE_SYSCALL(gui_get_window_parameters) \
__ENUMERATE_SYSCALL(gui_set_window_parameters) \
struct fd_set; struct fd_set;

View file

@ -3,7 +3,7 @@
#include <Kernel/Syscall.h> #include <Kernel/Syscall.h>
#include <errno.h> #include <errno.h>
int gui_create_window(const GUI_CreateWindowParameters* params) int gui_create_window(const GUI_WindowParameters* params)
{ {
int rc = syscall(SC_gui_create_window, params); int rc = syscall(SC_gui_create_window, params);
__RETURN_WITH_ERRNO(rc, rc, -1); __RETURN_WITH_ERRNO(rc, rc, -1);
@ -20,3 +20,15 @@ int gui_get_window_backing_store(int window_id, GUI_WindowBackingStoreInfo* info
int rc = syscall(SC_gui_get_window_backing_store, window_id, info); int rc = syscall(SC_gui_get_window_backing_store, window_id, info);
__RETURN_WITH_ERRNO(rc, rc, -1); __RETURN_WITH_ERRNO(rc, rc, -1);
} }
int gui_get_window_parameters(int window_id, GUI_WindowParameters* params)
{
int rc = syscall(SC_gui_get_window_parameters, window_id, params);
__RETURN_WITH_ERRNO(rc, rc, -1);
}
int gui_set_window_parameters(int window_id, const GUI_WindowParameters* params)
{
int rc = syscall(SC_gui_set_window_parameters, window_id, params);
__RETURN_WITH_ERRNO(rc, rc, -1);
}

View file

@ -5,9 +5,11 @@
__BEGIN_DECLS __BEGIN_DECLS
int gui_create_window(const GUI_CreateWindowParameters* params); int gui_create_window(const GUI_WindowParameters*);
int gui_invalidate_window(int window_id, const GUI_Rect*); int gui_invalidate_window(int window_id, const GUI_Rect*);
int gui_get_window_backing_store(int window_id, GUI_WindowBackingStoreInfo* info); int gui_get_window_backing_store(int window_id, GUI_WindowBackingStoreInfo*);
int gui_get_window_parameters(int window_id, GUI_WindowParameters*);
int gui_set_window_parameters(int window_id, const GUI_WindowParameters*);
__END_DECLS __END_DECLS

View file

@ -27,7 +27,7 @@ GWindow* GWindow::from_window_id(int window_id)
GWindow::GWindow(GObject* parent) GWindow::GWindow(GObject* parent)
: GObject(parent) : GObject(parent)
{ {
GUI_CreateWindowParameters wparams; GUI_WindowParameters wparams;
wparams.rect = { { 100, 400 }, { 140, 140 } }; wparams.rect = { { 100, 400 }, { 140, 140 } };
wparams.background_color = 0xffc0c0; wparams.background_color = 0xffc0c0;
strcpy(wparams.title, "GWindow"); strcpy(wparams.title, "GWindow");
@ -55,17 +55,26 @@ GWindow::~GWindow()
void GWindow::set_title(String&& title) void GWindow::set_title(String&& title)
{ {
if (m_title == title) dbgprintf("GWindow::set_title \"%s\"\n", title.characters());
return; GUI_WindowParameters params;
int rc = gui_get_window_parameters(m_window_id, &params);
ASSERT(rc == 0);
strcpy(params.title, title.characters());;
rc = gui_set_window_parameters(m_window_id, &params);
ASSERT(rc == 0);
m_title = move(title); m_title = move(title);
} }
void GWindow::set_rect(const Rect& rect) void GWindow::set_rect(const Rect& rect)
{ {
if (m_rect == rect) dbgprintf("GWindow::set_rect %d,%d %dx%d\n", m_rect.x(), m_rect.y(), m_rect.width(), m_rect.height());
return; GUI_WindowParameters params;
int rc = gui_get_window_parameters(m_window_id, &params);
ASSERT(rc == 0);
params.rect = rect;
rc = gui_set_window_parameters(m_window_id, &params);
ASSERT(rc == 0);
m_rect = rect; m_rect = rect;
dbgprintf("GWindow::setRect %d,%d %dx%d\n", m_rect.x(), m_rect.y(), m_rect.width(), m_rect.height());
} }
void GWindow::event(GEvent& event) void GWindow::event(GEvent& event)

View file

@ -14,7 +14,7 @@ void Terminal::create_window()
m_pixel_width = m_columns * font().glyph_width() + m_inset * 2; m_pixel_width = m_columns * font().glyph_width() + m_inset * 2;
m_pixel_height = (m_rows * (font().glyph_height() + m_line_spacing)) + (m_inset * 2) - m_line_spacing; m_pixel_height = (m_rows * (font().glyph_height() + m_line_spacing)) + (m_inset * 2) - m_line_spacing;
GUI_CreateWindowParameters params; GUI_WindowParameters params;
params.rect = { { 300, 300 }, { m_pixel_width, m_pixel_height } }; params.rect = { { 300, 300 }, { m_pixel_width, m_pixel_height } };
params.background_color = 0x000000; params.background_color = 0x000000;
strcpy(params.title, "Terminal"); strcpy(params.title, "Terminal");

View file

@ -14,7 +14,7 @@ static void paint(GraphicsBitmap& bitmap, int width, int height);
int main(int argc, char** argv) int main(int argc, char** argv)
{ {
GUI_CreateWindowParameters wparams; GUI_WindowParameters wparams;
wparams.rect = { { 100, 100 }, { 120, 120 } }; wparams.rect = { { 100, 100 }, { 120, 120 } };
wparams.background_color = 0xffc0c0; wparams.background_color = 0xffc0c0;
strcpy(wparams.title, "GUI test app"); strcpy(wparams.title, "GUI test app");

View file

@ -28,7 +28,7 @@ GWindow* make_font_test_window()
{ {
auto* window = new GWindow; auto* window = new GWindow;
window->set_title("Font test"); window->set_title("Font test");
window->set_rect({ 140, 100, 300, 80 }); window->set_rect({ 440, 100, 300, 80 });
auto* widget = new GWidget; auto* widget = new GWidget;
window->set_main_widget(widget); window->set_main_widget(widget);