A small C library for building user interfaces with C, XML and CSS

Overview

LCUI

A small C library for building user interfaces with C, XML and CSS.

GitHub Actions License Github Release Github All Releases Repo size Code size

Table of contents

Introduction

LCUI (LC's UI Library) is a small C library for building user interfaces.

中文版说明文档

Features

  • 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: Includes XML and CSS parsers, you can use XML and CSS to describe interface structure and style.
  • Web-like development experience: Since the design and implementation of LCUI's functions, including layout, CSS, and renderer, are mostly referenced from MDN documents and some popular web front-end development libraries, its development experience and interface effects will have some similarities to web pages. If you already have experience writing web pages with HTML and CSS, it will be easier to get started.
  • 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.

Screenshots

Hello App LC Finder
LCUI Router App LC Design

Related projects

Want to know what LCUI can do? You can view the following projects:

  • LCUI CLI - Command line interface for rapid LCUI development.
  • LCUI Router - The official router for LCUI. It provides a similar development experience to the Vue Router and make building multiple views applications with LCUI a breeze.
  • 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 preset LCUI bindings, provides React like development experience, makes it painless to create interactive UIs based on LCUI.
  • LCUI Quick Start - A minimal LCUI application.
  • LCUI Router App - A very simple browser-like application to show the LCUI and LCUI Router features.
  • LC Design App - A minimal LCUI application for preview LC Design component library.

Design references

  • 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

Quick start

Use LCUI CLI

LCUI CLI is a command line tool, you need to install Node.js before using it, and then run the following command to quickly experience it:

# Install lcui-cli and lcpkg
npm install -g @lcui/cli lcpkg

# Create an LCUI project named myapp
lcui create myapp

# Go into project directory
cd myapp

# set up the development environment for this project
lcui setup

# Build project
lcui build

# run project
lcui run

Manual compilation and installation

Windows

  1. Open CMD window, and run following command in the LCUI source directory to install the dependency libraries:
    lcpkg install
    # If you want compile for x64 CPU architecture
    lcpkg install --arch x64
    # If you want compile for Universal Windows Platform (UWP)
    lcpkg install --platform uwp
    lcpkg install --arch x64 --platform uwp
  2. Rename config.win32.h.in in the include directory to config.h.
  3. Open the build/windows/LCUI.sln file with Visual Studio, and then build LCUI.

Ubuntu

# 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 want to 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.

Contribution

Think LCUI is slow to update? there are many ways to contribute to LCUI.

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.

Documentation

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.

FAQ

  1. Why develop it?

    • Explore and experiment new GUI development way
    • Let other developers share about how to write better code
    • Make it easier for me to find better jobs to make more money
    • Pass the time
  2. 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.

  3. What do I need to pay attention to if I'm going to use it?

    We recommend that your project meet the following requirements:

    • The user interface is simple and does not require advanced features such as tables, animations, and transformations.
    • The code design is reasonable, and the core function code and UI logic code are independent of each other. Even if you find that the requirements are not met after using LCUI, you can easily migrate to other GUI libraries.
  4. Why do I choose the LCUI instead of Electron?

    In contrast to fully functional Electron, these features of LCUI, such as small binary file size and low memory usage, are not worth mentioning, except for technical research and share, you have no reason to use LCUI.

  5. 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
Comments
  • [License] Consider change license to MIT license

    [License] Consider change license to MIT license

    Some developer don't like GPL license, and their project source code is not very useful to me, so I will consider change license to MIT in 1.0.0 stable version.

    opened by lc-soft 29
  • Producing binaries

    Producing binaries

    Is your feature request related to a problem? Please describe. It's more of a question. I've noticed that the last release was in 5 Jul 2020 even though there has been way more recent commits. Is it possible that you do have to do it manually ? If so I could try and help setting up github actions to automate this.

    Describe the solution you'd like I could try and implement it via github actions.

    opened by WhoAteDaCake 18
  • Crashes unless LANG=en_US.UTF-8

    Crashes unless LANG=en_US.UTF-8

    [display] init ... [display] init ok, driver name: x11

    X Error of failed request: BadValue (integer parameter out of range for operation) Major opcode of failed request: 18 (X_ChangeProperty) Value in failed request: 0x0 Serial number of failed request: 25 Current serial number in output stream: 34

    $ locale LANG=en_US.UTF-8 ...

    LCUI version: downloaded from here (19.01.2017). OS and version: [Linux Mint 4.4.0-53-generic] Build tools: gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.4).

    Thanks!

    bug linux x11 
    opened by mrwert 17
  • Error occurs when building LCUI on GNU/Linux

    Error occurs when building LCUI on GNU/Linux

    I'm trying to build LCUI on my Fedora box but make fails, here is the error message in short:

    catch_screen.c: In function 'catch_screen':
    catch_screen.c:79:3: error: incompatible type for argument 1 of 'LCUIScreen_CatchGraph'
       LCUIScreen_CatchGraph( area, &graph );
    

    and here is the full ouput

    ➜  LCUI git:(master) ✗ ./configure
    ...
    Build with tslib support ........... : yes
    Build with libpng support .......... : yes
    Build with libjpeg support ......... : yes
    Build with libiconv support ........ : no
    Build with font-engine support ..... : none
    Build with thread support .......... : pthread
    Build with video support ........... : framebuffer
    
    ➜  LCUI git:(master) ✗ make
    Making all in src
    make[1]: Entering directory `/home/xcy/workspace/LCUI/src'
    Making all in bmp
    make[2]: Entering directory `/home/xcy/workspace/LCUI/src/bmp'
      CC       bmp.lo
      CC       jpeg.lo
      CC       png.lo
    png.c: In function 'Graph_WritePNG':
    png.c:124:29: warning: variable 'pos' set but not used [-Wunused-but-set-variable]
             int x, y, row_size, pos;
                                 ^
      CC       load_image.lo
      CCLD     libbmp.la
    make[2]: Leaving directory `/home/xcy/workspace/LCUI/src/bmp'
    Making all in misc
    make[2]: Entering directory `/home/xcy/workspace/LCUI/src/misc'
      CC       catch_screen.lo
    catch_screen.c: In function 'catch_screen':
    catch_screen.c:79:3: error: incompatible type for argument 1 of 'LCUIScreen_CatchGraph'
       LCUIScreen_CatchGraph( area, &graph );
       ^
    In file included from catch_screen.c:46:0:
    /home/xcy/workspace/LCUI/include/LCUI/LCUI_Display.h:82:14: note: expected 'struct LCUI_Graph *' but argument is of type 'LCUI_Rect'
     LCUI_API int LCUIScreen_CatchGraph( LCUI_Graph *graph, LCUI_Rect rect );
                  ^
    catch_screen.c:79:3: error: incompatible type for argument 2 of 'LCUIScreen_CatchGraph'
       LCUIScreen_CatchGraph( area, &graph );
       ^
    In file included from catch_screen.c:46:0:
    /home/xcy/workspace/LCUI/include/LCUI/LCUI_Display.h:82:14: note: expected 'LCUI_Rect' but argument is of type 'struct LCUI_Graph *'
     LCUI_API int LCUIScreen_CatchGraph( LCUI_Graph *graph, LCUI_Rect rect );
                  ^
    make[2]: *** [catch_screen.lo] Error 1
    make[2]: Leaving directory `/home/xcy/workspace/LCUI/src/misc'
    make[1]: *** [all-recursive] Error 1
    make[1]: Leaving directory `/home/xcy/workspace/LCUI/src'
    make: *** [all-recursive] Error 1
    
    ➜  LCUI git:(master) ✗ uname -a                  
    Linux fedora 3.14.7-200.fc20.x86_64 #1 SMP Wed Jun 11 22:38:05 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
    

    If you want to know more details please let me know.

    opened by xuchunyang 17
  • Protect against spurious wakeups

    Protect against spurious wakeups

    opened by elfring 15
  • perf: Add OpenMP support for widget rendering (#118)

    perf: Add OpenMP support for widget rendering (#118)

    Purpose

    Add OpenMP support for widget rendering (#118) .

    Changes

    • Modified src/Makefile.am and added compiler option.
    • Modified src/display.c and added preprocessor directives for OpenMP.
    • To check whether multithreading is possible, the string is output to standard output. However, I will remove it before merging.

    Screenshots

    • When OpenMP is not supported(change before) openmp_is_not_supported

    • When OpenMP is supported(change after) openmp_is_supported

    I printed thread_num to confirm that multiple threads were used. If there are no problems with the review, I will remove the thread_num output.

    To reproduce

    $ make
    $ make test
    

    In make test, there is only one rectangle in rects, the execution time was slightly longer due to overhead. I measured it with time make test.


    IssueHunt Summary

    Referenced issues

    This pull request has been submitted to:


    IssueHunt has been backed by the following sponsors. Become a sponsor

    opened by hyugabokko 12
  • Add custom settings

    Add custom settings

    Issuehunt badges

    Describe the solution you'd like

    • Add LCUI_Settings settings to src/main.c:MainApp.
    • Add files:
      • src/setttings.c
      • include/LCUI/settings.h
    • Change related files to apply settings:
      • src/main.c
      • src/gui/widget_task.c
      • src/display.c
      • ...

    Usage:

    LCUI_SettingsRec settings;
    
    // Get global settings of the LCUI
    Settings_Init(&settings);
    
    // default settings:
    // settings.paint_flashing = FALSE
    // settings.Frame_rate_cap = 120
    // settings.fps_meter = FALSE
    // settings.record_profile = FALSE
    // settings.parallel_rendering_threads = 4
    
    // Set frame rate cap to 30
    settings.frame_rate_cap = 30;
    
    // Set parallel rendering threads to 8
    settings.parallel_rendering_threads = 8;
    
    // enable paint flashing
    settings.paint_flashing = TRUE;
    
    // start record performance profile
    settings.record_profile = TRUE;
    
    // show fps meter
    settings.fps_meter = TRUE;
    
    // apply this new settings, and trigger LCUI_SETTINGS_CHANGE event
    LCUI_ApplySettings(&settings);
    
    // Reset settings to default
    LCUI_ResetSettings();
    
    

    Additional context

    settings.frame_rate_cap:

    Call StepTimer_SetFrameLimit(MainApp.settings.frame_rate_cap) when LCUI_SETTINGS_CHANGE event trigger

    https://github.com/lc-soft/LCUI/blob/949db382a94370ac8a6f29611d7f40c717f7587c/src/main.c#L474

    settings.paint_flashing:

    • Remove display.show_rect_border, LCUIDisplay_ShowRectBorder(), LCUIDisplay_HideRectBorder().
    • Add LCUI_Settings settings to the display struct, and replace display.show_rect_border with display.settings->paint_flashing

    https://github.com/lc-soft/LCUI/blob/949db382a94370ac8a6f29611d7f40c717f7587c/src/display.c#L233

    settings.parallel_rendering_threads:

    • Use display.settings->parallel_rendering_threads instead of PARALLEL_RENDERING_THREADS
    • The minimum value of parallel_rendering_threads is 1

    https://github.com/lc-soft/LCUI/blob/949db382a94370ac8a6f29611d7f40c717f7587c/src/display.c#L132 settings.record_profile:

    • Save profile data to MainApp.profile
    • Add LCUI_GetProfile() to get performance profile

    https://github.com/lc-soft/LCUI/blob/949db382a94370ac8a6f29611d7f40c717f7587c/src/main.c#L183

    settings.show_fps_meter:

    No related code needs to be modified


    IssueHunt Summary

    jduo jduo has been rewarded.

    Backers (Total: $50.00)

    Submitted pull Requests


    Tips

    :gift: Rewarded on Issuehunt low priority 
    opened by lc-soft 10
  • fix #36

    fix #36

    opened by ArcticLampyrid 9
  • Compiler warnings and errors

    Compiler warnings and errors

    Hello!

    src/platform/windows/windows_display.c [398]: wsprintf( str, L"LCUI_CreateWinAppDriver(): error code: %d\n", GetLastError() ); Warning C4133: 'function' : incompatible types - from 'wchar_t *' to 'LPCSTR'.

    src/platform/windows/windows_events.c [172]: wsprintf( str, L"LCUI_CreateWinAppDriver(): error code: %d\n", GetLastError() ); Warning C4133: 'function' : incompatible types - from 'wchar_t [256]' to 'LPSTR'. and Warning C4133: 'function' : incompatible types - from 'unsigned short [43]' to 'LPCSTR'.

    src/platform/windows/windows_events.c [173]: MessageBox( NULL, str, szAppName, MB_ICONERROR ); Warning C4133: 'function' : incompatible types - from 'wchar_t [256]' to 'LPCSTR'.

    src/platform/windows/windows_events.c [177]: app->PostTask = WIN_PostTask; Error C2039: ‘PostTask’ is not a member of ‘LCUI_AppDriverRec_’.

    src/platform/windows/windows_events.c [178]: app->WaitEvent = WIN_WaitEvent; Error C2039: ‘WaitEvent’ is not a member of ‘LCUI_AppDriverRec_’.

    LCUI version: [2.661 commits / 13.04.2017] OS and version: [Windows 7] Build tools: [vcvars32.bat -> cl.exe (VisualStudio 2015)]

    Thanks!

    windows 
    opened by mrwert 9
  • 是否支持arm linux

    是否支持arm linux

    Is your feature request related to a problem? Please describe. 之前用Qt做的,但是qt有很多特性都是不怎么需要的,现在想找一款更加简单、UI开发快速的GUI框架

    Describe the solution you'd like 能否支持跨平台,如arm-linux(主要是UI用在嵌入式设备上面),如果是纯C开发应该是可以交叉编译的,但是不支持依赖的底层是否可行

    Describe alternatives you've considered

    Additional context

    opened by hvritual 8
  • Update test program

    Update test program

    Issuehunt badges

    Is your feature request related to a problem? Please describe.

    The output of the test program should be in the same format.

    Describe the solution you'd like

    Update the following functions in test.c:

    https://github.com/lc-soft/LCUI/blob/b87ce34be7a5f4e0cd73da5a2d37d34068bfeb1c/test/test.c#L14-L26

    Use the functions in libtest.c instead of TEST_LOG(), CHECK(), CHECK_WITH_TEXT(), just like this:

    https://github.com/lc-soft/LCUI/blob/b87ce34be7a5f4e0cd73da5a2d37d34068bfeb1c/test/test_css_parser.c#L114-L145

    All output should be formatted like this:

    image

    Describe alternatives you've considered None.

    Additional context None.


    IssueHunt Summary

    jduo jduo has been rewarded.

    Backers (Total: $40.00)

    Submitted pull Requests


    Tips

    help wanted :gift: Rewarded on Issuehunt 
    opened by lc-soft 8
  • feat(css): define CSS property value with formal syntax

    feat(css): define CSS property value with formal syntax

    Reference: https://developer.mozilla.org/en-US/docs/Web/CSS/Value_definition_syntax

    TODO:

    • [x] Value definition parser
      • [x] Juxtaposition combinator
      • [x] Single bar combinator
      • [x] Double bar combinator
      • [x] Bracket combinator
      • [x] Double ampersand combinator
      • [x] Curly braces multiplier
      • [x] Question mark multiplier
    • [x] Value matcher
    • [ ] Fix memory leak bugs
    • [ ] Use formal syntax to define the values of all CSS properties
    • [ ] Let the UI library handle style properties based on the new CSS API
    opened by lc-soft 2
  • 默认的例子最大化后再最小化,控件都没了。

    默认的例子最大化后再最小化,控件都没了。

    Describe the bug A clear and concise description of what the bug is. image 我想知道这是类库的bug还是例子程序的bug。屏幕是4K屏幕不知道是否有关。

    To Reproduce Steps to reproduce the behavior:

    1. [First Step]
    2. [Second Step]
    3. [Other Steps...]

    Expected behavior A clear and concise description of what you expected to happen.

    Screenshots If applicable, add screenshots to help explain your problem.

    Environment (please complete the following information):

    • LCUI version: [Enter LCUI version here]
    • Build tools: [Enter build tools name and version here, E.g: gcc/clang/VisualStudio 201X]
    • OS and version: [Enter OS name and version here, E.g: WinXP/Win7/Win10/Ubuntu/Mac OS]

    Additional context Add any other context about the problem here.

    opened by Killea 1
  • 主页上的例子直接编译好多都编译不过去,老哥不改改嘛?

    主页上的例子直接编译好多都编译不过去,老哥不改改嘛?

    #include <LCUI.h>
    #include <LCUI/gui/widget.h>
    #include <LCUI/gui/widget/textview.h>
    #include <LCUI/gui/widget/textedit.h>
    #include <LCUI/gui/widget/button.h>
    
    void OnButtonClick(LCUI_Widget self, LCUI_WidgetEvent e, void *arg)
    {
        wchar_t str[256] = { 0 };
        LCUI_Widget text = ((LCUI_Widget*)e->data)[0];
        LCUI_Widget input = ((LCUI_Widget*)e->data)[1];
        
        TextEdit_GetTextW(input, 0, 255, str);
        TextView_SetText(text, str);
    }
    
    int main(void)
    {
        LCUI_Widget root;
        LCUI_Widget text;
        LCUI_Widget button;
        LCUI_Widget input;
        LCUI_Widget button_data[2];
    
        LCUI_Init();
        root = LCUIWidget_GetRoot();
        text = LCUIWidget_New("textview");
        input = LCUIWidget_New("textedit");
        button = LCUIWidget_New("button");
        button_data[0] = text;
        button_data[1] = input;
        TextView_SetTextW(text, L"Hello, World!");
        TextEdit_SetPlaceholderW(input, L"Please input...");
        Button_SetTextW(button, "Change");
        Widget_BindEvent(button, "click", OnButtonClick, button_data, NULL);
        Widget_Append(root, text);
        Widget_Append(root, input);
        Widget_Append(root, button);
        return LCUI_Main();
    }
    

    比如这个TextView_SetText 应该为 TextView_SetTextW

    还有 Button_SetTextW(button, "Change") 应该为Button_SetTextW(button, L"Change")

    新手看了例子更加一头雾水

    opened by Endt4sk 1
  • TextEdit 删除文字BUG

    TextEdit 删除文字BUG

    存在问题的函数:

    https://github.com/lc-soft/LCUI/blob/ea409f1339580c2f5267597a134c0a8c17d1e5e5/src/font/textlayer.c#L962-L967

    1. TextEdit启用多行文本
    2. 添加多行文本(‘\n’),如:123\n123\n123\n
    3. 用退格键(backspace)删除最后一行文本的最后一个字是出现异常,
    		/* 如果当前行为空,也不是第一行,并且上一行没有结束符 */
    		if (len <= 0 && end_y > 0 &&
    		    prev_txtrow->eol != LCUI_EOL_NONE) {
    			TextRowList_RemoveRow(&layer->text_rows, end_y);
    			return 0;    <<这里添加return可以解决bug
    		}
    		/* 调整起始行的容量 */
    		TextRow_SetLength(txtrow, len);    <<< 这里异常,因为txtrow已经被释放掉了(TextRowList_RemoveRow)
    
    1. 在第二行最后一个字符处使用删除键(delete),出现异常:
    	i = char_x;
    	j = end_x;  <<< 原始代码这里为end_x + 1,这里不应该+1
    	end_y = char_y + 1;
    	/* 将结束行的内容拼接至起始行 */
    	for (; i < len && j < end_txtrow->length; ++i, ++j) {
    		txtrow->string[i] = end_txtrow->string[j];      <<< **这里吧下一行的字符数据与当前行进行拼接**
    	}
    	TextLayer_UpdateRowSize(layer, txtrow);
    	TextLayer_InvalidateRowRect(layer, end_y, 0, -1);
    	/* 移除结束行 */
    	TextRowList_RemoveRow(&layer->text_rows, end_y);   <<< **这里释放掉原来行的LCUI_TextRow,形成空指针。**
    	/* 如果起始行无内容,并且上一行没有结束符(换行符),则
    	 * 说明需要删除起始行 */
    	if (len <= 0 && char_y > 0 && prev_txtrow->eol != LCUI_EOL_NONE) {
    		TextLayer_InvalidateRowRect(layer, char_y, 0, -1);
    		TextRowList_RemoveRow(&layer->text_rows, char_y);
    	}
    	TextLayer_AddUpdateTypeset(layer, char_y);
    
    bug 
    opened by zhaozheng0612 0
  • English API Documentation

    English API Documentation

    Is your feature request related to a problem? Please describe. No, I just got familiar with LCUI and it seems it can be one of the best ui engines in future. Demo was very good but as a programmer I find it very hard to learn, there's no documentation that explains how it works and it's very time consuming to read entire source code to see how it works.

    Describe the solution you'd like I would like to have a good and complete documentation of how it works and how to implement stuff, how to connect things together and how to implement custom controls.

    Additional context A good example can be Ultralight : https://docs.ultralig.ht/docs/

    opened by MichealShinoda 3
Releases(v2.2.0)
  • v2.2.0(Jun 1, 2021)

    Changelog

    Bug Fixes

    • conditional jump or move depends on uninitialised value(s) (7174868)
    • gui: the horizontal scroll bar does not work (#219) (31dee24)
    • gui: the size of the absolutely positioned widget is incorrect (35bfa3f)
    • gui: the style of hidden widgets will not be updated (f0a6e30)
    • image: incorrect image suffix detection (46095e7)
    • util: ‘NULL’ is undeclared when the function of dict is inlined (c9c9901)
    • remove the incorrect CSSParser_GetRuleParser() macro (3bd6b71)
    • variable naming conflict in LCUI_PostSimpleTask() (f0382d4)

    Features

    • font: add operation functions for TextStyle (c0ccdf8)

    更新日志

    问题修复

    • conditional jump or move depends on uninitialised value(s) (7174868)
    • gui: 水平滚动条未起作用 (#219) (31dee24)
    • gui: 当部件的定位为绝对定位时,尺寸计算错误 (35bfa3f)
    • gui: 组件在隐藏后未更新样式 (f0a6e30)
    • image: 图片后缀名检测方式错误 (46095e7)
    • util: 当 dict 的操作函数被编译器内联时会报错 ‘NULL’ 未声明 (c9c9901)
    • 移除错误的 CSSParser_GetRuleParser() 宏 (3bd6b71)
    • LCUI_PostSimpleTask() 中的变量命名冲突 (f0382d4)

    新功能

    • font: 添加 TextStyle 的操作函数 (c0ccdf8)
    Source code(tar.gz)
    Source code(zip)
    LCUI-2.2.0_all.lcpkg.zip(18.38 MB)
    LCUI-2.2.0_x64-uwp.lcpkg.zip(3.38 MB)
    LCUI-2.2.0_x64-windows.lcpkg.zip(5.55 MB)
    LCUI-2.2.0_x86-uwp.lcpkg.zip(3.84 MB)
    LCUI-2.2.0_x86-windows.lcpkg.zip(5.60 MB)
    liblcui2_2.2.0-1_amd64.deb(166.04 KB)
    liblcui2-dev_2.2.0-1_amd64.deb(224.08 KB)
  • v2.1.0(Jul 5, 2020)

    Changelog

    Bug Fixes

    • wasm-ld: error: duplicate symbol: self (2b0424c)
    • display: rect_array is not freed (224c433)
    • gui: invalid area are not added after the widget is destroyed (8e1f136)
    • gui: segmention fault in TextView_SetTextW() (a10df88), closes #195
    • ime: segmentation fault when set caret (0b644e1)
    • linux: segmentation fault on draw window with minimal size (#200) (#201) (fa23f89)
    • mainloop: move out paint event trigger from openmp parallel loop (#204) (#205) (6978f46)

    Features

    更新日志

    问题修复

    • wasm-ld: error: duplicate symbol: self (2b0424c)
    • display: rect_array 未被释放 (224c433)
    • gui: 部件销毁后未标记无效区域 (8e1f136)
    • gui: TextView_SetTextW() 段错误 (#195) (a10df88)
    • ime: 设置输入框文本光标时段错误 (0b644e1)
    • linux: 在窗口处于最小尺寸时渲染会出现段错误 (#200) (#201) (fa23f89)
    • mainloop: 将事件触发器从 OpenMP 并行循环中移出以解决主线程阻塞问题 (#204) (#205) (6978f46)

    新功能

    Source code(tar.gz)
    Source code(zip)
    LCUI-2.1.0_x64-uwp.lcpkg.zip(3.32 MB)
    LCUI-2.1.0_x64-windows.lcpkg.zip(4.77 MB)
    LCUI-2.1.0_x86-uwp.lcpkg.zip(3.23 MB)
    LCUI-2.1.0_x86-windows.lcpkg.zip(4.80 MB)
    liblcui2_2.1.0-1_amd64.deb.zip(165.13 KB)
    liblcui2-dev_2.1.0-1_amd64.deb.zip(221.92 KB)
  • v2.0.0(Mar 2, 2020)

    Changelog

    Bug Fixes

    • builder: comment node should be ignore (460ee00)
    • css: conditional jump or move depends on uninitialised value(s) (44486f1)
    • font: fix to get the correct file path (#187) (6d54685)
    • font: FontBitmap_Free() memory leak (c47a6c0)
    • gui: root widget is missing hover and active status (02c03c7)
    • gui: segmentation fault on resize empty window (#199) (56ce0b5)
    • gui: TextCaret did not remove the timer after destruction (a58b12d)
    • linux: InitLinuxKeybord() memory leak bug (61cadc8)
    • timer: the callback will still run after the timer is removed (43233b3)
    • correct the use of variables (513b3b9)
    • windows: touch support is not enabled by default (bc7710a)
    • cursor position should be updated before handle widget events (83fc949)
    • util: the preset dict types are not exported correctly (20abb19)

    Code Refactoring

    • gui: add widget_background.h (d69fbb0)
    • gui: add widget_border.h (843232e)
    • gui: add widget_shadow.h (08ed51c)
    • gui: improve widget update processing (1a50aec)

    Features

    • builder: output details when an error occurs (f7ed3b8)
    • css: add flexbox property parser (07d2911)
    • display: add LCUIDisplay_EnablePaintFlashing() (298ffa4)
    • display: flashing rendered rects (#180) (#190) (5ad4fec)
    • display: set the minimum screen size to 320x240 (317df70)
    • gui: add CSSFontStyle_IsEquals() (80d4149)
    • gui: add flexible box layout (3cbb246)
    • gui: change the call timing and parameter list for the runtask() (f058916)
    • gui: rewrite widget layout system (24e89aa)
    • gui: ScrollBar widget will reset when the container is destroyed (61e0f2c)
    • gui: set the container padding when the ScrollBar is visible (a436f41)
    • gui: unwrap() will fire the link and unlink events for each child (48344bc)
    • gui: update the sizing rules for the TextView widget (ea7e9d2)
    • util: use inline functions instead of global variables (0991d14)

    Performance Improvements

    • display: no need to add dirty rectangles after resizing (b0985a2)
    • display: OpenMP is enabled only when the render area is large (1e57d9d)
    • gui: improve invalid area collection (e9ea262)
    • gui: improve textedit update processing (bbb7cbc)
    • gui: improve textview update processing (6824735)
    • add OpenMP support for widget rendering (#118) (#189) (d858333)
    • improve dirty rectangle collection (c81da29)

    BREAKING CHANGES

    • util: DictType_StringKey and DictType_StringCopyKey have been replaced by inline functions
    • display: LCUIDisplay_ShowRectBorder() LCUIDisplay_HideRectBorder() have been removed.
    • gui: The widget shadow operation interface has been changed to private
    • gui: The widget background operation interface has been changed to private
    • gui: The widget border operation interface has been changed to private
    • gui: The textview widget must operate in the UI thread.
    • gui: The runtask() method takes two arguments and is called before each task is processed.
    • gui: Some widget operation functions have been renamed or removed.

    更新日志

    问题修复

    • builder: 注释结点应该被忽略 (460ee00)
    • css: 使用了未初始化的值 (44486f1)
    • font: 字体路径获取错误 (#187) (6d54685)
    • font: FontBitmap_Free() 内存泄露 (c47a6c0)
    • gui: 根部件缺少 hover 和 active 状态 (02c03c7)
    • gui: 调整空窗口的尺寸时出现段错误 (#199) (56ce0b5)
    • gui: TextCaret 应该在销毁后移除定时器 (a58b12d)
    • linux: InitLinuxKeybord() 内存泄漏 (61cadc8)
    • timer: 在移除定时器后,其回调依然会被执行 (43233b3)
    • util: dict 类型未正确导出 (20abb19)
    • windows: 未默认启用触控支持 (bc7710a)
    • 纠正变量的使用 (513b3b9)
    • 光标的位置应该在处理部件事件之前更新 (83fc949)

    代码重构

    • gui: 添加 widget_background.h (d69fbb0)
    • gui: 添加 widget_border.h (843232e)
    • gui: 添加 widget_shadow.h (08ed51c)
    • gui: 改进部件更新流程 (1a50aec)

    新功能

    • builder: 在出错时输出详细内容 (f7ed3b8)
    • css: 添加 flexbox 相关属性解析器 (07d2911)
    • display: 添加 LCUIDisplay_EnablePaintFlashing() (298ffa4)
    • display: 闪烁已渲染的矩形区域 (#180) (#190) (5ad4fec)
    • display: 设置最小屏幕尺寸为 320x240 (317df70)
    • gui: 添加 CSSFontStyle_IsEquals() (80d4149)
    • gui: 添加弹性盒子布局 (3cbb246)
    • gui: 更改部件原型上的 runtask() 方法的参数和调用时机 (f058916)
    • gui: 重写部件布局系统 (24e89aa)
    • gui: 滚动条部件将会在容器销毁后重置 (61e0f2c)
    • gui: 在滚动条可见时设置容器的内间距 (a436f41)
    • gui: unwrap() 将会为没给子部件触发 link 和 unlink 事件 (48344bc)
    • gui: 更新TextView 尺寸变动规则 (ea7e9d2)
    • util: 使用内联函数代替全局变量 (0991d14)

    性能改进

    • display: 主窗口尺寸改变后无需添加无效区域 (b0985a2)
    • display: OpenMP 将只在渲染区域较大时启用 (1e57d9d)
    • gui: 改进部件的无效区域收集方式 (e9ea262)
    • gui: 改进 TextEdit 部件的更新流程 (bbb7cbc)
    • gui: 改进 TextView 部件的更新流程 (6824735)
    • 为部件渲染添加 OpenMP 支持 (#118) (#189) (d858333)
    • 改进表面 (Surface) 的无效区域的收集方式 (c81da29)

    不兼容变动

    • util: DictType_StringKey and DictType_StringCopyKey 已改用内联函数代替
    • display: 已移除 LCUIDisplay_ShowRectBorder()LCUIDisplay_HideRectBorder()
    • gui: 部件的阴影操作接口已改为私有
    • gui: 部件的背景操作接口已改为私有
    • gui: 部件的边框操作接口已改为私有
    • gui: TextView 部件必须在 UI 线程中操作
    • gui: 部件原型上的 runtask() 方法接受两个参数,并且会在每个任务被处理后调用
    • gui: 一些部件操作接口已重命名或已移除
    Source code(tar.gz)
    Source code(zip)
    LCUI-2.0.0_x64-uwp.lcpkg.zip(4.14 MB)
    LCUI-2.0.0_x64-windows.lcpkg.zip(5.66 MB)
    LCUI-2.0.0_x86-uwp.lcpkg.zip(3.85 MB)
    LCUI-2.0.0_x86-windows.lcpkg.zip(5.79 MB)
    LCUI-2.0-test.zip(848.35 KB)
  • v1.3.0(Oct 8, 2019)

    Changelog

    Bug Fixes

    • conflict with C++ "operator" keyword (5a5ba8c)
    • css: setting font style parser's style_handler doesn't work (6869683)
    • display: memory leak from X11Surface_SetCaptionW() (484c3d7)
    • font: failed to get bitmap when font_size > 18 (d6315c5)
    • gui: the default border color of the widget should be transparent (5164955)
    • gui: event target selection bug when widget pointer-events is none (0f26c8b)
    • gui: TextEdit placeholder are not working (d827767)
    • gui: the mousemove event should fire before the mouseout event (5020b91)
    • gui: widget attribute value should always be available (4b0a2ed)
    • ime: composition window position problem (#36, #175) (1107f91)
    • renderer: widget content rendering incorrect (f8b0f8b)
    • util: incorrect object type checking in Object_Operate() (a326e8c)
    • util: ParseUrl() parsing result is incorrect (3f9450c)

    Features

    • add LCUI_GetVersion() (de40c7c)
    • add rounded border rendering (#174) (f36d071)
    • add include/LCUI.h file (#173) (113af6a)
    • builder: tag name can be an existing widget type name (4f6a01c)
    • css: make CSSFontStyle_* functions public (568c915)
    • graph: add LCUI_OverPixel() (d8075d9)
    • gui: add canvas widget (e246843)
    • gui: add Widget_CollectReferences() (811585b)
    • gui: add Widget_Each() (2d7d1ee)
    • logger: support setting logging level (173b92f)
    • scrollbar: capture touch and mousewheel events from the container (f2f9162)

    更新日志

    问题修复

    • C++ "operator" 关键字冲突 (5a5ba8c)
    • css: 设置字体样式解析器的 style_handler 后未起作用 (6869683)
    • display: X11Surface_SetCaptionW() 内存泄漏 (484c3d7)
    • font: 当 font_size > 18 时字体位图获取失败 (d6315c5)
    • gui: 部件的默认边框颜色应为透明 (transparent) (5164955)
    • gui: 当部件 pointer-events 为 none 时的事件目标选择问题 (0f26c8b)
    • gui: TextEdit 占位符未起作用 (d827767)
    • gui: mousemove 事件应在 mouseout 事件前触发 (5020b91)
    • gui: 部件属性值应始终有效 (4b0a2ed)
    • ime: 输入法候选词窗口定位问题 (#36, #175) (1107f91)
    • renderer: 部件内容区渲染不正确 (f8b0f8b)
    • util: Object_Operate() 中的对象类型判断不正确 (a326e8c)
    • util: ParseUrl() 解析结果不正确 (3f9450c)

    新功能

    • 添加 LCUI_GetVersion() (de40c7c)
    • 添加圆角边框渲染,改进盒阴影渲染 (#174) (f36d071)
    • 添加 include/LCUI.h 文件 (#173) (113af6a)
    • builder: 标签名称可以是一个已存在的部件类型名称 (4f6a01c)
    • css: 将 CSSFontStyle_* 系列函数改为公共函数 (568c915)
    • graph: 添加 LCUI_OverPixel() (d8075d9)
    • gui: 添加 canvas 部件 (e246843)
    • gui: 添加 Widget_CollectReferences() (811585b)
    • gui: 添加 Widget_Each() (2d7d1ee)
    • logger: 支持设置日志等级 (173b92f)
    • scrollbar: 从容器捕获 touch 和 mousewheel 事件 (f2f9162)
    Source code(tar.gz)
    Source code(zip)
    LCUI-1.3.0_x64-uwp.lcpkg.zip(3.89 MB)
    LCUI-1.3.0_x64-windows.lcpkg.zip(5.53 MB)
    LCUI-1.3.0_x86-uwp.lcpkg.zip(3.78 MB)
    LCUI-1.3.0_x86-windows.lcpkg.zip(5.54 MB)
  • v1.2.0-beta(Jun 17, 2019)

    Changelog

    Bug Fixes

    • textlayer: incorrect text line height calculation (#169) (a4d2f0a)

    Features

    • gui: add default methods for widget prototype (e68e8e5)
    • gui: add TextEdit_BindProperty() (c9d8ded)
    • gui: add Widget_BindProperty() (0d3fb68)
    • gui: add Widget_SetStyleString() (5163363)
    • gui: add Widget_SetText() (02714bf)
    • textedit: add TextEdit_GetProperty() (512706e)
    • util: add object wrapper and operation set (241c652)
    • util: add Object_ToString() (13465c7)

    更新日志

    问题修复

    新功能

    • gui: 为部件原型设置默认方法 (e68e8e5)
    • gui: 添加 TextEdit_BindProperty() (c9d8ded)
    • gui: 添加 Widget_BindProperty() (0d3fb68)
    • gui: 添加 Widget_SetStyleString() (5163363)
    • gui: 添加 Widget_SetText() (02714bf)
    • textedit: 添加 TextEdit_GetProperty() (512706e)
    • util: 添加对象包装和操作集 (241c652)
    • util: 添加 Object_ToString() (13465c7)
    Source code(tar.gz)
    Source code(zip)
    lcui-1.2.0-beta.zip(9.29 MB)
  • v1.1.0-beta(Mar 10, 2019)

    Changelog

    Bug Fixes

    • builder: widget should be initialized before appending (f12e00b)
    • gui: event target should be initialized (ebbd128)
    • gui: focus event and "focusable" property parsing bug (d9a39a5)
    • gui: mouse events should be ignored when pointer-events is none (fc54a64)
    • gui: TextEdit should reset the caret position after blur (8de4e71)
    • gui: TextEdit_SetTextW() does not clear the previous content (51eef68)
    • gui: the button height is different from the textedit (5a918da)
    • gui: widget width with margin is incorrectly calculated (#167) (d14023e)
    • thread: LCUIThread_Join() has not waited for the thread to exit (4ddb833)
    • util: decoded string length should not include terminator (93f3d77)
    • worker: task queue should not be blocked when running a task (2b41f54)

    Features

    • gui: add rule for allow widget updates only when visible (93049c4)
    • gui: add rule for cache children style (50cc6b2)
    • gui: add rule for first update visible children (4cd6fdc)
    • gui: add rule for limit the number of children rendered (ec5e0d6)
    • gui: add support for custom widget update rules (bdd1d1c)
    • gui: add widget border helper (e8d52df)
    • gui: add Widget_GetClosest() (e740138)
    • gui: add Widget_SetHashList() (f466dee)
    • gui: auto assign an id to the event name (fee31b0)
    • gui: Widget_SetAttribute() will call proto->setattr() (19992d1)
    • add LCUI_Profile for profiling performance (f715a08)
    • textview: add TextView_SetColor() (3a7b53f)
    • util: add return value for LCUIRect_ValidateArea() (2fa6cf3)
    • util: add strhash() (ebf843f)
    • util: add strpool (c843df1)
    • util: add strreplace() (409395d)
    • util: default using OutputDebugString() to output log on Windows (79ec21b)

    Performance Improvements

    • css: change the stylesheet store struct to reduce memory usage (9cc2957)
    • css: reduce duplicate memory alloc for DictType (01fd3f6)
    • gui: improve widget destruction performance (87aff87)
    • gui: improve Widget_Empty() performance (1654963)
    • gui: reduce memory usage for widget style sheets (3790fbd)
    • gui: remove the mutex in the textview widget (6340d60)
    • gui: save classes and status with strlist (f611936)
    • gui: update the sort method of the widget list (e9dbcea)
    • gui: use LCUI_STYPE_INT instead of LCUI_STYPE_VALUE (23090eb)
    • renderer: improve the selection of the rendering target (1df08b6)

    更新日志

    问题修复

    • builder: 在追加部件前应该将其初始化 (f12e00b)
    • gui: focus 事件和 "focusable" 属性解析问题 (d9a39a5)
    • gui: 当 pointer-events 为 none 时应该忽略鼠标事件 (fc54a64)
    • gui: TextEdit 应该在失去焦点后重置光标的位置 (8de4e71)
    • gui: TextEdit_SetTextW() 未清空之前的内容 (51eef68)
    • gui: Button 的高度与 TextEdit 不一致 (5a918da)
    • gui: 设置部件外边距时会导致宽度计算错误 (#167) (d14023e)
    • thread: LCUIThread_Join() 未等待线程退出 (4ddb833)
    • util: 解码后的字符串长度不应将结束符计算在内 (93f3d77)
    • worker: 运行任务时不应阻塞任务队列 (2b41f54)

    新功能

    • gui: 添加支持自定义部件更新规则 (bdd1d1c)
    • gui: 添加支持限制最大的子部件渲染数量 (ec5e0d6)
    • gui: 添加 only_on_visible 规则,用于允许仅在部件可见时更新它 (93049c4)
    • gui: 添加 cache_children_style 规则,用于缓存子部件样式 (50cc6b2)
    • gui: 添加 first_update_visible_children 规则,用于优先更新可见的子部件 (4cd6fdc)
    • gui: 添加部件边框样式相关操作接口 (e8d52df)
    • gui: 添加 Widget_GetClosest() (e740138)
    • gui: 添加 Widget_SetHashList() (f466dee)
    • gui: 自动为事件名生成 id (fee31b0)
    • gui: Widget_SetAttribute() 将会调用 proto->setattr() (19992d1)
    • textview: 添加 TextView_SetColor() (3a7b53f)
    • util: 为 LCUIRect_ValidateArea() 添加返回值 (2fa6cf3)
    • util: 添加 strhash() (ebf843f)
    • util: 添加 strpool (c843df1)
    • util: 添加 strreplace() (409395d)
    • util: 在 Windows 上默认使用 OutputDebugString() 输出日志 (79ec21b)

    性能改进

    • css: 更改样式表存储结构以减少内存占用 (9cc2957)
    • css: 减少重复的 DictType 内存分配 (01fd3f6)
    • gui: 改进部件销毁性能 (87aff87)
    • gui: 改进 Widget_Empty() 性能 (1654963)
    • gui: 减少部件的样式表的内存占用 (3790fbd)
    • gui: 移除 TextView 部件中的互斥锁 (6340d60)
    • gui: 使用 strlist 保存 classes 和 status (f611936)
    • gui: 更新部件列表的排序方法 (e9dbcea)
    • gui: 改用 LCUI_STYPE_INT 代替 LCUI_STYPE_VALUE (23090eb)
    • renderer: 改进渲染目标的选择方法 (1df08b6)
    Source code(tar.gz)
    Source code(zip)
    lcui-1.1.0-beta.x64-windows.zip(9.28 MB)
  • v1.0.0-beta.4(Nov 28, 2018)

    Changelog

    Bug Fixes

    • dirent: LCUI_ReadDirW() UNINITIALIZED READ (dd610ad)
    • display: the renderer pauses when resizing the window (#164) (8ad667a)
    • display: too many duplicate dirty rectangles in one frame (b5d9040)
    • font: failed to set default font after loading font file (9b4c005)
    • font: font number is not reset after module reinitialization (d75b4ca)
    • gui: layout should be updated after widget display role is changed (96c1cef)
    • gui: should clear trash widget when module destroyed (1ad6be1)
    • gui: the block element default width should be 100% (adcb9e7)
    • gui: the node should unlinked before destroying widget (3249490)
    • gui: the unlink event is triggered repeatedly (89faa5d)
    • gui: widget background image is not rendered (e76f3f9)
    • gui: Widget_AutoSize() should not change the static width or height (8bee9c2)
    • ime: non-qwerty keyboard layouts broken (#147) (4b1f050)
    • layout: "left: auto" is calculated as "left: 0" (f4990da)
    • platform: linux framebuffer driver has not been destroyed (#157) (87f79f0)
    • renderer: problem when widget has transparency (#160) (d13b554)
    • renderer: transparent widgets are rendered incorrectly (6668165)
    • textlayer: chinese text line break error (1e5a262)
    • textlayer: isalpha() assertion failed (cd39a46)
    • textview: no effect after changing the "content" property (d1ab50d)
    • textview: size not updated after setting text (31e0582)
    • util: incorrect value of LCUI_DirEntry::name (367febe)
    • worker: worker thread memory access violation (5a7e2c0)
    • linker errors when jpeg and png are not supported (2bbabe1)
    • PACKAGE_VERSION is not defined (70660de)
    • the mouse cursor should be hidden when the window system exists (acf9454)
    • the return value of LCUI_GetAppId() is incorrect (46ec607)
    • "linux/input.h" file not found on FreeBSD (7d95f3f)
    • undefined ENODATA on FreeBSD (2cd0b27)
    • unresolved external symbol _Graph_IsValid (1328a2d)

    Features

    • builder: <resource> support load xml file (d5e162c)
    • display: auto disable window maximize button (#164) (82fad1b)
    • event: add ctrl_key and shift_key to LCUI_KeyboardEvent (6f5f17c)
    • gui: add Widget_SetOpacity() (e6ad163)
    • gui: add Widget_SetVisibility() (145d9ee)
    • gui: add Widget_SetVisible() and Widget_SetHidden() (2f581b8)
    • gui: LCUIWidget_ClearTrash() will return count (6262f20)
    • linux: add mouse wheel event handing for x11 (#54) (1061592)
    • linux: use fontconfig to locate fonts (2932246)
    • textview: refresh all textview after loading new font (3fcfa99)
    • util: add OpenUri() (ec20c99)
    • make LCUI_MAX_FRAMES_PER_SEC public (6fa2995)
    • add LCUI_MAX_FRAME_MSEC macro (7abc901)

    Performance Improvements

    • charset: improve utf-8 and unicode string convert (1efd856)
    • graph: improve image scaling quality (issue #39) (bbfb9af)

    更新日志

    问题修复

    • dirent: LCUI_ReadDirW() UNINITIALIZED READ (dd610ad)
    • display: 调整窗口尺寸时会暂停渲染 (#164) (8ad667a)
    • display: 一帧内有过多的重复的脏矩形 (b5d9040)
    • font: 在加载完字体文件后设置默认字体会失败 (9b4c005)
    • font: 在模块被重新初始化后,字体编号未重置 (d75b4ca)
    • gui: 当部件的显示角色改变后应该更新布局 (96c1cef)
    • gui: 当模块被销毁时应该清空废弃的部件 (1ad6be1)
    • gui: 块级元素的默认宽度应该为 100% (adcb9e7)
    • gui: 在销毁部件前应该解除结点 (3249490)
    • gui: unlink 事件被重复触发 (89faa5d)
    • gui: 部件背景图未渲染 (e76f3f9)
    • gui: Widget_AutoSize() 不应该改变静态的宽度或高度 (8bee9c2)
    • ime: 无法正确识别非 qwerty 键盘布局的按键输入 (#147) (4b1f050)
    • layout: "left: auto" 被计算为 "left: 0" (f4990da)
    • platform: linux 帧缓存驱动未被销毁 (#157) (87f79f0)
    • renderer: 当部件整体透明时,子级部件未正确渲染 (#160) (d13b554)
    • renderer: 有透明效果的部件,渲染不正确 (6668165)
    • textlayer: 中文文本断行错误 (1e5a262)
    • textlayer: isalpha() 断言失败 (cd39a46)
    • textview: 在改变 "content" 属性后没有效果 (d1ab50d)
    • textview: 设置文本后未更新自身尺寸 (31e0582)
    • util: LCUI_DirEntry::name 的值不正确 (367febe)
    • worker: 工作线程内存访问越界 (5a7e2c0)
    • 当不支持 jpeg 和 png 时连接器会报错 (2bbabe1)
    • PACKAGE_VERSION 未定义 (70660de)
    • 当系统中存在窗口管理系统时应该隐藏鼠标指针 (acf9454)
    • LCUI_GetAppId() 返回值不正确 (46ec607)
    • 在 FreeBSD 上编译时,"linux/input.h" 文件不存在 (7d95f3f)
    • 在 FreeBSD 上编译时,ENODATA 未定义 (2cd0b27)
    • 未解析的外部符号 _Graph_IsValid (1328a2d)

    新特性

    • builder: <resource> 支持加载 xml 文件 (d5e162c)
    • display: 自动禁用窗口最大化按钮 (#164) (82fad1b)
    • event: 添加 ctrl_key 和 shift_key 成员至 LCUI_KeyboardEvent (6f5f17c)
    • gui: 添加 Widget_SetOpacity() (e6ad163)
    • gui: 添加 Widget_SetVisibility() (145d9ee)
    • gui: 添加 Widget_SetVisible() 和 Widget_SetHidden() (2f581b8)
    • gui: LCUIWidget_ClearTrash() 返回值为实际销毁的部件数量 (6262f20)
    • linux: 为 x11 系统添加鼠标滚轮事件处理 (#54) (1061592)
    • linux: 使用 fontconfig 定位字体文件路径 (2932246)
    • textview: 在加载新的字体文件后刷新所有 textview 部件 (3fcfa99)
    • util: 添加 OpenUri() (ec20c99)
    • 添加 LCUI_MAX_FRAMES_PER_SEC 宏定义 (6fa2995)
    • 添加 LCUI_MAX_FRAME_MSEC 宏定义 (7abc901)

    改进

    • charset: 改进 utf-8 和 unicode 字符串转换 (1efd856)
    • graph: 添加新的图片缩放方式 (issue #39) (bbfb9af)
    Source code(tar.gz)
    Source code(zip)
    libs-for-windows.zip(42.65 MB)
    LCUI-1.0-beta.4-for-windows.zip(14.57 MB)
  • v1.0.0-beta.3(May 7, 2018)

    Bug Fixes

    • font: segmentation fault in DeleteFont() (5465c6b)
    • timer: timer thread may quit after it is created (0b01f88)
    • util: 'struct dirent' has no member named 'd_reclen' (#141) (0416c42)

    Features

    • platform: add linux framebuffer driver (6015838)
    • platform: add linux keyboard driver (ad3348e)
    • platform: add linux mouse driver (0ff7b70)

    You can read this pull request for more details.

    更新日志

    问题修复

    • font: 因字体缓存位置计算错误而导致的 DeleteFont() 段错误 (5465c6b)
    • timer: 定时器线程在被创建后可能会立刻退出 (0b01f88)
    • util: 在 Unix 系统下编译会报错:'struct dirent' has no member named 'd_reclen' (#141) (0416c42)

    新特性

    • platform: 添加 linux 平台的帧缓存(FrameBuffer)驱动 (6015838)
    • platform: 添加 linux 平台的键盘驱动 (ad3348e)
    • platform: 添加 linux 平台的鼠标驱动 (0ff7b70)

    其它改动

    • 更改代码风格
    • 添加 .clang-format 配置文件
    • 为部分待改进的代码添加 FIXME 注释

    发行说明

    本次更新主要添加了对Linux 的帧缓存(FrameBuffer)的支持,在没有 Xwindow 服务支持的字符终端模式下,LCUI 会改用 Linux 的帧缓存来输出图形内容,并直接从鼠标设备(/dev/input/mice)和标准输入(stdin)中读取用户输入。不过,这些支持并不完善,而作者也没有打算继续完善这块功能,理由很简单:没什么用,懒得浪费时间。如果你有丰富的 Linux 开发经验,可以向此项目提供改进方案,与其他人分享你的技术。

    LCUI 的源代码中还有很多待改进的代码,包括:打算改、没时间改、懒得改和不想改的代码,其中有一部分代码已经用 FIXME 注释标记,这些注释中有的会说明为什么改进它,以及怎么改进它,如果你感兴趣,可以留意源代码中的 FIXME 注释内容,或者直接搜索 FIXME 注释,看看有哪些是可以帮上忙的。

    fixme

    更新日志中只列出了主要的改动,如需了解更多细节,请自行查看代码提交记录,或许以下命令会对你有所帮助。

    # 只查看包含新特性(Feature)的提交信息
    $ git log --pretty=format:"%h %ad %s %d" --date=short --grep "^feat"
    
    ad3348ea 2018-04-22 feat(platform): add linux keyboard driver
    0ff7b70e 2018-04-22 feat(platform): add linux mouse driver
    6015838d 2018-04-22 feat(platform): add linux framebuffer driver
    8c1d1056 2018-02-20 feat(widget-event): add "link" event, rename "remove" event to "unlink"
    f032f6ff 2018-02-20 feat(timer): add LCUITimer_SetTimeout() and LCUITimer_SetInterval()
    30de5b82 2018-02-11 feat(css): add parsing support for "border-left: 0;"
    9193c0a5 2018-01-19 feat(textview): add word-break property support
    cb7749d3 2018-01-16 feat(widget): add "disabled" attribute processing
    7aaac407 2018-01-14 feat(widget): add `http://` and `file:` url support for anchor widget
    9532d89a 2018-01-14 feat(widget): allow multiple widgets to have the same id
    0616d855 2018-01-13 feat(mainloop): set mainloop to processing only one task  per frame
    adc8ba30 2018-01-07 feat(textlayer): add i tag support (#115)
    
    # 只查看包含功能代码改动的提交信息(包括新功能、修复、重构、改进)
    $ git log --pretty=format:"%h %ad %s %d" --date=short --grep "^\(feat\|fix\|refactor\|perf\)"
    
    3a888110 2018-05-05 refactor(display): change to right type
    b00139bc 2018-05-05 refactor: rename is_inited and is_working to active
    090d1c40 2018-05-05 refactor: rename COLOR_TYPE_* to LCUI_COLOR_TYPE_*
    de3bb33e 2018-05-05 refactor(graph): rename some functions
    b113cf21 2018-04-23 refactor: SVT_* -> LCUI_STYPE_*
    cb3c2a89 2018-04-23 refactor(input): LCUIKEY_* -> LCUI_KEY_*
    4bf3f91f 2018-04-23 refactor(display): LCDM_* -> LCUI_DMODE, DET_* -> LCUI_DEVENT_*
    0b01f88f 2018-04-22 fix(timer): timer thread may quit after it is created
    5465c6bc 2018-04-17 fix(font): segmentation fault in DeleteFont()
    78eeca61 2018-04-17 refactor(ime): add LCUIIME_ToUpperCase()
    2538d79b 2018-04-15 refactor(platform): update ime selection in the linux
    ad3348ea 2018-04-22 feat(platform): add linux keyboard driver
    0ff7b70e 2018-04-22 feat(platform): add linux mouse driver
    6015838d 2018-04-22 feat(platform): add linux framebuffer driver
    eb04b2c3 2018-04-07 refactor(cursor): add LCUICursor_Paint(), remove unused code
    0416c421 2018-03-27 fix(util): 'struct dirent' has no member named 'd_reclen' (#141)
    7d577b0b 2018-03-13 refactor(textlayer): add "LCUI_" prefix for some type names
    
    Source code(tar.gz)
    Source code(zip)
  • v1.0.0-beta.2(Mar 19, 2018)

    Bug Fixes

    • some memory leak bugs (#135) (9995b23)
    • gui: widget auto size computation bug (095f4b8)
    • renderer: incorrect widget content rectangle computation (#122,#123) (0f81863)
    • renderer: widget content overflow (#144) (2a923a6)
    • thread: memory leak bug when running test (402bc03)
    • widget: scrollbar did not cancel the event bubbling (#145) (7dd60ac)
    • widget: Scrollbar_BindBox() not working after scrollbar initialize (196f47c)
    • widget: Widget_GetOffset() result does not include padding spacing (0a893f4)
    • widget-event: the touch point coordinate are not been converted (a40eda2)
    • worker: worker did not enter the blocked state (#134) (8dae96f)

    Features

    • css: add parsing support for "border-left: 0;" (30de5b8)
    • timer: add LCUITimer_SetTimeout() and LCUITimer_SetInterval() (f032f6f)
    • widget-event: add "link" event, rename "remove" event to "unlink" (8c1d105)

    Performance Improvements

    • widget: rename scrollbar widget attributes (d397914)

    中文版(Chinese Version)

    问题修复

    • 一些内存泄露问题 (#135) (9995b23)
    • gui: 部件大小计算错误 (095f4b8)
    • renderer: 部件内容区域计算错误 (#122,#123) (0f81863)
    • renderer: 部件内容溢出 (#144) (2a923a6)
    • thread: 线程在退出后未释放之前申请的内存资源 (402bc03)
    • widget: 滚动条未取消事件冒泡 (#145) (7dd60ac)
    • widget: Scrollbar_BindBox() 在滚动条初始化后未能正常工作 (196f47c)
    • widget: Widget_GetOffset() 返回的结果未包含内间距 (0a893f4)
    • widget-event: 部件触控事件中的触点坐标未根据全局缩放比例进行转换 (a40eda2)
    • worker: 工作线程获取新任务前未进入阻塞状态 (#134) (8dae96f)

    新特性

    • css: 添加支持解析 "border-left: 0;" (30de5b8)
    • timer: 添加更具语义的 LCUITimer_SetTimeout() 和 LCUITimer_SetInterval() (f032f6f)
    • widget-event: 添加 "link" 事件, 重命名 "remove" 事件为 "unlink" (8c1d105)

    改进

    • widget: 重命名滚动条的属性名称和 CSS 选择符 (d397914)
    Source code(tar.gz)
    Source code(zip)
    LCUI-1.0-beta.2.win32-bin.zip(3.03 MB)
  • v1.0.0-beta(Feb 7, 2018)

    Features

    • font: add support for font-weight and font-style selection
    • textlayer: add [bgcolor] tag support (#110)
    • textlayer: add [i] tag support (#115)
    • textlayer: add [b] tag support (#112)
    • textlayer: using FreeType to get space width
    • widget: add content trimming support for textview (#97)
    • widget: add anchor widget (#105)
    • widget: add word-break property support for textview (#71)
    • widget: add WTT_RESIZE_WITH_SURFACE task for sync surface size (#104)
    • widget: add Widget_UnbindEventByHandlerId() function
    • css: add css font-face rule parser (#95)
    • css: add relative path support for url() parser (#98)
    • css: add css property parser for parsing justify-content (#117)
    • css: add support to parse "border: 0"
    • css: add support to parse "line-height: 1"
    • layout: add simple support for flex display and justify-content (#117)
    • bulder: add short name <w> for <widget> (#103)
    • core: add LCUIWorker for async task support (#106)

    Bug fixes

    • textlayer: text vertical position is not center (#100)
    • widget: textview height computation error (#111)
    • css: stylesheet selection bug (#113)
    • graphic: segmentation fault bug in Graph_FillRectARGB() (#110)
    • linux: set "--enable-video-ouput=no" will make the linker output errors
    • renderer: widget border rendering is incomplete when position is non-integer (#108)

    Improvements

    • layout: improve widget size computation
    • font: improve font data storage and operation method
    • mainloop: set run all tasks in one frame
    • mainloop: set the widget tree to update least once per frame

    You can read this pull request for more details.

    中文版(Chinese Version)

    新特性

    • font: 添加支持按字重(font-weight)和风格(font-style)选择字体
    • textlayer: 添加 [bgcolor] 标签支持,用于设置文本背景色 (#110)
    • textlayer: 添加 [i] 标签支持,用于设置文本为斜体 (#115)
    • textlayer: 添加 [b] 标签支持,用于设置文本为粗体 (#112)
    • textlayer: 使用 FreeType 字体引擎默认的方式获取空格宽度
    • widget: 为 textview 添加内容修剪支持,启用后会去除文本首尾空白符 (#97)
    • widget: 添加锚点(anchor)组件 (#105)
    • widget: 为 textview 添加 word-break 属性支持,用于设置单词断行方式 (#71)
    • widget: 添加 WTT_RESIZE_WITH_SURFACE 任务类型,用于将表面(surface)大小与部件同步 (#104)
    • widget: 添加 Widget_UnbindEventByHandlerId() 函数,用于根据事件处理器标识号取消事件绑定
    • css: 添加 font-face 规则解析器,可用于在 css 代码中定义字体信息 (#95)
    • css: 为 url() 的解析器添加支持处理相对路径 (#98)
    • css: 添加针对 justify-content 的属性解析器 (#117)
    • css: 为 border 的属性解析器添加支持解析 "border: 0"
    • css: 为 line-height 的属性解析器添加支持解析 "line-height: 1"
    • layout: 添加简单的 flex 显示方式和 justify-content 属性支持 (#117)
    • bulder:<widget> 添加短名称 <w> (#103)
    • core: 添加 LCUIWorker 用于处理异步任务 (#106)

    问题修复

    • textlayer: 文本没有垂直居中对齐 (#100)
    • widget: textview 的高度计算错误 (#111)
    • css: 样式表选取问题,同名选择器会共用同一优先级 (#113)
    • graphic: Graph_FillRectARGB() 段错误 (#110)
    • linux: 设置 "--enable-video-ouput=no" 选项后会导致链接器报错
    • renderer: 部件位置为非整数时,在渲染时边框会时有时无 (#108)

    改进

    • layout: 改进部件尺寸计算
    • layout: 改进块(block)和内联块(inline-block)元素的布局处理
    • font: 改进字体数据的存储和操作方式
    • mainloop: 设置每帧运行任务队列中的所有任务
    • mainloop: 设置每帧至少更新一次部件树

    如需了解更多代码变更细节,请查看此次拉取请求,包含 121 次提交,净增 3.8K 行代码。当前版本还存在已知且未修复的问题,你可以在问题列表里找到它们。

    布局

    居中和靠右是比较常用的对齐方式,比如对话框中的按钮组:

    lcui-modal

    之前版本中如果要实现这种效果,需要修改定位方式和右间距:position: absolute; right: 0;,一个按钮还好,多个按钮就得靠包装一个容器来定位,而且父级元素的宽高不会被撑开,始终为 0。为此,添加了简单的弹性(flex)布局支持,配合 justify-content 属性可以设置子级元素的对齐方式。justify-content 属性值有三种:flex-start、center 和 flex-end,效果是将每一行元素向左对齐、居中对齐、向右对齐。

    lcui-flex-layout

    字体

    之前的版本只能根据字族(font-family)名称选择一种字体,即使这个字族包含不同粗细程度、风格的字体也只会选择常规(Regular)字体,连给界面中的标题加粗都很麻烦。为此,改进了字体数据的存储和操作方式,添加支持按字重(font-weight)和风格(font-style)选择字体,CSS 解析器也添加了相关的解析支持。

    由于大多数字体都不会包含所有粗细程度和风格的字形,所以会存在找不到的情况,而本次更新的版本只是改进了存储和访问方式,并未实现字形自动加粗和倾斜功能,为解决这个问题就添加了一个回退机制,回退机制的设计参考自 MDN 文档,如需了解具体规则可查看此文档内容。

    文本渲染

    既然字体已经支持使用粗体和斜体,那么文本层(TextLayer)也就顺势加上了 [i][b] 标签的支持,方便测试字体效果。有了 color、i、b 这几个标签,界面中的代码块也就能加点特效:

    lcui-code-highlight

    考虑到文本中会引用命令行和代码,为了凸显这些文本,需要能够设置背景色,于是就添加了 [bgcolor] 标签支持,比如内容为 [bgcolor=#ddeeff]make install[bgcolor] 的文本,渲染效果会是这样:

    lcui-text-bgcolor

    对于英文文本,如果在换行时直接截断单词则会影响阅读体验,需要将溢出的单词整个换到下一行显示,控制这个规则的属性是 word-break,默认值为 normal,不中断单词,当值为 break-all 时会在任意字符间断行。

    lcui-text-word-break

    CSS

    一篇文档会需要用到各种字体来提升阅读体验,比如:等宽字体、中文字体、西文字体,用 LCUI 呈现这样的文档的话会有些麻烦,需要手动在 XML 或 C 代码中引入这些字体文件,而作者在为 LCUI 开发 CSS 组件库时也遇到同样的问题,如果能在 CSS 中预先定义好各种字体的信息就能够省去这些麻烦。

    CSS 标准中的 @font-face 规则可以解决这个问题,于是 LCUI 就增加了对 @font-face 规则的解析支持,方便通过 CSS 代码来控制加载哪些字体。@font-face 能够定义包括字族、风格、粗细程度、文件路径等在内的字体信息,然而这些属性中只有文件路径有用,在解析完规则后会直接加载该文件路径里的字体文件,因为 LCUI 的字体管理还不支持预先声明字体信息和按需加载字体文件这两个功能。

    部件

    添加了锚点(Anchor)部件,功能与 HTML 中的 <a> 元素类似,支持 href、target、key 属性,当该部件被点击后会判断 href 内容,如果是 https://http://file: 类型的链接,则调用系统默认的打开方式打开它;如果是普通的文件路径则会将之视为 xml 文件载入它,载入成功后会将新元素追加至 target 指定的 id 的元素内。简而言之,可以靠该部件实现“点击按钮切换界面”的功能。

    lcui-anchor-widget

    版本迭代

    代码库的 Git 提交信息格式已经采用 Angular 提交信息规范 进行规范,方便为以后的版本收集改动内容。

    版本号一直停留在 1.0.0 会浪费版本号的价值,但到目前为止,LCUI 内部函数命名还不够稳定,在后续版本更新中有可能会更名和移除,如果你有丰富的接口命名和模块化设计经验,可以向 LCUI 提交你的改进方案,以让 LCUI 尽早发布 1.0.0 版本。

    Source code(tar.gz)
    Source code(zip)
    LCUI-1.0-beta-for-windows.x86.zip(14.67 MB)
  • v1.0-alpha2(Jul 11, 2017)

    • Adjust the code structure
    • Improved TextView widget
    • Improved caret positioning and text rendering for TextEdit widget
    • Improved widget box-shadow rendering
    • Add drivers for UWP Application, here is example
    • Improved support for high-resolution screen
      • Add dp and sp unit, Similar to dp and sp unit in Android
      • Add support scaling, It is possible to set the appropriate zoom ratio according to the screen pixel density
    • Improve automation build and test
      • Add unit testing
      • Add code coverage testing
      • Enabled the valgrind memory check tool
    • Fixed all memory leak BUGs and memory access errors
    • Fixed some widget layout bugs
    • Fixed jpeg reader sometimes fail to read data
    • Fixed other known bugs

    中文版(Chinese Version)

    • 调整代码结构
    • 改进 TextView 部件
    • 改进 TextEdit 部件的光标定位与文本渲染
    • 改进部件的盒形阴影(box-shadow)绘制
    • 添加适用于 UWP 应用的驱动支持,示例应用代码在这里
    • 改进对高分屏的支持
      • 添加 dp、sp 度量单位,功能与 Android 中的同名单位相似
      • 添加缩放支持,可根据屏幕像素密度设置合适的缩放比例
    • 完善自动化构建和测试
      • 添加单元测试
      • 添加代码覆盖率测试
      • 引入 valgrind 内存检查工具
    • 解决所有内存泄露和内存访问越界问题
    • 解决部件布局功能中存在的一些问题
    • 解决 jpeg 图像读取器有时会读取失败的问题
    • 其它已知 BUG 修复

    如需了解更多代码变更细节,请查看此次拉取请求,包含 88 次代码提交,涉及 174 个文件,净增 6K+ 行代码。

    UWP 的支持

    这个版本已经引入 UWP 应用的驱动支持,基于 DirectX 11,封装了 UWP C++ 接口调用代码,源代码参考自 Visual Studio 提供的 DirectX 11 示例应用(通用 Windows),你可以在 src/platform/windows 目录下找到实现代码,示例应用代码在 build/windows/LCUIApp/App.cpp,编译生成 LCUIApp 项目即可查看运行效果。

    2017-07-02-17-22

    该驱动代码单独放在 LCUIUWPApp 项目中,编译生成的是动态库(dll),需要与 LCUIUWP 项目一起使用。由于该项目只是做了简单的封装,没有对灵活性和扩展性做过多的考虑,因此,如果你有其它需求(例如在应用挂起、恢复时做一些操作),请手动修改该项目的代码。

    对高分屏的适应

    如今高分屏在手机和笔记本上日渐普及,作为一个图形界面开发库,如果还停留在以像素(px)为单位设置界面元素的位置和大小的话,那么在各种分辨率下的视觉体验会惨不忍睹,因此,LCUI 在此次版本更新中添加了高分屏适配方案,原理很简单,让界面元素支持比例缩放,这样就能够根据屏幕像素密度以合适的缩放比例呈现界面内容。

    test-scaling-support

    除此之外,还添加了 dp 和 sp 度量单位,这两个度量单位参考自 Android,效果大致一样,相信 Android 程序员们对其最为熟悉,此处就不做详细说明了。

    注:目前 LCUI 并不支持自动检测 dpi 来设置缩放比例,你需要手动设置缩放比例,这个问题会在后续版本中解决。

    自动化构建和测试

    在以往的版本中,每次代码改动都有可能影响到正常功能,遇到这种情况只能人工手动运行程序来检查各项功能是否运作正常,既麻烦又浪费时间。在此次版本更新后这个情况会有所改善,部分主要功能模块已经有了对应的单元测试,在每次更新代码后,可以方便的根据自动化构建和测试结果来得知是否存在新 BUG。

    auto-building-and-testing

    有时一两处存在内存越界的代码可能不会影响到正常的运行结果,一旦数量多起来的时候就很容易让程序崩溃,更为奇特的是程序并不是固定在某个情况下崩溃的。为确保单元测试能够得到正常的结果,LCUI 引入了 valgrind 内存检查工具,并将内存检查结果作为测试是否通过的条件之一,以前堆积的内存访问越界和内存泄漏问题在这个版本中已经全部解决。

    商业许可

    和其它 GPL 软件的套路一样,LCUI 添加了收费的商业授权许可,允许闭源商用,附带一点点技术支持服务。当然,这主要是为以后的可持续发展做些准备,现阶段并不指望有多少人会用。商业授权的收费并不贵,可能还不及某些实习生的半个月工资,你可以当作是聘用了个实习生花了几天时间写的界面库。

    CSS 框架

    手写 CSS 代码和调整界面布局终究是一件麻烦的事情,就像 Web 前端程序员不用现成的 CSS 框架写网站一样,除了业务逻辑还要浪费时间写 CSS 代码调整页面效果。作者计划为此开发一个新的项目,包含 CSS 框架、常用界面组件、国际化支持(i18n)等,如果你是 Web 前端大佬,踩过一些坑,用过一些主流的 CSS 框架,可以在这里与作者交流心得体会,包括但不仅限于:工程目录划分、CSS 代码命名、编码规范、SCSS 技巧、界面配色及视觉效果这类内容。

    贡献

    相信很多人已经习惯看到那些活跃的开源项目,即使自己什么都不用做,它也能积极的发展下去,然而 LCUI 并不是那种有强大社区力量或雄厚资金支持的开源项目,所以,如果你有什么需求,请先阅读以下内容。

    • 遇到问题时请尽量花时间自己独立解决,实在无法解决的话,请再花些时间准备好详细的问题描述,然后按照下面给出的方法提交问题。
    • 普通的使用问题,请在开源中国社区(问答板块)SegmentFaultStackoverflow 上提交问题并 @ 作者,这样作者在帮助你解决问题后至少能赚点积分/声望值,还能让搜索引擎多收录一条 LCUI 相关的内容,帮助其他遇到类似问题的人们。
    • BUG、新功能建议、代码改进建议等核心开发相关的问题请提交至 GitHub 的 Issues 页面中。虽然作者英语比较渣,但还是建议你使用英语撰写内容,就当是一起学习英语吧。
    • 如果你想提交自己的代码改进方案,请先向作者确认这个方案是否符合要求,确认之后再开始编写代码,务必遵循现有代码风格。在代码完成后,请提交拉取请求(Pull Request),让作者决定是否拉取你的分支里的代码并合并至主分支,必要的话请补充单元测试。
    • 文档相关问题、需求及改进建议,请提交至 LCUI-Guide 项目里。
    Source code(tar.gz)
    Source code(zip)
    LCUI-1.0-alpha2-for-windows.x86.zip(23.76 MB)
  • v1.0-alpha(Apr 18, 2017)

    • Improved bmp, jpeg, png file processing, add image reader
    • Added Scrollbar widget
    • Improved Button widget
    • Improved TextView widget
    • Improved TextEdit widget
    • Improved widget types, events, layouts and styles processing
    • Imrpoved UI rendering performance
    • Added touch screen support
    • Added XML and CSS support
    • Removed Linux Framebuffer support
    • Added Linux XWindow support
    • Added simple support for Universal Windows Platform (UWP)
    • Imrpoved Windows support
    • Added some tutorials (only Chinese version)
    • Fixed some bugs

    中文版(Chinese Version)

    由于本次更新改动很大,所以版本号从 1.0 开始,主要更新内容如下:

    • 改进 bmp、jpeg、png 图片的读取接口
    • 添加滚动条(Scrollbar)部件
    • 改进按钮(Button)部件
    • 改进文本显示(TextView)部件
    • 改进文本编辑(TextEdit)部件
    • 改进部件的类型、事件、布局及样式处理
    • 改进图形界面的性能
    • 添加触控支持
    • 添加 CSS 和 XML 支持
    • 移除 Linux 的帧缓冲(FrameBuffer)支持
    • 添加对 Linux 的 XWindow 的支持
    • 添加对 Windows 通用应用平台(UWP)的简单支持
    • 改进对 Windows 的支持
    • 添加部分文档
    • 修复部分已知BUG

    原计划在此版本中添加缩放功能,用于适应各种分辨率的屏幕,但由于涉及到的地方比较多,所以该特性已经推迟到后续的版本中。

    以下将针对几个主要改动做些简单的说明,如需要体验具体效果可以下载 LCUI 的功能旗舰级应用:LC's Finder

    XML 和 CSS

    本次比较大的改动是加入了对 XML 和 CSS 支持,为此 LCUI 的部件布局和样式处理也做了些整改,基本算是重写了一遍。相信写过图形界面应用的程序员们都会有这样的体验,只用编程语言来描述界面内容是一件很麻烦的事情,写了一坨代码却只是实现一些简单的布局和效果,可读性差且不易维护。XML 和 CSS 能够解决这种问题,界面的布局和结构可以用 XML 描述,目前支持的标签很少,书写起来会比较简单,就像下面这样。

    <?xml version="1.0" encoding="UTF-8" ?>
    <lcui-app>
      <resource type="text/css" src="helloworld.css"/>
      <resource type="application/font-ttf" src="C:/Windows/Fonts/comic.ttf"/>
      <ui>
        <widget id="text-hello" type="textview" class="text-hello">Hello, World!</widget>
        <widget id="edit" type="textedit">Hello, World!</widget>
        <widget id="btn-ok" type="button">Submit</widget>
      </ui>
    </lcui-app>
    

    至于 CSS,你可以用它来描述界面元素的视觉效果,受限于现有条件,目前只支持简单的 CSS 样式,并且某些 CSS 样式的实际效果会根据 LCUI 的现有情况做一定的调整,属于定制版的 CSS。除了一些简单的样式外,你还可以靠 CSS 来使用图标字体,例如:FontAwesomeMaterial Design Icons,当然,这些图标字体附带的 CSS 文件并不能直接在 LCUI 中使用,需要做些修改,具体可以参考这篇文章

    对于比较复杂的界面,CSS 代码也会比较多,如果觉得这堆 CSS 代码写起来很麻烦,可以试试使用 sasslessstylus 这类 CSS 预处理器来简化编码,就像下面这样。

    build-app-with-css

    当 CSS 代码比较多的时候,会很容易出现样式污染问题,在没有浏览器自带的开发人员工具情况下,这个问题处理起来会比较麻烦,但也不是没有办法,LCUI 提供了 Widget_PrintStyleSheets() 函数,可以打印出指定部件应用到的所有样式表内容,结果类似于下面这样。

    selector(1612994007) stylesheets begin
    
    [helloworld.css][rank: 11]
    textview.text-hello {
    	margin-top: 25px;
    	margin-right: 25px;
    	margin-bottom: 25px;
    	margin-left: 25px;
    	padding-top: 25px;
    	padding-right: 25px;
    	padding-bottom: 25px;
    	padding-left: 25px;
    	border-top-width: 1px;
    	border-top-style: solid;
    	border-top-color: #000000;
    	border-right-width: 1px;
    	border-right-style: solid;
    	border-right-color: #000000;
    	border-bottom-width: 1px;
    	border-bottom-style: solid;
    	border-bottom-color: #000000;
    	border-left-width: 1px;
    	border-left-style: solid;
    	border-left-color: #000000;
    	background-color: #fafafa;
    	color: #8cc63f;
    	font-family (+): "Comic Sans MS";
    	font-size (+): 18px;
    	text-align (+): center;
    }
    
    [<none>][rank: 1]
    * {
    	position: static;
    	display: block;
    	width: auto;
    	height: auto;
    	此处省略部分内容 ...
    	background-color: rgba(255,255,255,0);
    }
    [selector(1612994007) final stylesheet] {
    	此处省略部分内容 ...
    }
    selector(1612994007) stylesheets end
    

    UWP 支持

    此版本虽然支持编译成 Windows 通用库/运行时组件,但并未包含 UWP 版的消息循环、键盘、鼠标、触控和图形输出的支持代码,这块的代码目前还在 LC's Finder 项目内,如有需要可以套用该项目的相关代码,后续版本会将这块的代码整理进来。

    Source code(tar.gz)
    Source code(zip)
    LCUI-1.0-alpha-for-windows.zip(15.21 MB)
Owner
Liu
A web front end developer
Liu
RmlUi - The HTML/CSS User Interface library evolved

RmlUi - The HTML/CSS User Interface Library Evolved RmlUi - now with added boosters taking control of the rocket, targeting your games and application

Michael R. P. Ragazzon 1.6k Jan 7, 2023
GPU Accelerated C++ User Interface, with WYSIWYG developing tools, XML supports, built-in data binding and MVVM features.

GacUI GPU Accelerated C++ User Interface, with WYSIWYG developing tools, XML supports, built-in data binding and MVVM features. Read the LICENSE first

Vczh Libraries 2.1k Jan 7, 2023
Library for writing text-based user interfaces

Termbox for RT-Thread 中文说明文档 This repository forks from nullgemm/termbox_next Getting started Termbox's interface only consists of 12 functions: tb_in

Meco Jianting Man 5 May 25, 2022
A simple/fast stacking box layout library. It's useful for calculating layouts for things like 2D user interfaces.

A simple/fast stacking box layout library. It's useful for calculating layouts for things like 2D user interfaces. It compiles as C99 or C++. It's tested with gcc (mingw64), VS2015, and clang/LLVM. You only need one file to use it in your own project: layout.h.

Andrew Richards 713 Dec 28, 2022
Arcan is a powerful development framework for creating virtually anything from user interfaces

Arcan is a powerful development framework for creating virtually anything from user interfaces for specialized embedded applications all the way to full-blown standalone desktop environments.

Bjorn Stahl 1.3k Dec 26, 2022
GTK is a multi-platform toolkit for creating graphical user interfaces.

GTK — The GTK toolkit General information GTK is a multi-platform toolkit for creating graphical user interfaces. Offering a complete set of widgets,

GNOME Github Mirror 1.1k Dec 31, 2022
Build performant, native and cross-platform desktop applications with Node.js and CSS like styling. 🚀

NodeGui Build performant, native and cross-platform desktop applications with Node.js and CSS like styling. ?? NodeGUI is powered by Qt5 ?? which make

NodeGui 8.1k Dec 30, 2022
Electron framework lets you write cross-platform desktop applications using JavaScript, HTML and CSS.

?? Available Translations: ???? ???? ???? ???? ???? ???? ???? ???? . View these docs in other languages at electron/i18n. The Electron framework lets

Electron 105.2k Jan 3, 2023
ZIAPI repository which contains the interfaces and concrete implementations that make up our Epitech Zia project API proposal.

ZIAPI Welcome to the ZIAPI repository which contains the interfaces and concrete implementations that make up our Epitech Zia project API proposal. ZI

Martin Olivier 30 Oct 24, 2022
ImTui: Immediate Mode Text-based User Interface C++ Library

ImTui is an immediate mode text-based user interface library. Supports 256 ANSI colors and mouse/keyboard input.

Georgi Gerganov 2.1k Jan 1, 2023
This is a minimal state immediate mode graphical user interface toolkit written in ANSI C and licensed under public domain

This is a minimal state immediate mode graphical user interface toolkit written in ANSI C and licensed under public domain. It was designed as a simple embeddable user interface for application and does not have any dependencies, a default render backend or OS window and input handling but instead provides a very modular library approach by using simple input state for input and draw commands describing primitive shapes as output.

Micha Mettke 13.5k Jan 8, 2023
Dear ImGui: Bloat-free Graphical User interface for C++ with minimal dependencies

Dear ImGui (This library is available under a free and permissive license, but needs financial support to sustain its continued improvements. In addit

omar 44.5k Jan 7, 2023
AirPods desktop user experience enhancement program

AirPodsDesktop AirPods desktop user experience enhancement program

Sprite 381 Jan 5, 2023
ROS_Melodic_Qt_GUI_Template is a Graphical User Interface programmed with Qt framework.

This is a GUI template for ros to control your robot and read data from sensors.

null 28 Nov 15, 2022
AnUI is a powerful Graphical User Interface framework made for people that actually care about design!

What's AuUI ** Project is not finished ** AuUI, an abbreviation for "Actual Understandable User Interface" is a graphical user interface framework to

Goat 4 Jun 17, 2022
LicenseValidationDialog is a class designed to validate license keys on the user's side.

QT-LicenseValidationDialog Basic LicenseValidationDialog is a class designed to validate license keys on the user's side. The class is designed to ver

Piotr Napierała 1 Jun 10, 2022
Simple and portable (but not inflexible) GUI library in C that uses the native GUI technologies of each platform it supports.

libui: a portable GUI library for C This README is being written. Status It has come to my attention that I have not been particularly clear about how

Pietro Gagliardi 10.4k Jan 2, 2023
Minimalistic C++/Python GUI library for OpenGL, GLES2/3, Metal, and WebAssembly/WebGL

NanoGUI NanoGUI is a minimalistic cross-platform widget library for OpenGL 3+, GLES 2/3, and Metal. It supports automatic layout generation, stateful

Mitsuba Physically Based Renderer 1.2k Dec 28, 2022
A barebones single-header GUI library for Win32 and X11.

luigi A barebones single-header GUI library for Win32 and X11. Building example Windows Update luigi_example.c to #define UI_WINDOWS at the top of the

Nakst 235 Dec 30, 2022