mirror of
https://github.com/VincentWei/MiniGUI.git
synced 2026-09-24 00:54:18 +08:00
788 lines
34 KiB
Markdown
788 lines
34 KiB
Markdown
# Release Notes
|
|
|
|
- [Version 4.9.2](#version-492)
|
|
+ [What's new in this version](#whats-new-in-this-version)
|
|
+ [Compositing schema](#compositing-schema)
|
|
+ [New main window styles](#new-main-window-styles)
|
|
+ [Virtual window](#virtual-window)
|
|
+ [Other enhancements](#other-enhancements)
|
|
+ [Other new APIs](#other-new-apis)
|
|
+ [Changes leading to incompatibility](#changes-leading-to-incompatibility)
|
|
+ [Deprecated APIs](#deprecated-apis)
|
|
|
|
## Version 4.9.2
|
|
|
|
The MiniGUI development team announces the availability of MiniGUI 4.9.2,
|
|
which is the third preview release of MiniGUI 5.0.0.
|
|
|
|
This is an unstable release to show you some new and exciting features.
|
|
Here `unstable` means that the new APIs we introduced in this version
|
|
may change in the official release.
|
|
|
|
Nevertheless, we did our best to ensure backward compatibility of the
|
|
existed APIs so that the old applications can smoothly migrate to the new
|
|
version. We recommend that you test this version and report any bugs and
|
|
incompatibilities in
|
|
|
|
<https://github.com/VincentWei/minigui/tree/dev-4-1>
|
|
|
|
### What's new in this version
|
|
|
|
In the development of version 4.9.x, we introduced the following new and
|
|
exciting features for MiniGUI:
|
|
|
|
* ENHANCEMENTS:
|
|
- Support for compositing schema under MiniGUI-Processes runtime mode.
|
|
This feature brings the exciting visual effects which are popular
|
|
on modern desktop computers or smart phones to MiniGUI.
|
|
- New main window types/levels. You now can easily create main windows
|
|
in different z-order levels. This enhancement allows us to create
|
|
a special app which acts as screen lock, docker, or launcher.
|
|
- Virtual Window. You now can easily create message threads under all
|
|
runtime modes to exploit the messaging mechanism of MiniGUI in
|
|
non GUI threads - we call them message threads.
|
|
- Enhanced timer support. MiniGUI now manages the timers per message thread.
|
|
Under MiniGUI-Threads runtime mode, you can set up 32 (64 on 64-bit
|
|
architecture) timers for each GUI threads. If you enabled virtual window,
|
|
you can also do this for each message thread.
|
|
- Support for listening a file descriptor as long as the underlying system
|
|
has the `select()` system call for all runtime modes. Now you can call
|
|
`RegisterListenFD()` to register a file descriptor to be listened, and
|
|
handle `MSG_FDEVENT` in your window callback procedure to read/write
|
|
from/to the file descriptor. Before this version, this feature only
|
|
available for MiniGUI-Processes runtime mode.
|
|
- Support for local data of windows. You can now set or retrieve a local data
|
|
which is bound with a string name for a window. This will give you an
|
|
eays-to-use interface to manage various data of a window.
|
|
- Support for hardware cursors under compositing schema. MiniGUI now can
|
|
utilize the hardware cursors if your graphics device support it.
|
|
You can also load a cursor from a PNG file.
|
|
- Support for loading icon from a bitmap file. You can now load an icon
|
|
from a bitmap file such as a PNG file.
|
|
- Unified the message hook functions for all runtime modes. MiniGUI now
|
|
provides the consistent message hook functions for all runtime modes.
|
|
- Use the update regions for cumulative updating the screen. This will
|
|
eliminate the flickers due to the frequently redrawing of controls.
|
|
* ADJUSTMENTS:
|
|
- `g_rcScr` now is defined a macro calling function `GetScreenRect()`.
|
|
- `mgIsServer` now is define a macro calling function `IsServer()`.
|
|
* TUNNING
|
|
- Tune the `drm` (DRM) engine to support MiniGUI-Processes runtime mode
|
|
and compositing schema.
|
|
- Tune the `fbcon` (Linux Frame Buffer) engine to support compositing schema.
|
|
- Tune the `commlcd` (common LCD) engine to support cumulative updating and
|
|
compositing schema.
|
|
- Tune the `dummy` GAL engine to support MiniGUI-Processes runtime mode.
|
|
compositing schema.
|
|
- Fix some bugs.
|
|
* CLEANUP:
|
|
- Cleaned up a lot of internal symbols (the external functions and
|
|
global variables) in order to avoid name polution.
|
|
- Refactored the code for the following modules: z-order management,
|
|
message queue, event/message handling, and part of graphics abstract
|
|
layer.
|
|
|
|
The following new features will be developed in the successive versions of
|
|
4.9.x:
|
|
|
|
- Enhance other frequently used GAL engines to support compositing schema.
|
|
|
|
### Compositing schema
|
|
|
|
In this version, we enhanced the MiniGUI-Processes runtime mode to support
|
|
the compositing schema. Under compositing schema, regardless a main window
|
|
is created by the server (`mginit`) or a client, it renders the content in
|
|
a separate rendering buffer, and the server composites the contents from
|
|
all visible main windows to the ultimate scan-out frame buffer according to
|
|
the z-order information.
|
|
|
|
On the contrary, the legacy schema of MiniGUI-Processes uses the same
|
|
frame buffer for all processes (and all main windows) in the system.
|
|
So the legacy schema is also called the shared frame buffer schema.
|
|
|
|
Note that we often call a rendering buffer as a `surface`.
|
|
|
|
MiniGUI Core implements a compositor called 'fallback' as the built-in
|
|
compositor, which composites the contents of all windows in the classical
|
|
overlapped way.
|
|
|
|
But you can implement your own compositor by writing your
|
|
own server, i.e., `mginit`. You can also implement your customized compositor
|
|
in a shared library which can be loaded by MiniGUI Core dynamically.
|
|
|
|
By enabling the compositing schema, MiniGUI now provides a better
|
|
implementation for multi-process environment:
|
|
|
|
- Easy to implement advanced user interfaces with rounded corners, shadows,
|
|
alpha blending, blurring, and so on.
|
|
- Easy to implement animations for switching among main windows.
|
|
- Better security. One client created by different user cannot
|
|
read/write contents in/to another windows owned by other clients.
|
|
|
|
The major flaws of the compositing schema are as follow:
|
|
|
|
- It needs larger memory than the legacy schema to show multiple
|
|
windows at the same time. Therefore, we may need a client manager
|
|
to kill a client which runs in background and in full screen mode
|
|
if you are running MiniGUI on an embedded system, like Android
|
|
or iOS does.
|
|
- It may need a hardware-accelerated NEWGAL engine to get a smooth
|
|
user experience.
|
|
|
|
#### Compile-time configuration for compositing schema
|
|
|
|
- Use `--enable-compositing` to enable the compositing
|
|
schema when you configure the runtime mode of MiniGUI as
|
|
MiniGUI-Processes (`--with-runmode=procs`).
|
|
- Use `--disable-compositing` to disable the compositing schema
|
|
and enable the legacy schema (the shared frame buffer schema).
|
|
|
|
Note that, the compositing schema only works under MiniGUI-Processes runtime
|
|
mode.
|
|
|
|
#### Runtime configuration for compositing schema
|
|
|
|
```
|
|
[compositing_schema]
|
|
# The size of wallpaper pattern surface (the fake screen for clients).
|
|
# Optional values: <w>x<h>, full, half, quarter, octant, and empty.
|
|
# Default value is empty.
|
|
wallpaper_pattern_size=full
|
|
# wallpaper_pattern_size=half
|
|
# wallpaper_pattern_size=quarter
|
|
# wallpaper_pattern_size=octant
|
|
# wallpaper_pattern_size=empty
|
|
# wallpaper_pattern_size=32x32
|
|
compositor=my_compositor.so
|
|
```
|
|
|
|
As mentioned above, when using the compositing schema, the client processes
|
|
can not access the ultimate scan out frame buffer. However, MiniGUI provides
|
|
a graphics device context called `HDC_SCREEN` for apps. In order to provide
|
|
a backward compatibility, we implement the `HDC_SCREEN` as a special surface
|
|
which can be shared among all processes under MiniGUI-Processes runtime mode,
|
|
and one compositor can use the contents in this surface to render the wallpaper.
|
|
|
|
We call the special surface as the wallpaper pattern. You can specify the
|
|
size via the runtime configuration key `compsoting_schema.wallpaper_patter_size`.
|
|
All contents you rendered by using `HDC_SCREEN` in your applications will
|
|
appears in the shared surface ultimately. And the compositor can use the contents
|
|
in the shared surface to show a wallpaper or just ignore it.
|
|
|
|
The key in the runtime configuration `compsoiting_schema.compsoitor` specify
|
|
the shared library to load as the default compositor. If it is not specified, or
|
|
failed to load it, MiniGUI will use the built-in compositor: the fallback
|
|
compositor.
|
|
|
|
The fallback compositor implement a group of basic compositing actions. It renders
|
|
the contents of all visible main windows in the classical overlapped way in their
|
|
intrinsic z-order information. It keeps as simple as possible, so it does not
|
|
implement the following features:
|
|
|
|
- no border shadows.
|
|
- no support for complex compositing types, e.g., blurred.
|
|
- no any visual animations.
|
|
|
|
#### New APIs for compositing schema
|
|
|
|
In order to use the compositing schema under MiniGUI-Processes runtime mode,
|
|
we introduce some new APIs for the app:
|
|
|
|
- `CreateMainWindowEx2`: This function is an extension of `CreateMainWindowEx`.
|
|
It creates a main window by using the legacy create information and the
|
|
specified compositing type, the compositing argument, the surface type,
|
|
the background color, and returns the handle to the new main window:
|
|
+ The compositing type: one of `CT_OPAQUE`, `CT_COLORKEY`,
|
|
`CT_ALPHACHANNEL`, `CT_ALPHAPIXEL`, `CT_BLURRED`, or other compositing
|
|
types defined by a customized compositor. By using this argument, you
|
|
specify how the contents in a main window will be composited to the
|
|
screen.
|
|
+ The compositing argument: one DWORD value. You generally pass a color
|
|
for this argument. For example, for the compositing type `CT_COLORKEY`,
|
|
you need to use this argument to tell the compositor the color acts
|
|
as the key.
|
|
+ The surface type: you can specify the new main window uses a different
|
|
surface type instead of the one same as the screen. Here the surface type
|
|
mainly means the pixel format of the surface. For example, on a screen
|
|
with RGB656 pixel format, if you want to use the compositing type
|
|
`CT_ALPHAPIXEL`, you need to create a surface with type `ST_PIXEL_ARGB8888`
|
|
or `ST_PIXEL_ARGB4444`.
|
|
+ The background color in DWORD representation. When you use a surface type
|
|
other than `ST_PIXEL_DEFAULT`, you need this argument to pass the background
|
|
color of the main window in a DWORD value. This is because that
|
|
you can only pass a pixel value in the default screen surface type via
|
|
the legacy create information structure (`MAINWINCREATE`).
|
|
- `SetMainWindowCompositing`: This function sets the compositing type and
|
|
the compositing argument of a main window. By using this function,
|
|
you can change the compositing type and the argument of a main window on the fly.
|
|
|
|
MiniGUI defines the following built-in compositing types:
|
|
|
|
- `CT_OPAQUE`: The main window is opaque. This is the default compositing type
|
|
if you create a main window by calling legacy `CreateMainWindow` and
|
|
`CreateMainWindowEx` functions.
|
|
- `CT_COLORKEY`: Use a specific color as the transparency key when composting
|
|
the contents of the main window to the screen. You should specify
|
|
the color along with the compositing argument in a DWORD representation.
|
|
- `CT_ALPHACHANNEL`: Use a specific alpha channel value when compositing the
|
|
contents of the main window to the screen.
|
|
- `CT_ALPHAPIXEL`: Use the alpha component of the rendering buffer when
|
|
composting the contents of the main window.
|
|
- `CT_BLURRED`: Apply a Gaussian blur to the contents blew of the main window.
|
|
Generally, when using this composting type, the alpha component of the pixels
|
|
will go into effect.
|
|
|
|
Note that MiniGUI allows a customized compositor to define new compositing types.
|
|
|
|
If you want to develop a new compositor, you may need the following new APIs:
|
|
|
|
- `ServerRegisterCompositor`: Register a compositor.
|
|
- `ServerUnregisterCompositor`: Unregister a compositor.
|
|
- `ServerSelectCompositor`: Select a compositor.
|
|
- `ServerGetCompositorOps`: Get the operations of a specific compositor.
|
|
|
|
As mentioned before, MiniGUI will try to load the default compositor defined
|
|
by the runtime configuration key `compositing_schema.compositor` first.
|
|
MiniGUI will call a stub called `__ex_compositor_get` in the shared library to
|
|
get the pointer to the compositor operation structure for the default compositor,
|
|
and select the compositor as the current compositor.
|
|
|
|
When implementing your customized compositor, you may need the following APIs
|
|
to get the z-order information and the information of a z-order node:
|
|
|
|
- `ServerGetNextZNode` or `ServerGetPrevZNode`: travels the z-order nodes.
|
|
- `ServerGetWinZNodeHeader` and `ServerReleaseWinZNodeHeader`: get/lock and
|
|
release a z-node of a main window.
|
|
- `ServerGetPopupMenusCount`, `ServerGetPopupMenuZNodeHeader`, and
|
|
`ServerReleasePopupMenuZNodeHeader`: get/lock and release a z-order node
|
|
of pop-up menus.
|
|
- `ServerGetPopupMenuZNodeRegion` and `ServerGetWinZNodeRegion`:
|
|
- `ServerSetWinZNodePrivateData` and `ServerGetWinZNodePrivateData`:
|
|
- `ServerSetPopupMenuZNodePrivateData` and `ServerGetPopupMenuZNodePrivateData`:
|
|
|
|
By using the information returned by the functions above and the basic GDI
|
|
functions of MiniGUI, you can easily implement a customized compositor.
|
|
|
|
Note that:
|
|
|
|
- A compositor always runs in the server, i.e., `mginit`. A client of
|
|
MiniGUI-Processes can not call these functions.
|
|
- A compositor always compositing the contents from z-nodes to the special DC
|
|
called `HDC_SCREEN_SYS`. This DC is the only one represents the ultimate
|
|
screen under compositing schema.
|
|
- You should call `SyncUpdateDC (HDC_SCREEN_SYS);` when you need to update the
|
|
rendering result to the screen.
|
|
- You can use a third-party graphics library like Cairo, OpenGL, OpenGL ES, or
|
|
mGPlus to render the contents in your customized compositor.
|
|
|
|
You can refer to the source code of the fallback compositor for the usage of
|
|
the functions above:
|
|
|
|
```
|
|
minigui/src/kernel/compsor-fallback.c
|
|
```
|
|
|
|
### New main window styles
|
|
|
|
In this version, we also enhanced the window manager of MiniGUI Core
|
|
to support some special main window types.
|
|
|
|
Before 5.0.0, you can create a topmost main window with the style
|
|
`WS_EX_TOPMOST` in order to show the main window above all normal main windows,
|
|
and if you use MiniGUI-Processes runtime mode, the server (`mginit`) will
|
|
always create global main windows, which are shown on other main windows
|
|
created by clients.
|
|
|
|
Since 5.0.0, we introduce a concept of z-order levels for main windows.
|
|
There are eight levels in MiniGUI from top to bottom:
|
|
|
|
- The tooltip level (`WS_EX_WINTYPE_TOOLTIP`).
|
|
- The system/global level (`WS_EX_WINTYPE_GLOBAL`).
|
|
- The screen lock level (`WS_EX_WINTYPE_SCREENLOCK`).
|
|
- The docker level (`WS_EX_WINTYPE_DOCKER`).
|
|
- The higher level (`WS_EX_WINTYPE_HIGHER`).
|
|
- The normal level (`WS_EX_WINTYPE_NORMAL`).
|
|
- The launcher level (`WS_EX_WINTYPE_LAUNCHER`).
|
|
- The desktop or wallpaper.
|
|
|
|
We use new extended styles like `WS_EX_WINTYPE_GLOBAL` to create main windows
|
|
in different levels. For historical reasons, you can still use the legacy style
|
|
`WS_EX_TOPMOST`, but MiniGUI will create a main window in the higher
|
|
level for this style.
|
|
|
|
By default, without the style `WS_EX_TOPMOST` or a style like
|
|
`WS_EX_WINTYPE_GLOBAL`, MiniGUI will create a main window in
|
|
the normal level.
|
|
|
|
The main windows in the desktop level are managed by MiniGUI.
|
|
Any MiniGUI process instance has a virtual desktop window. The desktop
|
|
window is an internal object, so no API is provided for app to create
|
|
or manage the desktop window.
|
|
|
|
Note that, under MiniGUI-Processes runtime mode, only the first client
|
|
creates the first main window in a z-order level other than higher and normal
|
|
levels can create another main window in the same z-order level. And only
|
|
the server can create a main window in the global z-order level.
|
|
|
|
This is a security design for the multi-process runtime environment.
|
|
|
|
In this version, we also introduce a new extended style called
|
|
`WS_EX_AUTOPOSITION`.
|
|
|
|
If a main window has this extended style when creating it, MiniGUI will
|
|
determine the position in the screen for the main window. If the width
|
|
or the height of the window specified in `MAINWINCREATE` structure is zero,
|
|
MiniGUI will also determine a default size for the main window.
|
|
|
|
Under the compositing schema, the compositor is responsible to calculate
|
|
the position and the size for a main window.
|
|
|
|
The new `WS_ALWAYSTOP` style can be used to pin a main window on
|
|
the top of other main windows in the same z-order level.
|
|
|
|
### Virtual window
|
|
|
|
You know that we can post or send a message to other windows which
|
|
may run in another thread under MiniGUI-Threads. The MiniGUI
|
|
messaging functions such as `PostMessage()`, `SendMessage()`,
|
|
`SendNotifyMessage()`, and the window callback procedure
|
|
provide a flexible, efficient, safe, and flexible data transfer
|
|
and synchronization mechanism for your multithreaded applications.
|
|
|
|
For example, you can send or post a message to a window from a
|
|
general purpose thread which may download a file from a remote
|
|
server under MiniGUI-Threads.
|
|
|
|
But can we use the MiniGUI messaging mechanism under
|
|
MiniGUI-Processes and MiniGUI-Standalone runtime modes for
|
|
multithreading purpose? For example, we may download a file in a
|
|
general thread and inform a window when the file is ready.
|
|
|
|
Furthermore, if we want to use the MiniGUI messaging mechanism in
|
|
a general thread to handle messages from other threads, how to do this?
|
|
|
|
The virtual window provides a solution for the requirements above.
|
|
A virtual window is a special window object which does not have
|
|
a visible window area. But after you create a virtual window in
|
|
a different thread, you can use the MiniGUI messaging mechanism
|
|
to post or send messages between the current main window thread
|
|
and the new thread.
|
|
|
|
In MiniGUI, we call a thread creating a main window as a GUI thread,
|
|
and a thread creating a virtual window as a message thread.
|
|
|
|
It is important to know the following key points about virtual
|
|
window:
|
|
|
|
- It is enabled automatically under MiniGUI-Threads runtime mode.
|
|
- It can be enabled by using the compile-time configuration option
|
|
`--enable-virtualwindow`, or define `_MGHAVE_VIRTUAL_WINDOW` macro
|
|
under MiniGUI-Processes and MiniGUI-Standalone runtime modes.
|
|
- You can create multiple GUI threads under MiniGUI-Threads, but you
|
|
cannot create multiple GUI threads under MiniGUI-Processes and
|
|
MiniGUI-Standalone runtime modes. In other words, there is only one
|
|
GUI thread (the main thread) under MiniGUI-Processes and
|
|
MiniGUI-Standalone runtime modes.
|
|
- Regardless of the runtime mode, you can create multiple message
|
|
threads, and you can also create multiple virtual windows in
|
|
one message thread.
|
|
- It is possible to create a virtual window in a GUI thread, although
|
|
we do not encourage to do this.
|
|
- Essentially, a virtual window is a simplified main window.
|
|
It consumes very little memory space, but provides a complete
|
|
MiniGUI messaging mechanism for a general multithreaded app.
|
|
- When virtual window is enabled (or under MiniGUI-Threads runtime mode),
|
|
you can use the MiniGUI messaging facilities to post or send messages
|
|
to a window, or notify a window from a general thread.
|
|
|
|
A virtual window will get the following system messages in its life
|
|
life-cycle:
|
|
|
|
- `MSG_CREATE`: this message will be sent to the virtual window when
|
|
you call \a `CreateVirtualWindow` function.
|
|
- `MSG_CLOSE`: this message will be sent to the virtual window when
|
|
the system asks to close the virtual window.
|
|
- `MSG_DESTROY`: this message will be sent to the virtual window when
|
|
the system tries to destroy the virtual window, or after you
|
|
called \a `DestroyVirtualWindow` function.
|
|
- `MSG_IDLE`: When there is no any message in the message queue, all
|
|
virtual windows living in the message thread will get this idle
|
|
message.
|
|
- `MSG_TIMER`: When a timer expired after you call `SetTimer` to
|
|
set up a timer for a virtual window.
|
|
- `MSG_QUIT`: quit the message loop.
|
|
- `MSG_GETTEXT`: To query the caption of the virtual window.
|
|
- `MSG_SETTEXT`: To set the caption of the virtual window.
|
|
- `MSG_GETTEXTLENGTH`: To query the caption length of the virtual window.
|
|
- `MSG_FDEVENT`: Send to the window procedure when there is a read/write/except
|
|
event on a listened file descriptor.
|
|
|
|
You can call `DefaultVirtualWinProc` in your window procedure for a virtual
|
|
window for the default handling of the messages above.
|
|
|
|
A virtual window has the following properties:
|
|
|
|
- The additional data and the additional data 2.
|
|
- The identifier in a LINT value.
|
|
- The notification callback procedure.
|
|
- The caption.
|
|
- The local data.
|
|
|
|
Therefore, the following APIs can be called for a virtual window:
|
|
|
|
- `DefaultWindowProc`
|
|
- `GetWindowId`
|
|
- `SetWindowId`
|
|
- `GetThreadByWindow`
|
|
- `GetWindowAdditionalData`
|
|
- `SetWindowAdditionalData`
|
|
- `GetWindowAdditionalData2`
|
|
- `SetWindowAdditionalData2`
|
|
- `GetClassName`: always returns `VIRTWINDOW` for a virtual window.
|
|
- `GetWindowCallbackProc`
|
|
- `SetWindowCallbackProc`
|
|
- `GetWindowCaption`
|
|
- `SetWindowCaption`
|
|
- `GetWindowTextLength`
|
|
- `GetWindowText`
|
|
- `SetWindowText`
|
|
- `GetNotificationCallback`
|
|
- `SetNotificationCallback`
|
|
- `SetWindowLocalData`
|
|
- `GetWindowLocalData`
|
|
- `RemoveWindowLocalData`
|
|
- `RegisterEventHookWindow`
|
|
- `UnregisterEventHookWindow`
|
|
- `RegisterKeyHookWindow`
|
|
- `RegisterMouseHookWindow`
|
|
- `RegisterListenFD`
|
|
- `UnregisterListenFD`
|
|
|
|
Like a main window, when you want to create a virtual window, you call
|
|
`CreateVirtualWindow`, and when you wan to destroy a virtual window, you call
|
|
`DestroyVirtualWindow`. You must call `VirtualWindowCleanup` to cleanup the
|
|
system resource used by the virtual window after done with it, e.g., after
|
|
quitting the message loop.
|
|
|
|
### Other enhancements
|
|
|
|
#### Window identifier
|
|
|
|
Before 5.0.0, MiniGUI only provides the APIs to retrieve a control based on
|
|
the identifier. Since 5.0.0, you can calling the following APIs on a
|
|
main window or a virtual window on the basis of identifier:
|
|
|
|
- `GetWindowId`: return the identifier of a specific window.
|
|
- `SetWindowId`: set the identifier of a specific window.
|
|
|
|
Note that all main windows and/or virtual windows in a thread form a window tree.
|
|
The root window of the tree may be `HWND_DESKTOP` or the first main/virtual
|
|
window created in the thread. You can call `GetRootWindow` to retrieve the
|
|
root window of the current thread.
|
|
|
|
You can travel the window tree by calling the old API `GetNextHosted`. Since 5.0.0,
|
|
you can retrieve a hosted main window or virtual window via a specific identifier
|
|
by calling `GetHostedById` function.
|
|
|
|
#### Local data of a window
|
|
|
|
Local data of a window are some void objects represented in DWORD values, and they
|
|
are bound with different string names. In a window's life cycle, you can set, get,
|
|
or remove a local data which is bound a specific name. This provides a easy-to-use
|
|
way to manage multiple and complex objects of a window.
|
|
|
|
- `SetWindowLocalData`: set a local data.
|
|
- `GetWindowLocalData`: get a local data.
|
|
- `RemoveWindowLocalData`: remove a local data.
|
|
|
|
Note that all local data will be removed automatically when you destroy a window.
|
|
|
|
#### Hardware cursor
|
|
|
|
Under the compositing schema, MiniGUI now can use the hardware cursor to show
|
|
the mouse pointer. And you can use the following APIs to load a PNG file as
|
|
the cursor:
|
|
|
|
- `LoadCursorFromPNGFile`
|
|
- `LoadCursorFromPNGMem`
|
|
|
|
For a GAL engine which supports hardware cursors, it needs to implement the
|
|
following new methods:
|
|
|
|
- `AllocDumbSurface`/`FreeDumbSurface`: allocate/free a dumb surface.
|
|
Note that each hardware cursor uses a specific dumb surface. Here, a `dumb`
|
|
surface is a term introduced by the DRM driver of Linux. It means that
|
|
the surface does not provide any hardware acceleration functions.
|
|
- `SetCursor`: Set a dumb surface as the cursor, along with the hotspot of
|
|
of the cursor.
|
|
- `MoveCursor`: Move the cursor to a new position.
|
|
|
|
#### Loading an icon from bitmap files
|
|
|
|
As described before, you can create a main window to use a special surface type
|
|
under compositing schema. That is, the surface for the main window will have
|
|
a different pixel type from the screen. In other words, it is not compatible
|
|
with the screen. Therefore, we have to change some internal implementation
|
|
to reflect this enhancement. One of the changes is the icon of a window.
|
|
|
|
Since 5.0.0, an icon for a main window is always stored in a ARGB8888 surface,
|
|
so that it can be rendered correctly into the surface of any main window.
|
|
|
|
We also introduced some new APIs to load an icon from a PNG file or other bitmap
|
|
files:
|
|
|
|
- `LoadBitmapIconEx`, `LoadBitmapIconFromFile`, and `LoadBitmapIconFromMem`.
|
|
|
|
#### Loading system bitmaps for private surface
|
|
|
|
Another change is about the system bitmaps. The system bitmaps are often used
|
|
by a look-and-feel renderer to render the caption bar or the border of
|
|
a main window or a control. For a main window which may have a different surface
|
|
type under compositing schema, one L&F renderer can not use the system bitmaps
|
|
loaded by `GetSystemBitmapEx` function. Because the function only loads the
|
|
system bitmaps for `HDC_SCREEN`.
|
|
|
|
Therefore, we introduce a new function to load the system bitmaps:
|
|
|
|
- `GetSystemBitmapEx2`. This function will load the system bitmaps for
|
|
the specific device context.
|
|
|
|
We have tuned the built-in look and feel renderers to use the new function
|
|
to load the system bitmaps. If you want to use a customized look and feel
|
|
renderer under compositing schema, you must change the code to use the new
|
|
function to load the system bitmaps.
|
|
|
|
#### Unified event hook functions
|
|
|
|
- `RegisterEventHookFunc`
|
|
- `RegisterEventHookWindow` and `UnregisterEventHookWindow`
|
|
|
|
#### Listening file descriptor under all runtime modes
|
|
|
|
Since 5.0.0, MiniGUI provides support for listening a file descriptor
|
|
as long as the underlying system has the `select()` system call for all
|
|
runtime modes. Now you can call `RegisterListenFD()` to register a
|
|
file descriptor to be listened, and handle `MSG_FDEVENT` in your window
|
|
callback procedure to read/write from/to the file descriptor.
|
|
|
|
Before this version, this feature only available for MiniGUI-Processes
|
|
runtime mode.
|
|
|
|
By using this feature, you can listen and handle a file descriptor in
|
|
a message thread by using the virtual window. This is a powerful mechanism
|
|
for a multithreaded application.
|
|
|
|
Note that MiniGUI no longer limits the max number of listening file descriptors,
|
|
MiniGUI will try to allocate space to manage all listening file descriptors.
|
|
|
|
#### Enhanced timer
|
|
|
|
Since 5.0.0, MiniGUI manages the timers per message thread.
|
|
Under MiniGUI-Threads runtime mode, you can set up 32 (64 on 64-bit
|
|
architecture) timers for each GUI threads. If you enabled virtual window,
|
|
you can also do this for each message thread.
|
|
|
|
The function `IsTimerInstalled` checks the timers installed for the current
|
|
thread, and the function `HaveFreeTimer` also checks the free timer slots
|
|
for the current thread.
|
|
|
|
### Other new APIs
|
|
|
|
For MiniGUI-Processes runtime mode:
|
|
|
|
- `IsServer`: Under MiniGUI-Processes runtime mode, return whether the process
|
|
is the server (`mginit`) or a client.
|
|
- `MoveToLayer`: Called by a client to move itself to a specific layer. .
|
|
- `ServerMoveClientToLayer`: The server version of `MoveToLayer`.
|
|
- `ServerSendReplyEx`: The extended version of legacy `ServerSendRely`. It can
|
|
transfer a file descriptor between the server and the client.
|
|
- `RegisterRequestHandlerV1`: To register a request handler in version 1. The
|
|
request handler can handle the file descriptor received from the client.
|
|
- `GetRequestHandlerV1`: Get the registered request handler in version 1.
|
|
- `GetRequestHandlerEx`: Get the registered request handler and its version.
|
|
|
|
Global scope:
|
|
|
|
- `GetScreenRect`: Return a RECT as the screen rectangle.
|
|
|
|
For MiniGUI-Threads or when virtual window enabled:
|
|
|
|
- `GetThreadByWindow`: Return the thread identifier of a window.
|
|
- `IsWindowInThisThread`: Determine whether a window is created by the current
|
|
thread.
|
|
- `IsVirtualWindow`: Determine whether a window is a virtual window.
|
|
- `CreateThreadForMessaging`: Create a thread for messaging.
|
|
|
|
For messaging mechanism:
|
|
|
|
- `SendPriorNotifyMessage`: Send a prior notification message. Generally, a
|
|
notification message is put at the tail of the message list. This function
|
|
put the notification message at the head of the list.
|
|
- `NotifyWindow`: Send a notification message to a specific window.
|
|
- `BroadcastMessageInThisThread`: Broadcast a message in the current thread.
|
|
- `PreDefVirtualWinProc`: The pre-defined window procedure for a virtual window.
|
|
- `DefaultVirtualWinProc`: The default window procedure for a virtual window.
|
|
|
|
- `GetDCEx`: A extended version of `GetDC` and `GetClientDC`.
|
|
- `GetEffectiveCDC`: Get a effective device context for painting a window.
|
|
- `GetDCInSecondarySurface`: Get a device content for a main window or a control
|
|
in the secondary surface if the main window has set the secondary DC.
|
|
- `DWORD2PixelByWindow`: Convert a DWORD color to pixel value for a window..
|
|
- `AreRegionsIntersected`: Determine whether two regions are intersected.
|
|
- `SyncUpdateSurface`: Synchronize the update rectangles of the backing surface of
|
|
a window to screen.
|
|
- `SyncUpdateDC`: Synchronize the update rectangles of the surface corresponding to
|
|
a DC to screen.
|
|
- `LoadBitmapEx2`: The extended version of legacy `LoadBitmapEx` function. You can
|
|
specify a callback to allocate the buffer for the MiniGUI bitmap loader.
|
|
|
|
- `MSG_MOVEWINDOW`: This message will be sent as a notification after calling
|
|
`MoveWindow`.
|
|
|
|
### Changes leading to incompatibility
|
|
|
|
#### Look and feel renderer
|
|
|
|
As we mentioned before. If you want to use a customized look and feel
|
|
renderer under compositing schema, you must change the code to use the new
|
|
function `GetSystemBitmapEx2` to load the system bitmaps. For example, the
|
|
old code:
|
|
|
|
```
|
|
const BITMAP* radio_bmp;
|
|
|
|
radio_bmp =
|
|
GetSystemBitmapEx (__mg_wnd_rdr_classic.name, SYSBMP_RADIOBUTTON);
|
|
```
|
|
|
|
should be revised:
|
|
|
|
```
|
|
const BITMAP* radio_bmp;
|
|
|
|
radio_bmp =
|
|
GetSystemBitmapEx2 (hdc, __mg_wnd_rdr_classic.name, SYSBMP_RADIOBUTTON);
|
|
```
|
|
|
|
For the same reason, you should always call `GetWindowElementPixelEx` to
|
|
get the pixel value of a window element for a specific device context.
|
|
|
|
Fortunately, MiniGUI has passed the correct device context (`hdc`) for all
|
|
operations of a L&F renderer. So it is every easy to revise the code to use
|
|
the new function.
|
|
|
|
#### `WNDCLASS`
|
|
|
|
In order to support the private surface of a main window under compositing
|
|
schema, the `WNDCLASS` structure to register a control class also changed.
|
|
|
|
Since 5.0.0, the field `iBkColor` only available for shared frame buffer
|
|
schema. Under compositing schema, you must use `dwBkColor` field to
|
|
specify the background color for a control.
|
|
|
|
This introduces a source code incompatibility, you should change
|
|
you code with a conditional compilation statement block:
|
|
|
|
```
|
|
#ifdef _MGSCHEMA_COMPOSITING
|
|
MyClass.dwBkColor = RGBA_lightwhite;
|
|
#else
|
|
MyClass.iBkColor = PIXEL_lightwhite;
|
|
#endif
|
|
```
|
|
|
|
Note that the macros with the prefix `RGBA_` are new constants introduced for
|
|
the standard colors in DWORD representation. While the legacy macros with the
|
|
prefix `PIXEL_` give the pixel values for the screen.
|
|
|
|
#### `mgIsServer`
|
|
|
|
We make `mgIsServer` to be a macro calling `IsServer`. That is, `mgIsServer`
|
|
is no longer a global variable. Generally, this change will not break the source
|
|
code compatibility.
|
|
|
|
#### `g_rcScr`
|
|
|
|
Before version 5.0.0, `g_rcScr` is a global variable of `RECT` structure.
|
|
Since 5.0.0, we define it as a macro calling `GetScreenRect`:
|
|
|
|
```
|
|
RECT GUIAPI GetScreenRect (void);
|
|
|
|
#define g_rcScr (GetScreenRect())
|
|
```
|
|
|
|
This change breaks the source code compatibility. The compiler will complain
|
|
if you use `&g_rcScr`:
|
|
|
|
```
|
|
RECT rc;
|
|
CopyRect (&rc, &g_rcScr);
|
|
```
|
|
|
|
To fix it, you need to change the source code in this way:
|
|
|
|
```
|
|
RECT rc = g_rcScr;
|
|
```
|
|
|
|
Note that the legacy `g_rcDesktop` symbol is also defined as the macro calling
|
|
`GetScreenRect()` function.
|
|
|
|
#### `HDC_SCREEN`
|
|
|
|
Some code use `HDC_SCREEN` to determine the screen resolution by calling
|
|
function `GetGDCapability`, or draw some things directly to the screen.
|
|
This will not work under MiniGUI-Processes with the compositing schema.
|
|
|
|
As described before, under MiniGUI-Processes with compositing schema,
|
|
`HDC_SCREEN` stands for a global shared surface for wallpaper pattern.
|
|
This surface is the ONLY surface that can be accessed by all processes
|
|
(including the server and all clients) under compositing schema.
|
|
|
|
This surface will have the same pixel format as the real screen.
|
|
Therefore, one app can still use `HDC_SCREEN` to create a compatible
|
|
memory DC, load bitmaps, or draw something to the surface. However,
|
|
the content in the wallpaper surface will not be reflected to
|
|
the whole screen; the compositor decides how to display the contents
|
|
in it.
|
|
|
|
On the other hand, you can configure MiniGUI to create a smaller
|
|
surface than the whole screen as the underlying surface of `HDC_SCREEN`,
|
|
and the compositor may use it as a pattern to tile the content
|
|
to the whole wallpaper.
|
|
|
|
Because of the change of `HDC_SCREEN`'s connotation, you should avoid
|
|
to use \a `GetGDCapability` to determine the screen's resolution.
|
|
Instead, you use the macro `g_rcScr` or the new function `GetScreenRect()`.
|
|
|
|
Note that, you can still use `HDC_SCREEN` under a runtime mode other than
|
|
MiniGUI-Processes, and MiniGUI-Processes with the shared frame buffer schema.
|
|
|
|
#### `WINDOWINFO` structure
|
|
|
|
The `WINDOWINFO` structure changed, all legacy members were reserved, but
|
|
the order changed. Do not assume the first field of the structure is the
|
|
position of the window.
|
|
|
|
### Deprecated APIs
|
|
|
|
The following APIs are deprecated:
|
|
|
|
- `InitVectorialFonts` and `TermVectorialFonts`, no need to call these functions.
|
|
- `GetWindowElementColor` and `GetWindowElementColorEx`,
|
|
use `GetWindowElementPixelEx` instead.
|
|
- `SetServerEventHook`, use `RegisterEventHookFunc` instead.
|
|
- `GetMainWinThread`, use `GetThreadByWindow` instead.
|
|
- `WaitMainWindowClose`, use system `pthread_join` instead.
|
|
- `MainWindowThreadCleanup`, use `MainWindowCleanup` instead.
|
|
|
|
Note that the functions are marked as deprecated, but you can still use them.
|
|
We recommend that you no longer use the functions in new applications.
|
|
|
|
[HybridOS]: https://github.com/FMSoftCN/hybridos
|
|
[HybridOS Foundation Class Library]: https://github.com/FMSoftCN/hybridos/tree/dev/device-side/hfcl
|
|
[CSS Text Module Level 3]: https://www.w3.org/TR/css-text-3/
|
|
[CSS Writing Modes Level 3]: https://www.w3.org/TR/css-writing-modes-3/
|
|
|