[Mono-osx] Why not implement WPF using OpenGL on Mac OS X?

Mac Programmer MacPgmr at fastermac.net
Thu May 21 20:19:15 EDT 2009


 >>Creating XplatUICocoa & CocoaInternal, and converting 2,500 lines  
of Carbon code to Cocoa
 >>would seem to be less work than competing suggestions found in  
this mailing list.

That's probably a good place to start, but I'm not sure that would  
solve all of WinForms' problems on Mac.

Let's take a seemingly simple example. Assume we have a hypothetical  
cross-platform widgetset that has a class named "Form" (as does  
WinForms) and the Form class coincidentally has a property named  
Position (as does WinForms and Delphi VCL), of an enumerated type  
that includes Manual (as does WinForms; Delphi VCL calls it poDesigned).

Here's WinForms definition of Manual: "The position of the form is  
determined by Location" or, as we used to call it, Left and Top.

So what does Top mean? WinForms again: "distance, in pixels, between  
the top edge of the control and the top edge of its container client  
area."

So what is the "container client area" of a form? One might think  
that this would be Screen.WorkingArea, which excludes taskbar, etc.  
But it's not. It's the entire screen.

So in its literal-minded way, this is what Mono's Mac WinForms  
implementation does too. Setting a System.Windows.Forms.Form object's  
Top to 0 positions the form at the very top of the screen, its title  
bar underneath the menu bar, making its "window menu" inaccessible.  
If this is the app's main form, Force Quit is about your only option  
at this point.

You can see the same problem if you put the Dock on the left side of  
the screen and set a Form's Left to 0.

On Mac, it would appear that NSWindow.Screen.VisibleFrame is  
analogous to WorkingArea. Apple: "The rectangle defining the portion  
of the screen in which it is currently safe to draw your application  
content." VisibleFrame starts just below the menu bar and ends just  
above the Dock (if the Dock is at the bottom). So you could just  
compute Top so it doesn't do that, right, the way you would on  
Windows by looking at WorkingArea?

I have my Mac set to 1056 x 792 screen resolution.  
NSWindow.Screen.VisibleFrame tells me that with the Dock along the  
bottom, the usable vertical area starts at 37 and is 733 pixels high.  
(Never mind that 37 is relative to the lower-left corner with Cocoa  
and Carbon, not the upper-left corner, of the screen.)

But what does WorkingArea tell me? That the working area is 1056 x  
792, or the entire screen, meaning the menu bar and Dock areas are  
all fair game. And that working area's Left is 0 and Top is 0. That  
doesn't seem correct. So how do you calculate the topmost Top and the  
leftmost Left for a form with WinForms on Mac? I don't know.


These are the kinds of things that would need to be solved if  
WinForms is to be "fixed". But would "fixing" it break existing code.  
Well, yeah.


It would seem that _every_ aspect of Mono's WinForms on Mac would  
need to be carefully and tediously re-examined with the Mac in mind.  
For example, you could move on to  
FormStartPosition.WindowsDefaultLocation. WinForms again: "The form  
is positioned at the Windows default location."

Well, what if the form's app is not running on Windows?

I like Delphi's definition of its equivalent poDefaultPosOnly better:  
"the operating system chooses its position on the screen." Now we're  
getting somewhere.

And what is that default position on Mac? Well, you could argue that  
it's the way most apps come up initially, positioned in the upper- 
left corner of the  VisibleFrame area. In any case, it shouldn't be  
some weird cascading position that changes each time you display the  
window, as it does on Windows. To its credit, Mono's WinForms does  
position the form up against the menu bar, but horizontally it's  
moved in a bit from the left. Also note that you can't move the  
window's title bar under the menu bar or under the Dock, so it's  
aware of the usable area. So why allow Top and Left to be set to  
invalid values?

Thanks.

-Phil



More information about the Mono-osx mailing list