Pārlūkot izejas kodu

与fmt有关的修改

- 在根目录新增Makefile,以支持快捷fmt,并进行fmt
- 更换新版Makefile
- 新增fmt-check
yuyi2439 1 gadu atpakaļ
vecāks
revīzija
48d97639c6

+ 20 - 0
.github/workflows/fmt-check.yml

@@ -0,0 +1,20 @@
+name: fmt-check
+
+on:
+  workflow_dispatch:
+  push:
+    branches: [ "master" ]
+  pull_request:
+    branches: [ "master" ]
+
+env:
+  CARGO_TERM_COLOR: always
+
+jobs:
+  fmt-check:
+    runs-on: ubuntu-latest
+
+    steps:
+    - uses: actions/checkout@v3
+    - name: Build
+      run: make fmt-check

+ 3 - 0
Makefile

@@ -0,0 +1,3 @@
+fmt:
+	@ $(MAKE) -C starry_client fmt
+	@ $(MAKE) -C starry_server fmt

+ 33 - 18
starry_client/Makefile

@@ -1,41 +1,56 @@
-# The toolchain we use.
-# You can get it by running DragonOS' `tools/bootstrap.sh`
-TOOLCHAIN="+nightly-2023-08-15-x86_64-unknown-linux_dragonos-gnu"
-RUSTFLAGS+="-C target-feature=+crt-static -C link-arg=-no-pie"
+TOOLCHAIN="+nightly-2023-08-15-x86_64-unknown-linux-gnu"
+RUSTFLAGS+=""
 
+ifdef DADK_CURRENT_BUILD_DIR
 # 如果是在dadk中编译,那么安装到dadk的安装目录中
-INSTALL_DIR?=$(DADK_CURRENT_BUILD_DIR)
+	INSTALL_DIR = $(DADK_CURRENT_BUILD_DIR)
+else
 # 如果是在本地编译,那么安装到当前目录下的install目录中
-INSTALL_DIR?=./install
-
+	INSTALL_DIR = ./install
+endif
+
+ifeq ($(ARCH), x86_64)
+	export RUST_TARGET=x86_64-unknown-linux-musl
+else ifeq ($(ARCH), riscv64)
+	export RUST_TARGET=riscv64gc-unknown-linux-gnu
+else 
+# 默认为x86_86,用于本地编译
+	export RUST_TARGET=x86_64-unknown-linux-musl
+endif
 
 run:
-	RUSTFLAGS=$(RUSTFLAGS) cargo $(TOOLCHAIN) run
+	RUSTFLAGS=$(RUSTFLAGS) cargo $(TOOLCHAIN) run --target $(RUST_TARGET)
 
 build:
-	RUSTFLAGS=$(RUSTFLAGS) cargo $(TOOLCHAIN) build
+	RUSTFLAGS=$(RUSTFLAGS) cargo $(TOOLCHAIN) build --target $(RUST_TARGET)
 
 clean:
-	RUSTFLAGS=$(RUSTFLAGS) cargo $(TOOLCHAIN) clean
+	RUSTFLAGS=$(RUSTFLAGS) cargo $(TOOLCHAIN) clean --target $(RUST_TARGET)
 
 test:
-	RUSTFLAGS=$(RUSTFLAGS) cargo $(TOOLCHAIN) test
+	RUSTFLAGS=$(RUSTFLAGS) cargo $(TOOLCHAIN) test --target $(RUST_TARGET)
 
 doc:
-	RUSTFLAGS=$(RUSTFLAGS) cargo $(TOOLCHAIN) doc
+	RUSTFLAGS=$(RUSTFLAGS) cargo $(TOOLCHAIN) doc --target $(RUST_TARGET)
+
+fmt:
+	RUSTFLAGS=$(RUSTFLAGS) cargo $(TOOLCHAIN) fmt
+
+fmt-check:
+	RUSTFLAGS=$(RUSTFLAGS) cargo $(TOOLCHAIN) fmt --check
 
 run-release:
-	RUSTFLAGS=$(RUSTFLAGS) cargo $(TOOLCHAIN) run --release
+	RUSTFLAGS=$(RUSTFLAGS) cargo $(TOOLCHAIN) run --target $(RUST_TARGET) --release
 
 build-release:
