Closed Bug 172751 Opened 22 years ago Closed 22 years ago

nsITheme support for Windows 9x/NT/2000

Categories

(SeaMonkey :: Themes, defect)

x86
Windows 95
defect
Not set
normal

Tracking

(Not tracked)

RESOLVED FIXED

People

(Reporter: tim, Assigned: tim)

References

Details

Attachments

(2 files, 7 obsolete files)

Not everyone is "XPerienced" yet, so nsITheme native drawing for XUL and HTML 
form controls should be supported under Windows 9x/NT/2000.  Windows has an API 
to draw most controls.  This would fix accessibility bugs (such as using the 
correct system scrollbar size/colors) and make Mozilla look better under 
different color schemes.
assigning to self
Status: NEW → ASSIGNED
Attached patch nsNativeThemeWin changes (obsolete) — Splinter Review
This modifies nsNativeThemeWin to draw controls under non-XP operating systems
using DrawFrameControl, DrawEdge, and GDI.  Most controls are supported.
Attached patch CSS changes (obsolete) — Splinter Review
This makes a few XUL CSS changes to allow scrollbars and dropdown buttons to be
as small as Windows allows, and to remove the moz-appearance border from the
autocomplete dropdown list.
Requesting review
This is fantastic, Tim!  Comments:

Your CSS changes are likely incompatible with Windows XP, since you are changing the 
min size of controls (and this overrides the theme's specified size).

I would first verify that I'm right about this by running with your changes on WinXP.   If I am 
right, then we can correct the problem by removing the min-width/height rules from CSS 
completely and just hack the theme code to hand back the right values for WinXP vs. 2k.

Note that with your changes, we can actually eliminate virtually all of the CSS rules for 
XUL widgets in the classic skin, which should be a nice performance boost.

Also, be sure to test this patch in WinXP with the classic look, and make sure it behaves 
correctly.  This is a different code path, since mThemeDLL is there, but calls to getTheme 
will start returning NULL.  You should watch for this and treat it just like the Win2k/NT 
case (in which mThemeDLL is actually null).

Also study each control's state and double-check that you have all the states covered 
(hover/focus etc.).

This is fantastic.  I will give quick/responsive feedback to any new patches you submit for 
this bug.
 
Attached patch nsNativeThemeWin patch 2 (obsolete) — Splinter Review
The patch now uses the old theme support when mThemeDLL is null or when the
theme handle is null, adds theme support for tabs, and adds focus rects for
HTML radio buttons/checkboxes.	I've tested on Windows 95, NT 4.0, and Windows
2000 and it works, but I don't have XP available to test.  I'm pretty sure all
the necessary states are covered.
Attachment #102123 - Attachment is obsolete: true
Attached patch CSS patch 2 (obsolete) — Splinter Review
The min-width/min-height rules might as well go if the classic skin rules
aren't going to be kept around at all (and with full Windows/GTK/Aqua support I
guess there's no real reason for them). Let's make eliminating the rest of the
classic rules a separate bug though. :) It'd be nice to get this in 1.2...
Attachment #102125 - Attachment is obsolete: true
Not all platforms implement nsITheme, afaik BeOS and QNX don't. However I
believe that that most platforms use the windows css files for the classic
theme. Am I correct in saying that your removal of css rules will make classic
look bad on these ports? If so it looks like we'll need to create css files for
paltforms which don't yet implement nsITheme.
I am going to try this out on WinXP and let you know how it looks in Classic 
mode (as well as making sure everything's ok in Luna).  Great job!

Attached patch Natve Theme patch 3 (obsolete) — Splinter Review
I looked through a bunch of Mozilla windows dialogs for any visual oddities and
found a couple.  This patch just adds support for drawing bottom-tabs, uses
-moz-appearance: none for a borderless textbox inside a dropdown, and fixes a
minor bug in drawing focus rectangles.
Attachment #102654 - Attachment is obsolete: true
Attachment #102655 - Attachment is obsolete: true
tim, with your latest patch I no longer see the groove around the 
menubar/toolbar in Phoenix.
This is extremely cool, but the "Old..." method names are a bit grungy. It would
be nice if they were replaced with something meaningful.
I agree.  Let's use the term "Classic" rather than "Old", since this matches
Windows XP's terminology.
Attached patch Native theme patch 4 (obsolete) — Splinter Review
ok, renamed "old" to "classic", fixed toolbox.	For now I made the scrollbar
arrows non-overridable within nsITheme rather than modifying CSS, so that it
will still work when theming is off.  Really though the classic theme should
probably be forked for OS/2 and BeOS.  Have you tried this under XP yet Dave?
Attachment #103129 - Attachment is obsolete: true
Blocks: 175038
Attachment #104308 - Flags: review?(hyatt)
hyatt?
Attached patch Native theme patch 5 (obsolete) — Splinter Review
I borrowed an XP machine to test this, and didn't see any problems on Classic,
or XP themes.  I also fixed some minor issues under XP themes -- bug 61188 and
bug 178792 and focus rectangles for checkboxes and radios.
Attachment #104308 - Attachment is obsolete: true
Attachment #107899 - Flags: review?(hyatt)
Just wondering.. will this also fix bug 130534 that only affects xp?
Attachment #104308 - Flags: review?(hyatt)
I think this is ready.
Attachment #107899 - Flags: review?(hyatt) → review+
Attachment #107899 - Flags: superreview?
Attachment #107899 - Flags: superreview? → superreview?(roc+moz)
+  if (!theme)
+    return ClassicThemeSupportsWidget(aPresContext, aFrame, aWidgetType);
+  
+  return IsAlreadyStyled(aFrame, aWidgetType);

I think we should check IsAlreadyStyled for all widget types after calling
ClassicThemeSupportsWidget, and removing the calls to IsAlreadyStyled from
ClassicThemeSupportsWidget. Backgrounds and borders can be applied to lots of
form controls, and if we're going to hardcode assumptions about the kinds of
widgets which can be styled, we should do it in IsAlreadyStyled which can at
least be shared across platforms. [This is for another bug, but we really should
move IsAlreadyStyled somewhere shared so that all platforms can use it and
display native controls in HTML content.]

+      SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(nc), &nc, 0);  

