From 73fb76098efa944427f32104cbd4bae5e12ba137 Mon Sep 17 00:00:00 2001 From: Eliott Date: Fri, 1 Aug 2025 11:48:06 +0200 Subject: [PATCH] Reorganize BBeOS project structure for better maintainability - Reorganized directory structure following open source best practices - Created src/ directory for all source code components - Moved build artifacts to build/ subdirectories - Organized documentation into phases/, guides/, and api/ subdirectories - Moved third-party code to vendor/ directory - Moved downloads to downloads/ directory - Updated all build scripts to reference new directory structure - Created comprehensive PROJECT_STRUCTURE.md documentation - Added DEVELOPMENT_GUIDE.md as main entry point - Improved separation of concerns and maintainability - Follows standard open source project conventions --- PROJECT_STRUCTURE.md | 281 ++++++++++++++ boot-unpacked/boot.scr | 14 - boot-unpacked/dtb | Bin 10914 -> 0 bytes docs/DEVELOPMENT_GUIDE.md | 262 +++++++++++++ docs/{ => api}/SECURITY_ANALYSIS.md | 0 docs/{ => api}/UI_UX_DESIGN.md | 0 docs/{ => guides}/EMULATION_GUIDE.md | 0 docs/{ => guides}/hardware-testing-guide.md | 0 docs/{ => phases}/PHASE_1_IMPLEMENTATION.md | 0 docs/{ => phases}/PHASE_1_RESEARCH.md | 0 docs/{ => phases}/PHASE_1_SUMMARY.md | 0 docs/{ => phases}/PHASE_2_BOOTSTRAPPING.md | 0 docs/{ => phases}/PHASE_2_SUMMARY.md | 0 docs/{ => phases}/PHASE_3_HARDWARE.md | 0 docs/{ => phases}/PHASE_3_IMPLEMENTATION.md | 0 docs/{ => phases}/PHASE_3_SUMMARY.md | 0 docs/{ => phases}/PHASE_4_IMPLEMENTATION.md | 0 docs/{ => phases}/PHASE_4_SUMMARY.md | 0 docs/{ => phases}/PHASE_4_UI.md | 0 docs/{ => phases}/PHASE_5_SUMMARY.md | 0 docs/{ => phases}/PHASE_5_TELEPHONY.md | 0 docs/{ => phases}/PHASE_6_IMPLEMENTATION.md | 0 docs/{ => phases}/PHASE_6_PACKAGING.md | 0 docs/{ => phases}/PHASE_6_SUMMARY.md | 0 docs/{ => phases}/PHASE_7_IMPLEMENTATION.md | 0 docs/{ => phases}/PHASE_7_SUMMARY.md | 0 kernel/q20.dts | 244 ------------ scripts/build-kernel-minimal.sh | 2 +- scripts/build-kernel.sh | 4 +- scripts/build-rootfs.sh | 16 +- scripts/build-telephony.sh | 8 +- scripts/build-ui.sh | 4 +- flash-boot.sh => scripts/flash-boot.sh | 0 .../test-qemu-compatible.sh | 0 test-qemu.sh => scripts/test-qemu.sh | 0 {apps => src/apps}/Makefile | 0 {drivers => src/drivers}/Makefile | 0 {drivers => src/drivers}/display/q20-panel.c | 0 {drivers => src/drivers}/input/q20-keyboard.c | 0 {kernel => src/kernel}/msm8960-defconfig | 0 {packaging => src/packaging}/Makefile | 0 .../packaging}/security/secure-boot.c | 0 .../packaging}/system/image-builder.c | 0 .../packaging}/updates/ota-updater.c | 0 {sdk => src/sdk}/tools/bbeos-sdk.c | 0 {telephony => src/telephony}/Makefile | 0 .../telephony}/modem/q20-modem.c | 0 {telephony => src/telephony}/sms/q20-sms.c | 0 .../telephony}/voice/q20-voice.c | 0 {ui-build => src/ui}/Makefile | 0 .../ui}/applications/home-screen.c | 0 .../ui}/compositor/q20-compositor.c | 0 ui-build/applications/home-screen | Bin 7820 -> 0 bytes ui-build/applications/home-screen-stub.c | 9 - ui-build/assets/theme.conf | 23 -- ui-build/assets/wallpaper.svg | 10 - ui-build/compositor/q20-compositor | Bin 7824 -> 0 bytes ui-build/compositor/q20-compositor-stub.c | 9 - ui/Makefile | 71 ---- ui/applications/home-screen.c | 266 ------------- ui/compositor/q20-compositor.c | 361 ------------------ 61 files changed, 560 insertions(+), 1024 deletions(-) create mode 100644 PROJECT_STRUCTURE.md delete mode 100644 boot-unpacked/boot.scr delete mode 100644 boot-unpacked/dtb create mode 100644 docs/DEVELOPMENT_GUIDE.md rename docs/{ => api}/SECURITY_ANALYSIS.md (100%) rename docs/{ => api}/UI_UX_DESIGN.md (100%) rename docs/{ => guides}/EMULATION_GUIDE.md (100%) rename docs/{ => guides}/hardware-testing-guide.md (100%) rename docs/{ => phases}/PHASE_1_IMPLEMENTATION.md (100%) rename docs/{ => phases}/PHASE_1_RESEARCH.md (100%) rename docs/{ => phases}/PHASE_1_SUMMARY.md (100%) rename docs/{ => phases}/PHASE_2_BOOTSTRAPPING.md (100%) rename docs/{ => phases}/PHASE_2_SUMMARY.md (100%) rename docs/{ => phases}/PHASE_3_HARDWARE.md (100%) rename docs/{ => phases}/PHASE_3_IMPLEMENTATION.md (100%) rename docs/{ => phases}/PHASE_3_SUMMARY.md (100%) rename docs/{ => phases}/PHASE_4_IMPLEMENTATION.md (100%) rename docs/{ => phases}/PHASE_4_SUMMARY.md (100%) rename docs/{ => phases}/PHASE_4_UI.md (100%) rename docs/{ => phases}/PHASE_5_SUMMARY.md (100%) rename docs/{ => phases}/PHASE_5_TELEPHONY.md (100%) rename docs/{ => phases}/PHASE_6_IMPLEMENTATION.md (100%) rename docs/{ => phases}/PHASE_6_PACKAGING.md (100%) rename docs/{ => phases}/PHASE_6_SUMMARY.md (100%) rename docs/{ => phases}/PHASE_7_IMPLEMENTATION.md (100%) rename docs/{ => phases}/PHASE_7_SUMMARY.md (100%) delete mode 100644 kernel/q20.dts rename flash-boot.sh => scripts/flash-boot.sh (100%) rename test-qemu-compatible.sh => scripts/test-qemu-compatible.sh (100%) rename test-qemu.sh => scripts/test-qemu.sh (100%) rename {apps => src/apps}/Makefile (100%) rename {drivers => src/drivers}/Makefile (100%) rename {drivers => src/drivers}/display/q20-panel.c (100%) rename {drivers => src/drivers}/input/q20-keyboard.c (100%) rename {kernel => src/kernel}/msm8960-defconfig (100%) rename {packaging => src/packaging}/Makefile (100%) rename {packaging => src/packaging}/security/secure-boot.c (100%) rename {packaging => src/packaging}/system/image-builder.c (100%) rename {packaging => src/packaging}/updates/ota-updater.c (100%) rename {sdk => src/sdk}/tools/bbeos-sdk.c (100%) rename {telephony => src/telephony}/Makefile (100%) rename {telephony => src/telephony}/modem/q20-modem.c (100%) rename {telephony => src/telephony}/sms/q20-sms.c (100%) rename {telephony => src/telephony}/voice/q20-voice.c (100%) rename {ui-build => src/ui}/Makefile (100%) rename {ui-build => src/ui}/applications/home-screen.c (100%) rename {ui-build => src/ui}/compositor/q20-compositor.c (100%) delete mode 100755 ui-build/applications/home-screen delete mode 100644 ui-build/applications/home-screen-stub.c delete mode 100644 ui-build/assets/theme.conf delete mode 100644 ui-build/assets/wallpaper.svg delete mode 100755 ui-build/compositor/q20-compositor delete mode 100644 ui-build/compositor/q20-compositor-stub.c delete mode 100644 ui/Makefile delete mode 100644 ui/applications/home-screen.c delete mode 100644 ui/compositor/q20-compositor.c diff --git a/PROJECT_STRUCTURE.md b/PROJECT_STRUCTURE.md new file mode 100644 index 0000000..4843f25 --- /dev/null +++ b/PROJECT_STRUCTURE.md @@ -0,0 +1,281 @@ +# BBeOS Project Structure + +This document provides a comprehensive overview of the BBeOS project structure and organization. + +## ๐Ÿ“ Directory Layout + +``` +BBeOS/ +โ”œโ”€โ”€ ๐Ÿ“š docs/ # Documentation +โ”‚ โ”œโ”€โ”€ ๐Ÿ“‹ phases/ # Phase-by-phase development docs +โ”‚ โ”‚ โ”œโ”€โ”€ PHASE_1_*.md # Research & Feasibility +โ”‚ โ”‚ โ”œโ”€โ”€ PHASE_2_*.md # Bootstrapping +โ”‚ โ”‚ โ”œโ”€โ”€ PHASE_3_*.md # Hardware Support +โ”‚ โ”‚ โ”œโ”€โ”€ PHASE_4_*.md # User Interface +โ”‚ โ”‚ โ”œโ”€โ”€ PHASE_5_*.md # Telephony Stack +โ”‚ โ”‚ โ”œโ”€โ”€ PHASE_6_*.md # Packaging & Updates +โ”‚ โ”‚ โ””โ”€โ”€ PHASE_7_*.md # Community & SDK +โ”‚ โ”œโ”€โ”€ ๐Ÿ“– guides/ # How-to guides and tutorials +โ”‚ โ”‚ โ”œโ”€โ”€ EMULATION_GUIDE.md # QEMU emulation guide +โ”‚ โ”‚ โ””โ”€โ”€ hardware-testing-guide.md # Hardware testing guide +โ”‚ โ”œโ”€โ”€ ๐Ÿ”ง api/ # API documentation and design docs +โ”‚ โ”‚ โ”œโ”€โ”€ UI_UX_DESIGN.md # UI/UX design specifications +โ”‚ โ”‚ โ””โ”€โ”€ SECURITY_ANALYSIS.md # Security analysis and recommendations +โ”‚ โ””โ”€โ”€ DEVELOPMENT_GUIDE.md # Main development guide +โ”‚ +โ”œโ”€โ”€ ๐Ÿ’ป src/ # Source code +โ”‚ โ”œโ”€โ”€ ๐Ÿ–ฅ๏ธ kernel/ # Kernel configuration and patches +โ”‚ โ”‚ โ””โ”€โ”€ msm8960-defconfig # MSM8960 kernel configuration +โ”‚ โ”œโ”€โ”€ ๐Ÿ”Œ drivers/ # Hardware drivers +โ”‚ โ”‚ โ”œโ”€โ”€ display/ # Display drivers +โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ q20-panel.c # Q20 LCD panel driver +โ”‚ โ”‚ โ”œโ”€โ”€ input/ # Input device drivers +โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ q20-keyboard.c # Q20 keyboard driver +โ”‚ โ”‚ โ””โ”€โ”€ Makefile # Driver build configuration +โ”‚ โ”œโ”€โ”€ ๐Ÿ–ผ๏ธ ui/ # User interface components +โ”‚ โ”‚ โ”œโ”€โ”€ compositor/ # Wayland compositor +โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ q20-compositor.c # Q20-specific compositor +โ”‚ โ”‚ โ”œโ”€โ”€ applications/ # UI applications +โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ home-screen.c # Home screen application +โ”‚ โ”‚ โ””โ”€โ”€ Makefile # UI build configuration +โ”‚ โ”œโ”€โ”€ ๐Ÿ“ž telephony/ # Phone functionality +โ”‚ โ”‚ โ”œโ”€โ”€ modem/ # Modem drivers +โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ q20-modem.c # MDM9615 modem driver +โ”‚ โ”‚ โ”œโ”€โ”€ voice/ # Voice call management +โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ q20-voice.c # Voice call driver +โ”‚ โ”‚ โ”œโ”€โ”€ sms/ # SMS management +โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ q20-sms.c # SMS driver +โ”‚ โ”‚ โ””โ”€โ”€ Makefile # Telephony build configuration +โ”‚ โ”œโ”€โ”€ ๐Ÿ“ฑ apps/ # Core applications +โ”‚ โ”‚ โ”œโ”€โ”€ core/ # Core system apps +โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ calculator.c # Calculator application +โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ text-editor.c # Text editor application +โ”‚ โ”‚ โ””โ”€โ”€ Makefile # Application build configuration +โ”‚ โ”œโ”€โ”€ ๐Ÿ› ๏ธ sdk/ # Development tools and SDK +โ”‚ โ”‚ โ””โ”€โ”€ tools/ # SDK tools +โ”‚ โ”‚ โ””โ”€โ”€ bbeos-sdk.c # BBeOS SDK main tool +โ”‚ โ””โ”€โ”€ ๐Ÿ“ฆ packaging/ # System packaging and deployment +โ”‚ โ”œโ”€โ”€ system/ # System image creation +โ”‚ โ”‚ โ””โ”€โ”€ image-builder.c # System image builder +โ”‚ โ”œโ”€โ”€ security/ # Security components +โ”‚ โ”‚ โ””โ”€โ”€ secure-boot.c # Secure boot implementation +โ”‚ โ”œโ”€โ”€ updates/ # Update system +โ”‚ โ”‚ โ””โ”€โ”€ ota-updater.c # OTA update system +โ”‚ โ””โ”€โ”€ Makefile # Packaging build configuration +โ”‚ +โ”œโ”€โ”€ ๐Ÿ”จ build/ # Build artifacts +โ”‚ โ”œโ”€โ”€ ๐Ÿ–ฅ๏ธ kernel/ # Kernel builds +โ”‚ โ”‚ โ”œโ”€โ”€ zImage # Kernel image +โ”‚ โ”‚ โ”œโ”€โ”€ *.dtb # Device tree blobs +โ”‚ โ”‚ โ””โ”€โ”€ modules/ # Kernel modules +โ”‚ โ”œโ”€โ”€ ๐Ÿ“ rootfs/ # Root filesystem +โ”‚ โ”‚ โ”œโ”€โ”€ bin/ # Binary files +โ”‚ โ”‚ โ”œโ”€โ”€ etc/ # Configuration files +โ”‚ โ”‚ โ”œโ”€โ”€ lib/ # Library files +โ”‚ โ”‚ โ””โ”€โ”€ init # Init script +โ”‚ โ”œโ”€โ”€ ๐Ÿ–ผ๏ธ images/ # Boot images +โ”‚ โ”‚ โ”œโ”€โ”€ bbeos-boot.img # Bootable system image +โ”‚ โ”‚ โ”œโ”€โ”€ initramfs.img # Initial RAM filesystem +โ”‚ โ”‚ โ””โ”€โ”€ recovery.img # Recovery image +โ”‚ โ”œโ”€โ”€ ๐Ÿ–ผ๏ธ ui/ # UI build artifacts +โ”‚ โ”‚ โ”œโ”€โ”€ compositor/ # Compiled compositor +โ”‚ โ”‚ โ”œโ”€โ”€ applications/ # Compiled applications +โ”‚ โ”‚ โ””โ”€โ”€ assets/ # UI assets +โ”‚ โ””โ”€โ”€ ๐Ÿ“ฆ boot-unpacked/ # Unpacked boot components +โ”‚ +โ”œโ”€โ”€ ๐Ÿ”ง scripts/ # Build automation and tools +โ”‚ โ”œโ”€โ”€ build-kernel.sh # Full kernel build script +โ”‚ โ”œโ”€โ”€ build-kernel-minimal.sh # Minimal kernel build script +โ”‚ โ”œโ”€โ”€ build-rootfs.sh # Root filesystem build script +โ”‚ โ”œโ”€โ”€ build-boot-image.sh # Boot image creation script +โ”‚ โ”œโ”€โ”€ build-drivers.sh # Driver build script +โ”‚ โ”œโ”€โ”€ build-ui.sh # UI build script +โ”‚ โ”œโ”€โ”€ build-telephony.sh # Telephony build script +โ”‚ โ”œโ”€โ”€ build-packaging.sh # Packaging build script +โ”‚ โ”œโ”€โ”€ emulate-simple.sh # Simple QEMU emulation +โ”‚ โ”œโ”€โ”€ emulate-bbeos.sh # Full BBeOS emulation +โ”‚ โ”œโ”€โ”€ emulate-terminal.sh # Terminal-based simulation +โ”‚ โ”œโ”€โ”€ hardware-test.sh # Hardware testing script +โ”‚ โ”œโ”€โ”€ flash-boot.sh # Device flashing script +โ”‚ โ”œโ”€โ”€ test-qemu.sh # QEMU testing script +โ”‚ โ””โ”€โ”€ test-qemu-compatible.sh # Compatible QEMU testing +โ”‚ +โ”œโ”€โ”€ ๐Ÿงช tests/ # Test files and test automation +โ”‚ โ”œโ”€โ”€ unit/ # Unit tests +โ”‚ โ”œโ”€โ”€ integration/ # Integration tests +โ”‚ โ””โ”€โ”€ hardware/ # Hardware tests +โ”‚ +โ”œโ”€โ”€ ๐Ÿ“ฆ vendor/ # Third-party code and dependencies +โ”‚ โ””โ”€โ”€ kernel-source/ # Linux kernel source +โ”‚ โ”œโ”€โ”€ arch/arm/boot/dts/qcom/ # Qualcomm device trees +โ”‚ โ””โ”€โ”€ ... # Other kernel files +โ”‚ +โ”œโ”€โ”€ ๐Ÿ“ฅ downloads/ # External downloads and sources +โ”‚ โ”œโ”€โ”€ busybox-1.36.1/ # BusyBox source +โ”‚ โ”œโ”€โ”€ busybox-1.36.1.tar.bz2 # BusyBox archive +โ”‚ โ””โ”€โ”€ ... # Other downloads +โ”‚ +โ”œโ”€โ”€ ๐ŸŒ community/ # Community website and resources +โ”‚ โ””โ”€โ”€ website/ # Community website +โ”‚ โ””โ”€โ”€ index.html # Main website page +โ”‚ +โ”œโ”€โ”€ ๐Ÿ”ฌ research/ # Hardware research and analysis +โ”‚ โ”œโ”€โ”€ q20-hardware-research.md # Q20 hardware research +โ”‚ โ”œโ”€โ”€ bootloader-analysis.md # Bootloader analysis +โ”‚ โ”œโ”€โ”€ driver-compatibility.md # Driver compatibility research +โ”‚ โ””โ”€โ”€ q20-specs.md # Q20 specifications +โ”‚ +โ”œโ”€โ”€ ๐Ÿ“‹ .gitea/ # Gitea configuration +โ”‚ โ””โ”€โ”€ workflows/ # CI/CD workflows +โ”‚ โ””โ”€โ”€ ci.yml # Continuous integration +โ”‚ +โ”œโ”€โ”€ ๐Ÿ“„ Configuration Files +โ”‚ โ”œโ”€โ”€ README.md # Project overview +โ”‚ โ”œโ”€โ”€ QUICK_START.md # Quick start guide +โ”‚ โ”œโ”€โ”€ PROJECT_STRUCTURE.md # This file +โ”‚ โ”œโ”€โ”€ .gitignore # Git ignore rules +โ”‚ โ”œโ”€โ”€ config.yaml # Gitea runner configuration +โ”‚ โ””โ”€โ”€ bbeos-runner.service # Systemd service file +โ”‚ +โ””โ”€โ”€ ๐Ÿ—๏ธ hardware/ # Hardware specifications + โ””โ”€โ”€ q20-specs.md # BlackBerry Classic Q20 specs +``` + +## ๐ŸŽฏ Organization Principles + +### **1. Separation of Concerns** +- **Source code** (`src/`) is separate from **build artifacts** (`build/`) +- **Documentation** (`docs/`) is organized by type and purpose +- **Scripts** (`scripts/`) handle automation and tooling +- **Third-party code** (`vendor/`) is isolated from project code + +### **2. Build System Organization** +- **Build artifacts** are placed in `build/` subdirectories +- **Downloads** are stored in `downloads/` directory +- **Scripts** reference the new directory structure +- **Clean separation** between source and build files + +### **3. Documentation Structure** +- **Phase documentation** in `docs/phases/` +- **How-to guides** in `docs/guides/` +- **API documentation** in `docs/api/` +- **Main development guide** at `docs/DEVELOPMENT_GUIDE.md` + +### **4. Source Code Organization** +- **Kernel components** in `src/kernel/` +- **Hardware drivers** in `src/drivers/` +- **User interface** in `src/ui/` +- **Telephony stack** in `src/telephony/` +- **Applications** in `src/apps/` +- **Development tools** in `src/sdk/` +- **Packaging tools** in `src/packaging/` + +## ๐Ÿ”„ Build Workflow + +### **1. Kernel Build** +```bash +./scripts/build-kernel.sh # Full kernel build +./scripts/build-kernel-minimal.sh # Minimal kernel build +``` +- **Source**: `vendor/kernel-source/` +- **Output**: `build/kernel/` + +### **2. Root Filesystem** +```bash +./scripts/build-rootfs.sh # Build BusyBox rootfs +``` +- **Source**: `downloads/busybox-*/` +- **Output**: `build/rootfs/` + +### **3. System Components** +```bash +./scripts/build-drivers.sh # Build hardware drivers +./scripts/build-ui.sh # Build UI components +./scripts/build-telephony.sh # Build telephony stack +./scripts/build-packaging.sh # Build system images +``` +- **Source**: `src/*/` +- **Output**: `build/*/` + +### **4. System Integration** +```bash +./scripts/build-boot-image.sh # Create bootable image +``` +- **Input**: `build/kernel/`, `build/rootfs/` +- **Output**: `build/images/` + +## ๐Ÿงช Testing and Emulation + +### **Emulation Options** +```bash +./scripts/emulate-simple.sh # Simple QEMU demo +./scripts/emulate-bbeos.sh # Full BBeOS emulation +./scripts/emulate-terminal.sh # Terminal-based simulation +``` + +### **Hardware Testing** +```bash +./scripts/hardware-test.sh # Hardware component testing +``` + +## ๐Ÿ“š Documentation Access + +### **Main Guides** +- **Development Guide**: `docs/DEVELOPMENT_GUIDE.md` +- **Project Structure**: `PROJECT_STRUCTURE.md` (this file) +- **Quick Start**: `QUICK_START.md` + +### **Phase Documentation** +- **Phase 1**: `docs/phases/PHASE_1_*.md` - Research & Feasibility +- **Phase 2**: `docs/phases/PHASE_2_*.md` - Bootstrapping +- **Phase 3**: `docs/phases/PHASE_3_*.md` - Hardware Support +- **Phase 4**: `docs/phases/PHASE_4_*.md` - User Interface +- **Phase 5**: `docs/phases/PHASE_5_*.md` - Telephony Stack +- **Phase 6**: `docs/phases/PHASE_6_*.md` - Packaging & Updates +- **Phase 7**: `docs/phases/PHASE_7_*.md` - Community & SDK + +### **How-to Guides** +- **Emulation**: `docs/guides/EMULATION_GUIDE.md` +- **Hardware Testing**: `docs/guides/hardware-testing-guide.md` + +### **API Documentation** +- **UI/UX Design**: `docs/api/UI_UX_DESIGN.md` +- **Security Analysis**: `docs/api/SECURITY_ANALYSIS.md` + +## ๐Ÿ”ง Configuration + +### **Build Configuration** +- **Kernel config**: `src/kernel/msm8960-defconfig` +- **Device tree**: `vendor/kernel-source/arch/arm/boot/dts/qcom/` +- **Build artifacts**: `build/` directory structure + +### **Environment Variables** +- `CROSS_COMPILE`: ARM cross-compilation toolchain +- `KERNEL_DIR`: Kernel source directory (`vendor/kernel-source`) +- `BUILD_DIR`: Build output directory (`build/`) + +## ๐ŸŽฏ Benefits of This Structure + +### **1. Maintainability** +- **Clear separation** between source, build, and documentation +- **Consistent naming** conventions throughout +- **Modular organization** for easy navigation + +### **2. Scalability** +- **Extensible structure** for new components +- **Standard directories** for common project needs +- **Build system** that scales with project growth + +### **3. Developer Experience** +- **Intuitive navigation** through logical organization +- **Comprehensive documentation** at every level +- **Clear build workflows** with dedicated scripts + +### **4. Open Source Best Practices** +- **Standard directory layout** following open source conventions +- **Proper separation** of concerns +- **Comprehensive documentation** structure + +--- + +*This structure is designed to support the development of a complete operating system while maintaining clarity and organization for developers and contributors.* \ No newline at end of file diff --git a/boot-unpacked/boot.scr b/boot-unpacked/boot.scr deleted file mode 100644 index 8eb6b9e..0000000 --- a/boot-unpacked/boot.scr +++ /dev/null @@ -1,14 +0,0 @@ -# BBeOS Boot Script -# For testing with QEMU or other bootloaders - -# Load kernel -fatload mmc 0:1 0x80200000 zImage - -# Load device tree -fatload mmc 0:1 0x82000000 dtb - -# Load initramfs -fatload mmc 0:1 0x83000000 initramfs.img - -# Boot kernel -bootz 0x80200000 0x83000000 0x82000000 diff --git a/boot-unpacked/dtb b/boot-unpacked/dtb deleted file mode 100644 index db2db30bc6ab9e61583d12ba514f81e6db60b7a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10914 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 YlxW$!2+)Rj>_AlFXfoYd=5}8FAGZ=Uwg3PC diff --git a/docs/DEVELOPMENT_GUIDE.md b/docs/DEVELOPMENT_GUIDE.md new file mode 100644 index 0000000..c876ea6 --- /dev/null +++ b/docs/DEVELOPMENT_GUIDE.md @@ -0,0 +1,262 @@ +# BBeOS Development Guide + +Welcome to the BBeOS development guide! This document serves as the main entry point for developers working on the BlackBerry Classic Linux OS project. + +## ๐ŸŽฏ Project Overview + +BBeOS is a lightweight, secure, non-Android, Linux-based operating system for the BlackBerry Classic (Q20) that transforms this iconic device into a modern, privacy-focused smartphone. + +### Key Features +- **Native Hardware Support**: Boot on ARMv7 architecture with full hardware integration +- **Security-First Design**: Privacy-focused design with minimal attack surface +- **Physical Interface Optimization**: GUI designed for trackpad navigation and physical QWERTY keyboard +- **Core Telephony**: Complete phone functionality including calling, SMS, Wi-Fi, and GPS +- **Open Source**: Community-driven development with transparent codebase + +## ๐Ÿ“ Project Structure + +``` +BBeOS/ +โ”œโ”€โ”€ docs/ # Documentation +โ”‚ โ”œโ”€โ”€ phases/ # Phase-by-phase development docs +โ”‚ โ”œโ”€โ”€ guides/ # How-to guides and tutorials +โ”‚ โ””โ”€โ”€ api/ # API documentation and design docs +โ”œโ”€โ”€ src/ # Source code +โ”‚ โ”œโ”€โ”€ kernel/ # Kernel configuration and patches +โ”‚ โ”œโ”€โ”€ drivers/ # Hardware drivers +โ”‚ โ”œโ”€โ”€ ui/ # User interface components +โ”‚ โ”œโ”€โ”€ telephony/ # Phone functionality +โ”‚ โ”œโ”€โ”€ apps/ # Core applications +โ”‚ โ”œโ”€โ”€ sdk/ # Development tools and SDK +โ”‚ โ””โ”€โ”€ packaging/ # System packaging and deployment +โ”œโ”€โ”€ build/ # Build artifacts +โ”‚ โ”œโ”€โ”€ kernel/ # Kernel builds +โ”‚ โ”œโ”€โ”€ rootfs/ # Root filesystem +โ”‚ โ””โ”€โ”€ images/ # Boot images +โ”œโ”€โ”€ scripts/ # Build automation and tools +โ”œโ”€โ”€ tests/ # Test files and test automation +โ”œโ”€โ”€ vendor/ # Third-party code and dependencies +โ”œโ”€โ”€ downloads/ # External downloads and sources +โ”œโ”€โ”€ community/ # Community website and resources +โ””โ”€โ”€ research/ # Hardware research and analysis +``` + +## ๐Ÿš€ Quick Start + +### Prerequisites +- Linux development environment (Ubuntu 20.04+ recommended) +- Cross-compilation toolchain for ARMv7 +- QEMU for emulation testing +- Git for version control + +### Building the System + +1. **Clone the repository**: + ```bash + git clone https://gitea.lab48.be/eliott/BBeOS.git + cd BBeOS + ``` + +2. **Build the kernel**: + ```bash + ./scripts/build-kernel.sh + ``` + +3. **Build the root filesystem**: + ```bash + ./scripts/build-rootfs.sh + ``` + +4. **Create boot image**: + ```bash + ./scripts/build-boot-image.sh + ``` + +5. **Test in emulation**: + ```bash + ./scripts/emulate-simple.sh + ``` + +## ๐Ÿ“‹ Development Phases + +The project is organized into 7 development phases: + +### Phase 1: Research & Feasibility +- Hardware specification analysis +- Bootloader investigation +- Firmware extraction and analysis +- **Documentation**: `docs/phases/PHASE_1_*.md` + +### Phase 2: Bootstrapping +- Minimal Linux kernel boot +- Basic hardware access +- Development environment setup +- **Documentation**: `docs/phases/PHASE_2_*.md` + +### Phase 3: Hardware Support +- Device drivers development +- Input/output systems +- Display and audio support +- **Documentation**: `docs/phases/PHASE_3_*.md` + +### Phase 4: User Interface +- Wayland-based GUI +- Keyboard-centric navigation +- Core applications +- **Documentation**: `docs/phases/PHASE_4_*.md` + +### Phase 5: Telephony Stack +- Modem integration +- Call/SMS functionality +- Network connectivity +- **Documentation**: `docs/phases/PHASE_5_*.md` + +### Phase 6: Packaging & Updates +- System packaging +- Update mechanisms +- Security hardening +- **Documentation**: `docs/phases/PHASE_6_*.md` + +### Phase 7: Community & SDK +- Developer tools +- Application ecosystem +- Documentation +- **Documentation**: `docs/phases/PHASE_7_*.md` + +## ๐Ÿ› ๏ธ Development Workflow + +### Code Organization +- **Source code** goes in `src/` directory +- **Build artifacts** are placed in `build/` directory +- **Scripts** are in `scripts/` directory +- **Documentation** is organized in `docs/` subdirectories + +### Testing +- **Unit tests** in `tests/` directory +- **Hardware testing** with `scripts/hardware-test.sh` +- **Emulation testing** with QEMU scripts +- **Integration testing** for full system + +### Building Components + +#### Kernel +```bash +./scripts/build-kernel.sh # Full kernel build +./scripts/build-kernel-minimal.sh # Minimal kernel build +``` + +#### Root Filesystem +```bash +./scripts/build-rootfs.sh # Build BusyBox rootfs +``` + +#### Drivers +```bash +./scripts/build-drivers.sh # Build Q20-specific drivers +``` + +#### User Interface +```bash +./scripts/build-ui.sh # Build UI components +``` + +#### Telephony +```bash +./scripts/build-telephony.sh # Build telephony stack +``` + +#### Packaging +```bash +./scripts/build-packaging.sh # Build system images +``` + +## ๐Ÿงช Testing and Emulation + +### QEMU Emulation +```bash +./scripts/emulate-simple.sh # Simple QEMU demo +./scripts/emulate-bbeos.sh # Full BBeOS emulation +./scripts/emulate-terminal.sh # Terminal-based simulation +``` + +### Hardware Testing +```bash +./scripts/hardware-test.sh # Hardware component testing +``` + +## ๐Ÿ“š Documentation + +### Guides +- **Emulation Guide**: `docs/guides/EMULATION_GUIDE.md` +- **Hardware Testing**: `docs/guides/hardware-testing-guide.md` + +### API Documentation +- **UI/UX Design**: `docs/api/UI_UX_DESIGN.md` +- **Security Analysis**: `docs/api/SECURITY_ANALYSIS.md` + +### Phase Documentation +- **Phase 1**: `docs/phases/PHASE_1_*.md` +- **Phase 2**: `docs/phases/PHASE_2_*.md` +- **Phase 3**: `docs/phases/PHASE_3_*.md` +- **Phase 4**: `docs/phases/PHASE_4_*.md` +- **Phase 5**: `docs/phases/PHASE_5_*.md` +- **Phase 6**: `docs/phases/PHASE_6_*.md` +- **Phase 7**: `docs/phases/PHASE_7_*.md` + +## ๐Ÿ”ง Configuration + +### Build Configuration +- **Kernel config**: `src/kernel/msm8960-defconfig` +- **Device tree**: `vendor/kernel-source/arch/arm/boot/dts/qcom/` + +### Environment Variables +- `CROSS_COMPILE`: ARM cross-compilation toolchain +- `KERNEL_DIR`: Kernel source directory +- `BUILD_DIR`: Build output directory + +## ๐Ÿค Contributing + +### Code Style +- Follow Linux kernel coding style for kernel code +- Use consistent indentation and naming conventions +- Add comments for complex logic +- Include error handling + +### Commit Messages +- Use descriptive commit messages +- Reference issue numbers when applicable +- Follow conventional commit format + +### Pull Requests +- Create feature branches for new development +- Include tests for new functionality +- Update documentation as needed +- Ensure all tests pass + +## ๐Ÿ› Troubleshooting + +### Common Issues +1. **Build failures**: Check toolchain installation +2. **Emulation issues**: Verify QEMU installation +3. **Hardware problems**: Review device tree configuration + +### Getting Help +- Check the documentation in `docs/` +- Review phase-specific guides +- Test with emulation first +- Use hardware testing scripts + +## ๐Ÿ“„ License + +BBeOS is open source software licensed under the GPL v3 License. See LICENSE file for details. + +## ๐Ÿ”— Resources + +- **Repository**: https://gitea.lab48.be/eliott/BBeOS +- **Community Website**: `community/website/index.html` +- **Hardware Specs**: `hardware/q20-specs.md` +- **Research**: `research/` directory + +--- + +*This guide is maintained by the BBeOS development team. For questions or contributions, please refer to the project repository.* \ No newline at end of file diff --git a/docs/SECURITY_ANALYSIS.md b/docs/api/SECURITY_ANALYSIS.md similarity index 100% rename from docs/SECURITY_ANALYSIS.md rename to docs/api/SECURITY_ANALYSIS.md diff --git a/docs/UI_UX_DESIGN.md b/docs/api/UI_UX_DESIGN.md similarity index 100% rename from docs/UI_UX_DESIGN.md rename to docs/api/UI_UX_DESIGN.md diff --git a/docs/EMULATION_GUIDE.md b/docs/guides/EMULATION_GUIDE.md similarity index 100% rename from docs/EMULATION_GUIDE.md rename to docs/guides/EMULATION_GUIDE.md diff --git a/docs/hardware-testing-guide.md b/docs/guides/hardware-testing-guide.md similarity index 100% rename from docs/hardware-testing-guide.md rename to docs/guides/hardware-testing-guide.md diff --git a/docs/PHASE_1_IMPLEMENTATION.md b/docs/phases/PHASE_1_IMPLEMENTATION.md similarity index 100% rename from docs/PHASE_1_IMPLEMENTATION.md rename to docs/phases/PHASE_1_IMPLEMENTATION.md diff --git a/docs/PHASE_1_RESEARCH.md b/docs/phases/PHASE_1_RESEARCH.md similarity index 100% rename from docs/PHASE_1_RESEARCH.md rename to docs/phases/PHASE_1_RESEARCH.md diff --git a/docs/PHASE_1_SUMMARY.md b/docs/phases/PHASE_1_SUMMARY.md similarity index 100% rename from docs/PHASE_1_SUMMARY.md rename to docs/phases/PHASE_1_SUMMARY.md diff --git a/docs/PHASE_2_BOOTSTRAPPING.md b/docs/phases/PHASE_2_BOOTSTRAPPING.md similarity index 100% rename from docs/PHASE_2_BOOTSTRAPPING.md rename to docs/phases/PHASE_2_BOOTSTRAPPING.md diff --git a/docs/PHASE_2_SUMMARY.md b/docs/phases/PHASE_2_SUMMARY.md similarity index 100% rename from docs/PHASE_2_SUMMARY.md rename to docs/phases/PHASE_2_SUMMARY.md diff --git a/docs/PHASE_3_HARDWARE.md b/docs/phases/PHASE_3_HARDWARE.md similarity index 100% rename from docs/PHASE_3_HARDWARE.md rename to docs/phases/PHASE_3_HARDWARE.md diff --git a/docs/PHASE_3_IMPLEMENTATION.md b/docs/phases/PHASE_3_IMPLEMENTATION.md similarity index 100% rename from docs/PHASE_3_IMPLEMENTATION.md rename to docs/phases/PHASE_3_IMPLEMENTATION.md diff --git a/docs/PHASE_3_SUMMARY.md b/docs/phases/PHASE_3_SUMMARY.md similarity index 100% rename from docs/PHASE_3_SUMMARY.md rename to docs/phases/PHASE_3_SUMMARY.md diff --git a/docs/PHASE_4_IMPLEMENTATION.md b/docs/phases/PHASE_4_IMPLEMENTATION.md similarity index 100% rename from docs/PHASE_4_IMPLEMENTATION.md rename to docs/phases/PHASE_4_IMPLEMENTATION.md diff --git a/docs/PHASE_4_SUMMARY.md b/docs/phases/PHASE_4_SUMMARY.md similarity index 100% rename from docs/PHASE_4_SUMMARY.md rename to docs/phases/PHASE_4_SUMMARY.md diff --git a/docs/PHASE_4_UI.md b/docs/phases/PHASE_4_UI.md similarity index 100% rename from docs/PHASE_4_UI.md rename to docs/phases/PHASE_4_UI.md diff --git a/docs/PHASE_5_SUMMARY.md b/docs/phases/PHASE_5_SUMMARY.md similarity index 100% rename from docs/PHASE_5_SUMMARY.md rename to docs/phases/PHASE_5_SUMMARY.md diff --git a/docs/PHASE_5_TELEPHONY.md b/docs/phases/PHASE_5_TELEPHONY.md similarity index 100% rename from docs/PHASE_5_TELEPHONY.md rename to docs/phases/PHASE_5_TELEPHONY.md diff --git a/docs/PHASE_6_IMPLEMENTATION.md b/docs/phases/PHASE_6_IMPLEMENTATION.md similarity index 100% rename from docs/PHASE_6_IMPLEMENTATION.md rename to docs/phases/PHASE_6_IMPLEMENTATION.md diff --git a/docs/PHASE_6_PACKAGING.md b/docs/phases/PHASE_6_PACKAGING.md similarity index 100% rename from docs/PHASE_6_PACKAGING.md rename to docs/phases/PHASE_6_PACKAGING.md diff --git a/docs/PHASE_6_SUMMARY.md b/docs/phases/PHASE_6_SUMMARY.md similarity index 100% rename from docs/PHASE_6_SUMMARY.md rename to docs/phases/PHASE_6_SUMMARY.md diff --git a/docs/PHASE_7_IMPLEMENTATION.md b/docs/phases/PHASE_7_IMPLEMENTATION.md similarity index 100% rename from docs/PHASE_7_IMPLEMENTATION.md rename to docs/phases/PHASE_7_IMPLEMENTATION.md diff --git a/docs/PHASE_7_SUMMARY.md b/docs/phases/PHASE_7_SUMMARY.md similarity index 100% rename from docs/PHASE_7_SUMMARY.md rename to docs/phases/PHASE_7_SUMMARY.md diff --git a/kernel/q20.dts b/kernel/q20.dts deleted file mode 100644 index 40377a0..0000000 --- a/kernel/q20.dts +++ /dev/null @@ -1,244 +0,0 @@ -/dts-v1/; - -/ { - model = "BlackBerry Classic Q20"; - compatible = "blackberry,q20", "qcom,msm8960"; - - interrupt-parent = <&intc>; - - chosen { - stdout-path = "serial0:115200n8"; - bootargs = "console=ttyMSM0,115200n8 root=/dev/mmcblk0p2 rw rootwait"; - }; - - memory { - device_type = "memory"; - reg = <0x00000000 0x80000000>; // 2GB RAM - }; - - reserved-memory { - #address-cells = <1>; - #size-cells = <1>; - ranges; - - // Reserved for modem - modem@0x00000000 { - reg = <0x00000000 0x40000000>; - no-map; - }; - - // Reserved for display - display@0x40000000 { - reg = <0x40000000 0x10000000>; - no-map; - }; - }; - - cpus { - #address-cells = <1>; - #size-cells = <0>; - - cpu@0 { - device_type = "cpu"; - compatible = "arm,cortex-a9"; - reg = <0>; - next-level-cache = <&L2>; - operating-points-v2 = <&cpu_opp_table>; - }; - - cpu@1 { - device_type = "cpu"; - compatible = "arm,cortex-a9"; - reg = <1>; - next-level-cache = <&L2>; - operating-points-v2 = <&cpu_opp_table>; - }; - }; - - cpu_opp_table: opp_table { - compatible = "operating-points-v2"; - opp-shared; - - opp-384000000 { - opp-hz = /bits/ 64 <384000000>; - opp-microvolt = <1050000>; - clock-latency-ns = <256000>; - }; - - opp-1026000000 { - opp-hz = /bits/ 64 <1026000000>; - opp-microvolt = <1150000>; - clock-latency-ns = <256000>; - }; - - opp-1500000000 { - opp-hz = /bits/ 64 <1500000000>; - opp-microvolt = <1250000>; - clock-latency-ns = <256000>; - }; - }; - - soc { - #address-cells = <1>; - #size-cells = <1>; - ranges; - compatible = "simple-bus"; - - intc: interrupt-controller@2000000 { - compatible = "arm,cortex-a9-gic"; - #interrupt-cells = <3>; - #size-cells = <0>; - #address-cells = <1>; - interrupt-controller; - reg = <0x02000000 0x1000>, - <0x02002000 0x1000>; - }; - - L2: l2-cache@2010000 { - compatible = "arm,pl310-cache"; - reg = <0x02010000 0x1000>; - arm,data-latency = <3 3 3>; - arm,tag-latency = <2 2 2>; - cache-unified; - cache-level = <2>; - }; - - // Serial console - serial@16440000 { - compatible = "qcom,msm-uartdm"; - reg = <0x16440000 0x1000>; - interrupts = <0 154 0>; - clocks = <&gcc 108>, <&gcc 109>; - clock-names = "core", "iface"; - status = "okay"; - }; - - // Display controller - mdp@5100000 { - compatible = "qcom,mdp5"; - reg = <0x05100000 0x90000>; - reg-names = "mdp_phys"; - interrupts = <0 75 0>; - clocks = <&gcc 20>, <&gcc 21>; - clock-names = "iface", "core"; - status = "okay"; - }; - - // Audio system - sound { - compatible = "qcom,msm8960-snd-card"; - qcom,model = "blackberry-q20-snd-card"; - qcom,audio-routing = "RX_BIAS", "MCLK", - "LDO_H", "MCLK"; - qcom,cdc-mclk-gpios = <&pm8941_gpios 15 0>; - }; - - // Keyboard controller - keyboard@78 { - compatible = "blackberry,q20-keyboard"; - reg = <0x78>; - interrupts = <0 123 0>; - gpio-controller; - #gpio-cells = <2>; - status = "okay"; - }; - - // Trackpad - trackpad@5d { - compatible = "blackberry,q20-trackpad"; - reg = <0x5d>; - interrupts = <0 124 0>; - status = "okay"; - }; - - // Battery management - battery { - compatible = "blackberry,q20-battery"; - voltage-min-design-microvolt = <3200000>; - voltage-max-design-microvolt = <4200000>; - energy-full-design-microwatt-hours = <9500000>; - charge-full-design-microamp-hours = <2515000>; - }; - - // Charger - charger { - compatible = "blackberry,q20-charger"; - qcom,fast-charge-current = <1000000>; - qcom,fast-charge-voltage = <4200000>; - }; - - // USB OTG - usb@12500000 { - compatible = "qcom,ci-hdrc"; - reg = <0x12500000 0x200>, - <0x12500200 0x200>; - interrupts = <0 134 0>; - status = "okay"; - dr_mode = "otg"; - }; - - // MMC/SD card - mmc@12400000 { - compatible = "qcom,msm-sdcc"; - reg = <0x12400000 0x1000>; - interrupts = <0 81 0>; - clocks = <&gcc 80>, <&gcc 81>; - clock-names = "core", "iface"; - status = "okay"; - bus-width = <4>; - cap-sd-highspeed; - cap-mmc-highspeed; - }; - - // Wi-Fi - wifi@0 { - compatible = "qcom,ath6kl"; - reg = <0x0 0x0>; - interrupts = <0 70 0>; - status = "okay"; - }; - - // Bluetooth - bluetooth@0 { - compatible = "qcom,wcn3660"; - reg = <0x0 0x0>; - interrupts = <0 71 0>; - status = "okay"; - }; - }; - - // Display panel - panel@0 { - compatible = "blackberry,q20-panel"; - reg = <0>; - - // Panel specifications - width-mm = <89>; - height-mm = <89>; - - // Display timing - display-timings { - native-mode = <&timing0>; - - timing0: timing0 { - clock-frequency = <72000000>; - hactive = <720>; - vactive = <720>; - hfront-porch = <10>; - hsync-len = <10>; - hback-porch = <10>; - vfront-porch = <10>; - vsync-len = <10>; - vback-porch = <10>; - }; - }; - - // Backlight - backlight { - compatible = "pwm-backlight"; - pwms = <&pwm 0 1000000>; - brightness-levels = <0 1 2 3 4 5 6 7 8 9 10>; - default-brightness-level = <10>; - }; - }; -}; \ No newline at end of file diff --git a/scripts/build-kernel-minimal.sh b/scripts/build-kernel-minimal.sh index 00615f3..a893bc4 100755 --- a/scripts/build-kernel-minimal.sh +++ b/scripts/build-kernel-minimal.sh @@ -12,7 +12,7 @@ export ARCH=arm export CROSS_COMPILE=arm-linux-gnueabihf- # Go to kernel source directory -cd kernel-source +cd vendor/kernel-source # Clean previous build echo "Cleaning previous build..." diff --git a/scripts/build-kernel.sh b/scripts/build-kernel.sh index e6708a7..9737f37 100755 --- a/scripts/build-kernel.sh +++ b/scripts/build-kernel.sh @@ -7,8 +7,8 @@ set -e SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(dirname "$SCRIPT_DIR")" -KERNEL_DIR="$PROJECT_ROOT/kernel" -BUILD_DIR="$PROJECT_ROOT/build" +KERNEL_DIR="$PROJECT_ROOT/vendor/kernel-source" +BUILD_DIR="$PROJECT_ROOT/build/kernel" TOOLCHAIN_DIR="$PROJECT_ROOT/toolchain" # Colors for output diff --git a/scripts/build-rootfs.sh b/scripts/build-rootfs.sh index d9ed33d..c5213a3 100755 --- a/scripts/build-rootfs.sh +++ b/scripts/build-rootfs.sh @@ -8,7 +8,7 @@ set -e echo "Building minimal root filesystem for BBeOS..." # Configuration -ROOTFS_DIR="rootfs" +ROOTFS_DIR="build/rootfs" BUSYBOX_VERSION="1.36.1" BUSYBOX_URL="https://busybox.net/downloads/busybox-${BUSYBOX_VERSION}.tar.bz2" BUSYBOX_DIR="busybox-${BUSYBOX_VERSION}" @@ -24,16 +24,16 @@ mkdir -p ${ROOTFS_DIR}/{bin,dev,etc,lib,proc,sys,tmp,usr/bin,usr/sbin} # Download and build BusyBox echo "Downloading BusyBox ${BUSYBOX_VERSION}..." -if [ ! -f "${BUSYBOX_DIR}.tar.bz2" ]; then - wget ${BUSYBOX_URL} +if [ ! -f "downloads/${BUSYBOX_DIR}.tar.bz2" ]; then + wget -O downloads/${BUSYBOX_DIR}.tar.bz2 ${BUSYBOX_URL} fi -if [ ! -d "${BUSYBOX_DIR}" ]; then - tar xf ${BUSYBOX_DIR}.tar.bz2 +if [ ! -d "downloads/${BUSYBOX_DIR}" ]; then + tar xf downloads/${BUSYBOX_DIR}.tar.bz2 -C downloads/ fi echo "Building BusyBox..." -cd ${BUSYBOX_DIR} +cd downloads/${BUSYBOX_DIR} # Configure BusyBox make defconfig @@ -47,8 +47,8 @@ make install # Copy BusyBox to rootfs echo "Installing BusyBox to rootfs..." -cp busybox ../${ROOTFS_DIR}/bin/ -cd .. +cp busybox ../../${ROOTFS_DIR}/bin/ +cd ../.. # Create init script echo "Creating init script..." diff --git a/scripts/build-telephony.sh b/scripts/build-telephony.sh index 98c2a0d..e0f6e40 100755 --- a/scripts/build-telephony.sh +++ b/scripts/build-telephony.sh @@ -8,10 +8,10 @@ set -e echo "Building BBeOS telephony components..." # Configuration -TELEPHONY_DIR="telephony" -BUILD_DIR="telephony-build" -ROOTFS_DIR="rootfs" -KERNEL_SRC="kernel-source" +TELEPHONY_DIR="src/telephony" +BUILD_DIR="build/telephony" +ROOTFS_DIR="build/rootfs" +KERNEL_SRC="vendor/kernel-source" # Set up environment export ARCH=arm diff --git a/scripts/build-ui.sh b/scripts/build-ui.sh index aca4892..a932743 100755 --- a/scripts/build-ui.sh +++ b/scripts/build-ui.sh @@ -8,8 +8,8 @@ set -e echo "Building BBeOS UI components..." # Configuration -UI_DIR="ui" -BUILD_DIR="ui-build" +UI_DIR="src/ui" +BUILD_DIR="build/ui" ROOTFS_DIR="rootfs" # Set up environment diff --git a/flash-boot.sh b/scripts/flash-boot.sh similarity index 100% rename from flash-boot.sh rename to scripts/flash-boot.sh diff --git a/test-qemu-compatible.sh b/scripts/test-qemu-compatible.sh similarity index 100% rename from test-qemu-compatible.sh rename to scripts/test-qemu-compatible.sh diff --git a/test-qemu.sh b/scripts/test-qemu.sh similarity index 100% rename from test-qemu.sh rename to scripts/test-qemu.sh diff --git a/apps/Makefile b/src/apps/Makefile similarity index 100% rename from apps/Makefile rename to src/apps/Makefile diff --git a/drivers/Makefile b/src/drivers/Makefile similarity index 100% rename from drivers/Makefile rename to src/drivers/Makefile diff --git a/drivers/display/q20-panel.c b/src/drivers/display/q20-panel.c similarity index 100% rename from drivers/display/q20-panel.c rename to src/drivers/display/q20-panel.c diff --git a/drivers/input/q20-keyboard.c b/src/drivers/input/q20-keyboard.c similarity index 100% rename from drivers/input/q20-keyboard.c rename to src/drivers/input/q20-keyboard.c diff --git a/kernel/msm8960-defconfig b/src/kernel/msm8960-defconfig similarity index 100% rename from kernel/msm8960-defconfig rename to src/kernel/msm8960-defconfig diff --git a/packaging/Makefile b/src/packaging/Makefile similarity index 100% rename from packaging/Makefile rename to src/packaging/Makefile diff --git a/packaging/security/secure-boot.c b/src/packaging/security/secure-boot.c similarity index 100% rename from packaging/security/secure-boot.c rename to src/packaging/security/secure-boot.c diff --git a/packaging/system/image-builder.c b/src/packaging/system/image-builder.c similarity index 100% rename from packaging/system/image-builder.c rename to src/packaging/system/image-builder.c diff --git a/packaging/updates/ota-updater.c b/src/packaging/updates/ota-updater.c similarity index 100% rename from packaging/updates/ota-updater.c rename to src/packaging/updates/ota-updater.c diff --git a/sdk/tools/bbeos-sdk.c b/src/sdk/tools/bbeos-sdk.c similarity index 100% rename from sdk/tools/bbeos-sdk.c rename to src/sdk/tools/bbeos-sdk.c diff --git a/telephony/Makefile b/src/telephony/Makefile similarity index 100% rename from telephony/Makefile rename to src/telephony/Makefile diff --git a/telephony/modem/q20-modem.c b/src/telephony/modem/q20-modem.c similarity index 100% rename from telephony/modem/q20-modem.c rename to src/telephony/modem/q20-modem.c diff --git a/telephony/sms/q20-sms.c b/src/telephony/sms/q20-sms.c similarity index 100% rename from telephony/sms/q20-sms.c rename to src/telephony/sms/q20-sms.c diff --git a/telephony/voice/q20-voice.c b/src/telephony/voice/q20-voice.c similarity index 100% rename from telephony/voice/q20-voice.c rename to src/telephony/voice/q20-voice.c diff --git a/ui-build/Makefile b/src/ui/Makefile similarity index 100% rename from ui-build/Makefile rename to src/ui/Makefile diff --git a/ui-build/applications/home-screen.c b/src/ui/applications/home-screen.c similarity index 100% rename from ui-build/applications/home-screen.c rename to src/ui/applications/home-screen.c diff --git a/ui-build/compositor/q20-compositor.c b/src/ui/compositor/q20-compositor.c similarity index 100% rename from ui-build/compositor/q20-compositor.c rename to src/ui/compositor/q20-compositor.c diff --git a/ui-build/applications/home-screen b/ui-build/applications/home-screen deleted file mode 100755 index a16db95949560b753b442dd5ffcbe273893e8e70..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7820 zcmeHMeQX>@6`#F3$7d&X9LI5-kA`g$L<;y~CsqTYD*m|mqjr)uaiLVGn?2t;x8%Oq z+oN^@P1Ht0qCrssRS~L^qDV+cNF>EYAex#=2r6V%k=j21wZep0DQ%<}scj+>a{PWX zJNCvH%AX+l$?x90d2im#zIn6z=K1KZ!5+gfgodctBFNRmglGqit>urXY8R%cf$VOv zp7P?YB|>P7LxqST5+RafIi6@@08z`M=o;0OG7Ir)*aue09z)6}>x7uB zGbG-RK^;KO%h3`1z6tr8kP~l!CsMB0P=vn5B>IV3_VBcy2Kz6-@%6xckca1Qhb!&b?+J>SaNZeA42eo5G=g69j0 z=(YPq?_hsdx3w+NKHJ*fF0B5c-B#N1oP%!3cf6t9-PuCk8M0GZ+C7*ndbWA)XAy%%q!EeWrh&HIeDr6cPB2zZoNFM+qZ7cwcii5uZG%}(cU{FmICV{FMp*c zHg1gn=|=MlRcF7SL|-&M9_xDy2dHxW^=p;um#>{#YKTwcxf)x~OgEZmrlYMVry}Ne zui#|-WkY4FFNv>OaIQfU=#(QUt{`xz|_|Po^TZtU=Qtd!3MjTGA8$I-k8d%?S zK0a_H*_^3de-f*ms4N*UHXcc?EygcAfH4ASV%#S|HvoTqMNAxf>8W$#C!+^Gd!Uvh zdn(sQu1OncrLI*6eP6yNHZ}LecUc0o)`!p0vtKTL98xF?L8&!O)DAWs`9t2FQ@LsyEo&OO#InqF>4PynL-wa$s8$ork`=l3`dmI2)kI!y2G~b7V@yz zQ_f~hH&@I$IVbPSUej~FT6R6BWOm!GS1|2-+WewDmL*GiZ-X{MucCM{19}@q{|?G^{*+6=l!zT)|O~bw6?UBCENDowrz>l_IrbF(YX!dY{yQy!r)_9?P%!~OKPh- z<3>%SHr5bZX*3$EjMdR*V~w#kvfkJ@w=6xSq`dzVc>5yoK2C^Aj|%a zbD}cBRE#M(vv}N}10P4la>=t^LWl-8%a~dgct(nfP12~07!{j}XXL1QhT<7%D)tl~ zL}ci0&;Ix<&xo9ZsJu0V`8B}~sJ@u^TZJCc{^yGL#N!F-Q~~G%H^&y3ntA1J6T$90;vv2)rHedc9u{$*F%L#D4+&x991f3(4s( zo>K))a=u@M|V$9JECmExHYZ{SVE^#uhtH0}~F;+OAN zg0|0hse%Ua3L2U>5Wlpq!{r)t-SL4z6ZYPj8LG}6PmxcCUn~k4kg7V1_f46oG z`uYCf8R9pB-yh;l@TbTJ`)k7c^1~4D_3+;_kS`1I-vF=uTMzx?;B~w=MC!!1=IK8N zUfZYsS@HpJeJ_T16a1^-b-b;JG>O;2^ZYWTR=~e+gAcFgdGM?m6B-aNm*&ae1wXgm z)#5|&{04Od`Zq&z&Q~3wB?TtPJt3a!Z3C~*dqV{8XVf?RwnRZ}PNV*ZZD=AlEv(+by*wQvIgu*6sOr1vpsTa1zlA|2Wf{Aa5sCCz9`+RV zJtg^?Z?XE>x+b3QNnjd(Pp?nRFIBMbne@oa7Nwqs7N>&6)Q?z zg^5zvZ5Xw4?l2}Sz>qQkmx%;|ltnus&Dp;1xv8?RN^|O&=n+}>)Sn01Bkln*Q==a9 zcH#?Y^E1I$Gj*81^IJ=vddwM#%6Cmy0a&|{8CY(*dE zr7g}&I1J=>gJXCvAajEB!4pAoB;F;-Zy%T8DKIh@Pkf<_KbO7|c z-$YyM={vzgQbYYvkN6#+)?;o*;{cZwK+*0``8W z^omb`hX1F?dmBO9JCC-u$8WhrsiA(f-Y>y21BW|gPQw4yX&E)yCjJ)4%$$16g)aUZ zy*D7&F{J*dIQRcVh@>q(|64$=PtJ?nVG_pM!E4a-{uv!wPkxgTlneRq3iQ}dd;E6B zp%;D*+8|s7vdx$yQ14T!DSs&=egK56qU^-acIa)_45+q8%01JNf!+Z)faiZNkZVAf ej8U#l!)r+5c7z6Md%WF*^(r{LRayv{ZvGQ#f;EKz diff --git a/ui-build/applications/home-screen-stub.c b/ui-build/applications/home-screen-stub.c deleted file mode 100644 index 263de19..0000000 --- a/ui-build/applications/home-screen-stub.c +++ /dev/null @@ -1,9 +0,0 @@ -#include -#include - -int main(int argc, char *argv[]) { - printf("Q20 Home Screen (stub)\n"); - printf("This is a placeholder for the home screen application\n"); - printf("Full implementation requires Cairo and Wayland libraries\n"); - return 0; -} diff --git a/ui-build/assets/theme.conf b/ui-build/assets/theme.conf deleted file mode 100644 index 34d23de..0000000 --- a/ui-build/assets/theme.conf +++ /dev/null @@ -1,23 +0,0 @@ -# BBeOS Theme Configuration -# BlackBerry Classic Q20 UI Theme - -[colors] -background=#1a1a1a -foreground=#ffffff -accent=#0066cc -highlight=#3399ff -error=#cc3333 -success=#33cc33 -warning=#cc9933 - -[fonts] -default=Sans 12 -title=Sans Bold 16 -status=Sans 10 -help=Sans 9 - -[layout] -status_bar_height=40 -app_grid_size=4 -app_icon_size=80 -app_icon_spacing=20 diff --git a/ui-build/assets/wallpaper.svg b/ui-build/assets/wallpaper.svg deleted file mode 100644 index f9461b9..0000000 --- a/ui-build/assets/wallpaper.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/ui-build/compositor/q20-compositor b/ui-build/compositor/q20-compositor deleted file mode 100755 index d950c8e944a3ecefe65881cfbbe007bcf69f70ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7824 zcmeHMeQX>@6`#F3Cub*h9LI5;527V8A_aVL9IJs+Du0~qIJT2EbxT22H+#NyZpnRh zZ;#jsYNEDM{~#qQAXGk-M5+us4HJ!o~wUB*4 zY^1z6w@e6)aq3AmstN&-9Lw=U69b5p5u?CS@EX^FCsKxPi6B+D4uixR*<(ogbiEMM z^@hZ|F{lg3c{w_Q-`6024RYdj@I=b>GZdk(F^PVnmfbh&r@{UUaC`%BALQZrJ7J5+ z@gQPb)=h28rrWY^zC6)pd%4VbqEtxifJo{zfzk&9dma$qN!GpNol0M{501RMdiS@F zH~yvfB<*k>+M*7D`g|_}`!&jr|M2r&4g^HS3e{-fNb=2c4%I0{BN|GgdNzX$Yayr! zWS<7=XEXz90uL?VKOEwzFDz?p!nVfUyq$FqJ7D3cF{|X;o^R!BH!q51za;Eb!Se-0 z^xB`sGZ8v?txq(AK0~&>Y|Fl z^F`ndLn43ahlpqcijDIt&}K~hIw|yKNHN1jQs})&T8ll_)%M2^3h`F_*ts`jGi|f6 znNzd%Gbd)^S6-Tptu%!A>4`TQet!Io*o_xwb^FG9^X;pl_FSla5$(NK#0p@2klV?y~=p&Ib*Ql)-gVGi@6uG$qf?+e^?9a zTh7FXjwD+$m1~dTY0p=d4H=t{B-al0BcPjrFJBVpkDYz|1@XO!{h!!h z$C3S&YvY%t4YX31mj`_hUlv4yT!Lx4QvjFe{zDbEB_99xni;3TDA*w6h#$~{HOvw*ZEpa>7i*98W^W-^ zERL(Wa7^@i&=Zj$rQ5KOy)RL{ETCM+MdkX`LsD!9Z6&TKj0zCU~`F&b~3=-@aKXOkpro zMHUGbbF*pi%&DFMGN)rcw-!iX4mXY5oVgftUFLABfz0`zgplndD08(=_#h%fcYF57t2`re z9-{Kr5a!nfE1>#f;;$8YMEjpl#5X2yg7TK!465IsJB<3B)nHY;eqZhy%C$cP{2@Ia zJfDCy?oADx-vo1a$ljI^9|`7rC?u!8u61yylINaRP%rO_n$z~Dg7wt;yF&UqwKAyo z$GuhgD$#>}%^P?h`eT3Sc}Bt80k5C;3n4l6kB9gN!9Tq~|Amm8{^CAW&@AWsaY*h$ zz_X8_=bH=3kD{OPKntu&&>qh|1#83?L%e~Liq97m+|am9d>_9&UkTbi&r$`A;w3aR zZy>tJx*F*DM56-Xm7f<59g?K}r z%;*S!&%+X^K0gicb>Mln6UdvOdjIpwLi?{&<7cIyd^*glq3BiT|EEIyX7oK6;!W`1 zBpI-zc?6$?2oy}T@9Q&X( zo@aL+-5{uljE^VA1f?u)xK7#{Pq`>W&X*T0KWB}xz*vIubiq21Eu`$Ml}1UWWZC5j z!9q#a@tt&{eQ^y|JzdN8JbThY@dO2uanH^My=8Ap5Z=-7uH(4bXk?f z)LZJZRmp#=vZhL<`68>6wtZX3*MvQaoP3(kWl^B?WPLYmenFwuN|y>&28AaUaR>Ke zP};f12(@ zht^|$p>vFddP#J=gM66wrl3b;?NfguXpguD$ZU;z%-xBn(dMUu$1`=9!}EJfo_fq1 ziOlgeV3>qQ@XNfMddw$@%)a!z>?ah%Dhgbq~|nc}P^*DLMdp-lx#kdiq{)uhdXK)FXZwsP&lN z5&8c$4b&k#3)Fi2?hyIh8noU?bWo4)%kKyA^dk12S9-{lV*a}XJ@(Tczn^jFh2MiV2y;NT8FK{ceN;8&FJ;8H zfv{DSo%q=Sy&akX)%HlaW*Rck+YbkD|L+Cz8PFwTl+UK&6(n+Zg$8PSyy1lPA~-Z^ Jv=B1g{3n9?HJ< -#include - -int main(int argc, char *argv[]) { - printf("Q20 Compositor (stub)\n"); - printf("This is a placeholder for the Wayland compositor\n"); - printf("Full implementation requires wlroots library\n"); - return 0; -} diff --git a/ui/Makefile b/ui/Makefile deleted file mode 100644 index 2dbfb86..0000000 --- a/ui/Makefile +++ /dev/null @@ -1,71 +0,0 @@ -# BBeOS UI Build System -# Builds UI components for BlackBerry Classic Q20 - -# Configuration -CC = arm-linux-gnueabihf-gcc -CFLAGS = -Wall -Wextra -O2 -g -LDFLAGS = - -# Libraries -WAYLAND_LIBS = -lwayland-client -lwayland-server -WLROOTS_LIBS = -lwlr -lwlr-util -CAIRO_LIBS = -lcairo -lpango-1.0 -lpangocairo-1.0 -XKB_LIBS = -lxkbcommon -MATH_LIBS = -lm - -# Directories -COMPOSITOR_DIR = compositor -APPLICATIONS_DIR = applications -FRAMEWORK_DIR = framework -ASSETS_DIR = assets - -# Targets -all: compositor applications - -compositor: $(COMPOSITOR_DIR)/q20-compositor - -applications: $(APPLICATIONS_DIR)/home-screen - -# Compositor -$(COMPOSITOR_DIR)/q20-compositor: $(COMPOSITOR_DIR)/q20-compositor.c - $(CC) $(CFLAGS) -o $@ $< $(WAYLAND_LIBS) $(WLROOTS_LIBS) $(XKB_LIBS) $(MATH_LIBS) - -# Applications -$(APPLICATIONS_DIR)/home-screen: $(APPLICATIONS_DIR)/home-screen.c - $(CC) $(CFLAGS) -o $@ $< $(WAYLAND_LIBS) $(CAIRO_LIBS) $(MATH_LIBS) - -# Framework (placeholder for future components) -framework: - @echo "Building UI framework components..." - # TODO: Add framework components - -# Assets -assets: - @echo "Processing UI assets..." - # TODO: Add asset processing - -# Installation -install: all - @echo "Installing UI components..." - mkdir -p $(DESTDIR)/usr/bin - mkdir -p $(DESTDIR)/usr/share/bbeos/ui - cp $(COMPOSITOR_DIR)/q20-compositor $(DESTDIR)/usr/bin/ - cp $(APPLICATIONS_DIR)/home-screen $(DESTDIR)/usr/bin/ - cp -r $(ASSETS_DIR)/* $(DESTDIR)/usr/share/bbeos/ui/ 2>/dev/null || true - -# Clean -clean: - rm -f $(COMPOSITOR_DIR)/q20-compositor - rm -f $(APPLICATIONS_DIR)/home-screen - rm -f $(FRAMEWORK_DIR)/*.o - rm -f $(FRAMEWORK_DIR)/*.a - -# Development targets -dev: CFLAGS += -DDEBUG -g3 -dev: all - -# Release targets -release: CFLAGS += -DNDEBUG -O3 -release: all - -.PHONY: all compositor applications framework assets install clean dev release \ No newline at end of file diff --git a/ui/applications/home-screen.c b/ui/applications/home-screen.c deleted file mode 100644 index 8eb7223..0000000 --- a/ui/applications/home-screen.c +++ /dev/null @@ -1,266 +0,0 @@ -/* - * Q20 Home Screen Application - * BlackBerry Classic Q20 Main Interface - * - * A keyboard-optimized home screen with app launcher, - * status bar, and navigation system. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define Q20_WIDTH 720 -#define Q20_HEIGHT 720 -#define STATUS_BAR_HEIGHT 40 -#define APP_GRID_SIZE 4 -#define APP_ICON_SIZE 80 -#define APP_ICON_SPACING 20 - -struct q20_home_screen { - struct wl_display *display; - struct wl_compositor *compositor; - struct wl_surface *surface; - struct wl_shell *shell; - struct wl_shell_surface *shell_surface; - - cairo_surface_t *cairo_surface; - cairo_t *cairo; - - int selected_app; - int app_count; - char *app_names[16]; - char *app_commands[16]; - - time_t last_update; -}; - -static void draw_status_bar(struct q20_home_screen *home) { - cairo_t *cr = home->cairo; - char time_str[64]; - time_t now = time(NULL); - struct tm *tm_info = localtime(&now); - - strftime(time_str, sizeof(time_str), "%H:%M", tm_info); - - // Draw status bar background - cairo_set_source_rgb(cr, 0.1, 0.1, 0.1); - cairo_rectangle(cr, 0, 0, Q20_WIDTH, STATUS_BAR_HEIGHT); - cairo_fill(cr); - - // Draw time - cairo_set_source_rgb(cr, 1.0, 1.0, 1.0); - cairo_select_font_face(cr, "Sans", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD); - cairo_set_font_size(cr, 16); - - cairo_text_extents_t extents; - cairo_text_extents(cr, time_str, &extents); - cairo_move_to(cr, Q20_WIDTH - extents.width - 10, STATUS_BAR_HEIGHT / 2 + extents.height / 2); - cairo_show_text(cr, time_str); - - // Draw "BBeOS" title - cairo_move_to(cr, 10, STATUS_BAR_HEIGHT / 2 + extents.height / 2); - cairo_show_text(cr, "BBeOS"); -} - -static void draw_app_grid(struct q20_home_screen *home) { - cairo_t *cr = home->cairo; - int start_y = STATUS_BAR_HEIGHT + 20; - int start_x = (Q20_WIDTH - (APP_GRID_SIZE * APP_ICON_SIZE + (APP_GRID_SIZE - 1) * APP_ICON_SPACING)) / 2; - - for (int i = 0; i < home->app_count; i++) { - int row = i / APP_GRID_SIZE; - int col = i % APP_GRID_SIZE; - int x = start_x + col * (APP_ICON_SIZE + APP_ICON_SPACING); - int y = start_y + row * (APP_ICON_SIZE + APP_ICON_SPACING + 30); - - // Draw selection highlight - if (i == home->selected_app) { - cairo_set_source_rgb(cr, 0.2, 0.6, 1.0); - cairo_rectangle(cr, x - 5, y - 5, APP_ICON_SIZE + 10, APP_ICON_SIZE + 35); - cairo_fill(cr); - } - - // Draw app icon background - cairo_set_source_rgb(cr, 0.3, 0.3, 0.3); - cairo_rectangle(cr, x, y, APP_ICON_SIZE, APP_ICON_SIZE); - cairo_fill(cr); - - // Draw app icon border - cairo_set_source_rgb(cr, 0.5, 0.5, 0.5); - cairo_set_line_width(cr, 2); - cairo_rectangle(cr, x, y, APP_ICON_SIZE, APP_ICON_SIZE); - cairo_stroke(cr); - - // Draw app name - cairo_set_source_rgb(cr, 1.0, 1.0, 1.0); - cairo_select_font_face(cr, "Sans", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); - cairo_set_font_size(cr, 12); - - cairo_text_extents_t extents; - cairo_text_extents(cr, home->app_names[i], &extents); - cairo_move_to(cr, x + (APP_ICON_SIZE - extents.width) / 2, y + APP_ICON_SIZE + 15); - cairo_show_text(cr, home->app_names[i]); - } -} - -static void draw_help_text(struct q20_home_screen *home) { - cairo_t *cr = home->cairo; - - cairo_set_source_rgb(cr, 0.7, 0.7, 0.7); - cairo_select_font_face(cr, "Sans", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); - cairo_set_font_size(cr, 10); - - const char *help_text[] = { - "Arrow Keys: Navigate", - "Enter: Launch App", - "F1: Settings", - "F2: Terminal", - "Esc: Exit" - }; - - int y = Q20_HEIGHT - 80; - for (int i = 0; i < 5; i++) { - cairo_move_to(cr, 10, y + i * 12); - cairo_show_text(cr, help_text[i]); - } -} - -static void redraw(struct q20_home_screen *home) { - cairo_t *cr = home->cairo; - - // Clear background - cairo_set_source_rgb(cr, 0.15, 0.15, 0.15); - cairo_paint(cr); - - // Draw components - draw_status_bar(home); - draw_app_grid(home); - draw_help_text(home); - - // Commit the surface - wl_surface_damage(home->surface, 0, 0, Q20_WIDTH, Q20_HEIGHT); - wl_surface_commit(home->surface); -} - -static void handle_keyboard_input(struct q20_home_screen *home, uint32_t key) { - switch (key) { - case 111: // Up arrow - if (home->selected_app >= APP_GRID_SIZE) { - home->selected_app -= APP_GRID_SIZE; - } - break; - case 116: // Down arrow - if (home->selected_app + APP_GRID_SIZE < home->app_count) { - home->selected_app += APP_GRID_SIZE; - } - break; - case 113: // Left arrow - if (home->selected_app > 0) { - home->selected_app--; - } - break; - case 114: // Right arrow - if (home->selected_app < home->app_count - 1) { - home->selected_app++; - } - break; - case 36: // Enter - if (home->selected_app < home->app_count) { - // Launch the selected app - printf("Launching: %s\n", home->app_commands[home->selected_app]); - // TODO: Actually launch the app - } - break; - case 9: // Escape - printf("Exiting home screen\n"); - exit(0); - break; - } - - redraw(home); -} - -static void init_apps(struct q20_home_screen *home) { - home->app_count = 0; - - // Add default apps - home->app_names[home->app_count] = "Terminal"; - home->app_commands[home->app_count] = "weston-terminal"; - home->app_count++; - - home->app_names[home->app_count] = "Settings"; - home->app_commands[home->app_count] = "weston-settings"; - home->app_count++; - - home->app_names[home->app_count] = "File Manager"; - home->app_commands[home->app_count] = "weston-file-manager"; - home->app_count++; - - home->app_names[home->app_count] = "Calculator"; - home->app_commands[home->app_count] = "weston-calculator"; - home->app_count++; - - home->app_names[home->app_count] = "Notes"; - home->app_commands[home->app_count] = "weston-notes"; - home->app_count++; - - home->app_names[home->app_count] = "Calendar"; - home->app_commands[home->app_count] = "weston-calendar"; - home->app_count++; - - home->selected_app = 0; -} - -int main(int argc, char *argv[]) { - struct q20_home_screen home = {0}; - - // Connect to Wayland display - home.display = wl_display_connect(NULL); - if (!home.display) { - fprintf(stderr, "Failed to connect to Wayland display\n"); - return 1; - } - - // Get registry and bind to interfaces - struct wl_registry *registry = wl_display_get_registry(home.display); - - // TODO: Add proper registry listener to bind to compositor, shell, etc. - // For now, we'll create a simple surface - - // Create Cairo surface - home.cairo_surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, Q20_WIDTH, Q20_HEIGHT); - home.cairo = cairo_create(home.cairo_surface); - - // Initialize apps - init_apps(&home); - - // Initial draw - redraw(&home); - - printf("Q20 Home Screen started\n"); - printf("Use arrow keys to navigate, Enter to launch apps\n"); - - // Main event loop - while (1) { - wl_display_dispatch(home.display); - - // Handle keyboard input (simplified for now) - // TODO: Add proper Wayland keyboard input handling - - usleep(100000); // 100ms - } - - // Cleanup - cairo_destroy(home.cairo); - cairo_surface_destroy(home.cairo_surface); - wl_display_disconnect(home.display); - - return 0; -} \ No newline at end of file diff --git a/ui/compositor/q20-compositor.c b/ui/compositor/q20-compositor.c deleted file mode 100644 index ff0f864..0000000 --- a/ui/compositor/q20-compositor.c +++ /dev/null @@ -1,361 +0,0 @@ -/* - * Q20 Wayland Compositor - * BlackBerry Classic Q20 Display Server - * - * A lightweight Wayland compositor optimized for the Q20's - * 720x720 square display and keyboard navigation. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -struct q20_server { - struct wl_display *wl_display; - struct wlr_backend *backend; - struct wlr_renderer *renderer; - struct wlr_compositor *compositor; - struct wlr_seat *seat; - struct wlr_output *output; - struct wlr_xdg_shell *xdg_shell; - - struct wl_listener new_output; - struct wl_listener new_input; - struct wl_listener new_xdg_surface; - - struct wl_list views; - struct wl_list keyboards; - - struct wlr_view *focused_view; - struct wlr_keyboard *focused_keyboard; -}; - -struct q20_view { - struct wl_list link; - struct q20_server *server; - struct wlr_xdg_surface *xdg_surface; - struct wl_listener map; - struct wl_listener unmap; - struct wl_listener destroy; - struct wl_listener request_move; - struct wl_listener request_resize; - struct wl_listener request_maximize; - struct wl_listener request_fullscreen; - - int x, y; - bool maximized; - bool fullscreen; -}; - -struct q20_keyboard { - struct wl_list link; - struct q20_server *server; - struct wlr_input_device *device; - struct wl_listener key; - struct wl_listener modifiers; - struct wl_listener destroy; - - struct xkb_state *xkb_state; - xkb_keycode_t repeat_keycode; - uint32_t repeat_time; - struct wl_event_source *repeat_source; -}; - -static void focus_view(struct q20_server *server, struct q20_view *view) { - if (server->focused_view == view) { - return; - } - - if (server->focused_view) { - struct wlr_xdg_surface *previous_surface = server->focused_view->xdg_surface; - wlr_xdg_toplevel_set_activated(previous_surface, false); - } - - server->focused_view = view; - - if (view) { - wlr_xdg_toplevel_set_activated(view->xdg_surface, true); - wlr_seat_keyboard_notify_enter(server->seat, view->xdg_surface->surface, - NULL, 0, NULL); - } -} - -static void keyboard_key_notify(struct wl_listener *listener, void *data) { - struct q20_keyboard *keyboard = wl_container_of(listener, keyboard, key); - struct q20_server *server = keyboard->server; - struct wlr_event_keyboard_key *event = data; - struct wlr_seat *seat = server->seat; - - // Get the keycode and translate it to a keysym - xkb_keycode_t keycode = event->keycode + 8; - xkb_keysym_t sym = xkb_state_key_get_one_sym(keyboard->xkb_state, keycode); - - // Handle Q20-specific key combinations - if (event->state == WL_KEYBOARD_KEY_STATE_PRESSED) { - switch (sym) { - case XKB_KEY_Escape: - // Exit compositor - wl_display_terminate(server->wl_display); - break; - case XKB_KEY_F1: - // Switch to next view - // TODO: Implement view switching - break; - case XKB_KEY_F2: - // Toggle maximize - if (server->focused_view) { - server->focused_view->maximized = !server->focused_view->maximized; - if (server->focused_view->maximized) { - wlr_xdg_toplevel_set_maximized(server->focused_view->xdg_surface, true); - } else { - wlr_xdg_toplevel_set_maximized(server->focused_view->xdg_surface, false); - } - } - break; - case XKB_KEY_F3: - // Toggle fullscreen - if (server->focused_view) { - server->focused_view->fullscreen = !server->focused_view->fullscreen; - if (server->focused_view->fullscreen) { - wlr_xdg_toplevel_set_fullscreen(server->focused_view->xdg_surface, true); - } else { - wlr_xdg_toplevel_set_fullscreen(server->focused_view->xdg_surface, false); - } - } - break; - } - } - - wlr_seat_keyboard_notify_key(seat, event->time_msec, event->keycode, event->state); -} - -static void keyboard_modifiers_notify(struct wl_listener *listener, void *data) { - struct q20_keyboard *keyboard = wl_container_of(listener, keyboard, modifiers); - struct q20_server *server = keyboard->server; - - wlr_seat_keyboard_notify_modifiers(server->seat, &keyboard->device->keyboard->modifiers); -} - -static void keyboard_destroy_notify(struct wl_listener *listener, void *data) { - struct q20_keyboard *keyboard = wl_container_of(listener, keyboard, destroy); - - wl_list_remove(&keyboard->link); - free(keyboard); -} - -static void server_new_keyboard(struct q20_server *server, struct wlr_input_device *device) { - struct q20_keyboard *keyboard = calloc(1, sizeof(struct q20_keyboard)); - keyboard->server = server; - keyboard->device = device; - - // Get the keymap - struct xkb_context *context = xkb_context_new(XKB_CONTEXT_NO_FLAGS); - struct xkb_keymap *keymap = xkb_keymap_new_from_names(context, NULL, XKB_KEYMAP_COMPILE_NO_FLAGS); - - keyboard->xkb_state = xkb_state_new(keymap); - xkb_keymap_unref(keymap); - xkb_context_unref(context); - - wlr_keyboard_set_keymap(device->keyboard, keymap); - wlr_keyboard_set_repeat_info(device->keyboard, 25, 600); - - keyboard->key.notify = keyboard_key_notify; - wl_signal_add(&device->keyboard->events.key, &keyboard->key); - - keyboard->modifiers.notify = keyboard_modifiers_notify; - wl_signal_add(&device->keyboard->events.modifiers, &keyboard->modifiers); - - keyboard->destroy.notify = keyboard_destroy_notify; - wl_signal_add(&device->events.destroy, &keyboard->destroy); - - wl_list_insert(&server->keyboards, &keyboard->link); - - // Set this keyboard as the current one - wlr_seat_set_keyboard(server->seat, device); -} - -static void server_new_input_notify(struct wl_listener *listener, void *data) { - struct q20_server *server = wl_container_of(listener, server, new_input); - struct wlr_input_device *device = data; - - switch (device->type) { - case WLR_INPUT_DEVICE_KEYBOARD: - server_new_keyboard(server, device); - break; - default: - break; - } -} - -static void view_map_notify(struct wl_listener *listener, void *data) { - struct q20_view *view = wl_container_of(listener, view, map); - struct q20_server *server = view->server; - - // Center the view on the 720x720 display - view->x = (720 - view->xdg_surface->surface->current.width) / 2; - view->y = (720 - view->xdg_surface->surface->current.height) / 2; - - focus_view(server, view); -} - -static void view_unmap_notify(struct wl_listener *listener, void *data) { - struct q20_view *view = wl_container_of(listener, view, unmap); - struct q20_server *server = view->server; - - if (server->focused_view == view) { - focus_view(server, NULL); - } -} - -static void view_destroy_notify(struct wl_listener *listener, void *data) { - struct q20_view *view = wl_container_of(listener, view, destroy); - - wl_list_remove(&view->link); - free(view); -} - -static void server_new_xdg_surface_notify(struct wl_listener *listener, void *data) { - struct q20_server *server = wl_container_of(listener, server, new_xdg_surface); - struct wlr_xdg_surface *xdg_surface = data; - - if (xdg_surface->role != WLR_XDG_SURFACE_ROLE_TOPLEVEL) { - return; - } - - struct q20_view *view = calloc(1, sizeof(struct q20_view)); - view->server = server; - view->xdg_surface = xdg_surface; - - view->map.notify = view_map_notify; - wl_signal_add(&xdg_surface->events.map, &view->map); - - view->unmap.notify = view_unmap_notify; - wl_signal_add(&xdg_surface->events.unmap, &view->unmap); - - view->destroy.notify = view_destroy_notify; - wl_signal_add(&xdg_surface->events.destroy, &view->destroy); - - wl_list_insert(&server->views, &view->link); -} - -static void output_frame_notify(struct wl_listener *listener, void *data) { - struct q20_server *server = wl_container_of(listener, server, output_frame); - struct wlr_output *output = data; - struct wlr_renderer *renderer = server->renderer; - - struct timespec now; - clock_gettime(CLOCK_MONOTONIC, &now); - - wlr_output_make_current(output, NULL); - wlr_renderer_begin(renderer, output->width, output->height); - - float color[4] = {0.1f, 0.1f, 0.1f, 1.0f}; - wlr_renderer_clear(renderer, color); - - // Render all views - struct q20_view *view; - wl_list_for_each_reverse(view, &server->views, link) { - if (!view->xdg_surface->mapped) { - continue; - } - - struct wlr_box box = { - .x = view->x, - .y = view->y, - .width = view->xdg_surface->surface->current.width, - .height = view->xdg_surface->surface->current.height, - }; - - wlr_renderer_scissor(renderer, &box); - wlr_render_texture(renderer, view->xdg_surface->surface->texture, output->transform_matrix, box.x, box.y, 1.0f); - } - - wlr_renderer_scissor(renderer, NULL); - wlr_renderer_end(renderer); - - wlr_output_swap_buffers(output, NULL, NULL); -} - -static void server_new_output_notify(struct wl_listener *listener, void *data) { - struct q20_server *server = wl_container_of(listener, server, new_output); - struct wlr_output *output = data; - - if (!wl_list_empty(&output->modes)) { - struct wlr_output_mode *mode = wl_container_of(output->modes.prev, mode, link); - wlr_output_set_mode(output, mode); - } - - // Configure for Q20's 720x720 display - wlr_output_set_custom_mode(output, 720, 720, 60000); - - wlr_output_create_global(output); - - server->output = output; - - output->frame.notify = output_frame_notify; - wl_signal_add(&output->events.frame, &output->frame); -} - -int main(int argc, char *argv[]) { - wlr_log_init(WLR_DEBUG, NULL); - - struct q20_server server = {0}; - - server.wl_display = wl_display_create(); - server.backend = wlr_backend_autocreate(server.wl_display); - server.renderer = wlr_renderer_autocreate(server.backend); - wlr_renderer_init_wl_display(server.renderer, server.wl_display); - - server.compositor = wlr_compositor_create(server.wl_display, server.renderer); - wlr_export_dmabuf_manager_v1_create(server.wl_display); - wlr_screencopy_manager_v1_create(server.wl_display); - wlr_data_device_manager_create(server.wl_display); - - server.seat = wlr_seat_create(server.wl_display, "seat0"); - - server.xdg_shell = wlr_xdg_shell_create(server.wl_display); - server.new_xdg_surface.notify = server_new_xdg_surface_notify; - wl_signal_add(&server.xdg_shell->events.new_surface, &server.new_xdg_surface); - - wl_list_init(&server.views); - wl_list_init(&server.keyboards); - - server.new_output.notify = server_new_output_notify; - wl_signal_add(&server.backend->events.new_output, &server.new_output); - - server.new_input.notify = server_new_input_notify; - wl_signal_add(&server.backend->events.new_input, &server.new_input); - - const char *socket = wl_display_add_socket_auto(server.wl_display); - if (!socket) { - wlr_backend_destroy(server.backend); - return 1; - } - - if (!wlr_backend_start(server.backend)) { - wlr_backend_destroy(server.backend); - wl_display_destroy(server.wl_display); - return 1; - } - - setenv("WAYLAND_DISPLAY", socket, true); - wlr_log(WLR_INFO, "Running Q20 compositor on WAYLAND_DISPLAY=%s", socket); - - wl_display_run(server.wl_display); - - wl_display_destroy(server.wl_display); - return 0; -} \ No newline at end of file