diff --git a/Kernel/GUITypes.h b/Kernel/GUITypes.h index c72e3e98e7..9b22ee7e18 100644 --- a/Kernel/GUITypes.h +++ b/Kernel/GUITypes.h @@ -26,7 +26,7 @@ struct GUI_Rect { GUI_Size size; }; -struct GUI_CreateWindowParameters { +struct GUI_WindowParameters { GUI_Rect rect; Color background_color; unsigned flags { 0 }; diff --git a/Kernel/Process.h b/Kernel/Process.h index 865a6b5684..39c6713e1a 100644 --- a/Kernel/Process.h +++ b/Kernel/Process.h @@ -192,10 +192,12 @@ public: Unix::clock_t sys$times(Unix::tms*); 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$get_window_backing_store(int window_id, GUI_WindowBackingStoreInfo*); 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(); diff --git a/Kernel/ProcessGUI.cpp b/Kernel/ProcessGUI.cpp index 7ca3976622..6329bdc876 100644 --- a/Kernel/ProcessGUI.cpp +++ b/Kernel/ProcessGUI.cpp @@ -35,7 +35,7 @@ static void wait_for_gui_server() 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(); @@ -122,3 +122,33 @@ int Process::gui$invalidate_window(int window_id, const GUI_Rect* rect) WSEventLoop::the().server_process().request_wakeup(); 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; +} diff --git a/Kernel/Syscall.cpp b/Kernel/Syscall.cpp index 038ebc4318..9a551b2a37 100644 --- a/Kernel/Syscall.cpp +++ b/Kernel/Syscall.cpp @@ -192,13 +192,17 @@ static dword handle(RegisterDump& regs, dword function, dword arg1, dword arg2, case Syscall::SC_sync: return sync(); 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: return current->gui$destroy_window((int)arg1); case Syscall::SC_gui_get_window_backing_store: return current->gui$get_window_backing_store((int)arg1, (GUI_WindowBackingStoreInfo*)arg2); case Syscall::SC_gui_invalidate_window: 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: kprintf("<%u> int0x80: Unknown function %u requested {%x, %x, %x}\n", current->pid(), function, arg1, arg2, arg3); break; diff --git a/Kernel/Syscall.h b/Kernel/Syscall.h index 2159d491f2..51387ae88a 100644 --- a/Kernel/Syscall.h +++ b/Kernel/Syscall.h @@ -72,6 +72,8 @@ __ENUMERATE_SYSCALL(gui_get_window_backing_store) \ __ENUMERATE_SYSCALL(gui_invalidate_window) \ __ENUMERATE_SYSCALL(select) \ + __ENUMERATE_SYSCALL(gui_get_window_parameters) \ + __ENUMERATE_SYSCALL(gui_set_window_parameters) \ struct fd_set; diff --git a/LibC/gui.cpp b/LibC/gui.cpp index 2c11bcb8c8..0a4359453e 100644 --- a/LibC/gui.cpp +++ b/LibC/gui.cpp @@ -3,7 +3,7 @@ #include #include -int gui_create_window(const GUI_CreateWindowParameters* params) +int gui_create_window(const GUI_WindowParameters* params) { int rc = syscall(SC_gui_create_window, params); __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); __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); +} diff --git a/LibC/gui.h b/LibC/gui.h index e92809fe4a..7b008fbfba 100644 --- a/LibC/gui.h +++ b/LibC/gui.h @@ -5,9 +5,11 @@ __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_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 diff --git a/LibGUI/GWindow.cpp b/LibGUI/GWindow.cpp index 275d773d2a..9a7ca2a307 100644 --- a/LibGUI/GWindow.cpp +++ b/LibGUI/GWindow.cpp @@ -27,7 +27,7 @@ GWindow* GWindow::from_window_id(int window_id) GWindow::GWindow(GObject* parent) : GObject(parent) { - GUI_CreateWindowParameters wparams; + GUI_WindowParameters wparams; wparams.rect = { { 100, 400 }, { 140, 140 } }; wparams.background_color = 0xffc0c0; strcpy(wparams.title, "GWindow"); @@ -55,17 +55,26 @@ GWindow::~GWindow() void GWindow::set_title(String&& title) { - if (m_title == title) - return; - + dbgprintf("GWindow::set_title \"%s\"\n", title.characters()); + GUI_WindowParameters params; + int rc = gui_get_window_parameters(m_window_id, ¶ms); + ASSERT(rc == 0); + strcpy(params.title, title.characters());; + rc = gui_set_window_parameters(m_window_id, ¶ms); + ASSERT(rc == 0); m_title = move(title); } + void GWindow::set_rect(const Rect& rect) { - if (m_rect == rect) - return; + dbgprintf("GWindow::set_rect %d,%d %dx%d\n", m_rect.x(), m_rect.y(), m_rect.width(), m_rect.height()); + GUI_WindowParameters params; + int rc = gui_get_window_parameters(m_window_id, ¶ms); + ASSERT(rc == 0); + params.rect = rect; + rc = gui_set_window_parameters(m_window_id, ¶ms); + ASSERT(rc == 0); 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) diff --git a/Terminal/Terminal.cpp b/Terminal/Terminal.cpp index 3e7728b1ca..c01cd5708b 100644 --- a/Terminal/Terminal.cpp +++ b/Terminal/Terminal.cpp @@ -14,7 +14,7 @@ void Terminal::create_window() 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; - GUI_CreateWindowParameters params; + GUI_WindowParameters params; params.rect = { { 300, 300 }, { m_pixel_width, m_pixel_height } }; params.background_color = 0x000000; strcpy(params.title, "Terminal"); diff --git a/Userland/guitest.cpp b/Userland/guitest.cpp index b923eb8f9e..8f48a5cc75 100644 --- a/Userland/guitest.cpp +++ b/Userland/guitest.cpp @@ -14,7 +14,7 @@ static void paint(GraphicsBitmap& bitmap, int width, int height); int main(int argc, char** argv) { - GUI_CreateWindowParameters wparams; + GUI_WindowParameters wparams; wparams.rect = { { 100, 100 }, { 120, 120 } }; wparams.background_color = 0xffc0c0; strcpy(wparams.title, "GUI test app"); diff --git a/Userland/guitest2.cpp b/Userland/guitest2.cpp index b9f2decf3b..850dd5abd8 100644 --- a/Userland/guitest2.cpp +++ b/Userland/guitest2.cpp @@ -28,7 +28,7 @@ GWindow* make_font_test_window() { auto* window = new GWindow; window->set_title("Font test"); - window->set_rect({ 140, 100, 300, 80 }); + window->set_rect({ 440, 100, 300, 80 }); auto* widget = new GWidget; window->set_main_widget(widget);