Mind checking to see if this succeeded and doing something sensible if it didn't?

+        if (contentState & NS_EVENT_STATE_ACTIVE && contentState &
NS_EVENT_STATE_HOVER) {

[Optional] Here and below, I'd write "if ((contentState & (NS_EVENT_STATE_ACTIVE
| NS_EVENT_STATE_HOVER)) == (NS_EVENT_STATE_ACTIVE | NS_EVENT_STATE_HOVER))"
because it's a wee bit more efficient. But you don't have to :-).

+        if (aWidgetType == NS_THEME_CHECKBOX) {
+          if (IsChecked(aFrame))
+            aState += DFCS_CHECKED;
+        }
+        else
+          if (CheckBooleanAttr(aFrame, mSelectedAtom))

[Optional] You can write this a little simpler as "if ((aWidgetType ==
NS_THEME_CHECKBOX) ? IsChecked(aFrame) : CheckBooleanAttr(aFrame,
mSelectedAtom))", but again, you don't have to.

+    case NS_THEME_TAB_PANEL:
+    case NS_THEME_TAB_PANELS:
+      return NS_OK;

[Optional] It would be a bit easier to see that this code is correct if you set
some default values for the outputs of this function in these cases.

+        aState = aState | DFCS_PUSHED | DFCS_FLAT;

Here and below you can write "aState |= DFCS_PUSHED | DFCS_FLAT;". Actually it's
probably a little safer to use |= instead of += in all your code here.

+  #define SET_RECT(R,l,t,r,b) R.left=l; R.top=t; R.right=r; R.bottom=b;

Why didn't you just use ::SetRect? If you want the parameters in this order then
would you mind just defining this as an inline function? Macros suck.
static inline void SetRectXY(RECT& aRect, int aL, int aT, int aR, int aB) {
  aRect.left = aL; aRect.top = aT; aRect.right = aR, aRect.bottom = aB;
}

+  HDC hdc = ((nsRenderingContextWin*)aContext)->mDC;

Please use NS_STATIC_CAST.

+    case NS_THEME_BUTTON: {
+      if (focused) {
+        // draw dark button focus border first
+        HBRUSH brush;
+        brush = ::GetSysColorBrush(COLOR_3DDKSHADOW);
+        ::FrameRect(hdc, &widgetRect, brush);

Put this inside "if (brush)".

+        widgetRect.left++; widgetRect.top++;
+        widgetRect.right--; widgetRect.bottom--;
+      }
+    }
+    // Draw controls supported by DrawFrameControl
+    case NS_THEME_CHECKBOX:

Please add a comment noting that you're falling through to the next case.

+      ::FrameRect(hdc, &widgetRect, brush);

"if (brush)"

+        patBmp = ::CreateBitmap(8, 8, 1, 1, patBits);
+        brush = (HBRUSH) ::CreatePatternBrush(patBmp);

These should check for failure too.
Patch addressing roc's comments.  It seems simple enough to turn off theming
for other styled widgets, but Hyatt's existing code was only for buttons and
fields, so I left that alone..
Attachment #107899 - Attachment is obsolete: true
Attachment #108128 - Flags: superreview?(roc+moz)
Attachment #108128 - Flags: review?(hyatt)
Comment on attachment 108128 [details] [diff] [review]
Native theme patch 6

+	 brush = (HBRUSH) ::CreatePatternBrush(patBmp);

You should check patBmp != NULL before using it.

sr=roc+moz

Also, I'm taking th liberty of carrying forward hyatt's r=

Go ahead and find someone to check it in for you...
Attachment #108128 - Flags: superreview?(roc+moz)
Attachment #108128 - Flags: superreview+
Attachment #108128 - Flags: review?(hyatt)
Attachment #108128 - Flags: review+
Attached patch Final patchSplinter Review
Fix checked in.
Status: ASSIGNED → RESOLVED
Closed: 22 years ago
Resolution: --- → FIXED
Maybe wrong place to ask, but programs using native os scrollbars in Windows 
make the arrows smaller when window is too small. Try this with any program 
using scrollbars and you will see that the up and down arrow are minimized in 
size.
This does not happend in Mozilla though, they dissappear when the window has a 
certain height. Is this (just guessing) due to that this was not supported 
before and the arrows were hidden? Is this behavior possible in Mozilla?
Blocks: 179507
Attachment #107899 - Flags: superreview?(roc+moz)
(In reply to comment #24)
I think that's a good question, José, and a valid bug. I've filed bug 292284 for
that.

Product: Core → SeaMonkey
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Creator:
Created:
Updated:
Size: