feat: rename project to DualFloatingClock, add README, public release
Build and Release DualFloatingClock / build-linux (push) Failing after 32s
CI Build / build (macos-latest) (push) Canceled after 0s
CI Build / build (windows-latest) (push) Canceled after 0s
Build and Release DualFloatingClock / build-macos (push) Canceled after 0s
Build and Release DualFloatingClock / build-windows (push) Canceled after 0s
Build and Release DualFloatingClock / generate-changelog (push) Canceled after 0s
Build and Release DualFloatingClock / create-release (push) Canceled after 0s
Build and Release DualFloatingClock / build-linux (push) Failing after 32s
CI Build / build (macos-latest) (push) Canceled after 0s
CI Build / build (windows-latest) (push) Canceled after 0s
Build and Release DualFloatingClock / build-macos (push) Canceled after 0s
Build and Release DualFloatingClock / build-windows (push) Canceled after 0s
Build and Release DualFloatingClock / generate-changelog (push) Canceled after 0s
Build and Release DualFloatingClock / create-release (push) Canceled after 0s
- Full rename: CMake target, bundle, LaunchAgent label (com.dualfloatingclock.clock), QSettings org/app, tray tooltip, icns resource, build scripts, CI workflows, sample config - Config XML: new root DualFloatingClockConfig; reader accepts legacy ClouckConfig root for painless migration of existing settings - README rewritten: fork provenance (ivaquero/clouck), features, build, tests, usage - Drop stale README-CN.md
This commit is contained in:
@@ -52,7 +52,7 @@ Every push to main/master branches triggers CI builds to ensure code quality.
|
|||||||
### Manual Release
|
### Manual Release
|
||||||
|
|
||||||
1. Go to Actions tab in GitHub
|
1. Go to Actions tab in GitHub
|
||||||
2. Select "Build and Release Clouck"
|
2. Select "Build and Release DualFloatingClock"
|
||||||
3. Click "Run workflow"
|
3. Click "Run workflow"
|
||||||
4. Enter version number (e.g., v1.0.0)
|
4. Enter version number (e.g., v1.0.0)
|
||||||
5. Click "Run workflow"
|
5. Click "Run workflow"
|
||||||
|
|||||||
@@ -50,5 +50,5 @@ jobs:
|
|||||||
- name: Upload Build Artifact
|
- name: Upload Build Artifact
|
||||||
uses: actions/upload-artifact@v7
|
uses: actions/upload-artifact@v7
|
||||||
with:
|
with:
|
||||||
name: Clouck-${{ runner.os }}-cmake
|
name: DualFloatingClock-${{ runner.os }}-cmake
|
||||||
path: build/Clouck*
|
path: build/DualFloatingClock*
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
name: Build and Release Clouck
|
name: Build and Release DualFloatingClock
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
@@ -43,43 +43,43 @@ jobs:
|
|||||||
ls -la build/
|
ls -la build/
|
||||||
|
|
||||||
# Look for the .app bundle or executable
|
# Look for the .app bundle or executable
|
||||||
if [ -d "build/Clouck.app" ]; then
|
if [ -d "build/DualFloatingClock.app" ]; then
|
||||||
echo "Found .app bundle"
|
echo "Found .app bundle"
|
||||||
cp -r build/Clouck.app ./
|
cp -r build/DualFloatingClock.app ./
|
||||||
elif [ -f "build/Clouck" ]; then
|
elif [ -f "build/DualFloatingClock" ]; then
|
||||||
echo "Found standalone executable"
|
echo "Found standalone executable"
|
||||||
# Create app bundle
|
# Create app bundle
|
||||||
mkdir -p Clouck.app/Contents/MacOS
|
mkdir -p DualFloatingClock.app/Contents/MacOS
|
||||||
mkdir -p Clouck.app/Contents/Resources
|
mkdir -p DualFloatingClock.app/Contents/Resources
|
||||||
cp build/Clouck Clouck.app/Contents/MacOS/
|
cp build/DualFloatingClock DualFloatingClock.app/Contents/MacOS/
|
||||||
else
|
else
|
||||||
echo "Looking for executable in build directory..."
|
echo "Looking for executable in build directory..."
|
||||||
find build/ -name "Clouck*" -type f
|
find build/ -name "DualFloatingClock*" -type f
|
||||||
# Try to find and copy the first executable
|
# Try to find and copy the first executable
|
||||||
EXECUTABLE=$(find build/ -name "Clouck*" -type f | head -1)
|
EXECUTABLE=$(find build/ -name "DualFloatingClock*" -type f | head -1)
|
||||||
if [ -n "$EXECUTABLE" ]; then
|
if [ -n "$EXECUTABLE" ]; then
|
||||||
echo "Found executable: $EXECUTABLE"
|
echo "Found executable: $EXECUTABLE"
|
||||||
mkdir -p Clouck.app/Contents/MacOS
|
mkdir -p DualFloatingClock.app/Contents/MacOS
|
||||||
mkdir -p Clouck.app/Contents/Resources
|
mkdir -p DualFloatingClock.app/Contents/Resources
|
||||||
cp "$EXECUTABLE" Clouck.app/Contents/MacOS/
|
cp "$EXECUTABLE" DualFloatingClock.app/Contents/MacOS/
|
||||||
else
|
else
|
||||||
echo "ERROR: No Clouck executable found!"
|
echo "ERROR: No DualFloatingClock executable found!"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Create Info.plist
|
# Create Info.plist
|
||||||
cat > Clouck.app/Contents/Info.plist << EOF
|
cat > DualFloatingClock.app/Contents/Info.plist << EOF
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
<plist version="1.0">
|
<plist version="1.0">
|
||||||
<dict>
|
<dict>
|
||||||
<key>CFBundleExecutable</key>
|
<key>CFBundleExecutable</key>
|
||||||
<string>Clouck</string>
|
<string>DualFloatingClock</string>
|
||||||
<key>CFBundleIdentifier</key>
|
<key>CFBundleIdentifier</key>
|
||||||
<string>com.clouck.app</string>
|
<string>com.clouck.app</string>
|
||||||
<key>CFBundleName</key>
|
<key>CFBundleName</key>
|
||||||
<string>Clouck</string>
|
<string>DualFloatingClock</string>
|
||||||
<key>CFBundleVersion</key>
|
<key>CFBundleVersion</key>
|
||||||
<string>1.0.0</string>
|
<string>1.0.0</string>
|
||||||
<key>CFBundlePackageType</key>
|
<key>CFBundlePackageType</key>
|
||||||
@@ -92,18 +92,18 @@ jobs:
|
|||||||
|
|
||||||
- name: Deploy Qt Dependencies
|
- name: Deploy Qt Dependencies
|
||||||
run: |
|
run: |
|
||||||
if [ -d "Clouck.app" ]; then
|
if [ -d "DualFloatingClock.app" ]; then
|
||||||
macdeployqt Clouck.app -dmg || hdiutil create -volname "Clouck" -srcfolder Clouck.app -ov -format UDZO Clouck.dmg
|
macdeployqt DualFloatingClock.app -dmg || hdiutil create -volname "DualFloatingClock" -srcfolder DualFloatingClock.app -ov -format UDZO DualFloatingClock.dmg
|
||||||
else
|
else
|
||||||
echo "ERROR: Clouck.app not found!"
|
echo "ERROR: DualFloatingClock.app not found!"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
- name: Upload macOS Artifact
|
- name: Upload macOS Artifact
|
||||||
uses: actions/upload-artifact@v7
|
uses: actions/upload-artifact@v7
|
||||||
with:
|
with:
|
||||||
name: Clouck-macos
|
name: DualFloatingClock-macos
|
||||||
path: Clouck.dmg
|
path: DualFloatingClock.dmg
|
||||||
|
|
||||||
build-windows:
|
build-windows:
|
||||||
runs-on: windows-latest
|
runs-on: windows-latest
|
||||||
@@ -127,17 +127,17 @@ jobs:
|
|||||||
# Check what was actually built
|
# Check what was actually built
|
||||||
Get-ChildItem -Path "build" -Recurse -Name
|
Get-ChildItem -Path "build" -Recurse -Name
|
||||||
|
|
||||||
New-Item -ItemType Directory -Path Clouck-win -Force
|
New-Item -ItemType Directory -Path DualFloatingClock-win -Force
|
||||||
Copy-Item "build/Release/Clouck.exe" -Destination "Clouck-win/" -ErrorAction SilentlyContinue
|
Copy-Item "build/Release/DualFloatingClock.exe" -Destination "DualFloatingClock-win/" -ErrorAction SilentlyContinue
|
||||||
Copy-Item "build/Release/*.dll" -Destination "Clouck-win/" -ErrorAction SilentlyContinue
|
Copy-Item "build/Release/*.dll" -Destination "DualFloatingClock-win/" -ErrorAction SilentlyContinue
|
||||||
windeployqt --release Clouck-win/Clouck.exe
|
windeployqt --release DualFloatingClock-win/DualFloatingClock.exe
|
||||||
Compress-Archive -Path Clouck-win -DestinationPath Clouck-win.zip
|
Compress-Archive -Path DualFloatingClock-win -DestinationPath DualFloatingClock-win.zip
|
||||||
|
|
||||||
- name: Upload Windows Artifact
|
- name: Upload Windows Artifact
|
||||||
uses: actions/upload-artifact@v7
|
uses: actions/upload-artifact@v7
|
||||||
with:
|
with:
|
||||||
name: Clouck-win
|
name: DualFloatingClock-win
|
||||||
path: Clouck-win.zip
|
path: DualFloatingClock-win.zip
|
||||||
|
|
||||||
build-linux:
|
build-linux:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@@ -169,27 +169,27 @@ jobs:
|
|||||||
ls -la build/
|
ls -la build/
|
||||||
|
|
||||||
# Look for the executable
|
# Look for the executable
|
||||||
EXECUTABLE=$(find build/ -name "Clouck" -type f -executable | head -1)
|
EXECUTABLE=$(find build/ -name "DualFloatingClock" -type f -executable | head -1)
|
||||||
if [ -n "$EXECUTABLE" ]; then
|
if [ -n "$EXECUTABLE" ]; then
|
||||||
echo "Found executable: $EXECUTABLE"
|
echo "Found executable: $EXECUTABLE"
|
||||||
mkdir -p Clouck-linux
|
mkdir -p DualFloatingClock-linux
|
||||||
cp "$EXECUTABLE" Clouck-linux/
|
cp "$EXECUTABLE" DualFloatingClock-linux/
|
||||||
else
|
else
|
||||||
echo "ERROR: No Clouck executable found!"
|
echo "ERROR: No DualFloatingClock executable found!"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Copy any Qt libraries
|
# Copy any Qt libraries
|
||||||
find build/ -name "*.so*" -exec cp {} Clouck-linux/ \; 2>/dev/null || true
|
find build/ -name "*.so*" -exec cp {} DualFloatingClock-linux/ \; 2>/dev/null || true
|
||||||
|
|
||||||
# Create tar.gz for distribution
|
# Create tar.gz for distribution
|
||||||
tar -czf Clouck-linux.tar.gz Clouck-linux/
|
tar -czf DualFloatingClock-linux.tar.gz DualFloatingClock-linux/
|
||||||
|
|
||||||
- name: Upload Linux Artifact
|
- name: Upload Linux Artifact
|
||||||
uses: actions/upload-artifact@v7
|
uses: actions/upload-artifact@v7
|
||||||
with:
|
with:
|
||||||
name: Clouck-linux
|
name: DualFloatingClock-linux
|
||||||
path: Clouck-linux.tar.gz
|
path: DualFloatingClock-linux.tar.gz
|
||||||
|
|
||||||
generate-changelog:
|
generate-changelog:
|
||||||
needs: [ build-macos, build-windows, build-linux ]
|
needs: [ build-macos, build-windows, build-linux ]
|
||||||
@@ -227,9 +227,9 @@ jobs:
|
|||||||
echo "$CHANGELOG" >> $GITHUB_OUTPUT
|
echo "$CHANGELOG" >> $GITHUB_OUTPUT
|
||||||
echo "" >> $GITHUB_OUTPUT
|
echo "" >> $GITHUB_OUTPUT
|
||||||
echo "## Downloads" >> $GITHUB_OUTPUT
|
echo "## Downloads" >> $GITHUB_OUTPUT
|
||||||
echo "- **macOS**: Clouck.dmg" >> $GITHUB_OUTPUT
|
echo "- **macOS**: DualFloatingClock.dmg" >> $GITHUB_OUTPUT
|
||||||
echo "- **Windows**: Clouck-win.zip" >> $GITHUB_OUTPUT
|
echo "- **Windows**: DualFloatingClock-win.zip" >> $GITHUB_OUTPUT
|
||||||
echo "- **Linux**: Clouck-linux.tar.gz" >> $GITHUB_OUTPUT
|
echo "- **Linux**: DualFloatingClock-linux.tar.gz" >> $GITHUB_OUTPUT
|
||||||
echo "EOF" >> $GITHUB_OUTPUT
|
echo "EOF" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
create-release:
|
create-release:
|
||||||
@@ -252,16 +252,16 @@ jobs:
|
|||||||
- name: Create Release
|
- name: Create Release
|
||||||
uses: softprops/action-gh-release@v3
|
uses: softprops/action-gh-release@v3
|
||||||
with:
|
with:
|
||||||
name: Clouck ${{ needs.generate-changelog.outputs.version }}
|
name: DualFloatingClock ${{ needs.generate-changelog.outputs.version }}
|
||||||
body: |
|
body: |
|
||||||
Cross-platform clock widget application
|
Cross-platform clock widget application
|
||||||
|
|
||||||
${{ needs.generate-changelog.outputs.changelog }}
|
${{ needs.generate-changelog.outputs.changelog }}
|
||||||
|
|
||||||
files: |
|
files: |
|
||||||
artifacts/Clouck-macos/Clouck.dmg
|
artifacts/DualFloatingClock-macos/DualFloatingClock.dmg
|
||||||
artifacts/Clouck-win/Clouck-win.zip
|
artifacts/DualFloatingClock-win/DualFloatingClock-win.zip
|
||||||
artifacts/Clouck-linux/Clouck-linux.tar.gz
|
artifacts/DualFloatingClock-linux/DualFloatingClock-linux.tar.gz
|
||||||
draft: false
|
draft: false
|
||||||
prerelease: false
|
prerelease: false
|
||||||
generate_release_notes: true
|
generate_release_notes: true
|
||||||
|
|||||||
+12
-12
@@ -1,5 +1,5 @@
|
|||||||
cmake_minimum_required(VERSION 3.16)
|
cmake_minimum_required(VERSION 3.16)
|
||||||
project(Clouck)
|
project(DualFloatingClock)
|
||||||
|
|
||||||
set(CMAKE_CXX_STANDARD 17)
|
set(CMAKE_CXX_STANDARD 17)
|
||||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||||
@@ -49,13 +49,13 @@ endif()
|
|||||||
|
|
||||||
# macOS app icon
|
# macOS app icon
|
||||||
if(APPLE)
|
if(APPLE)
|
||||||
set(MACOSX_BUNDLE_ICON_FILE clouck.icns)
|
set(MACOSX_BUNDLE_ICON_FILE dualfloatingclock.icns)
|
||||||
set(APP_ICON_MACOSX ${CMAKE_CURRENT_SOURCE_DIR}/resources/clouck.icns)
|
set(APP_ICON_MACOSX ${CMAKE_CURRENT_SOURCE_DIR}/resources/dualfloatingclock.icns)
|
||||||
set_source_files_properties(${APP_ICON_MACOSX} PROPERTIES MACOSX_PACKAGE_LOCATION "Resources")
|
set_source_files_properties(${APP_ICON_MACOSX} PROPERTIES MACOSX_PACKAGE_LOCATION "Resources")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Create executable
|
# Create executable
|
||||||
qt6_add_executable(Clouck WIN32 MACOSX_BUNDLE
|
qt6_add_executable(DualFloatingClock WIN32 MACOSX_BUNDLE
|
||||||
${SOURCES}
|
${SOURCES}
|
||||||
${HEADERS}
|
${HEADERS}
|
||||||
${APP_ICON_MACOSX}
|
${APP_ICON_MACOSX}
|
||||||
@@ -63,25 +63,25 @@ qt6_add_executable(Clouck WIN32 MACOSX_BUNDLE
|
|||||||
|
|
||||||
# Platform-specific sources and libraries
|
# Platform-specific sources and libraries
|
||||||
if(APPLE)
|
if(APPLE)
|
||||||
target_sources(Clouck PRIVATE window_helper_macos.mm)
|
target_sources(DualFloatingClock PRIVATE window_helper_macos.mm)
|
||||||
target_link_libraries(Clouck PRIVATE "-framework AppKit" "-framework CoreGraphics")
|
target_link_libraries(DualFloatingClock PRIVATE "-framework AppKit" "-framework CoreGraphics")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
target_sources(Clouck PRIVATE window_helper_windows.cpp)
|
target_sources(DualFloatingClock PRIVATE window_helper_windows.cpp)
|
||||||
target_link_libraries(Clouck PRIVATE user32 dwmapi)
|
target_link_libraries(DualFloatingClock PRIVATE user32 dwmapi)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(UNIX AND NOT APPLE)
|
if(UNIX AND NOT APPLE)
|
||||||
target_sources(Clouck PRIVATE window_helper_linux.cpp)
|
target_sources(DualFloatingClock PRIVATE window_helper_linux.cpp)
|
||||||
target_link_libraries(Clouck PRIVATE ${X11_LIBRARIES} Xfixes)
|
target_link_libraries(DualFloatingClock PRIVATE ${X11_LIBRARIES} Xfixes)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Link Qt libraries
|
# Link Qt libraries
|
||||||
target_link_libraries(Clouck PRIVATE Qt6::Core Qt6::Widgets)
|
target_link_libraries(DualFloatingClock PRIVATE Qt6::Core Qt6::Widgets)
|
||||||
|
|
||||||
# Set up install
|
# Set up install
|
||||||
install(TARGETS Clouck
|
install(TARGETS DualFloatingClock
|
||||||
RUNTIME DESTINATION bin
|
RUNTIME DESTINATION bin
|
||||||
BUNDLE DESTINATION bin
|
BUNDLE DESTINATION bin
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# Created by and for Qt Creator This file was created for editing the project sources only.
|
# Created by and for Qt Creator This file was created for editing the project sources only.
|
||||||
# You may attempt to use it for building too, by modifying this file here.
|
# You may attempt to use it for building too, by modifying this file here.
|
||||||
|
|
||||||
TARGET = Clouck
|
TARGET = DualFloatingClock
|
||||||
|
|
||||||
QT = core gui widgets
|
QT = core gui widgets
|
||||||
|
|
||||||
-123
@@ -1,123 +0,0 @@
|
|||||||
# Clouck 浮动时钟
|
|
||||||
|
|
||||||
## 功能特性
|
|
||||||
|
|
||||||
✅ **已实现的功能:**
|
|
||||||
|
|
||||||
- **无边框窗口** - 简洁的浮动时钟界面
|
|
||||||
- **拖拽移动** - 鼠标左键拖拽移动窗口位置
|
|
||||||
- **右键菜单** - 丰富的自定义选项
|
|
||||||
- **总在最前** - 始终显示在其他窗口之上
|
|
||||||
- **透明背景** - 支持半透明背景效果
|
|
||||||
- **自定义样式** - 可调整字体颜色、背景颜色、字体大小
|
|
||||||
- **设置持久化** - 自动保存和恢复用户设置
|
|
||||||
- **跨平台支持** - 基于Qt6,支持 macOS/Linux/Windows
|
|
||||||
|
|
||||||
## 使用方法
|
|
||||||
|
|
||||||
### 基本操作
|
|
||||||
|
|
||||||
- **移动时钟**:鼠标左键点击并拖拽
|
|
||||||
- **显示菜单**:右键点击时钟
|
|
||||||
- **退出应用**:右键菜单选择"退出"
|
|
||||||
|
|
||||||
### 自定义设置
|
|
||||||
|
|
||||||
- **字体颜色**:右键菜单 → 设置字体颜色
|
|
||||||
- **背景颜色**:右键菜单 → 设置背景颜色
|
|
||||||
- **字体大小**:右键菜单 → 设置字体大小
|
|
||||||
- **总在最前**:右键菜单 → 勾选/取消"总在最前"
|
|
||||||
- **重置设置**:右键菜单 → 重置设置
|
|
||||||
|
|
||||||
### 构建和运行
|
|
||||||
|
|
||||||
#### 快速构建(推荐):
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# 一键构建
|
|
||||||
./build.sh
|
|
||||||
|
|
||||||
# 运行应用
|
|
||||||
./build/Clouck.app/Contents/MacOS/Clouck # macOS
|
|
||||||
./build/Clouck # Linux
|
|
||||||
```
|
|
||||||
|
|
||||||
#### 手动构建:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# 清理旧的构建文件
|
|
||||||
./clean.sh
|
|
||||||
|
|
||||||
# 生成Makefile
|
|
||||||
qmake Clouck.pro
|
|
||||||
|
|
||||||
# 编译
|
|
||||||
make
|
|
||||||
|
|
||||||
# 运行
|
|
||||||
./build/Clouck.app/Contents/MacOS/Clouck # macOS
|
|
||||||
./build/Clouck # Linux
|
|
||||||
```
|
|
||||||
|
|
||||||
#### 使用CMake构建:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
mkdir build && cd build
|
|
||||||
cmake ..
|
|
||||||
make
|
|
||||||
./Clouck
|
|
||||||
```
|
|
||||||
|
|
||||||
### 项目结构
|
|
||||||
|
|
||||||
```text
|
|
||||||
qClouck/
|
|
||||||
├── build/ # 构建输出目录
|
|
||||||
│ ├── Clouck.app/ # macOS应用包
|
|
||||||
│ ├── *.o # 目标文件
|
|
||||||
│ ├── moc_*.cpp # Qt元对象编译器输出
|
|
||||||
│ └── Makefile # 构建文件
|
|
||||||
├── src/ # 源代码(建议)
|
|
||||||
├── build.sh # 一键构建脚本
|
|
||||||
├── clean.sh # 清理脚本
|
|
||||||
├── Clouck.pro # qmake项目文件
|
|
||||||
├── CMakeLists.txt # CMake项目文件
|
|
||||||
└── README.md
|
|
||||||
```
|
|
||||||
|
|
||||||
## 技术特点
|
|
||||||
|
|
||||||
- **Qt6框架**:使用最新的Qt6库
|
|
||||||
- **透明窗口**:支持RGBA透明背景
|
|
||||||
- **定时器更新**:每秒更新时钟显示
|
|
||||||
- **设置管理**:使用QSettings持久化用户偏好
|
|
||||||
- **事件处理**:自定义鼠标事件实现拖拽功能
|
|
||||||
|
|
||||||
## 开发说明
|
|
||||||
|
|
||||||
### 构建输出管理
|
|
||||||
|
|
||||||
- 所有编译生成的文件(.o, moc_*.cpp, Makefile等)都会输出到`build/`目录
|
|
||||||
- 可执行文件位于`build/Clouck.app/Contents/MacOS/Clouck`(macOS)或`build/Clouck`(Linux)
|
|
||||||
- 使用`./clean.sh`可以快速清理所有构建文件
|
|
||||||
- 使用`./build.sh`可以进行完整的一键构建
|
|
||||||
|
|
||||||
### 自定义构建配置
|
|
||||||
|
|
||||||
可以在`Clouck.pro`中修改以下配置:
|
|
||||||
|
|
||||||
- `DESTDIR`:可执行文件输出目录
|
|
||||||
- `OBJECTS_DIR`:目标文件输出目录
|
|
||||||
- `MOC_DIR`:元对象编译器输出目录
|
|
||||||
|
|
||||||
## 更新日志
|
|
||||||
|
|
||||||
### v1.0.0 (2026-04-18)
|
|
||||||
|
|
||||||
- ✨ 初始版本发布
|
|
||||||
- ✨ 基础时钟功能
|
|
||||||
- ✨ 拖拽移动支持
|
|
||||||
- ✨ 右键菜单功能
|
|
||||||
- ✨ 样式自定义
|
|
||||||
- ✨ 设置持久化
|
|
||||||
- ✨ 构建输出目录管理
|
|
||||||
@@ -1,169 +1,61 @@
|
|||||||
# ☁ Clouck
|
# DualFloatingClock
|
||||||
|
|
||||||

|
A menu-bar-first, dual-timezone floating clock for macOS, Windows and Linux — built with Qt6.
|
||||||

|
|
||||||

|
|
||||||

|
|
||||||
|
|
||||||
This project aims to build a cross-platform floating clock based on Qt6.
|
> **Fork provenance:** this project is a fork of [clouck](https://github.com/ivaquero/clouck)
|
||||||
|
> by [ivaquero](https://github.com/ivaquero) — a cross-platform floating clock.
|
||||||
|
> DualFloatingClock extends it with dual time zones, a flat tray menu, glyph outlines,
|
||||||
|
> per-element font sizing and a menu-bar-only presence (no Dock icon on macOS).
|
||||||
|
|
||||||
## Motivation
|
## What it does
|
||||||
|
|
||||||
When coding in full screen mode, I often forget the time.
|
A borderless, always-on-top clock that shows **two configurable time zones**
|
||||||
When on macOS / Linux, the clock on the menu bar is too small to be noticeable, so is the clock on Windows.
|
side by side — each with its own time and city name — plus a menu bar tray icon
|
||||||
|
for quick access to all settings. Designed for people working across time zones
|
||||||
|
who want the second (or third) clock glanceable, not hidden in world-clock widgets.
|
||||||
|
|
||||||

|
## Features
|
||||||
|
|
||||||
## ✨ Features
|
- **Dual time zones** — pick any IANA zone for each clock (`Europe/Bucharest`, `America/Los_Angeles`, …)
|
||||||
|
- **Floating clock** — frameless, always-on-top, drag anywhere, resizable from the corner; visible even in fullscreen spaces (macOS)
|
||||||
|
- **Menu-bar tray** — icon adapts to light/dark mode; flat context menu with every setting (no submenus, no clicking on the clock itself)
|
||||||
|
- **Text outline** — configurable glyph outline (color) under the text fill, so the clock stays readable on any wallpaper
|
||||||
|
- **Per-element fonts** — separate font sizes for the time and the city name (up to 200pt)
|
||||||
|
- **Colors via HTML/hex** — type `#00ff00`, `#80000000` (with alpha) or `transparent`; falls back to the native color picker
|
||||||
|
- **Start at Login** — toggle in the tray menu (macOS LaunchAgent)
|
||||||
|
- **Menu-bar-only on macOS** — no Dock icon, no ⌘Tab entry; lives in the menu bar
|
||||||
|
- **XML config** — persisted in the OS config location (e.g. `~/Library/Preferences/DualFloatingClock/DualFloatingClock/config.xml`)
|
||||||
|
|
||||||
- [ ] **Cross Platform**
|
## Build
|
||||||
- [x] MacOS
|
|
||||||
- [x] Windows
|
|
||||||
- [ ] Linux
|
|
||||||
- [x] **Main Window**
|
|
||||||
- [x] Always On Top
|
|
||||||
- [x] Frameless
|
|
||||||
- [x] Drag and Move
|
|
||||||
- [x] Resizable
|
|
||||||
- [x] Show in Fullscreen Mode
|
|
||||||
- [x] **Style**
|
|
||||||
- [x] Right Click Menu
|
|
||||||
- [x] Set Background Color
|
|
||||||
- [ ] Transparent Background
|
|
||||||
- [x] Set Font Color
|
|
||||||
- [x] Set FontSize
|
|
||||||
- [x] **Tweakable** (XML)
|
|
||||||
- [x] Read Settings
|
|
||||||
- [x] Write Settings
|
|
||||||
- [x] Reset Settings
|
|
||||||
- [ ] **Time Zone**
|
|
||||||
- [ ] Select Time Zone
|
|
||||||
|
|
||||||
## Quick Start
|
Requires Qt6 (Core, Widgets, Test) and CMake ≥ 3.16.
|
||||||
|
|
||||||
### Build and Run
|
|
||||||
|
|
||||||
#### Quick Build (Recommended)
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# One-click build
|
cmake -S . -B build
|
||||||
./build.sh
|
cmake --build build
|
||||||
|
|
||||||
# Run application
|
# macOS — run
|
||||||
./build/Clouck.app/Contents/MacOS/Clouck # macOS
|
open build/DualFloatingClock.app
|
||||||
./build/Clouck # Linux
|
# install to /Applications
|
||||||
|
cp -R build/DualFloatingClock.app /Applications/
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Manual Build
|
qmake is also supported (legacy): see `build.sh` / `DualFloatingClock.pro`.
|
||||||
|
|
||||||
|
## Tests
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Clean build files
|
cd build && ctest
|
||||||
./clean.sh
|
|
||||||
|
|
||||||
# Generate Makefile
|
|
||||||
qmake Clouck.pro
|
|
||||||
|
|
||||||
# Build
|
|
||||||
make
|
|
||||||
|
|
||||||
# Run
|
|
||||||
./build/Clouck.app/Contents/MacOS/Clouck # macOS
|
|
||||||
./build/Clouck # Linux
|
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Using CMake
|
Qt Test suites: `ConfigManagerTest` (XML round-trip, default path), `AutoStartManagerTest` (LaunchAgent contents, enable/disable round-trip).
|
||||||
|
|
||||||
```bash
|
## Usage
|
||||||
mkdir build && cd build
|
|
||||||
cmake ..
|
|
||||||
make
|
|
||||||
./Clouck
|
|
||||||
```
|
|
||||||
|
|
||||||
## 🚀 GitHub Actions
|
- **Move**: drag the clock · **Resize**: drag the bottom-right corner
|
||||||
|
- **Settings**: right-click the **tray icon** (the clock itself has no menu — dragging-friendly)
|
||||||
This project uses GitHub Actions for automated building and releasing:
|
- Colors accept `#RRGGBB`, `#AARRGGBB` or `transparent`
|
||||||
|
|
||||||
### CI/CD Workflows
|
|
||||||
|
|
||||||
- **CI Build**: Validates builds on all platforms for every push/PR
|
|
||||||
- **Build Qt**: Comprehensive builds using both qmake and CMake
|
|
||||||
- **Release**: Creates distributable packages for tagged releases
|
|
||||||
|
|
||||||
### Download Pre-built Binaries
|
|
||||||
|
|
||||||
Visit the [Releases](https://github.com/ivaquero/clouck/releases) page to download pre-built binaries for:
|
|
||||||
|
|
||||||
- **macOS**: DMG installer with native app bundle
|
|
||||||
- **Windows**: ZIP package with all dependencies
|
|
||||||
- **Linux**: TAR.GZ package with shared libraries
|
|
||||||
|
|
||||||
### Creating a Release
|
|
||||||
|
|
||||||
1. Tag a new version:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
git tag v1.0.0
|
|
||||||
git push origin v1.0.0
|
|
||||||
```
|
|
||||||
|
|
||||||
2. GitHub Actions will automatically build and create a release with binaries for all platforms
|
|
||||||
|
|
||||||
### Configuration
|
|
||||||
|
|
||||||
The application now uses XML configuration files instead of QSettings. Configuration is stored in `config.xml` with the following options:
|
|
||||||
|
|
||||||
- **FontColor**: Font color in hex format
|
|
||||||
- **BackgroundColor**: Background color with alpha transparency
|
|
||||||
- **FontSize**: Font size in points (8-72)
|
|
||||||
- **AlwaysOnTop**: Window always stays on top
|
|
||||||
- **WindowPosition**: Window position coordinates
|
|
||||||
|
|
||||||
The configuration file is automatically created when you first run the application and make changes to settings.
|
|
||||||
|
|
||||||
### Usage
|
|
||||||
|
|
||||||
- **Move**: Left-click and drag
|
|
||||||
- **Menu**: Right-click for context menu
|
|
||||||
- **Customize**: Change colors, font size, always-on-top behavior
|
|
||||||
- **Configuration**: Settings are saved to `config.xml` and persist between sessions
|
|
||||||
|
|
||||||
### Project Structure
|
|
||||||
|
|
||||||
```text
|
|
||||||
qClouck/
|
|
||||||
├── build/ # Build output directory
|
|
||||||
│ ├── Clouck.app/ # macOS application bundle
|
|
||||||
│ ├── *.o # Object files
|
|
||||||
│ ├── moc_*.cpp # Qt meta-object compiler output
|
|
||||||
│ └── Makefile # Build file
|
|
||||||
├── config.xml # XML configuration file
|
|
||||||
├── build.sh # One-click build script
|
|
||||||
├── clean.sh # Clean script
|
|
||||||
├── Clouck.pro # qmake project file
|
|
||||||
├── CMakeLists.txt # CMake project file
|
|
||||||
└── README.md
|
|
||||||
```
|
|
||||||
|
|
||||||
### Build Output Management
|
|
||||||
|
|
||||||
- All compilation files (.o, moc_*.cpp, Makefile, etc.) are output to `build/` directory
|
|
||||||
- Executable files are located at `build/Clouck.app/Contents/MacOS/Clouck` (macOS) or `build/Clouck` (Linux)
|
|
||||||
- Use `./clean.sh` to quickly clean all build files
|
|
||||||
- Use `./build.sh` for complete one-click build
|
|
||||||
|
|
||||||
### Next Steps
|
|
||||||
|
|
||||||
- Time zone selection
|
|
||||||
- Alarm functionality
|
|
||||||
- Enhanced UI/UX
|
|
||||||
|
|
||||||
## Requirements
|
|
||||||
|
|
||||||
- Qt6 (Core, Widgets)
|
|
||||||
- C++17 compatible compiler
|
|
||||||
- CMake 3.16+ (optional, for CMake build)
|
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
See LICENSE file for details.
|
Same as upstream clouck — see [LICENSE](LICENSE).
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
const QString launchAgentLabel = QStringLiteral("com.clouck.clock");
|
const QString launchAgentLabel = QStringLiteral("com.dualfloatingclock.clock");
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AutoStartManager::enableForCurrentApplication()
|
bool AutoStartManager::enableForCurrentApplication()
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# Build script
|
# Build script
|
||||||
|
|
||||||
echo "Starting Clouck build..."
|
echo "Starting DualFloatingClock build..."
|
||||||
|
|
||||||
# Create build directory if it doesn't exist
|
# Create build directory if it doesn't exist
|
||||||
mkdir -p build
|
mkdir -p build
|
||||||
@@ -12,18 +12,18 @@ rm -rf build/*
|
|||||||
|
|
||||||
# Generate Makefile using qmake
|
# Generate Makefile using qmake
|
||||||
echo "Generating Makefile..."
|
echo "Generating Makefile..."
|
||||||
qmake Clouck.pro
|
qmake DualFloatingClock.pro
|
||||||
|
|
||||||
# Build project
|
# Build project
|
||||||
echo "Starting compilation..."
|
echo "Starting compilation..."
|
||||||
make
|
make
|
||||||
|
|
||||||
# Check build result
|
# Check build result
|
||||||
if [ -f "build/Clouck.app/Contents/MacOS/Clouck" ] || [ -f "build/Clouck" ]; then
|
if [ -f "build/DualFloatingClock.app/Contents/MacOS/DualFloatingClock" ] || [ -f "build/DualFloatingClock" ]; then
|
||||||
echo "Build successful!"
|
echo "Build successful!"
|
||||||
echo "Executable location:"
|
echo "Executable location:"
|
||||||
[ -f "build/Clouck.app/Contents/MacOS/Clouck" ] && echo " - build/Clouck.app/Contents/MacOS/Clouck (macOS)"
|
[ -f "build/DualFloatingClock.app/Contents/MacOS/DualFloatingClock" ] && echo " - build/DualFloatingClock.app/Contents/MacOS/DualFloatingClock (macOS)"
|
||||||
[ -f "build/Clouck" ] && echo " - build/Clouck (Linux)"
|
[ -f "build/DualFloatingClock" ] && echo " - build/DualFloatingClock (Linux)"
|
||||||
else
|
else
|
||||||
echo "Build failed!"
|
echo "Build failed!"
|
||||||
exit 1
|
exit 1
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# Cross-platform build script for Clouck
|
# Cross-platform build script for DualFloatingClock
|
||||||
|
|
||||||
echo "Building Clouck - Cross-platform Clock Application"
|
echo "Building DualFloatingClock - Cross-platform Clock Application"
|
||||||
echo "=================================================="
|
echo "=================================================="
|
||||||
|
|
||||||
# Detect operating system
|
# Detect operating system
|
||||||
@@ -49,19 +49,19 @@ echo ""
|
|||||||
echo "Executable location:"
|
echo "Executable location:"
|
||||||
|
|
||||||
if [ "$OS" == "macOS" ]; then
|
if [ "$OS" == "macOS" ]; then
|
||||||
echo " - build/Clouck.app/Contents/MacOS/Clouck (macOS)"
|
echo " - build/DualFloatingClock.app/Contents/MacOS/DualFloatingClock (macOS)"
|
||||||
elif [ "$OS" == "Windows" ]; then
|
elif [ "$OS" == "Windows" ]; then
|
||||||
echo " - build/Release/Clouck.exe (Windows)"
|
echo " - build/Release/DualFloatingClock.exe (Windows)"
|
||||||
elif [ "$OS" == "Linux" ]; then
|
elif [ "$OS" == "Linux" ]; then
|
||||||
echo " - build/Clouck (Linux)"
|
echo " - build/DualFloatingClock (Linux)"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
echo "To run the application:"
|
echo "To run the application:"
|
||||||
if [ "$OS" == "macOS" ]; then
|
if [ "$OS" == "macOS" ]; then
|
||||||
echo " ./build/Clouck.app/Contents/MacOS/Clouck"
|
echo " ./build/DualFloatingClock.app/Contents/MacOS/DualFloatingClock"
|
||||||
elif [ "$OS" == "Windows" ]; then
|
elif [ "$OS" == "Windows" ]; then
|
||||||
echo " ./build/Release/Clouck.exe"
|
echo " ./build/Release/DualFloatingClock.exe"
|
||||||
elif [ "$OS" == "Linux" ]; then
|
elif [ "$OS" == "Linux" ]; then
|
||||||
echo " ./build/Clouck"
|
echo " ./build/DualFloatingClock"
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -10,9 +10,9 @@ if [ -d "build" ]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# Delete .app bundle
|
# Delete .app bundle
|
||||||
if [ -d "Clouck.app" ]; then
|
if [ -d "DualFloatingClock.app" ]; then
|
||||||
rm -rf Clouck.app
|
rm -rf DualFloatingClock.app
|
||||||
echo "Clouck.app deleted"
|
echo "DualFloatingClock.app deleted"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "Cleanup complete!"
|
echo "Cleanup complete!"
|
||||||
|
|||||||
+2
-2
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<ClouckConfig>
|
<DualFloatingClockConfig>
|
||||||
<FontColor>#ff00ff00</FontColor>
|
<FontColor>#ff00ff00</FontColor>
|
||||||
<BackgroundColor>#00000000</BackgroundColor>
|
<BackgroundColor>#00000000</BackgroundColor>
|
||||||
<FontSize>24</FontSize>
|
<FontSize>24</FontSize>
|
||||||
@@ -8,4 +8,4 @@
|
|||||||
<WindowSize>240,160</WindowSize>
|
<WindowSize>240,160</WindowSize>
|
||||||
<PrimaryTimeZone>Europe/Bucharest</PrimaryTimeZone>
|
<PrimaryTimeZone>Europe/Bucharest</PrimaryTimeZone>
|
||||||
<SecondaryTimeZone>America/Los_Angeles</SecondaryTimeZone>
|
<SecondaryTimeZone>America/Los_Angeles</SecondaryTimeZone>
|
||||||
</ClouckConfig>
|
</DualFloatingClockConfig>
|
||||||
|
|||||||
+3
-2
@@ -48,7 +48,8 @@ bool ConfigManager::loadSettings(const QString &filename)
|
|||||||
QXmlStreamReader reader(&file);
|
QXmlStreamReader reader(&file);
|
||||||
|
|
||||||
// Check if it's a valid XML file
|
// Check if it's a valid XML file
|
||||||
if (!reader.readNextStartElement() || reader.name() != QString("ClouckConfig"))
|
if (!reader.readNextStartElement()
|
||||||
|
|| (reader.name() != QString("DualFloatingClockConfig") && reader.name() != QString("ClouckConfig")))
|
||||||
{
|
{
|
||||||
qDebug() << "Invalid config file format";
|
qDebug() << "Invalid config file format";
|
||||||
file.close();
|
file.close();
|
||||||
@@ -159,7 +160,7 @@ bool ConfigManager::saveSettings(const QString &filename)
|
|||||||
writer.writeStartDocument();
|
writer.writeStartDocument();
|
||||||
|
|
||||||
// Root element
|
// Root element
|
||||||
writer.writeStartElement("ClouckConfig");
|
writer.writeStartElement("DualFloatingClockConfig");
|
||||||
|
|
||||||
// Colors: store #RRGGBB when fully opaque, #AARRGGBB when translucent —
|
// Colors: store #RRGGBB when fully opaque, #AARRGGBB when translucent —
|
||||||
// the XML stays close to what the user typed.
|
// the XML stays close to what the user typed.
|
||||||
|
|||||||
@@ -55,16 +55,16 @@ int main(int argc, char *argv[])
|
|||||||
clouck_setActivationPolicyAccessory();
|
clouck_setActivationPolicyAccessory();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
app.setApplicationName("Clouck");
|
app.setApplicationName("DualFloatingClock");
|
||||||
app.setOrganizationName("Clouck");
|
app.setOrganizationName("DualFloatingClock");
|
||||||
app.setApplicationDisplayName("Clouck");
|
app.setApplicationDisplayName("DualFloatingClock");
|
||||||
|
|
||||||
ClockWidget clock;
|
ClockWidget clock;
|
||||||
clock.show();
|
clock.show();
|
||||||
|
|
||||||
// Start at Login: honor the persisted choice instead of always forcing it.
|
// Start at Login: honor the persisted choice instead of always forcing it.
|
||||||
{
|
{
|
||||||
QSettings autoStartSettings("Clouck", "Clouck");
|
QSettings autoStartSettings("DualFloatingClock", "DualFloatingClock");
|
||||||
const bool startAtLogin = autoStartSettings.value("startAtLogin", true).toBool();
|
const bool startAtLogin = autoStartSettings.value("startAtLogin", true).toBool();
|
||||||
if (startAtLogin)
|
if (startAtLogin)
|
||||||
{
|
{
|
||||||
@@ -79,7 +79,7 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
const QStyleHints *styleHints = app.styleHints();
|
const QStyleHints *styleHints = app.styleHints();
|
||||||
QSystemTrayIcon trayIcon(createTrayIcon(trayIconColorForScheme(styleHints->colorScheme())), &app);
|
QSystemTrayIcon trayIcon(createTrayIcon(trayIconColorForScheme(styleHints->colorScheme())), &app);
|
||||||
trayIcon.setToolTip("Clouck");
|
trayIcon.setToolTip("DualFloatingClock");
|
||||||
|
|
||||||
QObject::connect(styleHints, &QStyleHints::colorSchemeChanged, &trayIcon,
|
QObject::connect(styleHints, &QStyleHints::colorSchemeChanged, &trayIcon,
|
||||||
[&trayIcon](Qt::ColorScheme scheme) {
|
[&trayIcon](Qt::ColorScheme scheme) {
|
||||||
@@ -91,12 +91,12 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
QAction *startAtLoginAction = trayMenu.addAction("Start at Login");
|
QAction *startAtLoginAction = trayMenu.addAction("Start at Login");
|
||||||
{
|
{
|
||||||
QSettings autoStartSettings("Clouck", "Clouck");
|
QSettings autoStartSettings("DualFloatingClock", "DualFloatingClock");
|
||||||
startAtLoginAction->setCheckable(true);
|
startAtLoginAction->setCheckable(true);
|
||||||
startAtLoginAction->setChecked(autoStartSettings.value("startAtLogin", true).toBool());
|
startAtLoginAction->setChecked(autoStartSettings.value("startAtLogin", true).toBool());
|
||||||
}
|
}
|
||||||
QObject::connect(startAtLoginAction, &QAction::toggled, &app, [](bool checked) {
|
QObject::connect(startAtLoginAction, &QAction::toggled, &app, [](bool checked) {
|
||||||
QSettings autoStartSettings("Clouck", "Clouck");
|
QSettings autoStartSettings("DualFloatingClock", "DualFloatingClock");
|
||||||
autoStartSettings.setValue("startAtLogin", checked);
|
autoStartSettings.setValue("startAtLogin", checked);
|
||||||
if (checked)
|
if (checked)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ private slots:
|
|||||||
|
|
||||||
void AutoStartManagerTest::createsRunAtLoadLaunchAgent()
|
void AutoStartManagerTest::createsRunAtLoadLaunchAgent()
|
||||||
{
|
{
|
||||||
const QString executablePath = "/Applications/Clouck.app/Contents/MacOS/Clouck";
|
const QString executablePath = "/Applications/DualFloatingClock.app/Contents/MacOS/DualFloatingClock";
|
||||||
const QString contents = AutoStartManager::launchAgentContents(executablePath);
|
const QString contents = AutoStartManager::launchAgentContents(executablePath);
|
||||||
|
|
||||||
QVERIFY(contents.contains("<key>ProgramArguments</key>"));
|
QVERIFY(contents.contains("<key>ProgramArguments</key>"));
|
||||||
@@ -35,7 +35,7 @@ void AutoStartManagerTest::roundTripsPlistRoundTrip()
|
|||||||
QVERIFY(!QFile::exists(AutoStartManager::launchAgentPath()));
|
QVERIFY(!QFile::exists(AutoStartManager::launchAgentPath()));
|
||||||
QVERIFY(!AutoStartManager::isEnabled());
|
QVERIFY(!AutoStartManager::isEnabled());
|
||||||
|
|
||||||
QVERIFY(AutoStartManager::enableForPath("/Applications/Clouck.app/Contents/MacOS/Clouck"));
|
QVERIFY(AutoStartManager::enableForPath("/Applications/DualFloatingClock.app/Contents/MacOS/DualFloatingClock"));
|
||||||
QVERIFY(AutoStartManager::isEnabled());
|
QVERIFY(AutoStartManager::isEnabled());
|
||||||
QVERIFY(QFile::exists(AutoStartManager::launchAgentPath()));
|
QVERIFY(QFile::exists(AutoStartManager::launchAgentPath()));
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user