A small C library for building user interfaces with C, XML and CSS.
LCUI is a freely available software library for building user interfaces. It is written in C and supports the use of XML and CSS to describe the graphical interface of simple desktop apps.
- Written in C: Suitable for small applications written primarily in C.language designed for LCUI, it makes it easier to create interactive UIs.
- Cross platform: Support for Windows and Linux, you can write Windows Desktop apps and Universal Windows Platform apps, as well as Linux Desktop apps.
- XML + CSS: Support the use of XML and CSS to describe the GUI layout and style, saving interface development time and maintenance costs.
- Flexible: Support for adapting the interface to screens of different pixel densities by setting global scaling. Support for using screen density related sp and dp units to describe position and size of the elements.
- Simple image reading: Provide jpg, png and bmp image read APIs.
- Touch: Supports multi-touch, but currently only on Windows platforms.
LCUI is a personal project, its main purpose is to allow the author to easily develop simple GUI applications.
What is "simple"? It means fewer features, for example:
- No hardware acceleration, graphics rendering is inefficient.
- Cannot select text and copy it on user interface.
- Cannot use CTRL+C to copy content, and cannot use CTRL+V to paste content to input boxes.
- Cannot use the Input Method Engine to input non-ASCII characters, like Chinese, Japanese, etc.
- Layout system is simple. Grid and table layouts are not supported.
- No English documentation, it is hard to use.
There are many similar open source projects(E.g: SDL, imgui) that can be referenced today, most of the missing features in LCUI can find relevant implementations from these projects, so the development cost of LCUI is also reduced a lot. One of the reasons for open source this project is to conduct technical exchanges. If you have research experience in similar projects, please consider providing improvements to this project.
Want to know what LCUI can do? You can view the following projects:
- LC Design - A UI component framework for building LCUI application.
- LC Finder - An image manager, it uses most of the features of LCUI, and you can use it as a reference to evaluate whether LCUI's performance and development complexity meets your needs.
- Trad - A language based on JavaScript syntax that can be compiled into C, it pre-built LCUI bindings, with its language features and JSX syntax support to easily create interactive graphical interfaces based on LCUI.
- SDL — X11 driver code reference
- FreeType — Data structure naming style reference
- LevelDB — Function naming style reference
- jQuery — Widget operation method naming style reference
- MDN — CSS standard reference
Quickly create an LCUI project using lcui-cli:
# Install lcui-cli
npm install -g @lcui/cli
# Create an LCUI project named myapp
lcui create myapp
# Go into project directory
cd myapp
# Run it
npm run start
Or, you can clone and run the lc-ui/lcui-quick-start repository to see a minimal LCUI app in action:
# Clone repository
git clone https://github.com/lc-ui/lcui-quick-start
# Go into the repository
cd lcui-quick-start
# Install NodeJS dependencies
npm install
# Install C/C++ dependencies for x64 CPU architecture
lcpkg install --arch x64
# Run the app with debug mode
lcpkg run start --mode debug
Want to write an LCUI application from scratch? you can use lcpkg to quick install LCUI in your project directory:
# Initialize the lcpkg configuration file to tell lcpkg about your project
lcpkg init
# Download and install the compiled LCUI library from GitHub
lcpkg install github.com/lc-soft/LCUI
After successful installation, follow the help documentation output by lcpkg to configure your project's build configuration.
If you want to manually compile LCUI from source code, use lcpkg in the LCUI source directory to install the dependency libraries:
lcpkg install
After that, Visual Studio to open the build/windows/LCUI.sln
file, and then build LCUI.
# Install the dependencies
sudo apt-get install libpng-dev libjpeg-dev libxml2-dev libfreetype6-dev libx11-dev
# Clone this repository
git clone https://github.com/lc-soft/LCUI.git
# Go into the repository
cd LCUI
# Generate automake configure script
./autogen.sh
# Check the build environment and configure automake scripts
./configure
# Build
make
# If you wnat install LCUI
sudo make install
# Go into test directory
cd test
# Run helloworld application
./helloworld
Note: If you want to customize the compiler, compile flags, install location, and other configuration items, read the INSTALL file.
There are many ways to contribute to LCUI.
- Submit bugs and help us verify fixes as they are checked in.
- Search for FIXME comments in the source code and try to fix them.
- Fund to you interested issue on IssueHunt to attract other developers to contribute.
- Support this project on OpenCollective.
- Review the source code changes.
- Contribute bug fixes.
LCUI has adopted the code of conduct defined by the Contributor Covenant. This document is used across many open source communities, and we think it articulates our values well. For more, see the Code of Conduct.
- Tutorial: https://docs.lcui.lc-soft.io/ (Chinese version only)
- Changelog: docs/CHANGES.md
The English version of the documentation is not available, because the author does not have time to write the English version, please read the files in the test directory and related projects to learn how to use LCUI.
-
Why develop it?
- To explore and experiment new GUI development way
- Get more good job and make more money
- Leave a mark on the world
- Pass the time
-
Is this a browser kernel? Or a development library like Electron that integrates the browser environment?
No, you can think of it as a traditional GUI development library that applied some Web technologies.
-
Why do I choose the LCUI instead of Electron?
In contrast to fully functional Electron, small file size and low memory usage doesn't matter, except for technical research and communication, there's no reason to use LCUI.
-
Is it the same as writing a web page?
Not exactly, there are the following differences need to be noted:
- The interface description file format is XML, slightly different from HTML.
- You need to implement all the features of your application in C code, which is much less development efficiency than JavaScript.
- No
<script>
tag, you can't embed JavaScript or C code like HTML. - The widget is the basic layout element, not the text, and there is no
inline
display type. - The scrollbar is a widget, and the
overflow: scroll;
style doesn't show scrollbars automatically, you need to create it and specify the container and scroll layer. - All text is rendered by the TextView widget, which has a display type of
block
instead ofinline
. - The widget does not overflow the bounding box of the parent widget, and the effect is similar to the applied style:
overflow: hidden;
. - An absolutely positioned widget is always relative to its parent widget, not the first non-statically positioned widget of the parent.
- There are no tools like Chrome Devtools to debug graphical interfaces, you need to rely on your own imagination and development experience to verify that the bug is from your code or LCUI.。
-
How about CSS support?
The following is a list of supported CSS features. Checked is supported (But does not mean full support). Unlisted properties are not supported by default.
CSS feature coverage
- at rules
-
@font-face
-
@keyframes
-
@media
-
- keywords
-
!important
-
- selectors
-
*
-
type
-
#id
-
.class
-
:hover
-
:focus
-
:active
-
:first-child
-
:last-child
-
[attr="value"]
-
:not()
-
:nth-child()
-
parent > child
-
a ~ b
-
::after
-
::before
- ...
-
- units
- px
- dp
- sp
- pt
- %
- rem
- vh
- vw
- properties
- top, right, bottom, left
- width, height
- visiblility
- display
- none
- inline-block
- block
- flex
- inline
- grid
- table
- table-cell
- table-row
- table-column
- ...
- position
- static
- relative
- absolute
- fixed
- box-sizing
- border-box
- content-box
- border
- border-radius
- background-color
- background-image
- background-position
- background-cover
- background
- pointer-evnets
- font-face
- font-family
- font-size
- font-style
- justify-content
- flex-start
- center
- flex-end
- float
- transition
- transform
- flex
- ...
- at rules
The LCUI Project is released under the MIT License.