ProcessGUI.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. #include "Process.h"
  2. #include "MemoryManager.h"
  3. #include <LibC/errno_numbers.h>
  4. #include <Widgets/Font.h>
  5. #include <WindowServer/WSScreen.h>
  6. #include <WindowServer/WSFrameBuffer.h>
  7. #include <WindowServer/WSEventLoop.h>
  8. #include <WindowServer/WSWindow.h>
  9. #include <WindowServer/WSWindowManager.h>
  10. void Process::initialize_gui_statics()
  11. {
  12. Font::initialize();
  13. WSFrameBuffer::initialize();
  14. WSEventLoop::initialize();
  15. WSWindowManager::initialize();
  16. WSScreen::initialize();
  17. new WSEventLoop;
  18. }
  19. int Process::make_window_id()
  20. {
  21. int new_id = m_next_window_id++;
  22. while (!new_id || m_windows.contains(new_id)) {
  23. new_id = m_next_window_id++;
  24. if (new_id < 0)
  25. new_id = 1;
  26. }
  27. return new_id;
  28. }
  29. static void wait_for_gui_server()
  30. {
  31. // FIXME: Time out after a while and return an error.
  32. while (!WSEventLoop::the().running())
  33. sleep(10);
  34. }
  35. int Process::gui$create_window(const GUI_CreateWindowParameters* user_params)
  36. {
  37. wait_for_gui_server();
  38. if (!validate_read_typed(user_params))
  39. return -EFAULT;
  40. auto params = *user_params;
  41. Rect rect = params.rect;
  42. if (rect.is_empty())
  43. return -EINVAL;
  44. ProcessPagingScope scope(WSEventLoop::the().server_process());
  45. int window_id = make_window_id();
  46. if (!window_id)
  47. return -ENOMEM;
  48. auto window = make<WSWindow>(*this, window_id);
  49. if (!window)
  50. return -ENOMEM;
  51. window->set_title(params.title);
  52. window->set_rect(rect);
  53. m_windows.set(window_id, move(window));
  54. dbgprintf("%s<%u> gui$create_window: %d with rect {%d,%d %dx%d}\n", name().characters(), pid(), window_id, rect.x(), rect.y(), rect.width(), rect.height());
  55. return window_id;
  56. }
  57. int Process::gui$destroy_window(int window_id)
  58. {
  59. dbgprintf("%s<%u> gui$destroy_window (window_id=%d)\n", name().characters(), pid(), window_id);
  60. if (window_id < 0)
  61. return -EINVAL;
  62. auto it = m_windows.find(window_id);
  63. if (it == m_windows.end())
  64. return -EBADWINDOW;
  65. m_windows.remove(window_id);
  66. return 0;
  67. }
  68. int Process::gui$get_window_backing_store(int window_id, GUI_WindowBackingStoreInfo* info)
  69. {
  70. dbgprintf("%s<%u> gui$get_window_backing_store (window_id=%d, info=%p)\n", name().characters(), pid(), window_id, info);
  71. if (!validate_write_typed(info))
  72. return -EFAULT;
  73. if (window_id < 0)
  74. return -EINVAL;
  75. auto it = m_windows.find(window_id);
  76. if (it == m_windows.end())
  77. return -EBADWINDOW;
  78. auto& window = *(*it).value;
  79. info->bpp = sizeof(RGBA32);
  80. info->pitch = window.backing()->pitch();
  81. info->size = window.backing()->size();
  82. info->pixels = reinterpret_cast<RGBA32*>(window.backing()->client_region()->linearAddress.asPtr());
  83. return 0;
  84. }
  85. int Process::gui$invalidate_window(int window_id)
  86. {
  87. dbgprintf("%s<%u> gui$invalidate_window (window_id=%d)\n", name().characters(), pid(), window_id);
  88. if (window_id < 0)
  89. return -EINVAL;
  90. auto it = m_windows.find(window_id);
  91. if (it == m_windows.end())
  92. return -EBADWINDOW;
  93. auto& window = *(*it).value;
  94. WSEventLoop::the().post_event(&window, make<WSEvent>(WSEvent::WM_Invalidate));
  95. WSEventLoop::the().server_process().request_wakeup();
  96. return 0;
  97. }