@ -1,6 +1,6 @@
/*
* Copyright © 2008 Kristian Høgsberg
* Copyright © 2012 Collabora , Ltd .
* Copyright © 2012 - 2013 Collabora , Ltd .
*
* Permission to use , copy , modify , distribute , and sell this software and its
* documentation for any purpose is hereby granted without fee , provided that
@ -189,12 +189,16 @@ struct toysurface {
void ( * destroy ) ( struct toysurface * base ) ;
} ;
struct surface {
struct window * window ;
struct wl_surface * surface ;
} ;
struct window {
struct display * display ;
struct window * parent ;
struct wl_list window_output_list ;
struct wl_surface * surface ;
struct wl_shell_surface * shell_surface ;
struct wl_region * input_region ;
struct wl_region * opaque_region ;
char * title ;
@ -227,6 +231,8 @@ struct window {
window_fullscreen_handler_t fullscreen_handler ;
window_output_handler_t output_handler ;
struct surface * main_surface ;
struct wl_shell_surface * shell_surface ;
struct wl_callback * frame_cb ;
struct frame * frame ;
@ -1163,14 +1169,14 @@ window_attach_surface(struct window *window)
}
if ( window - > opaque_region ) {
wl_surface_set_opaque_region ( window - > surface ,
wl_surface_set_opaque_region ( window - > main_surface - > surface ,
window - > opaque_region ) ;
wl_region_destroy ( window - > opaque_region ) ;
window - > opaque_region = NULL ;
}
if ( window - > input_region ) {
wl_surface_set_input_region ( window - > surface ,
wl_surface_set_input_region ( window - > main_surface - > surface ,
window - > input_region ) ;
wl_region_destroy ( window - > input_region ) ;
window - > input_region = NULL ;
@ -1230,14 +1236,15 @@ window_create_surface(struct window *window)
window - > display - > dpy ) {
window - > toysurface =
egl_window_surface_create ( window - > display ,
window - > surface , flags ,
window - > main_surface - > surface ,
flags ,
& allocation ) ;
}
if ( ! window - > toysurface )
window - > toysurface = shm_surface_create ( window - > display ,
window - > surface , flags ,
& allocation ) ;
window - > main_surface - > surface ,
flags , & allocation ) ;
if ( window - > resizing )
flags = SURFACE_HINT_RESIZE ;
@ -1263,11 +1270,19 @@ window_set_buffer_transform(struct window *window,
enum wl_output_transform transform )
{
window - > buffer_transform = transform ;
wl_surface_set_buffer_transform ( window - > surface , transform ) ;
wl_surface_set_buffer_transform ( window - > main_surface - > surface ,
transform ) ;
}
static void frame_destroy ( struct frame * frame ) ;
static void
surface_destroy ( struct surface * surface )
{
wl_surface_destroy ( surface - > surface ) ;
free ( surface ) ;
}
void
window_destroy ( struct window * window )
{
@ -1304,7 +1319,9 @@ window_destroy(struct window *window)
if ( window - > shell_surface )
wl_shell_surface_destroy ( window - > shell_surface ) ;
wl_surface_destroy ( window - > surface ) ;
surface_destroy ( window - > main_surface ) ;
wl_list_remove ( & window - > link ) ;
if ( window - > toysurface )
@ -1498,7 +1515,7 @@ window_get_surface(struct window *window)
struct wl_surface *
window_get_wl_surface ( struct window * window )
{
return window - > surface ;
return window - > main_surface - > surface ;
}
struct wl_shell_surface *
@ -2076,16 +2093,18 @@ frame_menu_func(struct window *window, int index, void *data)
case 1 : /* move to workspace above */
display = window - > display ;
if ( display - > workspace > 0 )
workspace_manager_move_surface ( display - > workspace_manager ,
window - > surface ,
display - > workspace - 1 ) ;
workspace_manager_move_surface (
display - > workspace_manager ,
window - > main_surface - > surface ,
display - > workspace - 1 ) ;
break ;
case 2 : /* move to workspace below */
display = window - > display ;
if ( display - > workspace < display - > workspace_count - 1 )
workspace_manager_move_surface ( display - > workspace_manager ,
window - > surface ,
display - > workspace + 1 ) ;
workspace_manager_move_surface (
display - > workspace_manager ,
window - > main_surface - > surface ,
display - > workspace + 1 ) ;
break ;
case 3 : /* fullscreen */
/* we don't have a way to get out of fullscreen for now */
@ -3300,7 +3319,7 @@ idle_redraw(struct task *task, uint32_t events)
window - > redraw_needed = 0 ;
wl_list_init ( & window - > redraw_task . link ) ;
window - > frame_cb = wl_surface_frame ( window - > surface ) ;
window - > frame_cb = wl_surface_frame ( window - > main_surface - > surface ) ;
wl_callback_add_listener ( window - > frame_cb , & listener , window ) ;
window_flush ( window ) ;
}
@ -3465,16 +3484,16 @@ window_set_text_cursor_position(struct window *window, int32_t x, int32_t y)
return ;
text_cursor_position_notify ( text_cursor_position ,
window - > surface ,
wl_fixed_from_int ( x ) ,
wl_fixed_from_int ( y ) ) ;
window - > main_surface - > surface ,
wl_fixed_from_int ( x ) ,
wl_fixed_from_int ( y ) ) ;
}
void
window_damage ( struct window * window , int32_t x , int32_t y ,
int32_t width , int32_t height )
{
wl_surface_damage ( window - > surface , x , y , width , height ) ;
wl_surface_damage ( window - > main_surface - > surface , x , y , width , height ) ;
}
static void
@ -3537,6 +3556,23 @@ static const struct wl_surface_listener surface_listener = {
surface_leave
} ;
static struct surface *
surface_create ( struct window * window )
{
struct display * display = window - > display ;
struct surface * surface ;
surface = calloc ( 1 , sizeof * surface ) ;
if ( ! surface )
return NULL ;
surface - > window = window ;
surface - > surface = wl_compositor_create_surface ( display - > compositor ) ;
wl_surface_add_listener ( surface - > surface , & surface_listener , window ) ;
return surface ;
}
static struct window *
window_create_internal ( struct display * display ,
struct window * parent , int type )
@ -3550,12 +3586,11 @@ window_create_internal(struct display *display,
memset ( window , 0 , sizeof * window ) ;
window - > display = display ;
window - > parent = parent ;
window - > surface = wl_compositor_create_surface ( display - > compositor ) ;
wl_surface_add_listener ( window - > surface , & surface_listener , window ) ;
window - > main_surface = surface_create ( window ) ;
if ( type ! = TYPE_CUSTOM & & display - > shell ) {
window - > shell_surface =
wl_shell_get_shell_surface ( display - > shell ,
window - > surface ) ;
window - > main_surface - > surface ) ;
}
window - > allocation . x = 0 ;
window - > allocation . y = 0 ;
@ -3577,7 +3612,7 @@ window_create_internal(struct display *display,
else
window - > buffer_type = WINDOW_BUFFER_TYPE_SHM ;
wl_surface_set_user_data ( window - > surface , window ) ;
wl_surface_set_user_data ( window - > main_surface - > surface , window ) ;
wl_list_insert ( display - > window_list . prev , & window - > link ) ;
wl_list_init ( & window - > redraw_task . link ) ;
@ -3631,9 +3666,10 @@ window_create_transient(struct display *display, struct window *parent,
window - > y = y ;
if ( display - > shell )
wl_shell_surface_set_transient ( window - > shell_surface ,
window - > parent - > surface ,
window - > x , window - > y , flags ) ;
wl_shell_surface_set_transient (
window - > shell_surface ,
window - > parent - > main_surface - > surface ,
window - > x , window - > y , flags ) ;
return window ;
}
@ -3783,7 +3819,7 @@ window_show_menu(struct display *display,
input_ungrab ( input ) ;
wl_shell_surface_set_popup ( window - > shell_surface , input - > seat ,
display_get_serial ( window - > display ) ,
window - > parent - > surface ,
window - > parent - > main_surface - > surface ,
window - > x , window - > y , 0 ) ;
widget_set_redraw_handler ( menu - > widget , menu_redraw_handler ) ;