Example #1
0
        void UpdateWindowIntersect()
        {
            Gdk.Rectangle adjustedDockArea = intersect_area;
            adjustedDockArea.Inflate(-2, -2);

            bool intersect = false;

            Wnck.Window activeWindow = screen.ActiveWindow;

            try {
                foreach (Wnck.Window window in screen.Windows.Where(w => IsIntersectableWindow(w)))
                {
                    if (Behavior == AutohideType.Intellihide && activeWindow != null && activeWindow.Pid != window.Pid)
                    {
                        continue;
                    }

                    if (window.EasyGeometry().IntersectsWith(adjustedDockArea))
                    {
                        intersect = true;
                        break;
                    }
                }
            } catch (Exception e) {
                Log <AutohideManager> .Error("Failed to update window intersect: '{0}'", e.Message);

                Log <AutohideManager> .Debug(e.StackTrace);
            }

            if (WindowIntersectingOther != intersect)
            {
                WindowIntersectingOther = intersect;
                SetHidden();
            }
        }
Example #2
0
        public static int [] GetCardinalProperty(this Wnck.Window window, IntPtr atom)
        {
            X11Atoms atoms = X11Atoms.Instance;
            IntPtr   display;
            IntPtr   type;
            int      format;
            IntPtr   prop_return;
            IntPtr   nitems, bytes_after;
            int      result;

            int [] extents = new int[12];

            IntPtr window_handle = (IntPtr)window.Xid;

            display = Xlib.Xlib.GdkDisplayXDisplay(Gdk.Screen.Default.Display);
            type    = IntPtr.Zero;

            result = Xlib.Xlib.XGetWindowProperty(display, window_handle, atom, (IntPtr)0,
                                                  (IntPtr)System.Int32.MaxValue, false, atoms.XA_CARDINAL, out type, out format,
                                                  out nitems, out bytes_after, out prop_return);

            if (type == atoms.XA_CARDINAL && format == 32)
            {
                extents = new int [(int)nitems];
                for (int i = 0; i < (int)nitems; i++)
                {
                    extents [i] = Marshal.ReadInt32(prop_return, i * IntPtr.Size);
                }
            }

            return(extents);
        }
Example #3
0
        void HandleGeometryChanged(object sender, EventArgs e)
        {
            Wnck.Window window = sender as Wnck.Window;

            if (sender == null)
            {
                return;
            }

            Gdk.Rectangle geo = window.EasyGeometry();

            if (geo == last_known_geo)
            {
                return;
            }

            last_known_geo = geo;

            if (timer_geometry > 0)
            {
                return;
            }

            timer_geometry = GLib.Timeout.Add(updateDelay, delegate {
                UpdateWindowIntersect();
                timer_geometry = 0;
                return(false);
            });
        }
Example #4
0
 public static void UnmaximizeWindows(Wnck.Window window)
 {
     if (window.IsMaximized)
     {
         window.Unmaximize();
     }
 }
Example #5
0
 void SetupActiveWindow()
 {
     Wnck.Window active = screen.ActiveWindow;
     if (active != null)
     {
         active.GeometryChanged += HandleGeometryChanged;
         last_known_geo          = active.EasyGeometry();
     }
 }
Example #6
0
 void HandleUnmatchedWindowNameChanged(object sender, EventArgs e)
 {
     Wnck.Window window = (sender as Wnck.Window);
     if (DockServices.WindowMatcher.WindowIsReadyForMatch(window))
     {
         window.NameChanged -= HandleUnmatchedWindowNameChanged;
         longMatchInProgress = false;
         UpdateTransientItems();
     }
 }
Example #7
0
        public WindowDockItem(Wnck.Window baseWindow)
        {
            base_window = baseWindow;

            id = baseWindow.Name + baseWindow.Pid;
            UpdateWindows(baseWindow);
            SetNameAndIcon();

            Wnck.Screen.Default.WindowOpened += WnckScreenDefaultWindowOpened;
            Wnck.Screen.Default.WindowClosed += WnckScreenDefaultWindowClosed;
        }
		void WnckScreenDefaultWindowClosed (object o, WindowClosedArgs args)
		{
			if (base_window == args.Window)
				base_window = ManagedWindows
					.Where (w => w != args.Window)
					.DefaultIfEmpty (null)
					.FirstOrDefault ();
			
			UpdateWindows (base_window);
			SetNameAndIcon ();
		}
		public WindowDockItem (Wnck.Window baseWindow)
		{
			base_window = baseWindow;
			
			id = baseWindow.Name + baseWindow.Pid;
			UpdateWindows (baseWindow);
			SetNameAndIcon ();
			
			Wnck.Screen.Default.WindowOpened += WnckScreenDefaultWindowOpened;
			Wnck.Screen.Default.WindowClosed += WnckScreenDefaultWindowClosed;
		}
