Uniquely identifying an NSScreen - cocoa

I'm working on a project which has settings for each display. I want my application to support a display being removed and later re-added, possibly with another display used in between, with the original settings for each display being applied when the display is seen again.
As far as I can tell there is no way, through NSScreen, to uniquely identify one outside of the context of the current display configuration. I can't just use screen dimensions/properties as the user could have multiple displays of the same model in different locations; this problem applies to all persistent properties of a screen as far as I can tell.
Is there a good, known way to do this?
Thanks for your time. Any help is greatly appreciated.

The documentation to -[NSScreen deviceDescription] talks about getting the CGDirectDisplayID and the documentation about the CGDirectDisplayID says:
When a monitor is attached, Quartz assigns a unique display identifier (ID). A display ID can persist across processes and system reboot, and typically remains constant as long as certain display parameters do not change.
When assigning a display ID, Quartz considers the following parameters:
Vendor
Model
Serial number
Position in the I/O Kit registry
This sounds pretty close to what you are looking for.

Related

Determine if a handle points to an element of the screen (and not a printer etc)

I'm looking for a way to identify if a handle references something on the/a screen (a screen, a window, a control, the entire virtual desktop, etc).
I'm trying to standardise the resolution of the interface so that I can consistently save it and do non-regression testing on it. So I've hooked a couple of system calls like GetDeviceCaps so that I can intercept the resolution and change it to a consistent 96DPI.
So far I've found GetObjectType that doesn't necessarily tell me if the object is part of the screen (comparing to OBJ_DC and OBJ_MemDC). Combining that with WindowFromDC I can get a slightly more indicative result, but it's still not perfect.
I thought maybe I could use EnumDisplayMonitors with null for the first two parameters, but it never seems to function.
Does anyone have a fool proof way of telling if a handle references a screen object or not?
Thank you in advance!
Loren
Turns out I could've used GetDeviceCaps with the parameter index set to TECHNOLOGY. An object related to rendering to a screen will be identified as DT_RASDISPLAY
See https://learn.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-getdevicecaps

Appium: How to differentiate between two different iOS screens?

I am developing a testing algorithm for our iOS apps using Appium. To fully implement this algorithm i need to identify wither i have moved onto different screen or am still on the same screen after performing some action. I need to know, what makes every screen unique/different from other in terms of Appium?
Going through the pageSource of every screen, i found that most screens have xpath attribute in window element. Can i use value of xpath of window element to mark the screen as unique from others, or do i need to do a trivial string comparison between screen's pageSources to mark them different? Or is there any other better solution?
Not sure if xpath would be the best solution for this. Normally the UIAWindow would remain the same, and developers might use different containers within this UIAWindow to render different screens.
So to verify different screens, you might need to figure out what this container is and see if the container's properties change when you move to a new screen (ie a new container)
If you app user a different header for every new screen, then you can use this header to see if the screen is changed. Example: in WhatsApp, you would see a different persons at the top. So in this case, the person's name can be assumed as the header.
If this doesn't work then you can verify some of the other controls, or say list of all the UIAStaticText on the screen. During screen change the entire list of UIAStaticText might change. So this can indicate a screen change.
For our automation suite at work I've implemented a series of screen check steps. Every time we switch screens I do a find_element command for an element on that screen that is unique to that screen. That way if a button or option takes me to a new screen that is incorrect my test will fail as expected. If it does find the element we're expecting it adds minimal time to the test suite.
Anish Pillai made a good suggestion of using the header text if there is any. Otherwise a particular tab, menu text, resource_id, or whatever is unique about the page would suffice. All you would need to do is a find_element call and a failure message if it fails.

Xcode Need guidelines on invented draft for photo gallery manager

