diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index 857907b35e..b37d7d7c2a 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -18,7 +18,7 @@ jobs:
- name: Install system dependencies
run: |
sudo apt-get update
- sudo apt-get install -y libgl1-mesa-dev libglu1-mesa-dev g++-multilib gcc-multilib libasound2-dev libx11-dev libxext-dev libxi-dev libxrandr-dev libxinerama-dev libpulse-dev libmbedtls-dev libpng-dev libturbojpeg-dev libuv1-dev libvorbis-dev
+ sudo apt-get install -y libgl1-mesa-dev libglu1-mesa-dev g++-multilib gcc-multilib libasound2-dev libx11-dev libxext-dev libxi-dev libxrandr-dev libxinerama-dev libpulse-dev libmbedtls-dev libpng-dev libturbojpeg-dev libuv1-dev libvorbis-dev libvulkan-dev
- uses: krdlab/setup-haxe@v2
with:
@@ -110,7 +110,7 @@ jobs:
run: |
sudo add-apt-repository ppa:haxe/releases -y
sudo apt-get update
- sudo apt-get install -y libgl1-mesa-dev libglu1-mesa-dev libasound2-dev libx11-dev libxext-dev libxi-dev libxrandr-dev libxinerama-dev libpulse-dev libmbedtls-dev libpng-dev libturbojpeg-dev libuv1-dev libvorbis-dev
+ sudo apt-get install -y libgl1-mesa-dev libglu1-mesa-dev libasound2-dev libx11-dev libxext-dev libxi-dev libxrandr-dev libxinerama-dev libpulse-dev libmbedtls-dev libpng-dev libturbojpeg-dev libuv1-dev libvorbis-dev libvulkan-dev
# krdlab/setup-haxe doesn't support arm64 linux
# so this is our workaround for now
@@ -135,10 +135,6 @@ jobs:
haxelib install hxp --quiet
haxelib install utest --quiet
- - name: Enable HXCPP compile cache
- run: |
- echo "HXCPP_COMPILE_CACHE=~/.hxcpp" >> $GITHUB_ENV
-
- name: Rebuild Lime tools
run: |
haxelib dev lime ${{ github.workspace }}
@@ -182,6 +178,59 @@ jobs:
lime create SimpleAudio -verbose -nocolor
lime build SimpleAudio linux -release -verbose -nocolor
+ vulkan-smoke:
+ runs-on: ubuntu-22.04
+ steps:
+
+ - uses: actions/checkout@v6
+ with:
+ submodules: true
+
+ - name: Install system dependencies
+ run: |
+ sudo apt-get update
+ sudo apt-get install -y libgl1-mesa-dev libglu1-mesa-dev libasound2-dev libx11-dev libx11-xcb1 libxext-dev libxi-dev libxrandr-dev libxinerama-dev libpulse-dev libmbedtls-dev libpng-dev libturbojpeg-dev libuv1-dev libvorbis-dev libvulkan-dev mesa-vulkan-drivers xvfb
+
+ - uses: krdlab/setup-haxe@v2
+ with:
+ haxe-version: ${{ env.HAXE_VERSION }}
+
+ - name: Set HAXEPATH
+ run: |
+ echo "HAXEPATH=$HAXE_STD_PATH/.." >> $GITHUB_ENV
+
+ - name: Install Haxe dependencies
+ run: |
+ curl --output ../hxcpp-4.3.45.zip --location https://github.com/HaxeFoundation/hxcpp/releases/download/v4.3.45/hxcpp-4.3.45.zip
+ haxelib --global update haxelib --quiet
+ haxelib install ../hxcpp-4.3.45.zip --quiet
+ haxelib install format --quiet
+ haxelib install hxp --quiet
+ haxelib install utest --quiet
+
+ - name: Rebuild Lime tools
+ run: |
+ haxelib dev lime ${{ github.workspace }}
+ haxelib run lime rebuild tools -nocolor -verbose -nocffi
+ haxelib run lime setup -alias -y -nocffi
+
+ - name: Rebuild Lime (Linux default Vulkan)
+ run: |
+ lime rebuild linux -64 -release -nocolor -verbose -nocffi
+
+ - name: Build Vulkan smoke test app
+ working-directory: tests/vulkan-smoke
+ run: |
+ lime build linux -release -verbose -nocolor
+
+ - name: Run Vulkan smoke test app
+ working-directory: tests/vulkan-smoke
+ run: |
+ if [ -f /usr/share/vulkan/icd.d/lvp_icd.x86_64.json ]; then
+ export VK_ICD_FILENAMES=/usr/share/vulkan/icd.d/lvp_icd.x86_64.json
+ fi
+ SDL_AUDIODRIVER=dummy xvfb-run -a Export/linux/bin/LimeVulkanSmoke
+
macos:
runs-on: macos-14
steps:
@@ -476,6 +525,11 @@ jobs:
run: |
lime create SimpleAudio -verbose -nocolor -eval
lime build SimpleAudio android -release -verbose -nocolor -eval
+
+ - name: Build Vulkan smoke test app
+ working-directory: tests/vulkan-smoke
+ run: |
+ lime build android -release -verbose -nocolor -eval
ios:
runs-on: macos-14
steps:
@@ -536,7 +590,7 @@ jobs:
lime build SimpleAudio ios -release -nosign -verbose -nocolor -eval
package-haxelib:
- needs: [linux, macos, windows, android, ios]
+ needs: [linux, vulkan-smoke, macos, windows, android, ios]
runs-on: ubuntu-22.04
steps:
@@ -728,7 +782,7 @@ jobs:
runs-on: windows-latest
strategy:
matrix:
- haxe-version: [4.0.5, 4.1.5, 4.2.5, 4.3.6]
+ haxe-version: [4.0.5, 4.1.5, 4.2.5, 4.3.7]
steps:
- uses: actions/checkout@v6
@@ -882,7 +936,7 @@ jobs:
runs-on: ubuntu-22.04
strategy:
matrix:
- haxe-version: [3.4.7, 4.0.5, 4.1.5, 4.2.5, 4.3.6]
+ haxe-version: [3.4.7, 4.0.5, 4.1.5, 4.2.5, 4.3.7]
steps:
- uses: actions/checkout@v6
@@ -996,7 +1050,7 @@ jobs:
notify:
runs-on: ubuntu-22.04
- needs: [package-haxelib, docs, android, flash-samples, air-samples, hashlink-samples, hashlinkc-samples, html5-samples, ios, linux, macos, neko-samples, windows]
+ needs: [package-haxelib, docs, android, flash-samples, air-samples, hashlink-samples, hashlinkc-samples, html5-samples, ios, linux, vulkan-smoke, macos, neko-samples, windows]
if: ${{ github.repository == 'openfl/lime' && github.event_name != 'pull_request' }}
steps:
- name: Notify Discord
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 38d456a168..f3ddcb60e1 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,38 @@
Changelog
=========
+8.4.0 (06/18/2026)
+------------------
+
+- Added an experimental Vulkan renderer for native Windows, Linux, and Android targets.
+- Added `VulkanRenderContext` and Haxe Vulkan bindings for instance, device, swapchain, command, descriptor, memory, and pipeline helpers.
+- Added Vulkan bootstrap logging, error details, MSAA resolve support, mapped memory helpers, and descriptor helpers.
+- Added configurable application frame timing with `FrameProfile`, `FrameOptions`, `VSyncMode`, busy-wait, time precision, and uncap controls.
+- Added `AudioInput` and audio input device APIs with native OpenAL, HTML5, and Flash backends.
+- Added SDL_sound decoding and streaming, including inline stream playback, streams with unknown length, and loop counts.
+- Added `Window.alwaysOnTop` and transparent window support.
+- Added input event timestamps without changing listener signatures.
+- Added `Promise.completeAsync()`.
+- Added explicit font rendering flags, DPI-aware glyph rendering, unhinted font decomposition, and HarfBuzz FT font change notifications.
+- Added project.xml support for Android manifest tags and Gradle plugin entries.
+- Added AIR options for Android App Bundles, Android Studio output, and shared runtime deployment.
+- Added VAO support on macOS.
+- Changed asset copying and embedding to behave consistently across targets.
+- Changed OpenAL Soft HRTF to be disabled by default.
+- Updated pixman and platform config for LLVM assembly fixes, ARM NEON, Android NDKs, and Apple platforms.
+- Updated MojoAL and gamepad mappings.
+- Fixed an asset embedding regression.
+- Fixed Windows cpp icon resource handling when no icon is generated.
+- Fixed GL cleanup and desktop GL object collection.
+- Fixed native and HashLink `AudioBuffer` layout mismatches.
+- Fixed `AudioBuffer.fromBytes()` and `AudioBuffer.fromBase64()` on HTML5 to avoid forcing HTML5 audio buffers.
+- Fixed OpenAL output device recovery.
+- Fixed perspective camera matrix calculation.
+- Fixed Tizen `appinfo.json` templating.
+- Fixed Android architecture parsing for `x86_64` and `x86_32`.
+- Fixed SDL_sound ARM64 Linux detection outside Raspberry Pi OS.
+- Fixed HTML5 transparent docs generation.
+
8.3.2 (05/13/2026)
------------------
diff --git a/README.md b/README.md
index c6803fb1a5..167628b285 100644
--- a/README.md
+++ b/README.md
@@ -22,8 +22,13 @@ Lime does not include a renderer, but exposes the current context:
* DOM
* Flash
* GL
+ * Vulkan
The GL context is based upon the WebGL standard, implemented for both OpenGL and OpenGL ES as needed.
+Native Vulkan support exposes an explicit Vulkan API layer for renderer backends, including native window/swapchain integration and resource/command primitives.
+Native Vulkan support is included in standard Windows and Linux C++ Lime builds, including the matching Haxe API define. Apple targets still require an explicit Vulkan-enabled build and MoltenVK packaging.
+To request a Vulkan window, use the standard `RenderContextType.VULKAN` context selection or set `` in project XML.
+The in-repo `tests/vulkan-smoke` project is used as the current Vulkan CI smoke app.
Lime provides a unified audio API, but also provides access to OpenAL for advanced audio on native targets.
diff --git a/docs/ImportAll.hx b/docs/ImportAll.hx
index e0039724f6..d1fbcc89cf 100644
--- a/docs/ImportAll.hx
+++ b/docs/ImportAll.hx
@@ -58,6 +58,41 @@ import lime.graphics.PixelFormat;
import lime.graphics.RenderContext;
import lime.graphics.RenderContextAttributes;
import lime.graphics.RenderContextType;
+import lime.graphics.VulkanRenderContext;
+import lime.graphics.vulkan.VK;
+import lime.graphics.vulkan.VKAcquireResult;
+import lime.graphics.vulkan.VKBuffer;
+import lime.graphics.vulkan.VKCommandBuffer;
+import lime.graphics.vulkan.VKCommandPool;
+import lime.graphics.vulkan.VKDescriptorPool;
+import lime.graphics.vulkan.VKDescriptorPoolSize;
+import lime.graphics.vulkan.VKDescriptorSet;
+import lime.graphics.vulkan.VKDescriptorSetLayout;
+import lime.graphics.vulkan.VKDescriptorSetLayoutBinding;
+import lime.graphics.vulkan.VKDevice;
+import lime.graphics.vulkan.VKDeviceMemory;
+import lime.graphics.vulkan.VKFence;
+import lime.graphics.vulkan.VKFramebuffer;
+import lime.graphics.vulkan.VKGraphicsPipelineInfo;
+import lime.graphics.vulkan.VKImage;
+import lime.graphics.vulkan.VKImageView;
+import lime.graphics.vulkan.VKInstance;
+import lime.graphics.vulkan.VKMemoryRequirements;
+import lime.graphics.vulkan.VKPhysicalDevice;
+import lime.graphics.vulkan.VKPipeline;
+import lime.graphics.vulkan.VKPipelineCache;
+import lime.graphics.vulkan.VKPipelineLayout;
+import lime.graphics.vulkan.VKQueue;
+import lime.graphics.vulkan.VKQueueFamilyInfo;
+import lime.graphics.vulkan.VKRenderPass;
+import lime.graphics.vulkan.VKRenderer;
+import lime.graphics.vulkan.VKSampler;
+import lime.graphics.vulkan.VKSemaphore;
+import lime.graphics.vulkan.VKShaderModule;
+import lime.graphics.vulkan.VKSurface;
+import lime.graphics.vulkan.VKSwapchain;
+import lime.graphics.vulkan.VKVertexAttribute;
+import lime.graphics.vulkan.VKVertexBinding;
import lime.graphics.WebGL2RenderContext;
import lime.graphics.WebGLRenderContext;
import lime.math.ARGB;
@@ -87,6 +122,8 @@ import lime.media.vorbis.VorbisInfo;
import lime.media.AudioBuffer;
import lime.media.AudioContext;
import lime.media.AudioContextType;
+import lime.media.AudioInput;
+import lime.media.AudioInputDevice;
import lime.media.AudioManager;
import lime.media.AudioSource;
import lime.media.FlashAudioContext;
diff --git a/include.xml b/include.xml
index 04f641e3c6..e38f58019f 100644
--- a/include.xml
+++ b/include.xml
@@ -24,6 +24,8 @@
+
+
diff --git a/project/Build.xml b/project/Build.xml
index ef9bc7458d..84ef070811 100755
--- a/project/Build.xml
+++ b/project/Build.xml
@@ -35,10 +35,13 @@
+
+
+
@@ -59,6 +62,10 @@
+
+
+
+
@@ -236,6 +243,7 @@
+
@@ -270,6 +278,7 @@
+
diff --git a/project/include/graphics/vulkan/VKRenderer.h b/project/include/graphics/vulkan/VKRenderer.h
new file mode 100644
index 0000000000..ae2b0b8f69
--- /dev/null
+++ b/project/include/graphics/vulkan/VKRenderer.h
@@ -0,0 +1,160 @@
+#ifndef LIME_GRAPHICS_VULKAN_VKRENDERER_H
+#define LIME_GRAPHICS_VULKAN_VKRENDERER_H
+
+#include
+#include
+#include
+#include
+#include
+
+
+namespace lime {
+
+
+ class VulkanRenderer {
+
+ public:
+
+ explicit VulkanRenderer (Window* window);
+ ~VulkanRenderer ();
+
+ bool ClearOverlay ();
+ bool Create (const char* applicationName);
+ void Destroy ();
+ bool Render (float red, float green, float blue, float alpha);
+ bool Resize ();
+ bool SetOverlay (const unsigned char* data, int width, int height, int x, int y);
+
+ inline const std::string& GetInfo () const { return info; }
+ inline const std::string& GetLastError () const { return lastError; }
+
+ private:
+
+ bool CreateCommandBuffers ();
+ bool CreateCommandPool ();
+ bool CreateDevice ();
+ bool CreateFramebuffers ();
+ bool CreateImageViews ();
+ bool CreateInstance (const char* applicationName);
+ bool CreateOverlayBuffer (size_t requiredSize);
+ bool CreateRenderPass ();
+ bool CreateSurface ();
+ bool CreateSwapchain ();
+ bool CreateSwapchainResources ();
+ bool CreateSyncObjects ();
+ void DestroyOverlayResources ();
+ void DestroySwapchainResources ();
+ uint32_t FindMemoryType (uint32_t typeFilter, VkMemoryPropertyFlags properties);
+ bool LoadDeviceProcs ();
+ bool LoadGlobalProcs ();
+ bool LoadInstanceProcs ();
+ bool PickPhysicalDevice ();
+ bool RecordCommandBuffer (uint32_t imageIndex, float red, float green, float blue, float alpha);
+ bool RecreateSwapchain ();
+ void SetError (const std::string& value);
+
+ Window* window;
+ std::string info;
+ std::string lastError;
+
+ PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr;
+ PFN_vkGetDeviceProcAddr vkGetDeviceProcAddr;
+ PFN_vkAllocateMemory vkAllocateMemory;
+ PFN_vkBindBufferMemory vkBindBufferMemory;
+ PFN_vkCmdCopyBufferToImage vkCmdCopyBufferToImage;
+ PFN_vkCmdPipelineBarrier vkCmdPipelineBarrier;
+ PFN_vkCreateBuffer vkCreateBuffer;
+ PFN_vkCreateDevice vkCreateDevice;
+ PFN_vkCreateFence vkCreateFence;
+ PFN_vkCreateFramebuffer vkCreateFramebuffer;
+ PFN_vkCreateImageView vkCreateImageView;
+ PFN_vkCreateInstance vkCreateInstance;
+ PFN_vkCreateRenderPass vkCreateRenderPass;
+ PFN_vkCreateSemaphore vkCreateSemaphore;
+ PFN_vkCreateSwapchainKHR vkCreateSwapchainKHR;
+ PFN_vkCreateCommandPool vkCreateCommandPool;
+ PFN_vkAllocateCommandBuffers vkAllocateCommandBuffers;
+ PFN_vkAcquireNextImageKHR vkAcquireNextImageKHR;
+ PFN_vkBeginCommandBuffer vkBeginCommandBuffer;
+ PFN_vkCmdBeginRenderPass vkCmdBeginRenderPass;
+ PFN_vkCmdEndRenderPass vkCmdEndRenderPass;
+ PFN_vkDestroyCommandPool vkDestroyCommandPool;
+ PFN_vkDestroyBuffer vkDestroyBuffer;
+ PFN_vkDestroyDevice vkDestroyDevice;
+ PFN_vkDestroyFence vkDestroyFence;
+ PFN_vkDestroyFramebuffer vkDestroyFramebuffer;
+ PFN_vkDestroyImageView vkDestroyImageView;
+ PFN_vkDestroyInstance vkDestroyInstance;
+ PFN_vkDestroyRenderPass vkDestroyRenderPass;
+ PFN_vkDestroySemaphore vkDestroySemaphore;
+ PFN_vkDestroySurfaceKHR vkDestroySurfaceKHR;
+ PFN_vkDestroySwapchainKHR vkDestroySwapchainKHR;
+ PFN_vkDeviceWaitIdle vkDeviceWaitIdle;
+ PFN_vkEndCommandBuffer vkEndCommandBuffer;
+ PFN_vkEnumerateDeviceExtensionProperties vkEnumerateDeviceExtensionProperties;
+ PFN_vkFreeMemory vkFreeMemory;
+ PFN_vkGetBufferMemoryRequirements vkGetBufferMemoryRequirements;
+ PFN_vkEnumerateInstanceExtensionProperties vkEnumerateInstanceExtensionProperties;
+ PFN_vkEnumerateInstanceVersion vkEnumerateInstanceVersion;
+ PFN_vkEnumeratePhysicalDevices vkEnumeratePhysicalDevices;
+ PFN_vkGetDeviceQueue vkGetDeviceQueue;
+ PFN_vkGetPhysicalDeviceMemoryProperties vkGetPhysicalDeviceMemoryProperties;
+ PFN_vkGetPhysicalDeviceProperties vkGetPhysicalDeviceProperties;
+ PFN_vkGetPhysicalDeviceQueueFamilyProperties vkGetPhysicalDeviceQueueFamilyProperties;
+ PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR vkGetPhysicalDeviceSurfaceCapabilitiesKHR;
+ PFN_vkGetPhysicalDeviceSurfaceFormatsKHR vkGetPhysicalDeviceSurfaceFormatsKHR;
+ PFN_vkGetPhysicalDeviceSurfacePresentModesKHR vkGetPhysicalDeviceSurfacePresentModesKHR;
+ PFN_vkGetPhysicalDeviceSurfaceSupportKHR vkGetPhysicalDeviceSurfaceSupportKHR;
+ PFN_vkGetSwapchainImagesKHR vkGetSwapchainImagesKHR;
+ PFN_vkMapMemory vkMapMemory;
+ PFN_vkQueuePresentKHR vkQueuePresentKHR;
+ PFN_vkQueueSubmit vkQueueSubmit;
+ PFN_vkResetCommandPool vkResetCommandPool;
+ PFN_vkResetFences vkResetFences;
+ PFN_vkUnmapMemory vkUnmapMemory;
+ PFN_vkWaitForFences vkWaitForFences;
+
+ VkInstance instance;
+ VkSurfaceKHR surface;
+ VkPhysicalDevice physicalDevice;
+ VkPhysicalDeviceProperties physicalDeviceProperties;
+ VkDevice device;
+ VkQueue queue;
+ uint32_t queueFamilyIndex;
+ VkSwapchainKHR swapchain;
+ VkFormat swapchainFormat;
+ VkPresentModeKHR swapchainPresentMode;
+ int requestedVSyncMode;
+ VkExtent2D swapchainExtent;
+ VkRenderPass renderPass;
+ VkCommandPool commandPool;
+ VkSemaphore imageAvailableSemaphore;
+ VkSemaphore renderFinishedSemaphore;
+ VkFence inFlightFence;
+ VkBuffer overlayBuffer;
+ VkDeviceMemory overlayBufferMemory;
+ bool portabilityEnumerationSupported;
+ bool portabilitySubsetSupported;
+ bool swapchainDirty;
+ size_t overlayBufferCapacity;
+ unsigned char* overlayMappedData;
+ uint32_t overlayWidth;
+ uint32_t overlayHeight;
+ int overlayX;
+ int overlayY;
+ bool overlayEnabled;
+
+ std::vector instanceExtensions;
+ std::vector deviceExtensions;
+ std::vector swapchainImages;
+ std::vector swapchainImageViews;
+ std::vector framebuffers;
+ std::vector commandBuffers;
+
+ };
+
+
+}
+
+
+#endif
diff --git a/project/include/media/AudioBuffer.h b/project/include/media/AudioBuffer.h
index 5f9a8130e0..5cd3e476d9 100644
--- a/project/include/media/AudioBuffer.h
+++ b/project/include/media/AudioBuffer.h
@@ -40,6 +40,7 @@ namespace lime {
vdynamic* __srcAudio;
vdynamic* __srcBuffer;
+ int __srcBufferContext;
vdynamic* __srcCustom;
vdynamic* __srcHowl;
bool __isDisposed;
@@ -63,4 +64,4 @@ namespace lime {
}
-#endif
\ No newline at end of file
+#endif
diff --git a/project/include/ui/FileDialog.h b/project/include/ui/FileDialog.h
index 4a310b3198..1adf918f7b 100644
--- a/project/include/ui/FileDialog.h
+++ b/project/include/ui/FileDialog.h
@@ -9,14 +9,36 @@
namespace lime {
+ // Functions in this class return pointers to externally owned memory, which will be reused automatically
+ // for future dialogs and should not be freed.
class FileDialog {
public:
- static std::wstring* OpenDirectory (std::wstring* title = 0, std::wstring* filter = 0, std::wstring* defaultPath = 0);
- static std::wstring* OpenFile (std::wstring* title = 0, std::wstring* filter = 0, std::wstring* defaultPath = 0);
- static void OpenFiles (std::vector* files, std::wstring* title = 0, std::wstring* filter = 0, std::wstring* defaultPath = 0);
- static std::wstring* SaveFile (std::wstring* title = 0, std::wstring* filter = 0, std::wstring* defaultPath = 0);
+#ifdef HX_WINDOWS
+ using char_t = wchar_t;
+#else
+ using char_t = char;
+#endif
+
+ static const char_t* OpenDirectory(const char_t* title = nullptr, const char_t* filter = nullptr, const char_t* defaultPath = nullptr);
+ static const char_t* OpenFile(const char_t* title = nullptr, const char_t* filter = nullptr, const char_t* defaultPath = nullptr);
+
+ // Use actual string view once we can use c++17
+ class string_view {
+ public:
+ string_view(const char_t* c_str, size_t length) : c_str(c_str), length(length) {}
+
+ const char_t* data() const { return c_str; }
+ size_t size() const { return length; }
+
+ private:
+ const char_t* c_str;
+ size_t length;
+ };
+
+ static std::vector OpenFiles(const char_t* title = nullptr, const char_t* filter = nullptr, const char_t* defaultPath = nullptr);
+ static const char_t* SaveFile(const char_t* title = nullptr, const char_t* filter = nullptr, const char_t* defaultPath = nullptr);
};
@@ -24,4 +46,4 @@ namespace lime {
}
-#endif
\ No newline at end of file
+#endif
diff --git a/project/include/ui/GamepadEvent.h b/project/include/ui/GamepadEvent.h
index 607ef9cfc8..5543da20c2 100644
--- a/project/include/ui/GamepadEvent.h
+++ b/project/include/ui/GamepadEvent.h
@@ -28,6 +28,7 @@ namespace lime {
int id;
GamepadEventType type;
double axisValue;
+ int timestamp;
static ValuePointer* callback;
static ValuePointer* eventObject;
@@ -42,4 +43,4 @@ namespace lime {
}
-#endif
\ No newline at end of file
+#endif
diff --git a/project/include/ui/KeyEvent.h b/project/include/ui/KeyEvent.h
index 28e6fcc6fd..8d5ac047c0 100644
--- a/project/include/ui/KeyEvent.h
+++ b/project/include/ui/KeyEvent.h
@@ -25,6 +25,7 @@ namespace lime {
int modifier;
KeyEventType type;
int windowID;
+ int timestamp;
static ValuePointer* callback;
static ValuePointer* eventObject;
@@ -39,4 +40,4 @@ namespace lime {
}
-#endif
\ No newline at end of file
+#endif
diff --git a/project/include/ui/Window.h b/project/include/ui/Window.h
index 04321be0b2..81afa74fae 100644
--- a/project/include/ui/Window.h
+++ b/project/include/ui/Window.h
@@ -11,8 +11,13 @@
#include