@ -55,8 +55,7 @@ struct tinywl_server {
enum tinywl_cursor_mode cursor_mode ;
enum tinywl_cursor_mode cursor_mode ;
struct tinywl_view * grabbed_view ;
struct tinywl_view * grabbed_view ;
double grab_x , grab_y ;
double grab_x , grab_y ;
struct wlr_box grab_geo_box ;
struct wlr_box grab_geobox ;
int grab_width , grab_height ;
uint32_t resize_edges ;
uint32_t resize_edges ;
struct wlr_output_layout * output_layout ;
struct wlr_output_layout * output_layout ;
@ -370,33 +369,44 @@ static void process_cursor_resize(struct tinywl_server *server, uint32_t time) {
* commit any movement that was prepared .
* commit any movement that was prepared .
*/
*/
struct tinywl_view * view = server - > grabbed_view ;
struct tinywl_view * view = server - > grabbed_view ;
double dx = server - > cursor - > x - server - > grab_x ;
double border_x = server - > cursor - > x - server - > grab_x ;
double dy = server - > cursor - > y - server - > grab_y ;
double border_y = server - > cursor - > y - server - > grab_y ;
double x = view - > x ;
int new_left = server - > grab_geobox . x ;
double y = view - > y ;
int new_right = server - > grab_geobox . x + server - > grab_geobox . width ;
int width = server - > grab_width ;
int new_top = server - > grab_geobox . y ;
int height = server - > grab_height ;
int new_bottom = server - > grab_geobox . y + server - > grab_geobox . height ;
if ( server - > resize_edges & WLR_EDGE_TOP ) {
if ( server - > resize_edges & WLR_EDGE_TOP ) {
y = server - > grab_y + dy - server - > grab_geo_box . y ;
new_top = border_y ;
height - = dy + server - > grab_geo_box . y ;
if ( new_top > = new_bottom ) {
if ( height < 1 ) {
new_top = new_bottom - 1 ;
y + = height ;
}
}
} else if ( server - > resize_edges & WLR_EDGE_BOTTOM ) {
} else if ( server - > resize_edges & WLR_EDGE_BOTTOM ) {
height + = dy + server - > grab_geo_box . y ;
new_bottom = border_y ;
if ( new_bottom < = new_top ) {
new_bottom = new_top + 1 ;
}
}
}
if ( server - > resize_edges & WLR_EDGE_LEFT ) {
if ( server - > resize_edges & WLR_EDGE_LEFT ) {
x = server - > grab_x + dx - server - > grab_geo_box . x ;
new_left = border_x ;
width - = dx + server - > grab_geo_box . x ;
if ( new_left > = new_right ) {
if ( width < 1 ) {
new_left = new_right - 1 ;
x + = width ;
}
}
} else if ( server - > resize_edges & WLR_EDGE_RIGHT ) {
} else if ( server - > resize_edges & WLR_EDGE_RIGHT ) {
width + = dx + server - > grab_geo_box . x ;
new_right = border_x ;
if ( new_right < = new_left ) {
new_right = new_left + 1 ;
}
}
}
view - > x = x ;
view - > y = y ;
struct wlr_box geo_box ;
wlr_xdg_toplevel_set_size ( view - > xdg_surface , width , height ) ;
wlr_xdg_surface_get_geometry ( view - > xdg_surface , & geo_box ) ;
view - > x = new_left - geo_box . x ;
view - > y = new_top - geo_box . y ;
int new_width = new_right - new_left ;
int new_height = new_bottom - new_top ;
wlr_xdg_toplevel_set_size ( view - > xdg_surface , new_width , new_height ) ;
}
}
static void process_cursor_motion ( struct tinywl_server * server , uint32_t time ) {
static void process_cursor_motion ( struct tinywl_server * server , uint32_t time ) {
@ -725,18 +735,26 @@ static void begin_interactive(struct tinywl_view *view,
}
}
server - > grabbed_view = view ;
server - > grabbed_view = view ;
server - > cursor_mode = mode ;
server - > cursor_mode = mode ;
wlr_xdg_surface_get_geometry ( view - > xdg_surface , & server - > grab_geo_box ) ;
if ( mode = = TINYWL_CURSOR_MOVE ) {
if ( mode = = TINYWL_CURSOR_MOVE ) {
server - > grab_x = server - > cursor - > x - view - > x ;
server - > grab_x = server - > cursor - > x - view - > x ;
server - > grab_y = server - > cursor - > y - view - > y ;
server - > grab_y = server - > cursor - > y - view - > y ;
} else {
} else {
server - > grab_x = server - > cursor - > x + server - > grab_geo_box . x ;
struct wlr_box geo_box ;
server - > grab_y = server - > cursor - > y + server - > grab_geo_box . y ;
wlr_xdg_surface_get_geometry ( view - > xdg_surface , & geo_box ) ;
}
server - > grab_width = server - > grab_geo_box . width ;
double border_x = ( view - > x + geo_box . x ) + ( ( edges & WLR_EDGE_RIGHT ) ? geo_box . width : 0 ) ;
server - > grab_height = server - > grab_geo_box . height ;
double border_y = ( view - > y + geo_box . y ) + ( ( edges & WLR_EDGE_BOTTOM ) ? geo_box . height : 0 ) ;
server - > grab_x = server - > cursor - > x - border_x ;
server - > grab_y = server - > cursor - > y - border_y ;
server - > grab_geobox = geo_box ;
server - > grab_geobox . x + = view - > x ;
server - > grab_geobox . y + = view - > y ;
server - > resize_edges = edges ;
server - > resize_edges = edges ;
}
}
}
static void xdg_toplevel_request_move (
static void xdg_toplevel_request_move (
struct wl_listener * listener , void * data ) {
struct wl_listener * listener , void * data ) {