For this question, I don't require a full explanation of all code, but helping me get insight into the process for achieving this result would be very helpful! Some information sources that will lead me to where I want to be.
Don't hesitate to give your opinion or make suggestions on how you would make it better in case you have better ideas - We just want to jump off the regular photo album system.
In the added screenshot I have added a painted image that makes the purpose clear.
Albums are created by tapping the "+" sign. (This shows a popup window in which the user can tag a bar/event to which the picture applies; the bar/event profile picture will appear on the album cover).
Newly taken pictures should appear in a separate band on the screen. They will float there until the user drags and drops them into an album. Note that the picture is also taken from within the app (using the native camera of the smartphone).
When the user added them to an album that was tagged, they will also be displayed automatically in the gallery of the tagged bar/event profile. (Of course in the app, personal profiles will be available as well).
Which technologies / workflow would you advise me?
What I need to create now is just an empty shell for the app that demonstrates the visual workflow (the data flows are not important at this point).
I have read about some libraries such as three20 or UIImagePicker, I don't know if they are easy to customize towards our needs.
Thanks!
I cannot comment on the likes of Three20 as I have never actually used them.
One method I can suggest, is using a number of scrollviews. Based on your example, you would require 2 individual scrollviews. (For ease lets call them AlbumsSV and PicturesSV).
The AlbumsSV would dynamically load content, based on your backing store. One approach I have used in the past, is to load custom views into a scroll view, as this allows for maximum control, you can specify any requirements as properties of the view (i.e Primary key etc), also you can load a 'preview image' based on the data held in your data store.
Assuming you always want the ability to add new items to be last element added to the AlbumsSV, then you can simply add another custom view to the AlbumsSV after all other items have processed.
PicturesSV would simply load content based upon what is in the users camera roll. Again I would recommend using a custom view, as you can set properties such as FileURL etc on the custom view, this will aid when it comes to dragging items into a specific album.
Hope this helps :)

Creating real-time monitor window of an application

I want to create a window that can display the current content of an application, say Powerpoint or Adobe Reader.
When I run my application, I would first select which of the currently running application I need to monitor in realtime. Once done, I need to get the current content of the selected application and display it. Since my application is going to be realtime, it will need to capture the contents of the selected application as and when they change (with minimal lag), and then display it.
As I understand, this broadly comprise of the following steps:
1. Selecting an application that I want to monitor
2. Get 'notification' when the content of that applicaion (client area) has changed
3. Capture the new content and display it
The steps [1] and [3] are quite easy and I find several methods here to perform them. However, for the stage [2] I am still clueless. Can anybody throw some light on how to acheive this?
Cheers.
You might take a look at UltraVNC, which does exactly what you are trying to do (it has a single window mode as well as full-screen). It has no less than four ways to accomplish your step #2.
The one obvious approach I can think of is to periodically take snapshots of the app's window and compare it to the previous one for changes.

Descriptive label names in a desktop application

I have an application that displays a dialog when the user needs to enter information. The reason for this, is to keep the main form readonly, and only when you need to add/edit data will a dialog appear.
The problem I'm wrestling with is what to display for the label names in the dialog. The application is a WPF desktop app and traditionally desktop apps are very short on label names (usually one or two words). I want to make the dialog user friendly and be more descriptive about the information that is required. Web developers seem to be catching on to this and are much more descriptive with their label names, but most of the forms I've looked at are forms that are only filled in once, whereas I will have data that can be edited.
An example: If I had a label that asked a user if an employee smoked, in most a destop apps the label would normally be something like 'Smokes?' with a checkbox, whereas I want something like 'Does the employee smoke?'. My issue with this is, that the first time you come across this dialog and enter the data, then it seems OK, but what about when you are editing data that is already there. Does this label now make any sense. Past tense and present tense seem to be getting in my way and I was interested in what people think or ways they have approached this. The application I'm writing is a WPF app and I feel that traditional label names are a bit old in the tooth now.
Another example would be entering contact details for a person. Do I just have labels that say Phone, Fax, Email or something more descriptive. i.e. a label that appears before the textboxes stating 'Enter the contact details below' and then the single word labels?
Maybe I'm just being pedantic about all this, but I would like to take a step forward so that my application contains more than single word labels that are sometimes unclear to the user about what is required.
Why not make use of the concise labels and use Tool tips for a longer explanation.
The longer explanation is only required when a user is unfamiliar with the application anyway.
Also, you could re-word a label to make it sound more like a question such as "Is a Smoker?"
Since you are using Stack Overflow, take note of their use of tooltips, I think Jeff Attwood has a blog post or comments in a podcast about the use of tooltips in SO. I can't remember where I heard / read it.
Have you thought about creating a "quickstart" flow or wizard for entering data for the first time? This would give you the opportunity to guide the user through the process, using labels with descriptions, so that they learn to associate the description with the label you've chosen (hopefully something succinct but intuitive). Then when they need to edit data, they have learned the application taxonomy.
If you are running into issues with tenses, steer clear of using verbs or only use the present tense. I would try using nouns - "smoker?" instead of "smokes?"
When you're asking for common data like phone numbers, email addresses, you can probably assume that the user will understand what you mean. Just be clear as to whose contact information you are asking for - using a title for the field set that is explicit is a good idea ("Employee Contact Details"), adding a short description above the field set will help too.
Of course, you should always do some level of usability testing on your application before you launch it to uncover any issues with the interface.

Resources