Compare commits
	
		
			1 Commits
		
	
	
		
			3.29.4
			...
			wip/fullsc
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					672ca8850a | 
@@ -692,6 +692,7 @@ const WindowManager = new Lang.Class({
 | 
			
		||||
            this._minimizeWindowDone(shellwm, actor);
 | 
			
		||||
            this._mapWindowDone(shellwm, actor);
 | 
			
		||||
            this._destroyWindowDone(shellwm, actor);
 | 
			
		||||
            this._sizeChangeWindowDone(shellwm, actor);
 | 
			
		||||
        }));
 | 
			
		||||
 | 
			
		||||
        this._shellwm.connect('switch-workspace', Lang.bind(this, this._switchWorkspace));
 | 
			
		||||
@@ -1218,9 +1219,124 @@ const WindowManager = new Lang.Class({
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _sizeChangeWindow : function(shellwm, actor, whichChange, oldFrameRect, oldBufferRect) {
 | 
			
		||||
        let types = [Meta.WindowType.NORMAL];
 | 
			
		||||
        if (!this._shouldAnimateActor(actor, types)) {
 | 
			
		||||
            shellwm.completed_size_change(actor);
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (whichChange == Meta.SizeChange.FULLSCREEN)
 | 
			
		||||
            this._fullscreenWindow(shellwm, actor, oldFrameRect, oldBufferRect);
 | 
			
		||||
        else if (whichChange == Meta.SizeChange.UNFULLSCREEN)
 | 
			
		||||
            this._unfullscreenWindow(shellwm, actor, oldFrameRect, oldBufferRect);
 | 
			
		||||
        else
 | 
			
		||||
            shellwm.completed_size_change(actor);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _fullscreenWindow: function(shellwm, actor, oldFrameRect, oldBufferRect) {
 | 
			
		||||
        let targetRect = actor.meta_window.get_frame_rect();
 | 
			
		||||
        let actorContent = Shell.util_get_content_for_window_actor(actor, oldFrameRect);
 | 
			
		||||
        let actorClone = new St.Widget({ content: actorContent });
 | 
			
		||||
        actorClone.set_offscreen_redirect(Clutter.OffscreenRedirect.ALWAYS);
 | 
			
		||||
        actorClone.set_position(oldFrameRect.x, oldFrameRect.y);
 | 
			
		||||
        actorClone.set_size(oldFrameRect.width, oldFrameRect.height);
 | 
			
		||||
        Main.uiGroup.add_actor(actorClone);
 | 
			
		||||
 | 
			
		||||
        actor.__fullscreenClone = actorClone;
 | 
			
		||||
 | 
			
		||||
        let scaleX = targetRect.width / oldFrameRect.width;
 | 
			
		||||
        let scaleY = targetRect.height / oldFrameRect.height;
 | 
			
		||||
 | 
			
		||||
        Tweener.addTween(actorClone,
 | 
			
		||||
                         { x: targetRect.x,
 | 
			
		||||
                           y: targetRect.y,
 | 
			
		||||
                           scaleX: scaleX,
 | 
			
		||||
                           scaleY: scaleY,
 | 
			
		||||
                           opacity: 0,
 | 
			
		||||
                           time: WINDOW_ANIMATION_TIME,
 | 
			
		||||
                           transition: 'easeOutQuad',
 | 
			
		||||
                           onComplete: this._sizeChangeWindowDone,
 | 
			
		||||
                           onCompleteScope: this,
 | 
			
		||||
                           onCompleteParams: [shellwm, actor]
 | 
			
		||||
                         });
 | 
			
		||||
 | 
			
		||||
        actor.translation_x = actor.x;
 | 
			
		||||
        actor.translation_y = actor.y;
 | 
			
		||||
        actor.scaleX = 1 / scaleX;
 | 
			
		||||
        actor.scaleY = 1 / scaleY;
 | 
			
		||||
 | 
			
		||||
        Tweener.addTween(actor,
 | 
			
		||||
                         { scaleX: 1.0,
 | 
			
		||||
                           scaleY: 1.0,
 | 
			
		||||
                           translation_x: 0,
 | 
			
		||||
                           translation_y: 0,
 | 
			
		||||
                           time: WINDOW_ANIMATION_TIME,
 | 
			
		||||
                           transition: 'easeOutQuad'
 | 
			
		||||
                         });
 | 
			
		||||
 | 
			
		||||
        shellwm.completed_size_change(actor);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _unfullscreenWindow: function(shellwm, actor, oldFrameRect, oldBufferRect) {
 | 
			
		||||
        let targetRect = actor.meta_window.get_frame_rect();
 | 
			
		||||
        let actorContent = Shell.util_get_content_for_window_actor(actor, oldFrameRect);
 | 
			
		||||
        let actorClone = new St.Widget({ content: actorContent });
 | 
			
		||||
        actorClone.set_offscreen_redirect(Clutter.OffscreenRedirect.ALWAYS);
 | 
			
		||||
        actorClone.set_position(oldFrameRect.x, oldFrameRect.y);
 | 
			
		||||
        actorClone.set_size(oldFrameRect.width, oldFrameRect.height);
 | 
			
		||||
        Main.uiGroup.add_actor(actorClone);
 | 
			
		||||
 | 
			
		||||
        actor.__unfullscreenClone = actorClone;
 | 
			
		||||
 | 
			
		||||
        let scaleX = targetRect.width / oldFrameRect.width;
 | 
			
		||||
        let scaleY = targetRect.height / oldFrameRect.height;
 | 
			
		||||
 | 
			
		||||
        Tweener.addTween(actorClone,
 | 
			
		||||
                         { x: targetRect.x,
 | 
			
		||||
                           y: targetRect.y,
 | 
			
		||||
                           scaleX: scaleX,
 | 
			
		||||
                           scaleY: scaleY,
 | 
			
		||||
                           opacity: 0,
 | 
			
		||||
                           time: WINDOW_ANIMATION_TIME,
 | 
			
		||||
                           transition: 'easeOutQuad',
 | 
			
		||||
                           onComplete: this._sizeChangeWindowDone,
 | 
			
		||||
                           onCompleteScope: this,
 | 
			
		||||
                           onCompleteParams: [shellwm, actor]
 | 
			
		||||
                         });
 | 
			
		||||
 | 
			
		||||
        actor.translation_x = -actor.x;
 | 
			
		||||
        actor.translation_y = -actor.y;
 | 
			
		||||
        actor.scaleX = 1 / scaleX;
 | 
			
		||||
        actor.scaleY = 1 / scaleY;
 | 
			
		||||
 | 
			
		||||
        Tweener.addTween(actor,
 | 
			
		||||
                         { scaleX: 1.0,
 | 
			
		||||
                           scaleY: 1.0,
 | 
			
		||||
                           translation_x: 0,
 | 
			
		||||
                           translation_y: 0,
 | 
			
		||||
                           time: WINDOW_ANIMATION_TIME,
 | 
			
		||||
                           transition: 'easeOutQuad'
 | 
			
		||||
                         });
 | 
			
		||||
 | 
			
		||||
        shellwm.completed_size_change(actor);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _sizeChangeWindowDone: function(shellwm, actor) {
 | 
			
		||||
        Tweener.removeTweens(actor);
 | 
			
		||||
 | 
			
		||||
        let actorClone = actor.__fullscreenClone;
 | 
			
		||||
        if (actorClone) {
 | 
			
		||||
            actorClone.destroy();
 | 
			
		||||
            delete actor.__fullscreenClone;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        actorClone = actor.__unfullscreenClone;
 | 
			
		||||
        if (actorClone) {
 | 
			
		||||
            actorClone.destroy();
 | 
			
		||||
            delete actor.__unfullscreenClone;
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _hasAttachedDialogs: function(window, ignoreWindow) {
 | 
			
		||||
        var count = 0;
 | 
			
		||||
        window.foreach_transient(function(win) {
 | 
			
		||||
 
 | 
			
		||||
@@ -13,6 +13,7 @@
 | 
			
		||||
#include <gtk/gtk.h>
 | 
			
		||||
#include <gdk-pixbuf/gdk-pixbuf.h>
 | 
			
		||||
#include <gdk/gdkx.h>
 | 
			
		||||
#include <meta/meta-shaped-texture.h>
 | 
			
		||||
 | 
			
		||||
#include <locale.h>
 | 
			
		||||
#ifdef HAVE__NL_TIME_FIRST_WEEKDAY
 | 
			
		||||
@@ -403,3 +404,57 @@ shell_util_text_insert_keyval (ClutterActor *actor,
 | 
			
		||||
 | 
			
		||||
  clutter_actor_event (actor, &event, FALSE);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
canvas_draw_cb (ClutterContent *content,
 | 
			
		||||
                cairo_t        *cr,
 | 
			
		||||
                gint            width,
 | 
			
		||||
                gint            height,
 | 
			
		||||
                gpointer        user_data)
 | 
			
		||||
{
 | 
			
		||||
  cairo_surface_t *surface = user_data;
 | 
			
		||||
 | 
			
		||||
  cairo_set_source_surface (cr, surface, 0, 0);
 | 
			
		||||
  cairo_paint (cr);
 | 
			
		||||
 | 
			
		||||
  return FALSE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * shell_util_get_content_for_window_actor:
 | 
			
		||||
 * @window_actor: a #MetaWindowActor
 | 
			
		||||
 * @window_rect: a #MetaRectangle
 | 
			
		||||
 *
 | 
			
		||||
 * Returns: (transfer full): a new #ClutterContent
 | 
			
		||||
 */
 | 
			
		||||
ClutterContent *
 | 
			
		||||
shell_util_get_content_for_window_actor (MetaWindowActor *window_actor,
 | 
			
		||||
                                         MetaRectangle   *window_rect)
 | 
			
		||||
{
 | 
			
		||||
  ClutterActor *texture;
 | 
			
		||||
  ClutterContent *content;
 | 
			
		||||
  cairo_surface_t *surface;
 | 
			
		||||
  cairo_rectangle_int_t clip;
 | 
			
		||||
  gfloat actor_x, actor_y;
 | 
			
		||||
 | 
			
		||||
  texture = meta_window_actor_get_texture (window_actor);
 | 
			
		||||
  clutter_actor_get_position (CLUTTER_ACTOR (window_actor), &actor_x, &actor_y);
 | 
			
		||||
 | 
			
		||||
  clip.x = window_rect->x - (gint) actor_x;
 | 
			
		||||
  clip.y = window_rect->y - (gint) actor_y;
 | 
			
		||||
  clip.width = window_rect->width;
 | 
			
		||||
  clip.height = window_rect->height;
 | 
			
		||||
 | 
			
		||||
  surface = meta_shaped_texture_get_image (META_SHAPED_TEXTURE (texture),
 | 
			
		||||
                                           &clip);
 | 
			
		||||
 | 
			
		||||
  content = clutter_canvas_new ();
 | 
			
		||||
  clutter_canvas_set_size (CLUTTER_CANVAS (content),
 | 
			
		||||
                           clip.width, clip.height);
 | 
			
		||||
  g_signal_connect (content, "draw",
 | 
			
		||||
                    G_CALLBACK (canvas_draw_cb), surface);
 | 
			
		||||
  clutter_content_invalidate (content);
 | 
			
		||||
  cairo_surface_destroy (surface);
 | 
			
		||||
 | 
			
		||||
  return content;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -8,6 +8,7 @@
 | 
			
		||||
#include <libsoup/soup.h>
 | 
			
		||||
#include <gdk-pixbuf/gdk-pixbuf.h>
 | 
			
		||||
#include <meta/meta-cursor-tracker.h>
 | 
			
		||||
#include <meta/meta-window-actor.h>
 | 
			
		||||
 | 
			
		||||
G_BEGIN_DECLS
 | 
			
		||||
 | 
			
		||||
@@ -50,6 +51,9 @@ gboolean shell_util_need_background_refresh (void);
 | 
			
		||||
void shell_util_text_insert_keyval (ClutterActor *actor,
 | 
			
		||||
                                    guint         keyval);
 | 
			
		||||
 | 
			
		||||
ClutterContent * shell_util_get_content_for_window_actor (MetaWindowActor *window_actor,
 | 
			
		||||
                                                          MetaRectangle   *window_rect);
 | 
			
		||||
 | 
			
		||||
G_END_DECLS
 | 
			
		||||
 | 
			
		||||
#endif /* __SHELL_UTIL_H__ */
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user