-	RUSTFLAGS=$(RUSTFLAGS) cargo $(TOOLCHAIN) build --release
+	RUSTFLAGS=$(RUSTFLAGS) cargo $(TOOLCHAIN) build --target $(RUST_TARGET) --release
 
 clean-release:
-	RUSTFLAGS=$(RUSTFLAGS) cargo $(TOOLCHAIN) clean --release
+	RUSTFLAGS=$(RUSTFLAGS) cargo $(TOOLCHAIN) clean --target $(RUST_TARGET) --release
 
 test-release:
-	RUSTFLAGS=$(RUSTFLAGS) cargo $(TOOLCHAIN) test --release
+	RUSTFLAGS=$(RUSTFLAGS) cargo $(TOOLCHAIN) test --target $(RUST_TARGET) --release
 
 .PHONY: install
-install: 
-	RUSTFLAGS=$(RUSTFLAGS) cargo $(TOOLCHAIN) install --path . --no-track --root $(INSTALL_DIR) --force
+install:
+	RUSTFLAGS=$(RUSTFLAGS) cargo $(TOOLCHAIN) install --target $(RUST_TARGET) --path . --no-track --root $(INSTALL_DIR) --force

+ 2 - 2
starry_client/src/base/color.rs

@@ -19,7 +19,7 @@ impl Color {
     /// 通过RGBA值创建颜色
     pub const fn rgba(r: u8, g: u8, b: u8, a: u8) -> Self {
         Color {
-            data : ((a as u32) << 24) | ((r as u32) << 16) | (g as u32) << 8 | (b as u32),
+            data: ((a as u32) << 24) | ((r as u32) << 16) | (g as u32) << 8 | (b as u32),
         }
     }
 
@@ -79,4 +79,4 @@ impl fmt::Debug for Color {
     fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> {
         write!(f, "{:#010X}", { self.data })
     }
-}
+}

+ 8 - 6
starry_client/src/base/event.rs

@@ -9,7 +9,7 @@ pub enum EventOption {
     /// 空事件
     None,
     /// 未知事件
-    Unknown,    
+    Unknown,
 }
 
 /// TODO: 整理
@@ -40,7 +40,9 @@ impl Event {
         match self.code {
             EVENT_NONE => EventOption::None,
             EVENT_KEY => EventOption::Key(KeyEvent::from_event(self)),
-            EVENT_MOUSE_RELATIVE => EventOption::MouseRelative(MouseRelativeEvent::from_event(self)),
+            EVENT_MOUSE_RELATIVE => {
+                EventOption::MouseRelative(MouseRelativeEvent::from_event(self))
+            }
             EVENT_BUTTON => EventOption::Button(ButtonEvent::from_event(self)),
             _ => EventOption::Unknown,
         }
@@ -132,16 +134,16 @@ impl ButtonEvent {
         Event {
             code: EVENT_BUTTON,
             a: self.left as i64 | (self.middle as i64) << 1 | (self.right as i64) << 2,
-            b: 0    
+            b: 0,
         }
     }
 
     /// 从Event转换为ButtonEvent
     pub fn from_event(event: Event) -> ButtonEvent {
         ButtonEvent {
-            left: event.a & (1 << 0)  == 1,
+            left: event.a & (1 << 0) == 1,
             middle: event.a & (1 << 1) == 1,
-            right: event.a & (1 << 2) == 1
+            right: event.a & (1 << 2) == 1,
         }
     }
 }
@@ -171,4 +173,4 @@ impl MouseUpdateEvent {
             y: event.b as i32,
         }
     }
-}
+}

+ 0 - 1
starry_client/src/base/graphicspath.rs

