Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Front most window using CGWindowListCopyWindowInfo

In the documentation, it says that list of windows returned by this method:

CFArrayRef windowList = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly, kCGNullWindowID);

will return windows in order from front to back. But it doesn't...The front most window should be test, but here's the out of this array:

2011-03-12 18:18:14.221 test[982:a0f] (
        {
        kCGWindowAlpha = 1;
        kCGWindowBounds =         {
            Height = 22;
            Width = 212;
            X = 1662;
            Y = 0;
        };
        kCGWindowIsOnscreen = 1;
        kCGWindowLayer = 25;
        kCGWindowMemoryUsage = 30104;
        kCGWindowName = "";
        kCGWindowNumber = 14;
        kCGWindowOwnerName = SystemUIServer;
        kCGWindowOwnerPID = 99;
        kCGWindowSharingState = 1;
        kCGWindowStoreType = 2;
    },
        {
        kCGWindowAlpha = 0;
        kCGWindowBounds =         {
            Height = 22;
            Width = 1920;
            X = 0;
            Y = 0;
        };
        kCGWindowIsOnscreen = 1;
        kCGWindowLayer = 25;
        kCGWindowMemoryUsage = 5528;
        kCGWindowNumber = 15;
        kCGWindowOwnerName = SystemUIServer;
        kCGWindowOwnerPID = 99;
        kCGWindowSharingState = 1;
        kCGWindowStoreType = 2;
    },
        {
        kCGWindowAlpha = 1;
        kCGWindowBounds =         {
            Height = 22;
            Width = 46;
            X = 1874;
            Y = 0;
        };
        kCGWindowIsOnscreen = 1;
        kCGWindowLayer = 25;
        kCGWindowMemoryUsage = 5528;
        kCGWindowName = "";
        kCGWindowNumber = 12;
        kCGWindowOwnerName = SystemUIServer;
        kCGWindowOwnerPID = 99;
        kCGWindowSharingState = 1;
        kCGWindowStoreType = 2;
    },
        {
        kCGWindowAlpha = 1;
        kCGWindowBounds =         {
            Height = 22;
            Width = 1920;
            X = 0;
            Y = 0;
        };
        kCGWindowIsOnscreen = 1;
        kCGWindowLayer = 24;
        kCGWindowMemoryUsage = 218520;
        kCGWindowName = "Shared Menubar";
        kCGWindowNumber = 6;
        kCGWindowOwnerName = "Window Server";
        kCGWindowOwnerPID = 73;
        kCGWindowSharingState = 2;
        kCGWindowStoreType = 2;
    },
        {
        kCGWindowAlpha = 1;
        kCGWindowBounds =         {
            Height = 1058;
            Width = 1920;
            X = 0;
            Y = 22;
        };
        kCGWindowIsOnscreen = 1;
        kCGWindowLayer = 20;
        kCGWindowMemoryUsage = 1200;
        kCGWindowNumber = 13;
        kCGWindowOwnerName = Dock;
        kCGWindowOwnerPID = 98;
        kCGWindowSharingState = 1;
        kCGWindowStoreType = 1;
    },
        {
        kCGWindowAlpha = 1;
        kCGWindowBounds =         {
            Height = 52;
            Width = 676;
            X = 622;
            Y = 1028;
        };
        kCGWindowIsOnscreen = 1;
        kCGWindowLayer = 19;
        kCGWindowMemoryUsage = 157080;
        kCGWindowName = "Magic Mirror";
        kCGWindowNumber = 16;
        kCGWindowOwnerName = Dock;
        kCGWindowOwnerPID = 98;
        kCGWindowSharingState = 2;
        kCGWindowStoreType = 2;
    },
        {
        kCGWindowAlpha = 1;
        kCGWindowBounds =         {
            Height = 382;
            Width = 480;
            X = 335;
            Y = 367;
        };
        kCGWindowIsOnscreen = 1;
        kCGWindowLayer = 0;
        kCGWindowMemoryUsage = 792496;
        kCGWindowName = test;
        kCGWindowNumber = 252;
        kCGWindowOwnerName = test;
        kCGWindowOwnerPID = 982;
        kCGWindowSharingState = 1;
        kCGWindowStoreType = 2;
        kCGWindowWorkspace = 1;
    },
        {
        kCGWindowAlpha = 1;
        kCGWindowBounds =         {
            Height = 807;
            Width = 1206;
            X = 321;
            Y = 157;
        };
        kCGWindowIsOnscreen = 1;
        kCGWindowLayer = 0;
        kCGWindowMemoryUsage = 4055280;
        kCGWindowName = "AppDelegate.m - test";
        kCGWindowNumber = 24;
        kCGWindowOwnerName = Xcode;
        kCGWindowOwnerPID = 132;
        kCGWindowSharingState = 1;
        kCGWindowStoreType = 2;
        kCGWindowWorkspace = 1;
    },
        {
        kCGWindowAlpha = 1;
        kCGWindowBounds =         {
            Height = 967;
            Width = 960;
            X = 175;
            Y = 22;
        };
        kCGWindowIsOnscreen = 1;
        kCGWindowLayer = 0;
        kCGWindowMemoryUsage = 3817968;
        kCGWindowName = "test - Debugger Console";
        kCGWindowNumber = 31;
        kCGWindowOwnerName = Xcode;
        kCGWindowOwnerPID = 132;
        kCGWindowSharingState = 1;
        kCGWindowStoreType = 2;
        kCGWindowWorkspace = 1;
    },
        {
        kCGWindowAlpha = 1;
        kCGWindowBounds =         {
            Height = 967;
            Width = 1845;
            X = 121;
            Y = 22;
        };
        kCGWindowIsOnscreen = 1;
        kCGWindowLayer = 0;
        kCGWindowMemoryUsage = 882288;
        kCGWindowName = "CocoaDev Forums - get focused window id";
        kCGWindowNumber = 80;
        kCGWindowOwnerName = "Google Chrome";
        kCGWindowOwnerPID = 244;
        kCGWindowSharingState = 1;
        kCGWindowStoreType = 2;
        kCGWindowWorkspace = 1;
    },
        {
        kCGWindowAlpha = 1;
        kCGWindowBounds =         {
            Height = 784;
            Width = 885;
            X = 560;
            Y = 157;
        };
        kCGWindowIsOnscreen = 1;
        kCGWindowLayer = 0;
        kCGWindowMemoryUsage = 318768;
        kCGWindowName = "Console Messages";
        kCGWindowNumber = 125;
        kCGWindowOwnerName = Console;
        kCGWindowOwnerPID = 482;
        kCGWindowSharingState = 1;
        kCGWindowStoreType = 2;
        kCGWindowWorkspace = 1;
    },
        {
        kCGWindowAlpha = 1;
        kCGWindowBounds =         {
            Height = 494;
            Width = 1167;
            X = 519;
            Y = 417;
        };
        kCGWindowIsOnscreen = 1;
        kCGWindowLayer = 0;
        kCGWindowMemoryUsage = 2441264;
        kCGWindowName = Debug;
        kCGWindowNumber = 54;
        kCGWindowOwnerName = Finder;
        kCGWindowOwnerPID = 100;
        kCGWindowSharingState = 1;
        kCGWindowStoreType = 2;
        kCGWindowWorkspace = 1;
    },
        {
        kCGWindowAlpha = 1;
        kCGWindowBounds =         {
            Height = 382;
            Width = 480;
            X = 335;
            Y = 367;
        };
        kCGWindowIsOnscreen = 1;
        kCGWindowLayer = 0;
        kCGWindowMemoryUsage = 55216;
        kCGWindowName = test;
        kCGWindowNumber = 223;
        kCGWindowOwnerName = test;
        kCGWindowOwnerPID = 849;
        kCGWindowSharingState = 1;
        kCGWindowStoreType = 2;
        kCGWindowWorkspace = 1;
    },
        {
        kCGWindowAlpha = 1;
        kCGWindowBounds =         {
            Height = 437;
            Width = 770;
            X = 396;
            Y = 308;
        };
        kCGWindowIsOnscreen = 1;
        kCGWindowLayer = 0;
        kCGWindowMemoryUsage = 238512;
        kCGWindowName = Applications;
        kCGWindowNumber = 19;
        kCGWindowOwnerName = Finder;
        kCGWindowOwnerPID = 100;
        kCGWindowSharingState = 1;
        kCGWindowStoreType = 2;
        kCGWindowWorkspace = 1;
    },
        {
        kCGWindowAlpha = 1;
        kCGWindowBounds =         {
            Height = 437;
            Width = 770;
            X = 450;
            Y = 429;
        };
        kCGWindowIsOnscreen = 1;
        kCGWindowLayer = 0;
        kCGWindowMemoryUsage = 332720;
        kCGWindowName = Applications;
        kCGWindowNumber = 17;
        kCGWindowOwnerName = Finder;
        kCGWindowOwnerPID = 100;
        kCGWindowSharingState = 1;
        kCGWindowStoreType = 2;
        kCGWindowWorkspace = 1;
    },
        {
        kCGWindowAlpha = 1;
        kCGWindowBounds =         {
            Height = 14;
            Width = 1920;
            X = 0;
            Y = 22;
        };
        kCGWindowIsOnscreen = 1;
        kCGWindowLayer = "-20";
        kCGWindowMemoryUsage = 5528;
        kCGWindowName = "Backstop Menubar";
        kCGWindowNumber = 11;
        kCGWindowOwnerName = "Window Server";
        kCGWindowOwnerPID = 73;
        kCGWindowSharingState = 1;
        kCGWindowStoreType = 2;
    },
        {
        kCGWindowAlpha = 1;
        kCGWindowBounds =         {
            Height = 1080;
            Width = 1920;
            X = 0;
            Y = 0;
        };
        kCGWindowIsOnscreen = 1;
        kCGWindowLayer = "-2147483627";
        kCGWindowMemoryUsage = 1200;
        kCGWindowName = "";
        kCGWindowNumber = 10;
        kCGWindowOwnerName = Finder;
        kCGWindowOwnerPID = 100;
        kCGWindowSharingState = 1;
        kCGWindowStoreType = 1;
    },
        {
        kCGWindowAlpha = 1;
        kCGWindowBounds =         {
            Height = 1080;
            Width = 1920;
            X = 0;
            Y = 0;
        };
        kCGWindowIsOnscreen = 1;
        kCGWindowLayer = "-2147483628";
        kCGWindowMemoryUsage = 8328600;
        kCGWindowName = Desktop;
        kCGWindowNumber = 2;
        kCGWindowOwnerName = "Window Server";
        kCGWindowOwnerPID = 73;
        kCGWindowSharingState = 2;
        kCGWindowStoreType = 2;
    }
)

What's SystemUIServer, dock and magic mirror? These aren't my front most apps. Thanks!

like image 612
user635064 Avatar asked Mar 12 '11 23:03

user635064


2 Answers

Grab a copy of Apple's sample app: Son Of Grab. Then build and run it, and you'll have a very handy interactive app for investigating all the windows known to the window server.

The answer to your question is that windows are ordered front to back, but there are far more user interface elements defined as windows than you are expecting. This includes the menubar, the dock, the services menu, the Desktop, etc. These are defined at different levels, corresponding to kCGWindowLayer in your output.

You want the first window defined at the standard window level (zero). And if you look at your output, the first window with kCGWindowLayer == 0 is in fact the 7th.

like image 188
skue Avatar answered Oct 15 '22 02:10

skue


SystemUIServer is the top menu bar. Dock is the Dock (usually at the bottom of the screen). I'm not familiar with "Magic Mirror." You can look for it on your system with lsregister:

`locate lsregister` -dump

Search the output for "Magic Mirror".

like image 1
Rob Napier Avatar answered Oct 15 '22 03:10

Rob Napier