2019-01-13 01:59:38 +01:00
# include "Process.h"
# include "MemoryManager.h"
# include <LibC/errno_numbers.h>
# include <Widgets/AbstractScreen.h>
# include <Widgets/FrameBuffer.h>
# include <Widgets/EventLoop.h>
# include <Widgets/Font.h>
2019-01-13 05:03:17 +01:00
# include <Widgets/Button.h>
# include <Widgets/Label.h>
2019-01-13 01:59:38 +01:00
# include <Widgets/Widget.h>
# include <Widgets/Window.h>
# include <Widgets/WindowManager.h>
void Process : : initialize_gui_statics ( )
{
Font : : initialize ( ) ;
FrameBuffer : : initialize ( ) ;
EventLoop : : initialize ( ) ;
WindowManager : : initialize ( ) ;
AbstractScreen : : initialize ( ) ;
new EventLoop ;
}
static void wait_for_gui_server ( )
{
// FIXME: Time out after a while and return an error.
while ( ! EventLoop : : main ( ) . running ( ) )
sleep ( 10 ) ;
}
int Process : : gui $ create_window ( const GUI_CreateWindowParameters * user_params )
{
wait_for_gui_server ( ) ;
if ( ! validate_read_typed ( user_params ) )
return - EFAULT ;
2019-01-13 05:03:17 +01:00
auto params = * user_params ;
2019-01-13 01:59:38 +01:00
2019-01-13 05:08:26 +01:00
if ( params . rect . is_empty ( ) )
2019-01-13 01:59:38 +01:00
return - EINVAL ;
ProcessPagingScope scope ( EventLoop : : main ( ) . server_process ( ) ) ;
auto * window = new Window ;
if ( ! window )
return - ENOMEM ;
int window_id = m_windows . size ( ) ;
2019-01-13 05:03:17 +01:00
m_windows . append ( window - > makeWeakPtr ( ) ) ;
2019-01-13 01:59:38 +01:00
window - > setTitle ( params . title ) ;
2019-01-13 05:08:26 +01:00
window - > setRect ( params . rect ) ;
2019-01-13 01:59:38 +01:00
auto * main_widget = new Widget ;
window - > setMainWidget ( main_widget ) ;
2019-01-13 05:08:26 +01:00
main_widget - > setWindowRelativeRect ( { 0 , 0 , params . rect . width ( ) , params . rect . height ( ) } ) ;
2019-01-13 01:59:38 +01:00
main_widget - > setBackgroundColor ( params . background_color ) ;
main_widget - > setFillWithBackgroundColor ( true ) ;
2019-01-13 05:08:26 +01:00
dbgprintf ( " %s<%u> gui$create_window: %d with rect {%d,%d %dx%d} \n " , name ( ) . characters ( ) , pid ( ) , window_id , params . rect . x ( ) , params . rect . y ( ) , params . rect . width ( ) , params . rect . height ( ) ) ;
2019-01-13 01:59:38 +01:00
return window_id ;
}
int Process : : gui $ destroy_window ( int window_id )
{
dbgprintf ( " %s<%u> gui$destroy_window (window_id=%d) \n " , name ( ) . characters ( ) , pid ( ) , window_id ) ;
if ( window_id < 0 )
return - EINVAL ;
if ( window_id > = static_cast < int > ( m_windows . size ( ) ) )
2019-01-13 05:03:17 +01:00
return - EBADWINDOW ;
auto * window = m_windows [ window_id ] . ptr ( ) ;
if ( ! window )
return - EBADWINDOW ;
2019-01-13 01:59:38 +01:00
window - > deleteLater ( ) ;
return 0 ;
}
2019-01-13 05:03:17 +01:00
int Process : : gui $ create_widget ( int window_id , const GUI_CreateWidgetParameters * user_params )
{
if ( ! validate_read_typed ( user_params ) )
return - EFAULT ;
if ( window_id < 0 )
return - EINVAL ;
if ( window_id > = static_cast < int > ( m_windows . size ( ) ) )
return - EINVAL ;
if ( ! m_windows [ window_id ] )
return - EINVAL ;
auto & window = * m_windows [ window_id ] ;
auto params = * user_params ;
2019-01-13 05:08:26 +01:00
if ( params . rect . is_empty ( ) )
2019-01-13 05:03:17 +01:00
return - EINVAL ;
Widget * widget = nullptr ;
switch ( params . type ) {
case GUI_WidgetType : : Label :
widget = new Label ( window . mainWidget ( ) ) ;
static_cast < Label * > ( widget ) - > setText ( params . text ) ;
2019-01-13 07:33:10 +01:00
widget - > setFillWithBackgroundColor ( params . opaque ) ;
2019-01-13 05:03:17 +01:00
break ;
case GUI_WidgetType : : Button :
widget = new Button ( window . mainWidget ( ) ) ;
static_cast < Button * > ( widget ) - > setCaption ( params . text ) ;
break ;
}
int widget_id = m_widgets . size ( ) ;
m_widgets . append ( widget - > makeWeakPtr ( ) ) ;
2019-01-13 05:08:26 +01:00
widget - > setWindowRelativeRect ( params . rect ) ;
2019-01-13 05:03:17 +01:00
widget - > setBackgroundColor ( params . background_color ) ;
2019-01-13 05:08:26 +01:00
dbgprintf ( " %s<%u> gui$create_widget: %d with rect {%d,%d %dx%d} \n " , name ( ) . characters ( ) , pid ( ) , widget_id , params . rect . x ( ) , params . rect . y ( ) , params . rect . width ( ) , params . rect . height ( ) ) ;
2019-01-13 05:03:17 +01:00
return window_id ;
}
int Process : : gui $ destroy_widget ( int widget_id )
{
dbgprintf ( " %s<%u> gui$destroy_widget (widget_id=%d) \n " , name ( ) . characters ( ) , pid ( ) , widget_id ) ;
if ( widget_id < 0 )
return - EINVAL ;
if ( widget_id > = static_cast < int > ( m_widgets . size ( ) ) )
return - EBADWINDOW ;
auto * widget = m_widgets [ widget_id ] . ptr ( ) ;
if ( ! widget )
return - EBADWIDGET ;
widget - > deleteLater ( ) ;
return 0 ;
}