@@ -55,7 +55,6 @@ impl GraphicsPath {
 
             x = (self.x as f32) * uu;
             y = (self.y as f32) * uu;
-            
 
             x += 2.0 * u * t * (argx1 as f32);
             y += 2.0 * u * t * (argy1 as f32);

+ 1 - 1
starry_client/src/base/mod.rs

@@ -1,4 +1,4 @@
 pub mod color;
+pub mod event;
 pub mod graphicspath;
 pub mod renderer;
-pub mod event;

+ 2 - 2
starry_client/src/base/renderer.rs

@@ -208,7 +208,7 @@ pub trait Renderer {
     
     /// # 函数功能
     /// 绘制指定颜色的一条线段
-    /// 
+    ///
     /// ## 参数
     /// - argx1: 起点x坐标
     /// - argy1: 起点y坐标
@@ -259,7 +259,7 @@ pub trait Renderer {
 
     /// # 函数功能
     /// 绘制指定颜色的若干线段(首尾相连)
-    /// 
+    ///
     /// ## 参数
     /// - points: 点集合
     /// - color: 绘制颜色

+ 1 - 1
starry_client/src/lib.rs

@@ -1,2 +1,2 @@
 pub mod base;
-pub mod window;
+pub mod window;

+ 15 - 8
starry_client/src/window.rs

@@ -1,6 +1,13 @@
-use std::{cell::Cell, fs::File, io::{Seek, SeekFrom, Write}};
+use std::{
+    cell::Cell,
+    fs::File,
+    io::{Seek, SeekFrom, Write},
+};
 
-use crate::base::{color::Color, renderer::{RenderMode, Renderer}};
+use crate::base::{
+    color::Color,
+    renderer::{RenderMode, Renderer},
+};
 
 // TODO: 读帧缓冲设备属性
 /// 屏幕宽度
@@ -50,7 +57,7 @@ impl Renderer for Window {
         self.data_opt.as_ref().unwrap()
     }
 
-    fn data_mut(&mut self) -> &mut [Color]{
+    fn data_mut(&mut self) -> &mut [Color] {
         self.data_opt.as_mut().unwrap()
     }
 
@@ -70,7 +77,7 @@ impl Renderer for Window {
     }
 
     fn mode(&self) -> &Cell<RenderMode> {
-        &self.mode    
+        &self.mode
     }
 }
 
@@ -88,12 +95,13 @@ impl Window {
             resizable: false,
             mode: Cell::new(RenderMode::Blend),
             // file_opt: None,
-            data_opt: Some(vec!(Color::rgb(0, 0, 0); (w * h) as usize).into_boxed_slice()),
+            data_opt: Some(vec![Color::rgb(0, 0, 0); (w * h) as usize].into_boxed_slice()),
         }
 
-        // TODO: 与服务器通信 
+        // TODO: 与服务器通信
     }
 
+
     /// 返回窗口x坐标
     pub fn x(&self) -> i32 {
         self.x
@@ -107,7 +115,6 @@ impl Window {
     /// 返回窗口标题
     pub fn title(&self) -> String {
         self.title.clone()
-    }
 
     /// 改变窗口的位置
     pub fn set_pos(&mut self, x: i32, y: i32) {
@@ -125,4 +132,4 @@ impl Window {
     pub fn set_title(&mut self, title: &str) {
         self.title = title.to_string();
     }
-}
+}

+ 33 - 18
starry_server/Makefile

@@ -1,41 +1,56 @@
-# The toolchain we use.
-# You can get it by running DragonOS' `tools/bootstrap.sh`
-TOOLCHAIN="+nightly-2023-08-15-x86_64-unknown-linux_dragonos-gnu"
-RUSTFLAGS+="-C target-feature=+crt-static -C link-arg=-no-pie"
+TOOLCHAIN="+nightly-2023-08-15-x86_64-unknown-linux-gnu"
+RUSTFLAGS+=""
 
+ifdef DADK_CURRENT_BUILD_DIR
 # 如果是在dadk中编译,那么安装到dadk的安装目录中
-INSTALL_DIR?=$(DADK_CURRENT_BUILD_DIR)
+	INSTALL_DIR = $(DADK_CURRENT_BUILD_DIR)
+else
 # 如果是在本地编译,那么安装到当前目录下的install目录中
-INSTALL_DIR?=./install
-
+	INSTALL_DIR = ./install
+endif
+
+ifeq ($(ARCH), x86_64)
+	export RUST_TARGET=x86_64-unknown-linux-musl
+else ifeq ($(ARCH), riscv64)
+	export RUST_TARGET=riscv64gc-unknown-linux-gnu
+else 
+# 默认为x86_86,用于本地编译
+	export RUST_TARGET=x86_64-unknown-linux-musl
+endif
 
 run:
-	RUSTFLAGS=$(RUSTFLAGS) cargo $(TOOLCHAIN) run
+	RUSTFLAGS=$(RUSTFLAGS) cargo $(TOOLCHAIN) run --target $(RUST_TARGET)
 
 build:
-	RUSTFLAGS=$(RUSTFLAGS) cargo $(TOOLCHAIN) build
+	RUSTFLAGS=$(RUSTFLAGS) cargo $(TOOLCHAIN) build --target $(RUST_TARGET)
 
 clean:
-	RUSTFLAGS=$(RUSTFLAGS) cargo $(TOOLCHAIN) clean
+	RUSTFLAGS=$(RUSTFLAGS) cargo $(TOOLCHAIN) clean --target $(RUST_TARGET)
 
 test:
-	RUSTFLAGS=$(RUSTFLAGS) cargo $(TOOLCHAIN) test
+	RUSTFLAGS=$(RUSTFLAGS) cargo $(TOOLCHAIN) test --target $(RUST_TARGET)
 
 doc:
-	RUSTFLAGS=$(RUSTFLAGS) cargo $(TOOLCHAIN) doc
+	RUSTFLAGS=$(RUSTFLAGS) cargo $(TOOLCHAIN) doc --target $(RUST_TARGET)
+
+fmt:
+	RUSTFLAGS=$(RUSTFLAGS) cargo $(TOOLCHAIN) fmt
+
+fmt-check:
+	RUSTFLAGS=$(RUSTFLAGS) cargo $(TOOLCHAIN) fmt --check
 
 run-release:
-	RUSTFLAGS=$(RUSTFLAGS) cargo $(TOOLCHAIN) run --release
+	RUSTFLAGS=$(RUSTFLAGS) cargo $(TOOLCHAIN) run --target $(RUST_TARGET) --release
 
 build-release:
-	RUSTFLAGS=$(RUSTFLAGS) cargo $(TOOLCHAIN) build --release
+	RUSTFLAGS=$(RUSTFLAGS) cargo $(TOOLCHAIN) build --target $(RUST_TARGET) --release
 
 clean-release:
-	RUSTFLAGS=$(RUSTFLAGS) cargo $(TOOLCHAIN) clean --release
+	RUSTFLAGS=$(RUSTFLAGS) cargo $(TOOLCHAIN) clean --target $(RUST_TARGET) --release
 
 test-release:
-	RUSTFLAGS=$(RUSTFLAGS) cargo $(TOOLCHAIN) test --release
+	RUSTFLAGS=$(RUSTFLAGS) cargo $(TOOLCHAIN) test --target $(RUST_TARGET) --release
 
 .PHONY: install
-install: 
-	RUSTFLAGS=$(RUSTFLAGS) cargo $(TOOLCHAIN) install --path . --no-track --root $(INSTALL_DIR) --force
+install:
+	RUSTFLAGS=$(RUSTFLAGS) cargo $(TOOLCHAIN) install --target $(RUST_TARGET) --path . --no-track --root $(INSTALL_DIR) --force

+ 24 - 15
starry_server/src/core/compositor.rs

@@ -1,4 +1,8 @@
-use std::{fs::File, io::{Seek, SeekFrom, Write}, sync::{Arc, RwLock}};
+use std::{
+    fs::File,
+    io::{Seek, SeekFrom, Write},
+    sync::{Arc, RwLock},
+};
 
 use starry_client::base::renderer::Renderer;
 
@@ -52,17 +56,16 @@ impl Compositor {
         let window_manager = window_manager().unwrap();
         let server = starry_server().unwrap();
         let cursor_rect = window_manager.cursor_rect();
-        
+
         // 对窗口排序
         window_manager.rezbuffer();
-        
+
         let mut window_manager_guard = window_manager.data.write().unwrap();
         let mut compositor_guard = self.data.write().unwrap();
         let mut server_guard = server.data.write().unwrap();
-        
+
         let mut total_redraw_rect_opt: Option<Rect> = None;
         for original_rect in compositor_guard.redraws.drain(..) {
-
             // 更新重绘的总矩形区域
             if !original_rect.is_empty() {
                 total_redraw_rect_opt = match total_redraw_rect_opt {
@@ -95,9 +98,7 @@ impl Compositor {
 
                 let cursor_intersect = rect.intersection(&cursor_rect);
                 if !cursor_intersect.is_empty() {
-                    if let Some(cursor) =
-                        cursors.get_mut(&window_manager_guard.cursor_i)
-                    {
+                    if let Some(cursor) = cursors.get_mut(&window_manager_guard.cursor_i) {
                         display.roi(&cursor_intersect).blend(&cursor.roi(
                             &cursor_intersect.offset(-cursor_rect.left(), -cursor_rect.top()),
                         ));
@@ -105,22 +106,30 @@ impl Compositor {
                 }
             }
         }
-        
+
         // println!("[Info] Compositor calculate total redraw rect done!");
 
-        // TODO 
+        // TODO
         let mut fb = &compositor_guard.fb_file;
-        
+
         if let Some(total_redraw_rect) = total_redraw_rect_opt {
             for display in server_guard.displays.iter_mut() {
                 let display_redraw = total_redraw_rect.intersection(&display.screen_rect());
                 if !display_redraw.is_empty() {
                     for y in 0..display_redraw.height() {
                         for x in 0..display_redraw.width() {
-                            let pixel = display.image.get_pixel(x + display_redraw.left() - display.x, y + display_redraw.top() - display.y);
-                            let offset = (((y + display_redraw.top()) * SCREEN_WIDTH as i32) + x + display_redraw.left()) * 4;
-                            fb.seek(SeekFrom::Start(offset as u64)).expect("Unable to seek framebuffer");
-                            fb.write_all(&pixel.to_bgra_bytes()).expect("Unable to write framebuffer");
+                            let pixel = display.image.get_pixel(
+                                x + display_redraw.left() - display.x,
+                                y + display_redraw.top() - display.y,
+                            );
+                            let offset = (((y + display_redraw.top()) * SCREEN_WIDTH as i32)
+                                + x
+                                + display_redraw.left())
+                                * 4;
+                            fb.seek(SeekFrom::Start(offset as u64))
+                                .expect("Unable to seek framebuffer");
+                            fb.write_all(&pixel.to_bgra_bytes())
+                                .expect("Unable to write framebuffer");
                         }
                     }
                 }

+ 3 - 3
starry_server/src/core/input/mod.rs

@@ -32,7 +32,7 @@ pub struct InputManagerData {
 
 impl InputManager {
     /// 创建输入管理器
-    pub fn new(){
+    pub fn new() {
         let mut input_handlers = Vec::new();
         // TODO: 通过设备检测添加
         input_handlers.push(MouseInputHandler::new() as Box<dyn InputHandler>);
@@ -77,8 +77,8 @@ pub trait InputHandler {
         let mut buf: [u8; 1024] = [0; 1024];
         // TODO: 错误信息提示相应文件路径
         let count = self
-        .get_listening_file()
-        .read(&mut buf)
+            .get_listening_file()
+            .read(&mut buf)
             .expect("[Error] Fail to polling file");
         // println!("[Info] Input_Handler polling read {:?} bytes", count);
         for i in 0..count {

+ 22 - 7
starry_server/src/core/mod.rs

@@ -1,6 +1,13 @@
-use std::{collections::BTreeMap, rc::Rc, sync::{Arc, RwLock}};
+use std::{
+    collections::BTreeMap,
+    rc::Rc,
+    sync::{Arc, RwLock},
+};
 
-use crate::{base::{display::Display, image::Image}, config::Config};
+use crate::{
+    base::{display::Display, image::Image},
+    config::Config,
+};
 
 use self::{
     compositor::{compositor, Compositor},
@@ -42,10 +49,11 @@ pub struct StarryServerData {
 
 impl StarryServer {
     /// 创建图形服务器
-    pub fn new(config: Rc<Config>, displays: Vec<Display>){
+    pub fn new(config: Rc<Config>, displays: Vec<Display>) {
         let mut cursors = BTreeMap::new();
         cursors.insert(CursorKind::None, Image::new(0, 0));
-        cursors.insert(CursorKind::Normal, Image::from_path(CURSOR_NORMAL).unwrap_or(Image::new(10, 10)));        // cursors.insert(CursorKind::BottomLeftCorner, Image::from_path_scale(&config.bottom_left_corner, scale).unwrap_or(Image::new(0, 0)));
+        cursors.insert(CursorKind::Normal, Image::from_path(CURSOR_NORMAL).unwrap_or(Image::new(10, 10)));        
+        // cursors.insert(CursorKind::BottomLeftCorner, Image::from_path_scale(&config.bottom_left_corner, scale).unwrap_or(Image::new(0, 0)));
         // cursors.insert(CursorKind::BottomRightCorner, Image::from_path_scale(&config.bottom_right_corner, scale).unwrap_or(Image::new(0, 0)));
         // cursors.insert(CursorKind::BottomSide, Image::from_path_scale(&config.bottom_side, scale).unwrap_or(Image::new(0, 0)));
         // cursors.insert(CursorKind::LeftSide, Image::from_path_scale(&config.left_side, scale).unwrap_or(Image::new(0, 0)));
@@ -59,7 +67,6 @@ impl StarryServer {
             }),
         };
 
-
         unsafe {
             STARRY_SERVER = Some(Arc::new(server));
         }
@@ -74,8 +81,16 @@ impl StarryServer {
         InputManager::new();
 
         // TODO 临时在此创建桌面窗口
-        window_manager().unwrap().window_new(0, 0, SCREEN_WIDTH as i32, SCREEN_HEIGHT as i32, "", "".to_string(), DESKTOP_BG);
-        
+        window_manager().unwrap().window_new(
+            0,
+            0,
+            SCREEN_WIDTH as i32,
+            SCREEN_HEIGHT as i32,
+            "",
+            "".to_string(),
+            DESKTOP_BG,
+        );
+
         // println!("[Init] Starry_Server start main loop!");
         loop {
             input_manager().unwrap().polling_all();

+ 10 - 4
starry_server/src/core/window_manager.rs

@@ -119,7 +119,7 @@ impl WindowManager {
         _flags: &str,
         _title: String,
         image_path: &[u8],
-    ){
+    ) {
         let mouse_update_event: MouseUpdateEvent;
 
         {
@@ -225,10 +225,16 @@ impl WindowManager {
         let max_x: i32 = SCREEN_WIDTH as i32;
         let max_y: i32 = SCREEN_HEIGHT as i32;
         let cursor_rect = self.cursor_rect();
-        
+
         //防止鼠标出界
-        let x = cmp::max(0, cmp::min(max_x - cursor_rect.width(), cursor_x + event.dx));
-        let y = cmp::max(0, cmp::min(max_y - cursor_rect.height(), cursor_y - event.dy)); // 原点在左上角,向上为负
+        let x = cmp::max(
+            0,
+            cmp::min(max_x - cursor_rect.width(), cursor_x + event.dx),
+        );
+        let y = cmp::max(
+            0,
+            cmp::min(max_y - cursor_rect.height(), cursor_y - event.dy),
+        ); // 原点在左上角,向上为负
 
         self.handle_mouse_update_event(MouseUpdateEvent { x, y });
     }

+ 1 - 1
starry_server/src/lib.rs

@@ -1,6 +1,6 @@
 pub mod base;
-pub mod core;
 pub mod config;
+pub mod core;
 
 extern crate bitflags;
 extern crate resize;

+ 12 - 5
starry_server/src/main.rs

@@ -1,13 +1,20 @@
 use std::rc::Rc;
 
-
-use starry_server::{base::display::Display, config::Config, core::{starry_server, StarryServer, SCREEN_HEIGHT, SCREEN_WIDTH}};
-
+use starry_server::{
+    base::display::Display,
+    config::Config,
+    core::{starry_server, StarryServer, SCREEN_HEIGHT, SCREEN_WIDTH},
+};
 
 fn main() {
     // TODO 考虑多个显示器
-    let mut displays : Vec<Display> = Vec::new();
-    displays.push(Display::new(0, 0, SCREEN_WIDTH as i32, SCREEN_HEIGHT as i32));
+    let mut displays: Vec<Display> = Vec::new();
+    displays.push(Display::new(
+        0,
+        0,
+        SCREEN_WIDTH as i32,
+        SCREEN_HEIGHT as i32,
+    ));
 
     // TODO 暂时不考虑配置文件
     let config: Rc<Config> = Rc::new(Config::default());