💻📱 A cross platform system abstraction library written in C++ for managing windows and performing OS tasks.
A basic cross platform system abstraction library for managing windows and performing OS tasks.
🌟 Simple Window, File Dialog, and Message Dialog Creation
⌨️ 🖱️ 👆 🎮 Basic Input (Keyboard, Mouse, Touch, and Gamepad)
👻 Platform specific features (Mac Transparency, Mobile Accelerometer, etc.)
💊 Unit Tests + Test Coverage (Appveyor for Windows, CircleCI for Android / MacOS / iOS, Travis for Linux/Noop)
😎 Well maintained C++ 11, with a promise to evolve as the standard evolves. (C++ Modules, Package Managers, etc.)
🖼️ Windows (Win32<!--or UWP-->)
🍎 Mac (Cocoa)
📱 iOS (UIKit) (In Progress)
🐧 Linux (XCB<!--, XLib, Mir, or Wayland-->) (In Progress)
🤖 Android (In Progress)
🌐 WebAssembly (In Progress)
❌ Noop (Headless)
First add the repo as a submodule in your dependencies folder such as
external/:
cd external git submodule add https://github.com/alaingalvan/crosswindow.git
Then in your
CMakeLists.txtfile, include the following:
# ⬇ Add your dependency: add_subdirectories(external/crosswindow)❎ When creating your executable use CrossWindow's abstraction function:
xwin_add_executable( # Target ${PROJECT_NAME} # Source Files (make sure to surround in quotations so CMake treats it as a list) "${SOURCE_FILES}" )
🔗 Link CrossWindow to your project:
target_link_libraries( ${PROJECT_NAME} CrossWindow )
Fill out the rest of your
CMakeLists.txtfile with any other source files and dependencies you may have, then in your project root:
# 👷 Make a build folder mkdir build cd build🖼️ To build your Visual Studio solution on Windows x64
cmake .. -A x64
🍎 To build your XCode project On Mac OS for Mac OS
cmake .. -G Xcode
📱 To build your XCode project on Mac OS for iOS / iPad OS / tvOS / watchOS
cmake .. -G Xcode -DCMAKE_SYSTEM_NAME=iOS
🐧 To build your .make file on Linux
cmake ..
🔨 Build on any platform:
cmake --build .
For WebAssembly you'll need to have Emscripten installed. Assuming you have the SDK installed, do the following to build a WebAssembly project:
# 🌐 For WebAssembly Projects mkdir webassembly cd webassembly cmake .. -DXWIN_OS=WASM -DCMAKE_TOOLCHAIN_FILE="$EMSDK/emscripten/1.38.1/cmake/Modules/Platform/Emscripten.cmake" -DCMAKE_BUILD_TYPE=ReleaseRun emconfigure with the normal configure command as an argument.
$EMSDK/emscripten/emconfigure ./configure
Run emmake with the normal make to generate linked LLVM bitcode.
$EMSDK/emscripten/emmake make
Compile the linked bitcode generated by make (project.bc) to JavaScript.
'project.bc' should be replaced with the make output for your project (e.g. 'yourproject.so')
$EMSDK/emscripten/emcc project.bc -o project.js
For more information visit the Emscripten Docs on CMake.
For Android Studio you'll need to make a project, then edit your
build.gradlefile.
// 🤖 To build your Android Studio project android { ... externalNativeBuild { cmake { ... // Use the following syntax when passing arguments to variables: // arguments "-DVAR_NAME=ARGUMENT". arguments "-DXWIN_OS=ANDROID", // The following line passes 'rtti' and 'exceptions' to 'ANDROID_CPP_FEATURES'. "-DANDROID_CPP_FEATURES=rtti exceptions" } } buildTypes {...}// Use this block to link Gradle to your CMake build script. externalNativeBuild { cmake {...} } }
for more information visit Android Studio's docs on CMake.
Then create a main delegate function
void xmain(int argc, const char** argv)in a
.cppfile in your project (for example "
XMain.cpp") where you'll put your application logic:
#include "CrossWindow/CrossWindow.h"void xmain(int argc, const char** argv) { // 🖼️ Create Window Description xwin::WindowDesc windowDesc; windowDesc.name = "Test"; windowDesc.title = "My Title"; windowDesc.visible = true; windowDesc.width = 1280; windowDesc.height = 720;
bool closed = false; // 🌟 Initialize xwin::Window window; xwin::EventQueue eventQueue; if (!window.create(windowDesc, eventQueue)) { return; } // 🏁 Engine loop bool isRunning = true; while (isRunning) { // ♻️ Update the event queue eventQueue.update(); // 🎈 Iterate through that queue: while (!eventQueue.empty()) { const xwin::Event& event = eventQueue.front(); if (event.type == xwin::EventType::Mouse) { const xwin::MouseData mouse = event.data.mouse; } if (event.type == xwin::EventType::Close) { window.close(); isRunning = false; } eventQueue.pop(); } }
}
This
xmainfunction will be called from a platform specific main function that will be included in your main project by CMake. If you ever need to access something from the platform specific main function for whatever reason, you'll find it in
xwin::getXWinState().
For more examples visit the Documentation or try out the examples.
Be sure to have CMake Installed.
| CMake Options | Description | |:-------------:|:-----------:| |
XWIN_TESTS| Whether or not unit tests are enabled. Defaults to
OFF, Can be
ONor
OFF. | |
XWIN_API| The OS API to use for window generation, defaults to
AUTO, can be can be
NOOP,
WIN32<!--,
UWP-->,
COCOA,
UIKIT,
XCB<!--
XLIB,
MIR,
WAYLAND-->,
ANDROID, or
WASM. | |
XWIN_OS| Optional - What Operating System to build for, functions as a quicker way of setting target platforms. Defaults to
AUTO, can be
NOOP,
WINDOWS,
MACOS,
LINUX,
ANDROID,
IOS,
WASM. If your platform supports multiple apis, the final api will be automatically set to CrossWindow defaults (
WIN32on Windows,
XCBon Linux ). If
XWIN_APIis set this option is ignored. |
First install Git, then open any terminal such as Hyper in any folder and type:
# 🐑 Clone the repo git clone https://github.com/alaingalvan/crosswindow.git --recurse-submodules💿 go inside the folder
cd crosswindow
👯 If you forget to
recurse-submodules
you can always run:git submodule update --init
From there we'll need to set up our build files. Be sure to have the following installed:
An IDE such as Visual Studio, XCode, or a compiler such as GCC.
Then type the following in your terminal from the repo folder:
# 👷 Make a build folder mkdir build cd build🖼️ To build your Visual Studio solution on Windows x64
cmake .. -A x64 -DXWIN_TESTS=ON
🍎 To build your XCode project on Mac OS
cmake .. -G Xcode -DXWIN_TESTS=ON
🐧 To build your .make file on Linux
cmake .. -DXWIN_TESTS=ON
🔨 Build on any platform:
cmake --build .
Whenever you add new files to the project, run
cmake ..from your solution/project folder, and if you edit the
CMakeLists.txtfile be sure to delete the generated files and run Cmake again.
[ ] 🚜 XLib / Wayland support for Linux
[ ] ❎ Windows 10 Apps / Window 10 Arm / Xbox One support with Universal Windows Platform (WMP).
[ ] 🍭 Linux flavor OS targets (
XWIN_OScan be
UBUNTU,
DEBIAN,
FEDORA, etc.)
[ ] 🅿️ Playstation support
[ ] 💞 Nintendo support
CrossWindow is licensed as either MIT or Apache-2.0, whichever you would prefer.