Example #10
0
 bool IsIntersectableWindow(Wnck.Window window)
 {
     return(window != null &&
            !window.IsMinimized &&
            window.Pid != pid &&
            window.WindowType != Wnck.WindowType.Desktop &&
            window.WindowType != Wnck.WindowType.Dock &&
            window.WindowType != Wnck.WindowType.Splashscreen &&
            window.WindowType != Wnck.WindowType.Menu &&
            Wnck.Screen.Default.ActiveWorkspace != null &&
            window.IsVisibleOnWorkspace(Wnck.Screen.Default.ActiveWorkspace));
 }
Example #11
0
 void UpdateWindows(Wnck.Window baseWindow)
 {
     if (baseWindow != null)
     {
         Windows = DockServices.WindowMatcher.SimilarWindows(baseWindow)
                   .Where(w => !FileApplicationProvider.ManagedWindows.Contains(w));
     }
     else
     {
         Windows = Enumerable.Empty <Wnck.Window> ();
     }
 }
Example #12
0
        void RestoreTemporaryWindowGeometry(Wnck.Window window, Dictionary <Wnck.Window, WindowState> state)
        {
            if (!state.ContainsKey(window))
            {
                return;
            }

            WindowState currentState = state [window];

            window.SetWorkaroundGeometry(WindowGravity.Current, MoveResizeMask,
                                         currentState.Area.X - parent.ViewportX, currentState.Area.Y - parent.ViewportY,
                                         currentState.Area.Width, currentState.Area.Height);
        }
Example #13
0
        public static void SetWorkaroundGeometry(this Wnck.Window window, WindowGravity gravity, WindowMoveResizeMask mask,
                                                 int x, int y, int width, int height)
        {
            // This is very weird.  Don't know when they will fix it. You must subtract the top and left
            // frame extents from a move operation to get the window to actually show in the right spot.
            // Save for maybe kwin, I think only compiz uses Viewports anyhow, so this is ok.
            int [] extents = window.FrameExtents();

            x -= extents [(int)Position.Left];
            y -= extents [(int)Position.Top];

            window.SetGeometry(gravity, mask, x, y, width, height);
        }
Example #14
0
        void WnckScreenDefaultWindowClosed(object o, WindowClosedArgs args)
        {
            if (base_window == args.Window)
            {
                base_window = ManagedWindows
                              .Where(w => w != args.Window)
                              .DefaultIfEmpty(null)
                              .FirstOrDefault();
            }

            UpdateWindows(base_window);
            SetNameAndIcon();
        }
Example #15
0
        bool WindowCenterInViewport(Wnck.Window window)
        {
            if (!window.IsOnWorkspace(parent))
            {
                return(false);
            }

            Rectangle geo = window.EasyGeometry();

            geo.X += parent.ViewportX;
            geo.Y += parent.ViewportY;

            return(area.Contains(new Point(geo.X + geo.Width / 2, geo.Y + geo.Height / 2)));
        }
Example #16
0
        void RestoreTemporaryWindowGeometry(Wnck.Window window)
        {
            if (!window_states.ContainsKey(window))
            {
                return;
            }

            WindowState state = window_states [window];

            window.SetWorkaroundGeometry(WindowGravity.Current, MoveResizeMask, state.Area.X - parent.ViewportX,
                                         state.Area.Y - parent.ViewportY, state.Area.Width, state.Area.Height);

            window_states.Remove(window);
        }
Example #17
0
        protected override void OnScrolled(Gdk.ScrollDirection direction, Gdk.ModifierType mod)
        {
            int count = ManagedWindows.Count();

            if (count < 1 || (DateTime.UtcNow - last_scroll) < scroll_rate)
            {
                return;
            }

            last_scroll = DateTime.UtcNow;

            // This block will make sure that if we're scrolling on an app that is already active
            // that when we scroll we move on the next window instead of appearing to do nothing
            Wnck.Window focused = ManagedWindows.Where(w => w.IsActive).FirstOrDefault();
            if (focused != null)
            {
                for (; last_raised < count - 1; last_raised++)
                {
                    if (ManagedWindows.ElementAt(last_raised).Pid == focused.Pid)
                    {
                        break;
                    }
                }
            }

            switch (direction)
            {
            case ScrollDirection.Up:
            case ScrollDirection.Right:
                last_raised++;
                break;

            case ScrollDirection.Down:
            case ScrollDirection.Left:
                last_raised--;
                break;
            }

            if (last_raised < 0)
            {
                last_raised = count - 1;
            }
            else if (last_raised >= count)
            {
                last_raised = 0;
            }

            ManagedWindows.ElementAt(last_raised).CenterAndFocusWindow();
        }
