diff options
-rw-r--r-- | src/core/keybindings.c | 43 | ||||
-rw-r--r-- | src/core/window-private.h | 3 | ||||
-rw-r--r-- | src/core/window.c | 58 |
3 files changed, 74 insertions, 30 deletions
diff --git a/src/core/keybindings.c b/src/core/keybindings.c index 11b8daf4..a141e2c1 100644 --- a/src/core/keybindings.c +++ b/src/core/keybindings.c @@ -2680,37 +2680,20 @@ handle_move_to_monitor (MetaDisplay *display, XEvent *event, MetaKeyBinding *binding) { - MetaScreenDirection move_direction = binding->handler->data; - MetaXineramaScreenInfo* current; - MetaXineramaScreenInfo* neighbour; - MetaRectangle current_window_rect; - int new_x; - int new_y; + const MetaScreenDirection move_direction = binding->handler->data; + const MetaXineramaScreenInfo* current; + const MetaXineramaScreenInfo* neighbour; - - current = meta_screen_get_xinerama_for_window(screen, window); - neighbour = meta_screen_get_xinerama_neighbor(screen, current->number, move_direction); - - if(neighbour == NULL || - current->number == neighbour->number) - return; - - if(META_WINDOW_TILED (window)) - { - window->tile_monitor_number = neighbour->number; - return; - } - - meta_window_get_client_root_coords(window, ¤t_window_rect); - - new_x = current_window_rect.x - current->rect.x + neighbour->rect.x; - new_y = current_window_rect.y - current->rect.y + neighbour->rect.y; - /* target_rect.width = window->rect.width; */ - /* target_rect.height = window->rect.height; */ - /* Maybe do some resizing? */ - - meta_window_move(window, TRUE, new_x, new_y); - + current = meta_screen_get_xinerama_for_window(screen, window); + neighbour = meta_screen_get_xinerama_neighbor(screen, current->number, move_direction); + + if(neighbour == NULL || + current->number == neighbour->number) + return; + + meta_window_move_to_monitor(window, + current, + neighbour); } static gboolean diff --git a/src/core/window-private.h b/src/core/window-private.h index f0832abf..a6b49b4b 100644 --- a/src/core/window-private.h +++ b/src/core/window-private.h @@ -446,6 +446,9 @@ void meta_window_maximize_internal (MetaWindow *window, MetaRectangle *saved_rect); void meta_window_unmaximize (MetaWindow *window, MetaMaximizeFlags directions); +void meta_window_move_to_monitor (MetaWindow *window, + const MetaXineramaScreenInfo *from_monitor, + const MetaXineramaScreenInfo *to_monitor); void meta_window_make_above (MetaWindow *window); void meta_window_unmake_above (MetaWindow *window); void meta_window_shade (MetaWindow *window, diff --git a/src/core/window.c b/src/core/window.c index a1e38d3f..b5f9468c 100644 --- a/src/core/window.c +++ b/src/core/window.c @@ -114,6 +114,9 @@ static MetaTileMode calculate_tiling_mode(int x, MetaRectangle work_area, int shake_threshold); +static void meta_window_rescale_to_monitor (MetaRectangle *target_rect, + const MetaRectangle *from_monitor, + const MetaRectangle *to_monitor); static gboolean update_resize_timeout (gpointer data); @@ -2863,6 +2866,61 @@ meta_window_unmaximize (MetaWindow *window, meta_compositor_unmaximize_window (window->display->compositor, window); } + +void +meta_window_move_to_monitor(MetaWindow *window, + const MetaXineramaScreenInfo *from_monitor, + const MetaXineramaScreenInfo *to_monitor) +{ + MetaRectangle target_rect; + + if(META_WINDOW_TILED (window)) + { + window->tile_monitor_number = to_monitor->number; + meta_window_rescale_to_monitor(&window->saved_rect, + &from_monitor->rect, + &to_monitor->rect); + meta_window_tile(window); + return; + } + + meta_window_get_client_root_coords(window, &target_rect); + meta_window_rescale_to_monitor(&target_rect, + &from_monitor->rect, + &to_monitor->rect); + + meta_window_move_resize(window, TRUE, + target_rect.x, + target_rect.y, + target_rect.width, + target_rect.height); +} + +static void meta_window_rescale_to_monitor(MetaRectangle *target_rect, + const MetaRectangle *from_monitor, + const MetaRectangle *to_monitor) +{ + double horizontal_ratio; + double vertical_ratio; + + target_rect->x += to_monitor->x - from_monitor->x; + target_rect->y += to_monitor->y - from_monitor->y; + + if(from_monitor->width == to_monitor->width && + from_monitor->height == to_monitor->height) + return; + + horizontal_ratio = (double)to_monitor->width / from_monitor->width; + vertical_ratio = (double)to_monitor->height / from_monitor->height; + + target_rect->width *= horizontal_ratio; + target_rect->height *= vertical_ratio; + target_rect->x *= horizontal_ratio; + target_rect->y *= vertical_ratio; +} + + + void meta_window_make_above (MetaWindow *window) { |