node-mac-recorder 2.10.7 → 2.10.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "node-mac-recorder",
3
- "version": "2.10.7",
3
+ "version": "2.10.9",
4
4
  "description": "Native macOS screen recording package for Node.js applications",
5
5
  "main": "index.js",
6
6
  "keywords": [
@@ -77,20 +77,20 @@ void updateScreenOverlays();
77
77
 
78
78
  - (void)updateAppearance {
79
79
  if (self.isToggled) {
80
- // Toggled window: same background, thick border
80
+ // Toggled window: same background, thick border with darker version of fill color
81
81
  self.layer.backgroundColor = [[NSColor colorWithRed:0.6 green:0.4 blue:0.9 alpha:0.4] CGColor];
82
- self.layer.borderColor = [[NSColor whiteColor] CGColor];
82
+ self.layer.borderColor = [[NSColor colorWithRed:0.45 green:0.25 blue:0.75 alpha:0.9] CGColor]; // Darker purple
83
83
  self.layer.borderWidth = 3.0;
84
84
  } else if (self.isActiveWindow) {
85
- // Active window: brighter background, no border
85
+ // Active window: brighter background, thin white border
86
86
  self.layer.backgroundColor = [[NSColor colorWithRed:0.6 green:0.4 blue:0.9 alpha:0.4] CGColor];
87
- self.layer.borderColor = [[NSColor clearColor] CGColor];
88
- self.layer.borderWidth = 0.0;
87
+ self.layer.borderColor = [[NSColor whiteColor] CGColor];
88
+ self.layer.borderWidth = 1.0;
89
89
  } else {
90
- // Inactive window: dimmer background, no border
90
+ // Inactive window: dimmer background, thin white border
91
91
  self.layer.backgroundColor = [[NSColor colorWithRed:0.4 green:0.2 blue:0.6 alpha:0.25] CGColor];
92
- self.layer.borderColor = [[NSColor clearColor] CGColor];
93
- self.layer.borderWidth = 0.0;
92
+ self.layer.borderColor = [[NSColor whiteColor] CGColor];
93
+ self.layer.borderWidth = 1.0;
94
94
  }
95
95
 
96
96
  self.layer.cornerRadius = 8.0;
@@ -494,25 +494,47 @@ void updateOverlay() {
494
494
  // Find window under cursor
495
495
  NSDictionary *windowUnderCursor = getWindowUnderCursor(globalPoint);
496
496
 
497
- if (windowUnderCursor && ![windowUnderCursor isEqualToDictionary:g_currentWindowUnderCursor]) {
498
- // If there's a toggled window, don't switch to a different window
499
- if (g_hasToggledWindow && g_currentWindowUnderCursor) {
500
- // Check if current toggled window is different from window under cursor
501
- BOOL isSameWindow = [[g_currentWindowUnderCursor objectForKey:@"id"] isEqual:[windowUnderCursor objectForKey:@"id"]];
502
- if (!isSameWindow) {
503
- NSLog(@"🔒 BLOCKED: Not switching overlay - current window is toggled");
504
- return; // Don't update overlay for different window
505
- }
497
+ // Decide which window to track (cursor or toggled)
498
+ NSDictionary *targetWindow = nil;
499
+
500
+ if (g_hasToggledWindow && g_currentWindowUnderCursor) {
501
+ // Use current toggled window, but get fresh position data
502
+ int windowId = [[g_currentWindowUnderCursor objectForKey:@"id"] intValue];
503
+ NSArray *allWindows = getAllSelectableWindows();
504
+ targetWindow = allWindows != nil ?
505
+ [[allWindows filteredArrayUsingPredicate:
506
+ [NSPredicate predicateWithFormat:@"id == %d", windowId]] firstObject] : nil;
507
+
508
+ if (!targetWindow) {
509
+ NSLog(@"⚠️ Toggled window no longer exists - resetting toggle");
510
+ g_hasToggledWindow = false;
511
+ targetWindow = windowUnderCursor;
512
+ }
513
+ } else {
514
+ targetWindow = windowUnderCursor;
515
+ }
516
+
517
+ if (targetWindow) {
518
+ // Update current window if different or if we need fresh position data
519
+ BOOL shouldUpdate = !g_currentWindowUnderCursor ||
520
+ ![targetWindow isEqualToDictionary:g_currentWindowUnderCursor] ||
521
+ g_hasToggledWindow; // Always update position for toggled windows
522
+
523
+ if (shouldUpdate && !g_hasToggledWindow) {
524
+ // Only switch windows if not toggled
525
+ [g_currentWindowUnderCursor release];
526
+ g_currentWindowUnderCursor = [targetWindow retain];
527
+ } else if (g_hasToggledWindow) {
528
+ // Update position data for toggled window
529
+ [g_currentWindowUnderCursor release];
530
+ g_currentWindowUnderCursor = [targetWindow retain];
506
531
  }
507
- // Update current window
508
- [g_currentWindowUnderCursor release];
509
- g_currentWindowUnderCursor = [windowUnderCursor retain];
510
532
 
511
- // Update overlay position and size
512
- int x = [[windowUnderCursor objectForKey:@"x"] intValue];
513
- int y = [[windowUnderCursor objectForKey:@"y"] intValue];
514
- int width = [[windowUnderCursor objectForKey:@"width"] intValue];
515
- int height = [[windowUnderCursor objectForKey:@"height"] intValue];
533
+ // Update overlay position and size with fresh data
534
+ int x = [[targetWindow objectForKey:@"x"] intValue];
535
+ int y = [[targetWindow objectForKey:@"y"] intValue];
536
+ int width = [[targetWindow objectForKey:@"width"] intValue];
537
+ int height = [[targetWindow objectForKey:@"height"] intValue];
516
538
 
517
539
  // Find which screen contains the window center
518
540
  NSArray *screens = [NSScreen screens];
@@ -548,8 +570,8 @@ void updateOverlay() {
548
570
  // Only convert Y from top-left to bottom-left coordinate system
549
571
  NSRect overlayFrame = NSMakeRect(x, adjustedY, width, height);
550
572
 
551
- NSString *windowTitle = [windowUnderCursor objectForKey:@"title"] ?: @"Untitled";
552
- NSString *appName = [windowUnderCursor objectForKey:@"appName"] ?: @"Unknown";
573
+ NSString *windowTitle = [targetWindow objectForKey:@"title"] ?: @"Untitled";
574
+ NSString *appName = [targetWindow objectForKey:@"appName"] ?: @"Unknown";
553
575
 
554
576
  NSLog(@"🎯 WINDOW DETECTED: %@ - \"%@\"", appName, windowTitle);
555
577
  NSLog(@" 📍 Position: (%d, %d) 📏 Size: %d × %d", x, y, width, height);
@@ -560,7 +582,7 @@ void updateOverlay() {
560
582
 
561
583
  // Bring window to front if enabled
562
584
  if (g_bringToFrontEnabled) {
563
- int windowId = [[windowUnderCursor objectForKey:@"id"] intValue];
585
+ int windowId = [[targetWindow objectForKey:@"id"] intValue];
564
586
  if (windowId > 0) {
565
587
  bool success = bringWindowToFront(windowId);
566
588
  if (!success) {
@@ -572,10 +594,14 @@ void updateOverlay() {
572
594
  // Ensure overlay is on the correct screen
573
595
  [g_overlayWindow setFrame:overlayFrame display:YES];
574
596
 
575
- // Update overlay view window info and reset toggle state for new window
576
- [(WindowSelectorOverlayView *)g_overlayView setWindowInfo:windowUnderCursor];
577
- [(WindowSelectorOverlayView *)g_overlayView setIsToggled:NO];
578
- g_hasToggledWindow = NO; // Reset global toggle state when switching windows
597
+ // Update overlay view window info
598
+ [(WindowSelectorOverlayView *)g_overlayView setWindowInfo:targetWindow];
599
+
600
+ // Only reset toggle state when switching to a different window (not for position updates)
601
+ if (shouldUpdate && !g_hasToggledWindow) {
602
+ [(WindowSelectorOverlayView *)g_overlayView setIsToggled:NO];
603
+ g_hasToggledWindow = NO; // Reset global toggle state when switching windows
604
+ }
579
605
 
580
606
  // Add/update info label above button
581
607
  NSTextField *infoLabel = nil;
@@ -727,8 +753,11 @@ void updateOverlay() {
727
753
  [g_overlayWindow orderFront:nil];
728
754
  [g_overlayWindow makeKeyAndOrderFront:nil];
729
755
 
730
- // Ensure all subviews have no borders after positioning, but preserve corner radius for buttons and icons
756
+ // Ensure subviews (except overlay view itself) have no borders after positioning
731
757
  for (NSView *subview in [g_overlayWindow.contentView subviews]) {
758
+ // Skip the main overlay view - it handles its own borders
759
+ if ([subview isKindOfClass:[WindowSelectorOverlayView class]]) continue;
760
+
732
761
  if ([subview respondsToSelector:@selector(setWantsLayer:)]) {
733
762
  [subview setWantsLayer:YES];
734
763
  if (subview.layer) {
@@ -745,8 +774,8 @@ void updateOverlay() {
745
774
  NSLog(@" ✅ Overlay Status: Level=%ld, Alpha=%.1f, Visible=%s, Frame Set=YES",
746
775
  [g_overlayWindow level], [g_overlayWindow alphaValue],
747
776
  [g_overlayWindow isVisible] ? "YES" : "NO");
748
- } else if (!windowUnderCursor && g_currentWindowUnderCursor) {
749
- // No window under cursor, hide overlay
777
+ } else if (!targetWindow && g_currentWindowUnderCursor && !g_hasToggledWindow) {
778
+ // No window under cursor and no toggle active, hide overlay
750
779
  NSString *leftWindowTitle = [g_currentWindowUnderCursor objectForKey:@"title"] ?: @"Untitled";
751
780
  NSString *leftAppName = [g_currentWindowUnderCursor objectForKey:@"appName"] ?: @"Unknown";
752
781
 
@@ -1604,8 +1633,11 @@ Napi::Value StartWindowSelection(const Napi::CallbackInfo& info) {
1604
1633
  // Add cancel button to window
1605
1634
  [g_overlayWindow.contentView addSubview:cancelButton];
1606
1635
 
1607
- // Force all subviews to have no borders, but preserve corner radius for buttons and icons
1636
+ // Force subviews (except overlay view itself) to have no borders
1608
1637
  for (NSView *subview in [g_overlayWindow.contentView subviews]) {
1638
+ // Skip the main overlay view - it handles its own borders
1639
+ if ([subview isKindOfClass:[WindowSelectorOverlayView class]]) continue;
1640
+
1609
1641
  if ([subview respondsToSelector:@selector(setWantsLayer:)]) {
1610
1642
  [subview setWantsLayer:YES];
1611
1643
  if (subview.layer) {