Example #18
0
        void SetTemporaryWindowGeometry(Wnck.Window window, Gdk.Rectangle area, Dictionary <Wnck.Window, WindowState> state)
        {
            Gdk.Rectangle oldGeo = window.EasyGeometry();

            oldGeo.X += parent.ViewportX;
            oldGeo.Y += parent.ViewportY;

            state [window] = new WindowState(oldGeo, window.State);

            if (window.IsMaximized)
            {
                window.Unmaximize();
            }

            window.SetWorkaroundGeometry(WindowGravity.Current, MoveResizeMask, area.X, area.Y, area.Width, area.Height);
        }
Example #19
0
        void SetTemporaryWindowGeometry(Wnck.Window window, Gdk.Rectangle area)
        {
            Gdk.Rectangle oldGeo = window.EasyGeometry();

            oldGeo.X += parent.ViewportX;
            oldGeo.Y += parent.ViewportY;

            if (!window_states.ContainsKey(window))
            {
                window_states [window] = new WindowState(oldGeo, window.State);
            }

            if (window.IsMaximized)
            {
                window.Unmaximize();
            }

            window.SetWorkaroundGeometry(WindowGravity.Current, MoveResizeMask, area.X, area.Y, area.Width, area.Height);
        }
Example #20
0
        public void MoveWindowInto(Wnck.Window window)
        {
            if (parent.IsVirtual)
            {
                Rectangle geo = window.EasyGeometry();

                geo.X += window.Workspace.ViewportX;
                geo.Y += window.Workspace.ViewportY;

                int x = area.X + (geo.X % area.Width);
                int y = area.Y + (geo.Y % area.Height);

                x -= window.Workspace.ViewportX;
                y -= window.Workspace.ViewportY;

                window.SetWorkaroundGeometry(WindowGravity.Current, MoveMask, x, y, 0, 0);
            }
            else
            {
                window.MoveToWorkspace(parent);
            }
        }
Example #21
0
        static bool WindowsShareViewport(Wnck.Window first, Wnck.Window second)
        {
            if (first == null || second == null)
            {
                return(false);
            }

            Wnck.Workspace wksp = first.Workspace ?? second.Workspace;
            if (wksp == null)
            {
                return(false);
            }

            Gdk.Rectangle firstGeo, secondGeo;

            first.GetGeometry(out firstGeo.X, out firstGeo.Y, out firstGeo.Width, out firstGeo.Height);
            second.GetGeometry(out secondGeo.X, out secondGeo.Y, out secondGeo.Width, out secondGeo.Height);

            firstGeo.X += wksp.ViewportX;
            firstGeo.Y += wksp.ViewportY;

            secondGeo.X += wksp.ViewportX;
            secondGeo.Y += wksp.ViewportY;

            int viewportWidth, viewportHeight;

            viewportWidth  = first.Screen.Width;
            viewportHeight = first.Screen.Height;

            int firstViewportX = ((firstGeo.X + firstGeo.Width / 2) / viewportWidth) * viewportWidth;
            int firstViewportY = ((firstGeo.Y + firstGeo.Height / 2) / viewportHeight) * viewportHeight;

            Gdk.Rectangle viewpRect = new Gdk.Rectangle(firstViewportX, firstViewportY,
                                                        viewportWidth, viewportHeight);

            return(viewpRect.IntersectsWith(secondGeo));
        }
Example #22
0
 public static int Area(this Wnck.Window self)
 {
     Gdk.Rectangle geo = self.EasyGeometry();
     return(geo.Width * geo.Height);
 }
Example #23
0
 public static int [] FrameExtents(this Wnck.Window window)
 {
     return(GetCardinalProperty(window, X11Atoms.Instance._NET_FRAME_EXTENTS));
 }
Example #24
0
 public static Gdk.Rectangle EasyGeometry(this Wnck.Window self)
 {
     Gdk.Rectangle geo;
     self.GetGeometry(out geo.X, out geo.Y, out geo.Width, out geo.Height);
     return(geo);
 }