Getting the screen position of a non-view based NSStatusItem - objective-c

My application makes use of an NSStatusItem. I need to grab the screen coordinates for the status item, but since I have no need for the functionality offered by setting a custom view for the item I am using a standard icon-based one instead.
Is there a way to get the status item's position without having to resort to setting a custom view to it?

Unless you find a better way, you could use some undocumented API: - (id)_window of NSStatusItem probably returns the window enclosing the item itself. Maybe you can get some interesting information out of that?
Beware: Some fundamentalists might actually try to break your neck for using undocumented API. Just make sure you check regularly if this portion of your code works with newer OS versions (either by hand or using some unit tests).

Related

How to create a list which sorts its self like games with the animation

I am creating a game in flutter in which I want to create my leader board page in which I want to achieve the list like Reorderable widget but in that we drag the tile manually but I need to get it automate ,it should elevate and lower another tiles same animation like Reorderable list but it should be automated
I hope I will find some solution with large community
You can take a look at the AnimatedList in Flutter: https://api.flutter.dev/flutter/widgets/AnimatedList-class.html
When a new value is inserted (or removed), it is automatically animated (and you can of course customize this animation to suit your needs).
I'm not sure how you would handle moving an item from one place to the next in the list, though.
Update
I found this other SO thread which mentions the great_list_view package, in which you can just update your underlying list (with the new score, or sort it again) and it will automatically animate it for you. That sounds like a good option, and the package has recently been updated and has a decent amount of likes on pub.
https://pub.dev/packages/great_list_view

Chromium; how to get rid of the black circular X button in fullscreen mode?

In Chromium version 72.0.3626.121 the button to leave the fullscreen mode could be disabled by using the enable-experimental-fullscreen-exit-ui flag. In version 86.0.4240.193, this flag is no longer available.
Does somebody know how to disable this button?
I'm using the following options to start Chromium.
"chrome.exe" --no-default-browser-check --DisableSplashScreen=true --disable-infobars --overscroll-history-navigation=0 --js-flags="--expose-gc" --incognito --start-fullscreen
Adding the --kiosk option disables the button, but it also changes the behavior of the browser, which I don't want.
Appologisied if I'm wrong, and I do not propose this as a proper answer to your question, but this is what I think.
It might be possible that the only way to achieve what you want is to rebuild the browser from the source. For example, I wanted my bookmark UI to show a list bigger than few last items, was thinking this could be tweaked by a plugin or config, but it turns out it's a hardcoded const variable in the source code. An extension could use a different bookmarker to replace the bundled one. However, nothing can change that const value except changing it in the code and recompiling the browser.
Without knowing much internals it feels to me the X is there on purpose as safety, not to allow somebody to take advantage of less tech-savvy users (imagine a Windows login screen made in HTML to steal users credentials). Therefore I think very likely you will not be able to do what you want easily. A lot of the experiments and features get removed from the browser, remember the vertical-tabs were there for few versions as a hidden command-line argument, but then that got removed too.

Identify the monitor with the browser window in FireBreath

