--- /dev/null
+@startuml\r
+class pepper_object_t\r
+class pepper_compositor_t\r
+class pepper_seat_t\r
+class pepper_pointer_t\r
+class pepper_keyboard_t\r
+class pepper_touch_t\r
+class pepper_input_device_t\r
+\r
+pepper_object_t <|-- pepper_compositor_t\r
+pepper_object_t <|-- pepper_seat_t\r
+pepper_object_t <|-- pepper_pointer_t\r
+pepper_object_t <|-- pepper_keyboard_t\r
+pepper_object_t <|-- pepper_touch_t\r
+pepper_object_t <|-- pepper_input_device_t\r
+pepper_input_device_t <|-- X11::pointer\r
+pepper_input_device_t <|-- X11::key\r
+pepper_input_device_t <|-- WAYLAND::pointer\r
+pepper_input_device_t <|-- WAYLAND::key\r
+\r
+pepper_compositor_t "1"*--"*"pepper_seat_t\r
+pepper_seat_t "1"*--"1" pepper_pointer_t\r
+pepper_seat_t "1"*--"1" pepper_keyboard_t\r
+pepper_seat_t "1"*--"1" pepper_touch_t\r
+pepper_seat_t "1"*--"*" wl_resource::wl_seat\r
+pepper_seat_t "1"*--"1" wl_global::wl_seat_interface\r
+pepper_seat_t "1"*--"*" pepper_input_device_t\r
+\r
+pepper_pointer_t "1"*--"*" wl_resource::wl_pointer\r
+pepper_keyboard_t "1"*--"*" wl_resource::wl_keyboard\r
+pepper_touch_t "1"*--"*" wl_resource::wl_touch\r
+@enduml
\ No newline at end of file
--- /dev/null
+@startuml\r
+\r
+class pepper_object_t\r
+class pepper_compositor_t\r
+class pepper_output_t\r
+class pepper_seat_t\r
+class pepper_surface_t\r
+class pepper_buffer_t\r
+class pepper_view_t\r
+\r
+pepper_object_t <|-- pepper_compositor_t\r
+pepper_object_t <|-- pepper_output_t\r
+pepper_object_t <|-- pepper_seat_t\r
+pepper_object_t <|-- pepper_surface_t\r
+pepper_object_t <|-- pepper_buffer_t\r
+pepper_object_t <|-- pepper_view_t\r
+\r
+pepper_compositor_t *-- pepper_seat_t\r
+pepper_compositor_t *-- pepper_output_t\r
+\r
+class pepper_output_backend_t <<interface>> {\r
+ {abstract}destroy(void* output)\r
+\r
+ {abstract}get_subpixel_order()\r
+ {abstract}get_maker_name()\r
+ {abstract}get_model_name()\r
+ {abstract}get_mode_count()\r
+ {abstract}get_mode()\r
+ {abstract}set_mode()\r
+\r
+ {abstract}assign_planes()\r
+ {abstract}repaint()\r
+ {abstract}attach_surface()\r
+ -- listener--\r
+ {abstract}add_destroy_listener()\r
+ {abstract}add_mode_change_listender()\r
+ {abstract}add_frame_listener()\r
+}\r
+pepper_output_t "1" *-- "1" pepper_output_backend_t\r
+\r
+class pepper_drm_output_backend\r
+pepper_output_backend_t <|-- pepper_drm_output_backend : Implementation\r
+\r
+class pepper_fbdev_output_backend\r
+pepper_output_backend_t <|-- pepper_fbdev_output_backend : Implementation\r
+\r
+class pepper_wayland_output_backend\r
+pepper_output_backend_t <|-- pepper_wayland_output_backend : Implementation\r
+\r
+class pepper_x11_output_backend\r
+pepper_output_backend_t <|-- pepper_x11_output_backend : Implementation\r
+\r
+class pepper_renderer_t <<interface>> {\r
+ pepper_compositor_t *compositor\r
+ pepper_render_target_t *target\r
+\r
+ {abstract}destroy()\r
+ {abstract}attach_surface()\r
+ {abstract}flush_surface_damage()\r
+ {abstract}read_pixels()\r
+ {abstract}repaint_output()\r
+}\r
+\r
+class pepper_pixman_renderer\r
+pepper_renderer_t <|-- pepper_pixman_renderer\r
+\r
+class pepper_gl_renderer\r
+pepper_renderer_t <|-- pepper_gl_renderer\r
+\r
+class pepper_render_target_t<<interface>> {\r
+ pepper_renderer_t *renderer\r
+\r
+ {abstract}destroy()\r
+}\r
+pepper_renderer_t "1" -- "1" pepper_render_target_t\r
+\r
+class pepper_pixman_render_target\r
+pepper_render_target_t <|-- pepper_pixman_render_target\r
+pepper_drm_output_backend *-- pepper_pixman_render_target\r
+pepper_fbdev_output_backend *-- pepper_pixman_render_target\r
+pepper_wayland_output_backend *-- pepper_pixman_render_target\r
+pepper_x11_output_backend *-- pepper_pixman_render_target\r
+\r
+class pepper_gl_render_target\r
+pepper_render_target_t <|-- pepper_gl_render_target\r
+pepper_drm_output_backend *-- pepper_gl_render_target\r
+pepper_x11_output_backend *-- pepper_gl_render_target\r
+\r
+class pepper_plane_t {\r
+ pepper_output_t *output\r
+ pixman_region32_t damage_region\r
+ pixman_region32_t clip_region\r
+\r
+ pepper_plane_create()\r
+ pepper_plane_add_damage_region()\r
+ pepper_plane_accumulate_damage()\r
+ pepper_plane_update()\r
+}\r
+\r
+class pepper_drm #PaleGreen {\r
+ pepper_compositor_t *compositor\r
+ wl_list *output_list\r
+ pepper_renderer_t *pixman_renderer\r
+ pepper_renderer_t *gl_renderer\r
+ pepper_list_t plane_list\r
+\r
+ pepper_drm_create()\r
+ pepper_drm_destroy()\r
+}\r
+\r
+pepper_drm *-- pepper_compositor_t\r
+pepper_drm *-- pepper_gl_renderer\r
+pepper_drm *-- pepper_pixman_renderer\r
+\r
+\r
+class pepper_drm_output #PaleGreen\r
+pepper_drm "1" *-- "n" pepper_drm_output\r
+pepper_drm_output *-- pepper_drm_output_backend\r
+pepper_drm_output *-- pepper_plane_t\r
+\r
+@enduml
\ No newline at end of file
--- /dev/null
+@startuml
+
+title idle_repaint
+
+activate output
+
+ [->output : idle_repaint
+ output->output_backend : output->backend->start_repaint_loop
+ output<-output_backend : pepper_output_finish_frame
+ note right
+ output_backend should call pepper_output_finish_frame
+ endnote
+
+ activate output
+ alt output->frame.scheduled == 1
+ output->output : output_repaint
+ loop output->compositor->view_list
+ output->view : pepper_view_update
+ end loop
+
+ output->output : pepper_list_init(output->view_list)
+ loop output->compositor->view_list
+ output->output : pepper_list_insert(output->view_list)
+ end loop
+
+ output->output_backend : assign_planes
+ output->output : output_update_planes
+ output->output_backend : repaint
+
+ output->output : output->frame.pending = 1
+ output->output : output->frame.scheduled = 0
+
+ loop output->view_list
+ output->surface : pepper_surface_send_frame_callback_done(view->surface)
+ end loop
+ end alt
+ deactivate output
+
+ activate surface
+ loop surface->frame_callback_list
+ surface->actor : wl_callback_send_done
+ end loop
+ deactivate surface
+
+deactivate output
+
+@enduml
\ No newline at end of file
--- /dev/null
+@startuml\r
+actor client\r
+participant compositor <<pepper>>\r
+participant pepper_seat\r
+participant input_device <<pepper>>\r
+participant input_manager\r
+\r
+input_device <-] : Press_key\r
+input_device ->] : emit PEPPER_EVENT_INPUT_DEVICE_KEYBOARD_KEY\r
+pepper_seat <-] : call callback::PEPPER_EVENT_INPUT_DEVICE_KEYBOARD_KEY\r
+@enduml\r
--- /dev/null
+@startuml\r
+actor client\r
+participant compositor <<pepper>>\r
+participant pepper_seat\r
+participant input_device <<pepper>>\r
+participant input_manager\r
+\r
+create pepper_seat\r
+compositor -> pepper_seat : pepper_compositor_add_seat(name)\r
+pepper_seat -> compositor: add global for wl_seat\r
+compositor ->] : send PEPPER_EVENT_COMPOSITOR_SEAT_ADD\r
+compositor ->input_device : pepper_input_device_create\r
+input_device -> input_device : initialize\r
+input_device -> compositor : add input_device\r
+compositor ->] :PEPPER_EVENT_COMPOSITOR_INPUT_DEVICE_ADD\r
+\r
+input_manager <-] :PEPPER_EVENT_COMPOSITOR_INPUT_DEVICE_ADD\r
+input_manager -> pepper_seat : pepper_seat_add_input_device\r
+pepper_seat -> pepper_seat : add input_device to list\r
+pepper_seat -> pepper_seat : seat_update_caps(seat)\r
+activate pepper_seat\r
+ alt new input caps\r
+ pepper_seat -> pepper_seat : seat_update_pointer_cap\r
+ activate pepper_seat\r
+ alt add new pointer\r
+ pepper_seat -> pepper_seat : init pepper_pointer\r
+ pepper_seat ->] : emit::PEPPER_EVENT_SEAT_POINTER_ADD\r
+ else\r
+ pepper_seat -> pepper_seat : fini pepper_pointer\r
+ pepper_seat ->] : emit::PEPPER_EVENT_SEAT_POINTER_REMOVE\r
+ end\r
+\r
+ pepper_seat -> pepper_seat : update touch\r
+ pepper_seat -> pepper_seat : update keyboard\r
+\r
+ loop wl_seat list\r
+ [<-pepper_seat: send wl_seat_send_capabilities\r
+ end\r
+ deactivate pepper_seat\r
+ end\r
+deactivate pepper_seat\r
+pepper_seat -> input_device : add Event Listener::PEPPER_EVENT_ALL\r
+note right\r
+ PEPPER_EVENT_INPUT_DEVICE_POINTER_MOTION\r
+ PEPPER_EVENT_INPUT_DEVICE_POINTER_MOTION_ABSOLUTE,\r
+ PEPPER_EVENT_INPUT_DEVICE_POINTER_BUTTON,\r
+ PEPPER_EVENT_INPUT_DEVICE_POINTER_AXIS,\r
+\r
+ PEPPER_EVENT_INPUT_DEVICE_KEYBOARD_KEY,\r
+\r
+ PEPPER_EVENT_INPUT_DEVICE_TOUCH_DOWN,\r
+ PEPPER_EVENT_INPUT_DEVICE_TOUCH_UP,\r
+ PEPPER_EVENT_INPUT_DEVICE_TOUCH_MOTION,\r
+ PEPPER_EVENT_INPUT_DEVICE_TOUCH_FRAME,\r
+ PEPPER_EVENT_INPUT_DEVICE_TOUCH_CANCEL,\r
+endnote\r
+client <- compositor : registry::wl_seat\r
+client -> pepper_seat : bind(wl_seat)\r
+pepper_seat -> pepper_seat : create wl_resource for wl_seat\r
+pepper_seat -> pepper_seat : add wl_resource to list\r
+\r
+client -> pepper_seat : wl_seat_get_pointer\r
+pepper_seat -> pepper_seat : create wl_resource for wl_pointer\r
+@enduml
\ No newline at end of file
--- /dev/null
+@startuml
+
+title pepper_output_schedule_repaint
+
+activate output
+->output : pepper_output_shedule_repaint
+alt output->frame.scheduled == 1
+ <-output
+end
+alt output->frame.pending == 1
+ <-output
+end
+output->output : wl_event_loop_add_idle(idle_repaint);
+deactivate output
+
+@enduml
\ No newline at end of file
--- /dev/null
+@startuml\r
+\r
+actor user\r
+create desktop_shell\r
+user->desktop_shell : pepper_desktop_shell_init(compositor)\r
+desktop_shell->desktop_shell : init wl_shell\r
+desktop_shell->desktop_shell : init xdg_shell\r
+desktop_shell->desktop_shell : init_listeners\r
+activate desktop_shell\r
+ desktop_shell -> compositor: add event listener\r
+ note right\r
+ PEPPER_EVENT_COMPOSITOR_INPUT_DEVICE_ADD\r
+ PEPPER_EVENT_COMPOSITOR_SEAT_ADD\r
+ PEPPER_EVENT_COMPOSITOR_SEAT_REMOVE\r
+ endnote\r
+deactivate desktop_shell\r
+\r
+@enduml
\ No newline at end of file
--- /dev/null
+@startuml\r
+title Create surface\r
+actor wl_client\r
+wl_client -> compositor : wl_compositor_create_surface\r
+create surface\r
+compositor -> surface : pepper_surface_create\r
+surface -> surface : create wl_surface resource\r
+surface -> surface: initialize pepper_surface_t\r
+note right\r
+ state, regions, frame_callback_list, view_list\r
+end note\r
+surface -> compositor : return new surface\r
+\r
+note left: need change\r
+compositor -> compositor: add to surface_list\r
+compositor -->]: emit PEPPER_EVENT_COMPOSITOR_SURFACE_ADD\r
+\r
+@enduml\r
--- /dev/null
+@startuml\r
+title surface update\r
+\r
+actor user\r
+user->user : update buffer\r
+user->surface: wl_surface_attach(wl_buffer)\r
+alt new buffer\r
+ create buffer\r
+ surface -> buffer: pepper_buffer_from_resoure(wl_buffer)\r
+end\r
+surface->surface : set to pending state, newly_attached:1\r
+\r
+user->surface: wl_surface_damage\r
+surface->surface : add to pending.damage_region\r
+user->surface: wl_surface_commit\r
+\r
+surface->surface: pepper_surface_commit\r
+activate surface\r
+alt newly_attached==1\r
+ alt buffer.buffer\r
+ surface->surface: buffer unreference(buffer)\r
+ surface->surface: event_listener_remove\r
+ end\r
+ alt pending.buffer\r
+ surface->buffer: refernece\r
+ surface->buffer: add destroy_listener::PEPPER_EVENT_OBJECT_DESTROY\r
+ end\r
+ surface->surface : Set buffer.buffer from pending.buffer\r
+\r
+ surface->surface : attach_surface_to_outputs\r
+ activate surface\r
+ loop compositor::output_list\r
+ surface -> output: attach_surface(surface, &w, &h)\r
+ surface -> surface: set buffer.buffer w,h\r
+ end\r
+ deactivate surface\r
+end\r
+\r
+surface->surface : Set buffer.transform,scale, frame_callback from pending\r
+surface->surface : update_size\r
+activate surface\r
+ note right\r
+ set w,h of surface from\r
+ buffer size, scale and transform\r
+ endnote\r
+deactivate surface\r
+\r
+surface->surface : update damage_region\r
+surface->surface : pepper_surface_flush_damage\r
+activate surface\r
+ loop surface->view_list\r
+ surface->view : pepper_view_surface_damage\r
+ loop view->planes\r
+ view->plane: pepper_plane_add_damage_region\r
+ plane->plane: update damage_region\r
+ plane->output: pepper_output_schedule_repaint\r
+ output->output: add idle_repaint\r
+ note left\r
+ For screen update\r
+ endnote\r
+ end\r
+ end\r
+\r
+ loop surface->compositor->output_list\r
+ surface->output : backend->flush_surface\r
+ end\r
+deactivate surface\r
+[<-surface : PEPPER_EVENT_SURFACE_COMMIT\r
+deactivate surface\r
+\r
+[->shell_surface : PEPPER_EVENT_SURFACE_COMMIT\r
+shell_surface -> shell_surface: Call surface_map function for type\r
+note right\r
+ SHELL_SURFACE_TYPE_NONE,\r
+ SHELL_SURFACE_TYPE_TOPLEVEL,\r
+ SHELL_SURFACE_TYPE_TRANSIENT,\r
+ SHELL_SURFACE_TYPE_FULLSCREEN,\r
+ SHELL_SURFACE_TYPE_POPUP,\r
+ SHELL_SURFACE_TYPE_MAXIMIZED,\r
+ SHELL_SURFACE_TYPE_MINIMIZED,\r
+endnote\r
+@enduml
\ No newline at end of file
--- /dev/null
+@startuml\r
+\r
+title wl_shell_surface create\r
+\r
+actor user\r
+participant compositor<<pepper>>\r
+participant shell<<pepper>>\r
+\r
+user->compositor:bind wl_shell\r
+compositor->shell:bind_shell\r
+shell->shell:shell_client_create\r
+user->shell:wl_shell_get_shell_surface\r
+shell->surface: pepper_surface_set_role()\r
+create shell_surface\r
+shell->shell_surface: shell_surface_create(surface)\r
+\r
+create view\r
+shell_surface->view: create and add to compositor\r
+shell_surface->surface:add_event_listener:PEPPER_EVENT_OBJECT_DESTROY\r
+shell_surface->shell_surface\r
+note right\r
+ set init values\r
+ type:SHELL_SURFACE_TYPE_NONE\r
+ child, parent\r
+endnote\r
+shell_surface->surface:add_event_listener:PEPPER_EVENT_SURFACE_COMMIT\r
+shell_surface->shell_surface: Set send_configure callback by role\r
+note left\r
+role\r
+wl_shell_surface\r
+xdg_surface\r
+xdg_popup\r
+endnote\r
+\r
+@enduml\r
--- /dev/null
+@startuml
+title wl_surface_commit
+
+actor user
+user->surface: wl_surface_commit
+
+surface->surface: surface_commit
+activate surface
+surface->surface : pepper_subsurface_commit
+
+alt surface->pending.state->newly_attached == 1
+ alt surface->buffer.buffer
+ surface->surface: unreference buffer
+ surface->surface: event_listener_remove
+ end
+ alt surface->pending.state->buffer
+ surface->buffer: reference buffer
+ surface->buffer: add destroy_listener::PEPPER_EVENT_OBJECT_DESTROY
+ end
+ surface->surface : Set buffer.buffer from pending.buffer
+
+ surface->surface : attach_surface_to_outputs
+ activate surface
+ loop surface->compositor->output_list
+ surface -> output: attach_surface(surface, &w, &h)
+ surface -> surface: set buffer.buffer w,h
+ end loop
+ deactivate surface
+end
+
+surface->surface : Set buffer.transform,scale, frame_callback from pending
+surface->surface : update_size
+activate surface
+ note right
+ set w,h of surface from
+ buffer size, scale and transform
+ endnote
+deactivate surface
+
+surface->surface : update damage_region
+surface->surface : pepper_surface_flush_damage
+loop surface->view_list
+ surface->view : pepper_view_resize(view, surface->w, surface->h)
+ surface->view : pepper_view_mark_dirty
+ view->compositor : pepper_compositor_schedule_repaint
+ note right
+ schedule the update of
+ the compositor's outputs at idle time
+ endnote
+end loop
+
+loop surface->compositor->output_list
+ surface->output : backend->flush_surface
+end loop
+
+[<-surface : emit PEPPER_EVENT_SURFACE_COMMIT
+deactivate surface
+
+[->shell_surface : signal PEPPER_EVENT_SURFACE_COMMIT
+activate shell_surface
+ shell_surface -> shell_surface: Call surface_map function for type
+ note right
+ SHELL_SURFACE_TYPE_NONE,
+ SHELL_SURFACE_TYPE_TOPLEVEL,
+ SHELL_SURFACE_TYPE_TRANSIENT,
+ SHELL_SURFACE_TYPE_FULLSCREEN,
+ SHELL_SURFACE_TYPE_POPUP,
+ SHELL_SURFACE_TYPE_MAXIMIZED,
+ SHELL_SURFACE_TYPE_MINIMIZED,
+ endnote
+deactivate shell_surface
+@enduml
\ No newline at end of file