[ros-dev] I think I know how uxtheme works...
Richard Campbell
eek2121 at comcast.net
Thu Mar 24 01:01:54 CET 2005
I honestly wouldn't take this approach. While microsoft may do this,
you can use a different approach without sacrificing compatibility
(well, except for maybe anything from stardock.) Microsoft's approach
is kind of hackish/kludgy, and even worse, it's slow.
A better approach would be a plugin system. User32/gdi32/win32k would
pass off rendering calls to a plugin, which would be responsible for the
actual drawing. That way you could completely change HOW things are
drawn, for instance, you can create an opengl accelerated windowing
system, etc. Hmm...maybe i could write a draft for such a system....now
i'm wanting to code, hehe. Granted, this would probably be better off
as a fork or 3rd party project...but still...
Richard
Jonathan Wilson wrote:
> What I strongly suspect happens is this:
> 1.The themes service is always loaded and running and holds the theme
> data (and it contains details of which .msstyles file to use)
> 2.At some point (either at startup if the changes are global or when
> an app loads if the changes are app specific, I cant find where this
> bit happens but I suspect the themes service does this) control passes
> to ordinal 34 in uxtheme.dll (aka ThemeHooksInstall acording to
> uxtheme.pdb). This function calls an undocumented function in user32
> called RegisterUserApiHooks (which appears to be taylor made for
> uxtheme to do what it needs to do).
> The function hooks:
> GetScrollInfo
> SetScrollInfo
> EnableScrollBar
> SetWindowRgn
> DefWindowProcW
> DefWindowProcA
> PreWndProc (probobly stuff that happens internally before the window
> procedure gets called)
> PostWndProc (probobly stuff that happens internally after the window
> procedure gets called)
> PreDefDlgProc (probobly connected to dialog boxes)
> PostDefDlgProc (probobly connected to dialog boxes)
> GetSystemMetrics
> SystemParametersInfoA
> SystemParametersInfoW
> DrawFrameControl
> DrawCaption
> MDIRedrawFrame (probobly related to MDI frame windows)
> This is what causes all apps (including non-theme-aware ones) to get
> themed non-client areas (window borders etc)
> 3.Apps that are theme aware have a manifest, load comctl32.dll 6.0 and
> probobly have to call InitCommonControlsEx (although I think some of
> the code in the dllmain for comctl32.dll 6.0 may also end up calling
> InitCommonControlsEx). This causes new versions of the stock classes
> (button, list box, edit, combo box etc etc etc) to be created and
> registered. A cursory examination of some of these classes shows that
> they dont seem to "pull code" from the stock implementation in
> user32.dll (i.e. anything they dont themselves handle goes back to
> DefWindowProc). In particular, it doesnt appear as though they have
> any knowledge of the classes or window procedures contained in
> user32.dll.
> then 4.Apps that need to do something extra call into functions
> exported by uxtheme.dll to do whatever they need to do.
>
> user32.dll seems to have no knowledge whatsoever about themeing and
> uxtheme. All that user32 has is RegisterUserApiHooks (and the matching
> UnregisterUserApiHooks) that uxtheme uses to hook into user32.dll and
> do stuff.
>
> Exactly how the theme service and theme engine works "under the hood"
> doesnt matter.
> But for ReactOS and WINE purposes, I suggest we implement the following:
> 1.A function similar to RegisterUserApiHooks/UnregisterUserApiHooks
> (either reverse engineer the MS function or write our own). This will
> allow uxtheme to hook into the global drawing for things like window
> borders without user32 needing to care about uxtheme and what uxtheme
> does (just like how MS hooks into user32 that way)
> 2.Whatver code is necessary to get the hooks installed right so that
> all apps get the "global" theming like on real windows
> 3.Support to read the manifest and load a new comctl32.dll that would
> be like the version 6 from microsoft (and would contain complete
> theme-aware implementations of the stock controls just like MS
> comctl32.dll 6.0 does)
> and 4.All the needed uxtheme exports to make stuff run
>
> This would be the same way Microsoft does things.
> User32.dll would have no idea whatsoever about uxtheme and theming
> All apps would get non-client-area themeing like on windows.
> And only theme aware apps would get themed controls etc (the rest
> would get "stock" windows controls)
>
> Oh and btw, if this "reverse engineering" is not "clean room" enough
> for WINE and ReactOS, let me know and I will stop posting it :)
>
>
> _______________________________________________
> Ros-dev mailing list
> Ros-dev at reactos.com
> http://reactos.com:8080/mailman/listinfo/ros-dev
>
More information about the Ros-dev
mailing list