I am using FireBreath to create a cross browser plugin which makes use of some native libraries for the respective platform (some .NET based DLLs for Windows and Objective-C based dylibs/frameworks for Mac). Native libraries display UI screens. In order to improve usability, if the user has a multi/extended monitor setup, i would like the native UIs to appear on the same screen as the browser window is currently on.
If an identifier to the monitor with the browser window can be retrieved, that can be passed down to the native components which can be configured to display their UIs on that monitor. I have used FireBreath's getWindowPosition() method to get the rect coordinates of the plugin and used that info to identify the correct monitor in the Windows platform.
However, the coordinates returned in Mac seems to be always 0 (or 1) irrespective of monitor on which the browser window currently resides. I understand that we have to configure an event model and a drawing model in order for this to work in Mac. I have tried following event/drawing model combinations without much success.
1) Cocoa/CoreGraphics
2) Carbon/CoreGraphics
Any help in this regard is much appreciated. Also please do share if there are other approaches to achieve the same. What i want to achieve is to identify the monitor on which the current active browser window resides in Mac. I am unsure at this point, but it maybe possible to achieve this at Objective-C level (without any changes at FireBreath level). Also please note that i want to support Safari, Firefox and Chrome browsers.
You won't like this answer, but simply put you can't do that on Mac. The problem is that with CoreGraphics you are only given a CGContextRef to work with, and it doesn't know where it will be drawn. It was technically possible in older browsers to get an NSWindow by exploiting some internal implementation details, but many browsers that's no longer possible and it was never supported.
Other drawing models are the same; CoreAnimation you have a CALayer but it doesn't know which screen or monitor it is drawn to. I personally think it's a bit annoying as well, but I do not know of any way to find out which monitor your plugin is rendered to, particularly since most of them actually copy the buffer to something else and render in a different process.
I did manage to come up with a workaround and i am just replying here for the completeness of the thread. As #taxilian explained, it is not possible to retrieve plugin coordinates using the window reference. As an alternative approach, Javascript 'Window' object has 2 properties called 'screenX' and 'screenY' that return X and Y coordinates of the browser window relative to the screen. If the user has an extended monitor setup, these are the absolute coordinates with respect to the full extended screen. We can use these values to determine the monitor with the browser window (if the X coordinate is outside the bounds of the primary monitor's width, then the browser should essentially be on the extended monitor). We can retrieve DOM properties from Firebreath as explained in the following link:
http://www.firebreath.org/display/documentation/Invoking+methods+on+the+DOM

Retrieving an app's DockTile (view)

I'm getting my hands dirty with a bit of ObjC by trying to write something Dock-like, with a little less visual bells and whistles. It's going pretty well. However I've stumbled over a problem which I can't quiet solve:
Retrieving an app's icon via NSRunningApplication is easy. However, some apps don't use their icon as DockTile, they use a custom view because their DockTiles are dynamic (f.e. most torrent apps display their current up/down speeds in the dock).
Is there any way to get this DockTile and display it in my own app?
Thanks
No, there is not. The methods which set a custom dock tile end up communicating the contents of the view directly to the Dock; it is not made available to other processes.
For what it's worth, writing a replacement for the Dock is going to be a kind of hopeless task -- Apple's Dock.app uses numerous private, undocumented APIs to interact with the WindowServer, some of which simply cannot be used by any process which is not the Dock.

ListView bound to storage files with grouping capabilities in WinJS

I would like to replicate the song view of the Music app, in my Windows 8 Metro app using WinJS.
I'm using a StorageDataSource to load files from the music library in a list view. This works well, now I'd like to group music files by some property (ex.: album).
StorageDataSource does not support grouping, so I'm looking for tips on how to go at this. It has to be efficient as the user can have many items in the library, but I don't need it to auto-update when new files are added/removed (though it would be nice).
My current understanding is that I need to build 2 custom data sources:
One or the itemDataSource of the ListView, and is a wrapper around StorageDataSource. Ex.: the getItemsFromIndex implementation queries the underlying dataSource for its items that it wraps in a literal. I can't just set the StorageDataSource as its objects are immutable.
One for the groupDataSource of the listView. I build it manually once when the app loads, by iterating over my first StorageDataSource and determining how many groups I have, and where each one starts in terms of itemDataSource indexes.
It works, but I wonder if there's a better way. It also seems impossible to have groups in a ListLayout and it forces items to be displayed horizontally.
Does anyone have tips for the high level view of what's required here? Thanks.
First, you are correct that if you are using a list layout that grouping isn't supported; its only supported in the Grid layout. You could choose to insert fake data items for the groups that you could style as you needed using a custom item template rendering function.
The rest of your stuff will require some learning I suggest you take a look at the ListView samples to really understand the ins and outs of the data source API.
One option is to let the ListView calculate them for you by supplying the computerDataSourceGroups function:
http://msdn.microsoft.com/en-us/library/windows/apps/hh700578.aspx
The other option is that the StorageDataSource source is right the for you to look at; adding grouping to this as a raw datasource may in fact be your most efficient and maintainable solution. It will hopefully allow you to continue to leverage the virtualization of the listview without causing the data source to de virtualized. You should find the source in the references node in VS, in ui.js.