mirror of
https://github.com/WerWolv/ImHex.git
synced 2026-04-02 05:27:41 -05:00
impr: Restore native macOS title bar double click gesture in borderless mode (#1689)
### Problem description #### Problem 1 In borderless mode ImHex disables the standard macOS titlebar rendering and input processing. As a result double clicking the titlebar does not trigger the native macOS behavior set in `System Settings -> Desktop & Dock -> Double-click a window's title bar to [Zoom/Minimize/Do nothing]`. #### Problem 2 The ImHex window shows up as blank/transparent when de-minimizing it from the dock. #### Problem 3 Widgets experience ghost hover inputs from the past position of the cursor during live resizing. ### Implementation description ImGui elements consume input events in the order they are drawn. As a result by "drawing" an `InvisibleButton` over the content area of the titlebar we can catch unprocessed clicks in the titlebar area. Connecting this button's double clicks to the native window is then a trivial endeavour. The blank windows was caused by the rendering stack clearing the GL buffer, but proceeding to draw nothing in it. I have short circuited this path. Ghost hover inputs were squelched by consistently moving the ImGui cursor to `0, 0` during a live resize. The OS will dispatch a cursor positioning event once the resizing ends, restoring normal behavior. ### Screenshots N/A ### Additional things N/A --------- Co-authored-by: Nik <werwolv98@gmail.com>
This commit is contained in:
@@ -88,6 +88,36 @@
|
||||
CFRelease(fontDescriptors);
|
||||
}
|
||||
|
||||
void macosHandleTitlebarDoubleClickGesture(GLFWwindow *window) {
|
||||
NSWindow* cocoaWindow = glfwGetCocoaWindow(window);
|
||||
|
||||
// Consult user preferences: "System Settings -> Desktop & Dock -> Double-click a window's title bar to"
|
||||
NSString* action = [[NSUserDefaults standardUserDefaults] stringForKey:@"AppleActionOnDoubleClick"];
|
||||
|
||||
if (action == nil || [action isEqualToString:@"None"]) {
|
||||
// Nothing to do
|
||||
} else if ([action isEqualToString:@"Minimize"]) {
|
||||
if ([cocoaWindow isMiniaturizable]) {
|
||||
[cocoaWindow miniaturize:nil];
|
||||
}
|
||||
} else if ([action isEqualToString:@"Maximize"]) {
|
||||
// `[NSWindow zoom:_ sender]` takes over pumping the main runloop for the duration of the resize,
|
||||
// and would interfere with our renderer's frame logic. Schedule it for the next frame
|
||||
|
||||
CFRunLoopPerformBlock(CFRunLoopGetMain(), kCFRunLoopCommonModes, ^{
|
||||
if ([cocoaWindow isZoomable]) {
|
||||
[cocoaWindow zoom:nil];
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
bool macosIsWindowBeingResizedByUser(GLFWwindow *window) {
|
||||
NSWindow* cocoaWindow = glfwGetCocoaWindow(window);
|
||||
|
||||
return cocoaWindow.inLiveResize;
|
||||
}
|
||||
|
||||
@interface HexDocument : NSDocument
|
||||
|
||||
@end
|
||||
|
||||
Reference in New Issue
Block a user