> On Nov. 15, 2014, 2:43 p.m., Thomas Lübking wrote: > > kdeui/windowmanagement/kwindowsystem_mac.cpp, line 556 > > <https://git.reviewboard.kde.org/r/120931/diff/2/?file=328516#file328516line556> > > > > Does this *really* cut it on OSX? > > The function is not supposed to be an extra superfluous wrapper around > > QWidget, but typically used to control windows IN ANOTHER PROCESS. > > > > This raises the question whether that's possible on OSX at all. > > If not, testing for an in-process window (search toplevels only?) is > > ok, but the failure should cause a big fat warning to the developer that > > this code isn't portable. > > René J.V. Bertin wrote: > It works for in-process windows, obviously, but no it won't work for > windows from another process. I highly doubt that one could meddle with > those, and as I must have written in the comments somewhere, you cannot > convert the WId to a pointer to an actual window object if it's not owned by > ourselves. > > What exactly are you proposing concerning that big fat warning? > Do you know of code that uses this kind of functionality cross-process, > apart from kwin and maybe a couple of goodies that aren't relevent outside of > a Plasma workspace? > > Thomas Lübking wrote: > Well, how does the OSX docker etc. raise/activate a window? > Does this imply that activating won't work either for other PID windows? > (The comments actually seem to suggest so) > In case: why mess with the cocoa API itfp? You could just as well wrap > around Qt (w/ a //TODO or similar) > > > What exactly are you proposing concerning that big fat warning? > qWarning("BlahFooBar does not work on OSX, please fix your stuff"); > if (m_DebugClient) > abort(); > > m_DebugClient could be set in a header inline, depending on whether > QT_DEBUG is defined (or QT_NO_DEBUG is not defined) > > René J.V. Bertin wrote: > The OS X Dock is a case apart. It's system software, and probably > interacts with the window manager. > But I should rephrase, maybe: "it won't work" means there's no documented > way to achieve raising and the like across process boundaries. As long as you > don't want to or cannot use AppleScript, and in this case we cannot because > we cannot use the WId. > > I do think that the Cocoa API gives a bit more functionality than > wrapping Qt calls would, but I can have another look at that. > > Thomas Lübking wrote: > Are you or another OS_X hacker maybe in touch with more regular Cocoa API > devs (forum, mailing list personal contact)? > I find it hard to believe that there's no access to windows on Cocoa (but > on apple script) - wouldn't eg growl allow you to activate the sender window? > > René J.V. Bertin wrote: > Growl is a notification framework, and indeed it doesn't seem it can do > anything else but sending messages and displaying them. > > But I've spoken a little bit too soon. There *is* actually a potential > way to tell another application to raise a specific window. In ObjC, invoking > a class instance's member function is called sending a message to that > instance ... and those messages *can* be used for IPC. See > http://stackoverflow.com/questions/7448068/in-cocoa-or-generally-in-objective-c-is-there-a-way-to-send-a-message-to-objec > . It's a feature I've never used so I tend to forget about it, and the > question remains if we can actually use this without a substantial rewrite. > And the big question remains: how to glean the required information from a > WId. The documentation suggests that a WId is actually an `NSWindow*` on OS > X, but from what I've seen this is no (no longer) correct. > > René J.V. Bertin wrote: > I've had a look at using distributed objects in ObjC. That could be the > solution we're looking for, given certain conditions: > > - WId values must be unique across processes during a session and not > potentially identical in multiple processes at the same time like they could > be if they are pointers (like the documentation suggests). > - Because the KWindowSystem API only provides a WId to work on, we can > only check the system for published distributed objects registered under, for > instance, the hex. representation of that WId (which is why they must be > unique) > - As a consequence, each time a window is opened we must create a > dedicated NSConnection object registered with the WId's representation, so > KDE's windowing layer must be adapted to do that. I don't know yet whether > this is actually possible, nor how large an overhead this would introduce. > > A more elegant (?) solution would create a single NSConnection object for > some kind of application interface that can respond to queries like [give me > the NSWindow* for this WId] and register that through kded. And of course > kded would need to have a reverse interface to a dictionary mapping WIds to > registered applications because of point 2 above. > > Sounds like a fun little project to get right, but somehow I doubt it > stands much chance to be accepted for KDE4. > > And my main question remains: just how many applications try to do things > with windows that are not their own? > > Martin Gräßlin wrote: > > And my main question remains: just how many applications try to do > things with windows that are not their own? > > That is the main purpose of KWindowSystem. For doing things with your own > window one wouldn't need KWindowSystem, but could just QWidget/QWindow.
@René: Do the results of http://lxr.kde.org/ident?_i=KWindowSystem&_remember=1 mean anything to you? - Ian ----------------------------------------------------------- This is an automatically generated e-mail. To reply, visit: https://git.reviewboard.kde.org/r/120931/#review70399 ----------------------------------------------------------- On Nov. 14, 2014, 11:04 p.m., René J.V. Bertin wrote: > > ----------------------------------------------------------- > This is an automatically generated e-mail. To reply, visit: > https://git.reviewboard.kde.org/r/120931/ > ----------------------------------------------------------- > > (Updated Nov. 14, 2014, 11:04 p.m.) > > > Review request for KDE Software on Mac OS X and kdelibs. > > > Repository: kdelibs > > > Description > ------- > > This is an attempt to improve the Mac-specific implementation of the > `KWindowSystem` class. > For convenience and future-proofness (and also because I like the language) I > converted `kwindowsystem_mac.cpp` to ObjC++, i.e. `kwindowsystem_mac.mm`, and > added the AppKit framework in the CMakeFile. > > Much of the code in this file is hardly better than gentle hacking, but that > probably concerns the functions that are of least interest on a platform > where KDE doesn't do session management. > > I should probably update the "not yet implemented" debug statements (to > "unsupported"), and I might have another look at kwindowinfo_mac.cpp too. > > > Diffs > ----- > > kdeui/CMakeLists.txt 1454790 > kdeui/tests/kwindowtest.cpp b4012d7 > kdeui/windowmanagement/kwindowsystem_mac.cpp 4200237 > kdeui/windowmanagement/kwindowsystem_mac_p.h PRE-CREATION > kdeui/windowmanagement/kwindowsystem_macobjc.mm PRE-CREATION > > Diff: https://git.reviewboard.kde.org/r/120931/diff/ > > > Testing > ------- > > On OS X 10.6.8, mostly with the updated kwindowtest utility (which calls > KWindowSystem functions when clicking the Open button in its toolbar). > Also tested on Mac OS X 10.9.4 rebuilding kdelibs from scratch. > > > Thanks, > > René J.V. Bertin > >