[PB Cocoa] Methods, Tips & Tricks

Mac OSX specific forum
User avatar
Shardik
Addict
Addict
Posts: 1984
Joined: Thu Apr 21, 2005 2:38 pm
Location: Germany

Re: [PB Cocoa] Methods, Tips & Tricks

Post by Shardik »

List all Human Interface Devices (HID) currently attached to your Mac (tested on Snow Leopard and Mavericks with PB 5.21 x86 and x64 in both ASCII- and Unicode-mode):

Code: Select all

; Converted from C source code on
; http://atose.org/?page_id=113

EnableExplicit

ImportC "/System/Library/Frameworks/IOKit.framework/IOKit"
  IOHIDDeviceGetProperty(IOHIDDeviceRef.I, KeyStringRef.I)
  IOHIDManagerCopyDevices(IOHIDManagerRef.I)
  IOHIDManagerCreate(CFAllocatorRef.I, IOOptions.I)
  IOHIDManagerOpen(IOHIDManagerRef.I, IOOptions.I)
  IOHIDManagerSetDeviceMatching(IOHIDManagerRef.I, MatchingDictionary.I)
EndImport

ImportC ""
  CFSetGetCount(CFSetRef.I)
  CFSetGetValues(CFSetRef.I, *ValueArray)
  CFStringGetCString(CFStringRef.I, *StringBuffer, BufferSize.I,
    CFStringEncoding.I)
EndImport

Procedure.S ConvertCFStringIntoString(CFString.I)
  Protected String.S = Space(256)

  CFStringGetCString(CFString, @String, Len(String), 0)

  CompilerIf #PB_Compiler_Unicode
    PokeS(@String, PeekS(@String, -1, #PB_Ascii), -1, #PB_Unicode)
  CompilerEndIf

  ProcedureReturn Trim(String)
EndProcedure

Define *DeviceArray
Define DeviceSet.I
Define HIDManager.I
Define i.I
Define Info.S
Define KeyNameRef.I
Define kIOHIDManufacturerKey.S = "Manufacturer"
Define kIOHIDProductKey.S = "Product"
Define NumDevices.I

CompilerIf #PB_Compiler_Unicode
  PokeS(@kIOHIDManufacturerKey, PeekS(@kIOHIDManufacturerKey, -1, #PB_Unicode),
    -1, #PB_Ascii)
  PokeS(@kIOHIDProductKey, PeekS(@kIOHIDProductKey, -1, #PB_Unicode),
    -1, #PB_Ascii)
CompilerEndIf

HIDManager = IOHIDManagerCreate(0, 0)

If HIDManager
  IOHIDManagerSetDeviceMatching(HIDManager, 0)
  IOHIDManagerOpen(HIDManager, 0)
  DeviceSet = IOHIDManagerCopyDevices(HIDManager)
  NumDevices = CFSetGetCount(DeviceSet)
  Info = "Number of devices detected: " + NumDevices

  If NumDevices > 0
    *DeviceArray = AllocateMemory(NumDevices * SizeOf(Integer))
    CFSetGetValues(DeviceSet, *DeviceArray)
      
    For i = 0 To NumDevices - 1
      KeyNameRef = IOHIDDeviceGetProperty(PeekI(*DeviceArray +
        i * SizeOf(Integer)), CFStringCreateWithCString_(0,
        kIOHIDProductKey, 0))
      
      If KeyNameRef
        Info + #CR$ + "- " + ConvertCFStringIntoString(KeyNameRef)
      EndIf

      KeyNameRef = IOHIDDeviceGetProperty(PeekI(*DeviceArray +
        i * SizeOf(Integer)), CFStringCreateWithCString_(0,
        kIOHIDManufacturerKey, 0))
      
      If KeyNameRef
        Info + " (" + ConvertCFStringIntoString(KeyNameRef) + ")"
      EndIf
    Next i
  EndIf

  FreeMemory(*DeviceArray)
  CFRelease_(DeviceSet)
  CFRelease_(HIDManager)
EndIf

MessageRequester("Attached Human Interface Devices (HID)", Info)
wilbert
PureBasic Expert
PureBasic Expert
Posts: 3870
Joined: Sun Aug 08, 2004 5:21 am
Location: Netherlands

Re: [PB Cocoa] Methods, Tips & Tricks

Post by wilbert »

@Shardik,
Nice example.
Here's a modified version of your code with some Cocoa in it

Code: Select all

; Converted from C source code on
; http://atose.org/?page_id=113

EnableExplicit

ImportC "/System/Library/Frameworks/IOKit.framework/IOKit"
  IOHIDDeviceGetProperty(IOHIDDeviceRef.I, KeyStringRef.I)
  IOHIDManagerCopyDevices(IOHIDManagerRef.I)
  IOHIDManagerCreate(CFAllocatorRef.I, IOOptions.I)
  IOHIDManagerOpen(IOHIDManagerRef.I, IOOptions.I)
  IOHIDManagerSetDeviceMatching(IOHIDManagerRef.I, MatchingDictionary.I)
EndImport

Define Devices.I
Define DeviceSet.I
Define HIDDeviceRef.I
Define HIDManager.I
Define Info.S
Define KeyNameRef.I
Define NumDevices.I

HIDManager = IOHIDManagerCreate(0, 0)

If HIDManager
  IOHIDManagerSetDeviceMatching(HIDManager, 0)
  IOHIDManagerOpen(HIDManager, 0)
  DeviceSet = IOHIDManagerCopyDevices(HIDManager)
  NumDevices = CocoaMessage(0, DeviceSet, "count")
  Info = "Number of devices detected: " + NumDevices

  If NumDevices > 0
    Devices = CocoaMessage(0, DeviceSet, "objectEnumerator")
    
    HIDDeviceRef = CocoaMessage(0, Devices, "nextObject")
    While HIDDeviceRef
      
      KeyNameRef = IOHIDDeviceGetProperty(HIDDeviceRef, CocoaMessage(0, 0, "NSString stringWithString:$", @"Product"))
      
      If KeyNameRef
        Info + #CR$ + "- " + PeekS(CocoaMessage(0, KeyNameRef, "UTF8String"), -1, #PB_UTF8)
      EndIf

      KeyNameRef = IOHIDDeviceGetProperty(HIDDeviceRef, CocoaMessage(0, 0, "NSString stringWithString:$", @"Manufacturer"))
      
      If KeyNameRef
        Info + " (" + PeekS(CocoaMessage(0, KeyNameRef, "UTF8String"), -1, #PB_UTF8) + ")"
      EndIf
      
      HIDDeviceRef = CocoaMessage(0, Devices, "nextObject")
    Wend
    
  EndIf
  CFRelease_(DeviceSet)
  CFRelease_(HIDManager)
EndIf

MessageRequester("Attached Human Interface Devices (HID)", Info)
Windows (x64)
Raspberry Pi OS (Arm64)
User avatar
Shardik
Addict
Addict
Posts: 1984
Joined: Thu Apr 21, 2005 2:38 pm
Location: Germany

Re: [PB Cocoa] Methods, Tips & Tricks

Post by Shardik »

Detect left click on column header and left click on row of ListIconGadget (for a cross-platform example look here). I have tested the example successfully with PB 5.21 x86 and x64 in ASCII and unicode mode on MacOS X 10.6.8 (Snow Leopard) and OS X 10.9.2 (Mavericks).

Code: Select all

EnableExplicit

ImportC ""
  sel_registerName(MethodName.S)
  class_addMethod(Class.I, Selector.I, Implementation.I, Types.S)
EndImport

Define CallbackListIconID.I
Define CallbackWindowID.I

Procedure.S ConvertToUTF8(String.S)
  Protected UTF8String.S = Space(StringByteLength(String))
  PokeS(@UTF8String, String, -1, #PB_UTF8)
  ProcedureReturn UTF8String
EndProcedure

ProcedureC ColumnHeaderClickCallback(Object.I, Selector.I, TableView.I,
  TableColumn.I)
  Shared CallbackListIconID.I
  Shared CallbackWindowID.I

  Protected ClickedHeaderColumn.I

  ClickedHeaderColumn = Val(PeekS(CocoaMessage(0,
    CocoaMessage(0, TableColumn, "identifier"),
    "UTF8String"), -1, #PB_UTF8))
  PostEvent(#PB_Event_Gadget, CallbackWindowID, CallbackListIconID,
    #PB_EventType_LeftClick, ClickedHeaderColumn + 1)
EndProcedure

Procedure SetGadgetCallback(WindowID.I, ListIconID.I)
  Shared CallbackListIconID.I
  Shared CallbackWindowID.I

  Protected AppDelegate.I
  Protected DelegateClass.I
  Protected Selector.I = sel_registerName(ConvertToUTF8("tableView:didClickTableColumn:"))
  Protected Types.S = ConvertToUTF8("v@:@@")

  CallbackWindowID = WindowID
  CallbackListIconID = ListIconID
  AppDelegate = CocoaMessage(0,
    CocoaMessage(0, 0, "NSApplication sharedApplication"), "delegate")
  DelegateClass = CocoaMessage(0, AppDelegate, "class")
  class_addMethod(DelegateClass, Selector, @ColumnHeaderClickCallback(),
    Types)
  CocoaMessage(0, GadgetID(CallbackListIconID), "setDelegate:", AppDelegate)
EndProcedure

OpenWindow(0, 200, 100, 430, 95, "Detect left click on header cell")
ListIconGadget(0, 10, 10, WindowWidth(0) - 20, WindowHeight(0) - 20, "Name", 110)
AddGadgetColumn(0, 1, "Address",
  GadgetWidth(0) - GetGadgetItemAttribute(0, 0, #PB_ListIcon_ColumnWidth) - 8)
AddGadgetItem(0, -1, "Harry Rannit" + #LF$ +
  "12 Parliament Way, Battle Street, By the Bay")
AddGadgetItem(0, -1, "Ginger Brokeit"+ #LF$ +
  "130 PureBasic Road, BigTown, CodeCity")
AddGadgetItem(0, -1, "Didi Foundit"+ #LF$ +
  "321 Logo Drive, Mouse House, Downtown")

SetGadgetCallback(0, 0)

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      Break
    Case #PB_Event_Gadget
      If EventGadget() = 0 And EventType() = #PB_EventType_LeftClick
        If EventData()
          Debug "Left click on header of column " + Str(EventData() - 1)
        Else
          Debug "Left click on row " + Str(GetGadgetState(0))
        EndIf
      EndIf
  EndSelect
ForEver
User avatar
Shardik
Addict
Addict
Posts: 1984
Joined: Thu Apr 21, 2005 2:38 pm
Location: Germany

Re: [PB Cocoa] Methods, Tips & Tricks

Post by Shardik »

Display icon of the current user's Mac:

Code: Select all

OpenWindow(0, 270, 100, 200, 60, "Icon of user's Mac")

Image = CocoaMessage(0, 0, "NSImage imageNamed:$", @"NSComputer")
ImageGadget(0, 80, 10, 32, 32, Image)

Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
User avatar
Shardik
Addict
Addict
Posts: 1984
Joined: Thu Apr 21, 2005 2:38 pm
Location: Germany

Re: [PB Cocoa] Methods, Tips & Tricks

Post by Shardik »

List all predefined NSImageName icons and their minimum OS X version (taken from the NSImage.h header file with some comments to their usage):

Code: Select all

EnableExplicit

DataSection
  Data.S "NSQuickLook", "10.5"
  Data.S "NSBluetooth", "10.5"
  Data.S "NSIChatTheater", "10.5"
  Data.S "NSSlideshow", "10.5"
  
  ; This image is appropriate on an 'action' button. An action button is a popup
  ; that has the same contents as the contextual menu for a related control.
  Data.S "NSAction", "10.5"
  
  ; This image can be used as a badge for a 'smart' item. In 10.5, this and the
  ; 'action' image are both gears. Please avoid using a gear for other
  ; situations, and If you do, use custom art.
  Data.S "NSSmartBadge", "10.5"
  
  ; These images are intended for use in a segmented control for switching view
  ; interfaces for another part of the window.
  Data.S "NSIconView", "10.5"
  Data.S "NSListView", "10.5"
  Data.S "NSColumnView", "10.5"
  Data.S "NSFlowView", "10.5"
  Data.S "NSPath", "10.5"
  
  ; Place this image to the right of invalid data. For example, use it if the
  ; user tries to commit a form when it's missing a required name field.
  Data.S "NSInvalidData", "10.5"
  Data.S "NSLockLocked", "10.5"
  Data.S "NSLockUnlocked", "10.5"
  
  ; Use these images for "go forward" or "go back" functions, as seen in
  ; Safari's toolbar. See also the right and left facing triangle images.
  Data.S "NSGoRight", "10.5"
  Data.S "NSGoLeft", "10.5"
  
  ; Prefer the "GoLeft" and "GoRight" images for situations where they apply.
  ; These generic triangles aren't endorsed for any particular use, but you can
  ; use them if you don't have any better art.
  Data.S "NSRightFacingTriangle", "10.5"
  Data.S "NSLeftFacingTriangle", "10.5"
  Data.S "NSAdd", "10.5"
  Data.S "NSRemove", "10.5"
  Data.S "NSRevealFreestanding", "10.5"
  Data.S "NSFollowLinkFreestanding", "10.5"
  Data.S "NSEnterFullScreen", "10.5"
  Data.S "NSExitFullScreen", "10.5"
  Data.S "NSStopProgress", "10.5"
  Data.S "NSStopProgressFreestanding", "10.5"
  Data.S "NSRefresh", "10.5"
  Data.S "NSRefreshFreestanding", "10.5"
  Data.S "NSBonjour", "10.5"
  Data.S "NSComputer", "10.5"
  Data.S "NSFolderBurnable", "10.5"
  Data.S "NSFolderSmart", "10.5"
  Data.S "NSFolder", "10.6"
  Data.S "NSNetwork", "10.5"
  
  ; NSImageNameDotMac will continue to work for the forseeable future, and will
  ; return the same image as NSMobileMe.
  Data.S "NSDotMac", "10.5"
  Data.S "NSMobileMe", "10.6"
  
  ; This image is appropriate as a drag image for multiple items.
  Data.S "NSMultipleDocuments", "10.5"
  
  ; These images are intended for use in toolbars in preference windows.
  Data.S "NSUserAccounts", "10.5"
  Data.S "NSPreferencesGeneral", "10.5"
  Data.S "NSAdvanced", "10.5"
  
  ; These images are intended for use in other toolbars.
  Data.S "NSInfo", "10.5"
  Data.S "NSFontPanel", "10.5"
  Data.S "NSColorPanel", "10.5"
  
  ; These images are appropriate for use in sharing or permissions interfaces.
  Data.S "NSUser", "10.5"
  Data.S "NSUserGroup", "10.5"
  Data.S "NSEveryone", "10.5"
  Data.S "NSUserGuest", "10.6"
  
  ; These images are the default state images used by NSMenuItem. Drawing these
  ; outside of menus is discouraged.
  Data.S "NSMenuOnState", "10.6"
  Data.S "NSMenuMixedState", "10.6"
  
  ; The name @"NSApplicationIcon" has been available since Mac OS X 10.0. The
  ; symbol NSApplicationIcon is new in 10.6.
  Data.S "NSApplicationIcon", "10.6"
  Data.S "NSTrashEmpty", "10.6"
  Data.S "NSTrashFull", "10.6"
  Data.S "NSHome", "10.6"
  Data.S "NSBookmarks", "10.6"
  Data.S "NSCaution", "10.6"
  Data.S "NSStatusAvailable", "10.6"
  Data.S "NSStatusPartiallyAvailable", "10.6"
  Data.S "NSStatusUnavailable", "10.6"
  Data.S "NSStatusNone", "10.6"
  Data.S "NSShare", "10.8"
  Data.S ""
EndDataSection

Structure IconEntry
  Name.S
  Version.S
EndStructure

If OSVersion() < #PB_OS_MacOSX_10_5
  MessageRequester("Info", "Sorry, but your MacOS X version doesn't support NSImageNames!")
  End
EndIf

Define Icon.I
Define Name.S
Define Version.S

NewList Icon.IconEntry()

Repeat
  Read.S Name

  If Name <> ""
    Read.S Version

    If Val(Left(Version, 2)) * 1000 + Val(Right(Version, 1)) * 100 <= OSVersion()
      AddElement(Icon())
      Icon()\Name = Name
      Icon()\Version = Version
    EndIf
  EndIf
Until Name = ""

OpenWindow(0, 270, 100, 290, 398, "Predefined system icons")
ListIconGadget(0, 10, 10, 270, 378, "Icon name", 180, #PB_ListIcon_GridLines)
AddGadgetColumn(0, 1, "OS X", 40)

ForEach Icon()
  Icon = CocoaMessage(0, 0, "NSImage imageNamed:$", @Icon()\Name)
  AddGadgetItem(0, -1, Icon()\Name + #LF$ + Icon()\Version, Icon)
Next

Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
User avatar
J. Baker
Addict
Addict
Posts: 2178
Joined: Sun Apr 27, 2003 8:12 am
Location: USA
Contact:

Re: [PB Cocoa] Methods, Tips & Tricks

Post by J. Baker »

Full screen mode for OS X 10.6 Snow Leopard, with menu support. Uncomment the commented areas if you want it to work with OS X 10.6 only. As there is no need for this in OS X 10.7+.

Updated April 12, 2014: I noticed a few minor quirks and fixed them.

Code: Select all

;If OSVersion() = #PB_OS_MacOSX_10_6
  #NSApplicationPresentationDefault                    = 0
  #NSApplicationPresentationAutoHideDock               = 1 << 0
  #NSApplicationPresentationAutoHideMenuBar            = 1 << 2
  
  #NSBorderlessWindowMask                              = 0
  #NSTitledWindowMask                                  = 1 << 0
  #NSClosableWindowMask                                = 1 << 1
  #NSMiniaturizableWindowMask                          = 1 << 2
  #NSResizableWindowMask                               = 1 << 3
  
  Full.b = 1
  RX.w = 0
  RY.w = 0
  RW.w = 0
  RH.w = 0
;EndIf

Title$ = "Full Screen App"

If OpenWindow(0, 0, 0, 400, 300, Title$, #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_ScreenCentered)
  
  If CreateMenu(0, WindowID(0))
    MenuTitle("Window")
    ;If OSVersion() = #PB_OS_MacOSX_10_6
      MenuItem( 1, "Full Screen" + Chr(9) + "Ctrl+Cmd+F")
    ;EndIf
  EndIf
  
  TextGadget(0, 0, 40, 400, 40, "Use the " + Chr(34) + "Control + Command + F" + Chr(34) + " keys" + Chr(13) + "to enter and exit full screen mode.", #PB_Text_Center)
  
  Repeat

    Select WaitWindowEvent()

      Case #PB_Event_Menu

        Select EventMenu()

          Case 1
           ;If OSVersion() = #PB_OS_MacOSX_10_6
            If Full = 1
                RX = WindowX(0)
                RY = WindowY(0)
                RW = WindowWidth(0)
                RH = WindowHeight(0)
              CocoaMessage(0, WindowID(0), "setStyleMask:", #NSBorderlessWindowMask)
               ExamineDesktops()
              ResizeWindow(0, 0, 0, DesktopWidth(0), DesktopHeight(0))
               CocoaMessage(0, CocoaMessage(0, 0, "NSApplication sharedApplication"), "setPresentationOptions:", #NSApplicationPresentationAutoHideDock | #NSApplicationPresentationAutoHideMenuBar)
              SetMenuItemText(0, 1, "Exit Full Screen" + Chr(9) + "Ctrl+Cmd+F")
               Full = 0
            Else
              CocoaMessage(0, CocoaMessage(0, 0, "NSApplication sharedApplication"), "setPresentationOptions:", #NSApplicationPresentationDefault)
               CocoaMessage(0, WindowID(0), "setStyleMask:", #NSTitledWindowMask | #NSClosableWindowMask | #NSMiniaturizableWindowMask | #NSResizableWindowMask)
              ResizeWindow(0, RX, RY, RW, RH)
               SetWindowTitle(0, Title$)
              SetMenuItemText(0, 1, "Full Screen" + Chr(9) + "Ctrl+Cmd+F")
               Full = 1
            EndIf
           ;EndIf
            
        EndSelect

      Case #PB_Event_CloseWindow
        Quit = 1

    EndSelect

  Until Quit = 1
  
EndIf

End
www.posemotion.com

PureBasic Tools for OS X: PureMonitor, plist Tool, Data Maker & App Chef

Mac: 10.13.6 / 1.4GHz Core 2 Duo / 2GB DDR3 / Nvidia 320M
PC: Win 7 / AMD 64 4000+ / 3GB DDR / Nvidia 720GT


Even the vine knows it surroundings but the man with eyes does not.
User avatar
J. Baker
Addict
Addict
Posts: 2178
Joined: Sun Apr 27, 2003 8:12 am
Location: USA
Contact:

Re: [PB Cocoa] Methods, Tips & Tricks

Post by J. Baker »

Hide minimize and maximize buttons.

Code: Select all

CocoaMessage(0, CocoaMessage(0, WindowID(5), "standardWindowButton:", 1), "setHidden:", #YES) ;Minimize
CocoaMessage(0, CocoaMessage(0, WindowID(5), "standardWindowButton:", 2), "setHidden:", #YES) ;Maximize
www.posemotion.com

PureBasic Tools for OS X: PureMonitor, plist Tool, Data Maker & App Chef

Mac: 10.13.6 / 1.4GHz Core 2 Duo / 2GB DDR3 / Nvidia 320M
PC: Win 7 / AMD 64 4000+ / 3GB DDR / Nvidia 720GT


Even the vine knows it surroundings but the man with eyes does not.
User avatar
J. Baker
Addict
Addict
Posts: 2178
Joined: Sun Apr 27, 2003 8:12 am
Location: USA
Contact:

Re: [PB Cocoa] Methods, Tips & Tricks

Post by J. Baker »

A while back wilbert gave me some code that used "setSize:", for my about window. I just noticed this can be used for setting retina images. If you don't have a retina display, you can set your display to "HiDPI" to test retina apps. That's if your monitor has a large enough resolution to do so. If you have two monitors/displays, you can drag the window back and forth between retina and non-retina to see the results. Anyways, here's the code...

Code: Select all

UsePNGImageDecoder()

If OpenWindow(2, 0, 0, 364, 150, "Retina Image", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  
   CatchImage(1, ?elf)
  
      ImageSize.NSSize
       ImageSize\width = 64
       ImageSize\height = 64
       CocoaMessage(0, ImageID(1), "setSize:@", @ImageSize)
      ImageGadget(0, 150, 20, 64, 64, ImageID(1))
      
  Repeat
        
    Event = WaitWindowEvent()

    If Event = #PB_Event_CloseWindow
      Quit = 1
    EndIf

  Until Quit = 1
      
EndIf

DataSection
  elf: ; Image is 128 x 128
    Data.q $0A1A0A0D474E5089,$524448490D000000,$8000000080000000,$613EC30000000608,$41444900200000CB
    Data.q $5C60679DED9C7854,$56AFB65B9FB0D5C5,$AE3026F72EACD575,$8493BD31B04C60D8,$424DE1284201201A
    Data.q $900807A1092108F9,$10BEA10242121210,$EE377180C1C1B54C,$D5F7AB2DB24B6CB6,$43F7CEF7BDDDB6AE
    Data.q $D7E56B2DB248B8AE,$ECE66672DD5D3FCF,$FE71C0CCCE673399,$4FC83B00B5F4A34F,$119344D0C2FCF62D
    Data.q $C44BFF985AFB1A33,$66FC141725A8028B,$69D14D025BACD4D0,$48812BD616358492,$A00A2F13AC760B5F
    Data.q $CC94F03BBFB8E524,$911ECE0E64A70311,$C5D0DD3A25A85E72,$B301EA05AF5858D4,$C0051789163C85AF
    Data.q $1F37AC6F26BD6899,$67A6260B91609EC0,$CE59736D1F4F8C17,$5629B153B816DD68,$EA2C7DAD02366623
    Data.q $D229218028BC4531,$A2F3DACECB4F83AD,$E86931383E90AEC5,$AD69CF7CD4C49CF4,$0943F198CD0B8195
    Data.q $E48FA3A0268213E1,$D89D805AFA90663D,$70693D3E974DD63D,$585D6CC21BF9F757,$A55643B5767EB2DF
    Data.q $B408581678C47A85,$00A3711EC794BEF4,$079333E976528756,$A693343244F74ACA,$5BAFAEAECFD6768A
    Data.q $66BA59955AA99AD7,$B0AAF7340C580DFC,$A8716005D2F110C7,$BBD8B02CCE4D1497,$8A0EBDB848AC9227
    Data.q $E4803E9F07B86526,$A47A785340D0F73C,$1308E74AA2B5FB5D,$27782ABDED01F00D,$755762A8FED92B92
    Data.q $623BDF0A3B6FA23D,$BCF4E536A8028DC4,$CF287AC78712DEB1,$D76CD4F062ED9492,$0400EA9C58D9A9A0
    Data.q $F22D93EE47347727,$9F4E820429C21295,$E4D0C64A968637A1,$886FEB5F2706B3DB,$F46F85EF2C6686E8
    Data.q $C98F2AB200A3710A,$B0E3BA426A7C991E,$A67268A471C3B3DE,$A72786B21CF4E86B,$AF0755B7276D123A
    Data.q $58BE45B257F37534,$4123C7738109A442,$C94F1747F14C38C0,$C424BE72507D3BBE,$05CCC466D87340C8
    Data.q $02D7DA82A3CEF987,$A39A3BDBEA8B44EC,$AA7569DEA472C031,$F392486322490C64,$D5F146B5090B8B84
    Data.q $BAD90FB796374704,$C803248D6C1431B0,$AB00E73319A57916,$EFDDD0D03B600A81,$32B86625576C52B8
    Data.q $431BF81466C6F200,$F1988C9BF8553737,$146E22DE9655238F,$C816FE6D96FA8300,$386C53384FADECCA
    Data.q $709DB14A8F646C53,$8A68E9D6162DA151,$302DBAD89F0C6FE0,$4A10DFD04B456AAA,$C1DE2059A9649004
    Data.q $96FF67280AB01E64,$B76DAA29945B2AC2,$D2F7D0BF23361D31,$53A74A51988C47FA,$E4980028CDC4B71A
    Data.q $7AE343FE7BBE74C9,$68E8351E83BA014D,$17D4BEA21B5ED08E,$4D86A3D4C1B8BADB,$1F023F8A6156A592
    Data.q $A7AAAA8018802B03,$C9218C8DF7333B0F,$ECB30A6813DF3DDE,$C7128621A64D8DB5,$16A70001F1B8ABC1
    Data.q $492C9E6E751AEFD2,$58F7632AB297A77D,$195524A722E01A49,$E49D21305AAE5671,$123E3C29A3A3971C
    Data.q $B4E85BA49258FD88,$D4D0787E4D8B2106,$363DEBDE458A119C,$B0C6FE9A66230597,$374C293EB3E29843
    Data.q $F25D3406900B2788,$1C091F3D891C24D4,$B2B4D66A618D022D,$69C86C2C68B6D666,$FBA9C505C97F1E45
    Data.q $6B8BFE6311DA37BB,$8EE22DF4E843040D,$C15FFE241100B278,$596BEB6499C574F8,$C3C8AD2165CD880E
    Data.q $4A022A9B500CEF90,$BF7FB5D5A72CC4D1,$61A24534742AB555,$51651E1F042DC45F,$530D472DF5DC85BB
    Data.q $CB5F68D6C14DA556,$DB8048229A3A2DD1,$8774B8FE6B61F07B,$C45DEBAAF898BA40,$EA1B5FD8B4A65097
    Data.q $6AFA580844BA296B,$A137BCBAB2934519,$D72DBDE181124153,$DAE61A600A5710A1,$2BA396BEFE6D0DBA
    Data.q $3389D782435E7F36,$3D932AB2BDE5DED9,$7AC97DEA4C0C253C,$C2A9A5B000295C4E,$DC260718B5F440EF
    Data.q $524319357661B1AE,$51513BB6624CFDBA,$6F1321D628BDC9E4,$AEDC25A6EA6D500A,$F2580845FB1CB5F5
    Data.q $EE4CE1E7A743194A,$710A62B448EAA3BE,$029BC4C8768A2F46,$701533E35B0400D4,$03C92B6EEC5ABCF3
    Data.q $4C20B4EACE7A3DDC,$C4CA38CFBAE80031,$340FE4924934029B,$6B2C687D8E5AFB84,$F464C6F206A2EB67
    Data.q $D33DCD55DD5959F8,$3E200029BC40A39C,$A0680255C40CA96B,$F4F8626FBFC2CC31,$3C7B27B2B09BBA7C
    Data.q $4EE2011D82A23AE3,$E39A6FF6FE608401,$667BCC6204880FA6,$9F0140E42ECEA31D,$F5771B57976210AE
    Data.q $51AD43EB0102771D,$61620E5AFBD216A7,$0753E0C75D9E2F83,$F1185BEEF43D4AE0,$649568054789AC3B
    Data.q $5D00E1B7DE54DA29,$ED19C9EBCFEAF933,$6C15DEB0E1272925,$11D82D8762D065DB,$0846B37601F27E26
    Data.q $4CD7401677DC2C41,$A449056903617EBE,$41F5FC7BF21E2515,$A28CDA5D50B6576A,$15C82EE3374361CA
    Data.q $9636E6909740168F,$E60D47A82389F7B7,$8632049CA481B0BF,$2A5A0A6179F8F724,$6D7D2C2DDFFBACFD
    Data.q $9FF9E0F8F3B36313,$B0D677EC01C21A62,$E9F108400547892F,$80852E6C878D25B6,$E90B54C6BE7BAFCA
    Data.q $648979A91D767BCC,$8D26EA6007D220F6,$1F0D8CBBFD563E65,$A3E9B2A773C6E36C,$CA73309FE9FB7847
    Data.q $F767030A2E8FC628,$F783A69E265EA858,$353C0D1FCCC46AC4,$D6FB54BDE7A38B0B,$AC31DC3A6EAD9920
    Data.q $CE6114D1DF3DEEAE,$B323D5971C292BA3,$FD28DACB1A4CC46F,$3CA0C946AD6892A0,$8B6340531E399B2E
    Data.q $5C166DD819F9819F,$DD3635FCF1F29B0E,$B8917A8171E95F30,$9C43F68066C000B4,$9787EC7944D70C19
    Data.q $6E5613BA6AADF9B1,$E866AF8F67CEDCDC,$33E1CF77E4A479E9,$BCBF9656D2FA9374,$222D0D273086E891
    Data.q $749C14B9C9EC09A2,$773C7B9F1F22F53E,$6325FEBECF2965FF,$48771E5516CBE786,$241A0155E245EA05
    Data.q $3A6B687E54DADA59,$F6F0F14F483BDB7C,$5407A5B3E1616FAF,$AF5FCBBBC33A2102,$8846EA4883A5CC60
    Data.q $F958FB371A4DD4D7,$5DB743C9A56A194A,$A847BEECFC2C2E82,$A2A6EF3BB6E3ABAD,$C4638A3F67A1912D
    Data.q $5DC7B219EF3A0C8D,$44B12284CD2DDACB,$100155E29DD2AE20,$671EBAABECB578A6,$EEF267477A010887
    Data.q $F81BCBF1FE4C82E0,$2F0EF71A0435B1FC,$B0D2962F059D216B,$BBB9B18B0B929DB1,$7B7BAC83EBF8F20E
    Data.q $9BB1E3799B8B0D2B,$92B0B5997386F7B9,$D1E779CE7056CB25,$3BC1AF9F07C1D1D1,$D8B577B3B9647CEC
    Data.q $9266A8244E5B349C,$4CB4F44606169D9F,$EC30B0002ADC49BD,$FC4508661EA16CD3,$19DF703B7632031A
    Data.q $7F4F99BC1ED79C3F,$C436BDA5169D8AB7,$A0C9C53B815DBF27,$16835783D4507353,$AACC3606CBFDB18C
    Data.q $C793ECA72FDB89E4,$9CCADD59CC6C3870,$2F042676F5E05FB9,$9EBBE9C28482BA5E,$02E6FDBF9AB2DDAB
    Data.q $CB9E47D269FD7C3E,$0547BF20410591B8,$7593B00E31E265EA,$3FBA53381D55AD00,$EDEFA7E469F61AF5
    Data.q $F0BE9F3871319FC1,$92231924F2DE6673,$7845B9D4636D2BA8,$14C2274B78079C32,$B9DBA7C3656E6E34
    Data.q $D22EFA7CBE38FA64,$F3D497F789BB3A92,$D1FB7651455E97D7,$61AB29DAAA00F6BE,$5535F14BA1E978C4
    Data.q $127C9D4C399BF1B1,$6964FCDE38E707A3,$0B678814730BB75E,$59E9AED654492D50,$7D2328A517C87D4A
    Data.q $6559495F3EB3DFD7,$C3DEF0D98A4B1303,$49CBB556AC567DB8,$6295EFCD846B609D,$91456E3EFFCD56D9
    Data.q $8E8DA1A6BF1ABBA2,$61BA500F8D5ED08E,$535F64C2E77F412D,$5EDBFF5DAAA6BE15,$CB2A974C9CC28EB1
    Data.q $C10800ACF111C4E9,$FDDEA61BD4162A3F,$7BB9C5231FC47A58,$25F3E44FD382EDD2,$126F6C9CAAB4581B
    Data.q $14E73FAE4BFDFE8B,$0C46B2D54E55BE56,$B8D26EA63EC5EF6D,$1FDBF2966FD59EBA,$651319958BFBCC98
    Data.q $192A39D02F87D914,$C5E04ED7FDCC9190,$5CD70F44E7B57EA7,$64A400ED8EF47DF5,$06FFD764339E9214
    Data.q $65CB86979819BB66,$4EC038D788052B8F,$E2A4C772EB8A6164,$931F46E378AA66E8,$B5D7672839198A73
    Data.q $A73FD7A7F0178693,$7198F34309CFC5A1,$0D7C34ECBA6E48F2,$159776197BFD6641,$59C6CA2DA842C79B
    Data.q $ACA7FDE0EB4E8C65,$4489F8EF2325184C,$1EA9E91463871935,$7C3DF2A31B4EDC00,$CD891A280CC7D1F4
    Data.q $7DDF0F8D2D2D24EE,$D18D8B5458D66705,$D9EA717766C12F93,$C2B7549FB07332D7,$DED11425BD7D66BF
    Data.q $02BBC4887535E23E,$07781C3213BB81F8,$F8C7C1B0D3382F76,$4D75DDCE0F4642EC,$CE7F8C3F1B4E2492
    Data.q $A8FC61BF73BBC05A,$186E3E9C0929BC22,$7C6949818D3A5E37,$31995BABF50565F3,$726C8A322D8D3461
    Data.q $845F66C8C1DDD0E2,$D760AC309C59958D,$B2A1E39C18965935,$05E9893F011D0974,$02FBBE9F0279329C
    Data.q $B549C9D3544ED351,$A2CF8EE7394A5270,$4265FBFF8BC025B1,$70E82AA470FFD354,$EBF9A70308057789
    Data.q $B3BB91C8CEC339C3,$E6E9AF0F937EA98E,$12CB2EBAF74371B4,$171B7D4D411E4FD3,$36986ACBEB0CFADE
    Data.q $32F283271EC93861,$77FEF96E24E672B8,$78CEFC2E28CA7338,$A7037E64F9D3AF16,$500AB434218CED8D
    Data.q $A66F9F7B30A43226,$6FCABE00E478EC78,$8A4C509F4C6DEAB0,$B5A909C15D1BC4A8,$2725A5F7E9D71CCC
    Data.q $A61A6E51582CB400,$EF1088E6EB30F4B9,$0B0BF5858960000A,$6D2FAF563977A426,$CD70530815EBF963
    Data.q $B8C492CAE126FBF9,$2E9F3BC492488551,$1FAB634C7FBFB1E7,$86C39709249130DD,$84F93859B762AACD
    Data.q $35A1D8CF5859CC21,$F32B276D5150ACD8,$16EC896C0ED33274,$4CC8DB452208D519,$FBDDED9172CE2830
    Data.q $7FCFFE4C0C2749FE,$E74B9FE2D0D719BF,$3B813B5C4A7D77F6,$0DE03BEA5F500858,$AACB599EF310FAFE
    Data.q $AE163CCCFC31B677,$E7D93A781D8B472A,$F66CA02E4FC0F10F,$3B4EDC64C17B5C63,$CC15F3EF785AEBDB
    Data.q $E2B93F7DD76EB059,$B2EAC0041D2CE62C,$8E1CB85EEC17066C,$2C8C2E3D82860984,$00E16F2EE97DCC4B
    Data.q $71CF102620E26CEF,$ADCE371A026C9D80,$F11BF36F6D3C1F49,$1B8BAD9AB738D8C7,$841EF9A90E5A7C19
    Data.q $3F19DB8DAAC10029,$8EB5B8DC2FBF68AA,$4DE02726F17243D1,$7F953B3F3FEC703E,$C14B1C21D312A7D7
    Data.q $27A86C6DC51DDF69,$7B03CF6874310E1C,$E9BDD7FCBE4E0949,$8EBE2DD5ABF25E27,$D108E4BF1EB2C0E9
    Data.q $B11DA2B80100BA1F,$10B04F63A5C7F2D3,$DFC167AFCC54188B,$39A9E0C897929236,$424924B6533A52B8
    Data.q $FDDAE72C2C962492,$FECCEDCDF5000374,$394506319D172D7A,$FAC5654A4D4C11B8,$BBD9792E781B0C65
    Data.q $EDA5A4C949497047,$66A6A2A9A9ABA23B,$5C1387B3C1EF5E3B,$A6D57DB27F3EAE76,$A8D1F18EFEAD19AA
    Data.q $83FA220BEA38073E,$6C52BA1F81440002,$5714A17FCCA35A84,$EE9092E5A7C183B2,$36891D0EF6F79244
    Data.q $5306632981BFBFE6,$6D0DD565E7DDE398,$FF8DFE79AFBDF3FC,$0599B6B2A6E89C92,$B5C1224B4CC8CB2B
    Data.q $B99DE361D39FEE77,$6BB9640CEE715CB5,$4E3B566C2592542F,$AB8DA76EC009D757,$8AC3F1F4E9393BCF
    Data.q $2B16B083F6DBAF96,$EE6DC51C4DB16A89,$C9209183807F69E2,$72D3C1D5956AAB52,$775C1EB1444E2F49
    Data.q $EB03517DB13757AB,$7B33FEC64E4C3D67,$9B0AA9B358DA1BAA,$EC25240511A4E555,$26F6C8F936D70D0E
    Data.q $B360B56EC611DED1,$D71D4B71B96F6EF6,$0EB76B65AAF7FFDF,$005778D90ADA8E05,$A1F91628E72AB155
    Data.q $ED5223D9C59909C2,$431BF840E389DEDF,$9F126F6C8CA77BAC,$E197BB33721EEDFE,$5CD7CFFE5E74C5A3
    Data.q $B460E214BDF8D67E,$68A8A46E6969DBFB,$7934C313DFEEB750,$6FFC3E9FE125A3ED,$A8EAC7640F0C1FC9
    Data.q $FB6EEC028EDC45A3,$F33388C175A24754,$4F722391C3F29C5F,$6EB41085F1AB76F0,$567E3E32ABF9A068
    Data.q $8AFF97F19DB93D25,$EB65D9F2EE6C57AF,$CC79304F0DC672B6,$024242403E376EA0,$4C37478E6CF40603
    Data.q $A7DDE71192BE7D66,$70C1FCEBABD0F6DD,$802D8E21F1B94701,$CFE14E791EAE5162,$05A33EEE929E45BC
    Data.q $8D6284C2DFCFD463,$AB634276E2A1DFDF,$73AF9C3E74C7B6E0,$0C29DCEAB8D395EB,$470C11B0E5C4C82E
    Data.q $2F1355454D565759,$E5F357376B15FBBD,$9EC1BEF17865EEBF,$FA34D475ADA6C123,$FEDF17F69AFE64F8
    Data.q $7A11DFCF8A28A3D2,$E20DD83E57BDB815,$8513EB2E6C000156,$BB8FD929C9AF3313,$A4FB283BAADA2DFD
    Data.q $BEE662B954EF279C,$A53E772615FCC1FE,$B3F2DE9DDF65BA53,$94EB398BF6F078D3,$042104F7E5FA3D51
    Data.q $FFC5A9B5BBBACF03,$F4087C0E5B1A3866,$648000AD7128E9F9,$7D7C9E1CCE1F5977,$661EEDFDF4EC94F1
    Data.q $6DAC34F55586821A,$F072184E1693D660,$29F26330D5FC626E,$DB8AAB360876329C,$F18D7B796184E761
    Data.q $F8DE0D2CE6B7837B,$7AEBB4860EDE3FC0,$000015DE243D43F5,$D776C12585FD4B87,$C9EC7B096979E9B0
    Data.q $720ADFF6D8C40D13,$EA4642D07D5E513D,$2F3E2822DF538BC1,$47A184E01EB7B2C2,$59D0621FCDA32F2F
    Data.q $373A4CA103DB4777,$70902443FA1B8EB0,$79BE6BD41C227F50,$182FCE4D8A9DF363,$657AA97485A69197
    Data.q $5B1FC1E648BA3F23,$2906D98DF80FCEE9,$A8970F8AA6BD8E89,$6F13F9FC443977A6,$E359C463C8C183F8
    Data.q $7A6BC3F6028F1C43,$365D9D88ED1718CC,$4A62CD75BAAEF6BF,$F8D5BA587713C489,$89CCECB954BEB300
    Data.q $A5BCC27AFF445DA8,$3366FFCFB31D07A5,$D1F34DD36A5ECD6F,$80527F4823D1F623,$D56EF7F375372C9D
    Data.q $D6C06FBB1B81F37C,$1BAEE6175D2C9B96,$ADDA14D31CE2EC8E,$4ED06667B7D57BBF,$F467D6E0B85B6B2A
    Data.q $AAF43D3896363448,$F0ECC58A00002A3F,$13763750FCFB3AB8,$1670DD770B15F278,$6715D5F25B3D5979
    Data.q $A6C4B36EC93A3A9F,$11F76F8B4768F35E,$3879AF5328A11D46,$6B824762AE460816,$08E26B20155FD23C
    Data.q $C17AF6C481486325,$DE703E6BA9449FCC,$718A2E9F260DF2E0,$7FC798457B33B5E7,$ECE434A610D7B976
    Data.q $5951D6593EB7F47B,$6E6C1B3DB745CCDB,$3D1F2BD9BC0F3E0B,$25A4DBF0270BF442,$C8D2E2382111D090
    Data.q $5B6D98B637D6901A,$028EFB69592DC46A,$BDE647BDDF055B1A,$2348F7AB2BBEDE3F,$E2F5CFBD5E0B12CB
    Data.q $316BF8F9DDB45FDB,$A62C716840BE1021,$17E904783E57B4FF,$AD16944D48AEC0C3,$7177BDD13136DB7D
    Data.q $2FC6C07DAE0A5736,$D7A938CE8B92BE6F,$9E9BACE06CAB28E5,$F4D341FFB735D58C,$697E804783FD7ABB
    Data.q $72FFAB952B24F601,$043BFBE367BDC5BF,$F885B7A7F3A1BDCF,$EC8F26334897ADED,$95E1FC83DB5A1955
    Data.q $16AB13E3FE4FA34F,$3C1FABD4FE04EE33,$CAA666A00B67F482,$A6CBC3F28571DE37,$85AA2A09B536272B
    Data.q $D6BF8FAACD2F83FF,$5CEB28D147C19A5D,$D67918DD344FEB76,$8EAE9AAFDBF5A329,$BDC3F0E7B24B921E
    Data.q $7E1F196570B261BA,$5956B9B5EE7B5AB1,$ECA01AFD316B1692,$C00ACFE8F4768BF0,$C632AE6CC65BA7C5
    Data.q $A1B9B301FD58A347,$A7019BEBE33A2A8D,$B770C8F26993732A,$429275A9CAA59025,$5382E2E89C92668D
    Data.q $A4E61471F4F67146,$31B0396AC24DE591,$D754EDCDF506E98C,$97B39BC0D95652B7,$08421768D92DE644
    Data.q $BFE049E2186D9881,$00AD7E9447D8A947,$09B19DE245AC6107,$6FB4D48EA9A5D756,$9D61E526EAB7234D
    Data.q $A8055A54566831ED,$1E69BC6E49490B56,$1AD21EDAD98B362C,$17C3AB5D557A035B,$6D55AB0B22AA2908
    Data.q $00BFD316937375D7,$7BA2EE356133A2BE,$2CBB44805358E13D,$E01D3F4DC49165DF,$D3E38B99EF681D4E
    Data.q $BA85827093755A4D,$036B2D65BDF46B54,$D34FDD15408DD8E1,$C9B6B77D26F6CF4A,$7D1FE267ADB001F7
    Data.q $0AADB857604E4BFA,$98E69A5F1F48C997,$7EE96BC52B967370,$3986CD36A08682D1,$78260A34A4E783C4
    Data.q $65258663A8F22E29,$5F331A2E36D7592C,$60164049BC5BE0E4,$777FDFF8F796198E,$F16A0F96570BDDFD
    Data.q $A5B8A6EAE74D7C75,$BAE4061805005ABF,$905F1714CD62F915,$5D89BD58F14E376A,$4D83602189DFF5AC
    Data.q $BC8524A63321C2A6,$469F66CFA4AED71C,$4735D44AAA82DB92,$AFCDAB365CBC8FA2,$38B3BD91BBF60F7D
    Data.q $AC2F135232FFFBD7,$DFBDCAFF99AFF16F,$BC8FD5EA70F14F4F,$3CDA1BAB8328B564,$5423BA81338D5515
    Data.q $2173030F5C4A23F6,$699861D7DCB0E6DB,$64998D4CC7458986,$F24ED24544CC826A,$AB1CF4D60949CD58
    Data.q $906C05D6554DDA82,$93253A9C2C925B04,$952E3C92677DE492,$646949DA713797CF,$F93D919D976DD9A5
    Data.q $CBC68206D75539F5,$E57DE39051D5BADF,$6F16CFE2E7FE17E3,$3C53D3D269AB6FF0,$39C25A7A4554D9AC
    Data.q $CC6F0BC64B793E6F,$B1EDC5AFA3E9FDAB,$5F22305500AD7171,$B34ECEE992DE1718,$E10F58122812C8C8
    Data.q $36092D5821A0B958,$ECE2E4CB4E3312A8,$9DA7322D5B6DA703,$62633334DF17C694,$BF347C07524A533A
    Data.q $F23D8CF8D040EEFE,$EDD0F27E1253D2F6,$A7DCCE9B94599F17,$012A3FA3D7FA6EDE,$7B3CEF696FF7EBB8
    Data.q $B5BB5D2CCB22866B,$79102F92F3D53D3C,$BD0D50878DB4D350,$F8BA225B00FBBC4A,$EC8B64FDF6305D68
    Data.q $017C683DA8ABB02C,$24AF930AE60D4554,$419C9F4CD93BE938,$A1228AC7F3D74252,$6C5232618DD5122A
    Data.q $CB6D2B2F2575CC0C,$0DA4B71DDDE262D2,$C8AE7BE9FC7ACC2D,$C4C612CB086CAF2B,$8FA05ACD7F968192
    Data.q $9A50AA3F19639418,$F8A374B79F54A4B7,$C6C57F3A9D577DE3,$86AB43DCC75B4B60,$C9B0A28327EE23DE
    Data.q $87C6E12DFBC97987,$B3CE7E0ED1A9FBB6,$7E112D3FFD1B3A21,$E7498D8651601556,$D9CE2883B5C772E4
    Data.q $9CAB6BB6BC5FABFD,$C450907B6CA4E59F,$275826A4A5DB20A0,$F7E99EC91900C502,$E2CD9B0008FE74DD
    Data.q $C460815969F2F1B8,$4E1707E5B1746E3E,$C7FBFD1E21FCDB96,$8810848A3BA7FFBC,$116F43D4E1D1F498
    Data.q $9352A4DD000016EF,$8F6CBF5348496AC5,$54410A88D7ED7E26,$34A0D455410C3A08,$C29B97847356F3A4
    Data.q $6E7AF6D5F0156634,$B3C0CA4C67117EF9,$6414826A2BDE6D9F,$61B2B24D4C111D75,$B629E9070CDC806B
    Data.q $FF3316B0FEE535C4,$BEBBC9F87CE8949B,$D33BBA242AA2DC37,$D65BB26F15566CD4,$C1FD03F5FF0F3A62
    Data.q $FE6E0EDD13562EDB,$29E5BF5D2E973FF5,$2DEE22C3FAE8E77A,$CCC4B59F3AA24EC0,$F8DF126D432D801B
    Data.q $41750BC421BBFCA3,$62B1450F2984B766,$BC7FD7F2D7B5FD72,$1C26DFF17EBD808C,$C3043EC70E4FD831
    Data.q $2D0F01573A6B5B06,$0B2063F99AA25048,$21FCDB491281EF24,$0A666E6AA5E9FE1E,$1575B2D351F8BC8F
    Data.q $A051F42E3D6D00AF,$2A25B0989D80585F,$77209ABD3749AB78,$B172CBB68DB14BBC,$1624936322C7264D
    Data.q $E9454C54579235D7,$A39ECDE07718CE32,$81D25A46205B4131,$5A7E6F30C6EA81FD,$B232AAA1E5E775C3
    Data.q $A46DF58D1908112C,$32AAF16B382DC80D,$B6F75BB18371B4CB,$17B33676E7676E30,$5F3C1FAFF47E6DAC
    Data.q $91C0D4C8FC7FE4D7,$C1343A0EC0295FA7,$D17331AD9AC1617B,$4B6236115E19B0C6,$7D1A066A29B28643
    Data.q $20ECB0C6D7CFB77E,$AA71EFFF3C0EF283,$D9524B931561FCBC,$FCFF074B6EB95F9F,$7DA718A2B9FF9AB0
    Data.q $1670A266A3853577,$92B0C24978BC590D,$9C2E97EEDBBAE209,$B934C350C4AF7A36,$DDF6781FCA77D9FF
    Data.q $A5A23EEFDA9B6BF7,$B101D040D7F4C23F,$D7EB3468D1B56CD9,$D6F00017683D0E37,$A8325370290C3567
    Data.q $3EBDB2662D0F1773,$270152471352C2CC,$99791E7DAD821A8C,$79B5E0D448E8BF9D,$E74242425ECD6651
    Data.q $FBF1E46E371B02BE,$858002BABFAFE56F,$6DD7F3DF5743CB2B,$41605B6363768891,$8071D71088F5162F
    Data.q $7B6E096DCD34C143,$D1A4DE0ED7667E56,$128325194AF13C29,$54185BAB85896591,$9CA723FFBF23C794
    Data.q $77BEEB8B972E0A72,$B98536EC3EC9E906,$C6AEEE7B7D5E752B,$2B23BA28743A1807,$AD876EAD5DE6745C
    Data.q $FADF5358BC8A1FD4,$6380FA43EDF3D011,$309E0FA1862C014D,$34ACC1A11BB5093C,$6E9A00207F7E773B
    Data.q $05115D5803E9DDF2,$73DC1DB9D3C78A33,$921676DE5F8F7B7F,$D9D90BF9BF17E011,$C2F07474760DD7BB
    Data.q $CD87C1F07EB42F0B,$EDA96BAAAB4DA69A,$70175AC71EF5629D,$68D7773C1F492C96,$618DBE0273CDD3C5
    Data.q $2EE78F9EAB7E9E08,$391EF47F1FD8D5DB,$5807DCED8F462E19,$BAE33DEF7BDE75D7,$2050F492480BAEEB
    Data.q $6DFF17E4FD33F810,$775A59655005258E,$3ACD4E1781ACB4D1,$6B67C42EB2B6E72C,$B7BAAA2962FDCCEC
    Data.q $707E1B90B85C2D22,$F040FE954DF5B525,$E9AFAB7CE1FB6054,$1884BA706E807137,$B4783D12250CD31C
    Data.q $5B5B249CB3F22BB0,$F36D75D99E9FF3F9,$EF7C19CE7F9CCDE6,$A3D4C14E3998B3D2,$01476387C6F3F4B5
    Data.q $29C9DCF9FD2CB2EC,$44DE5E478DADA066,$262733E459E1D579,$3FCFF3E4BFFDFF71,$47A3253B73FFE7E7
    Data.q $90347F6FC2DF6592,$077719A61809F9A1,$A578138AC70A1D40,$B2E288F4500D22DD,$92569FDBC1AF20C1
    Data.q $3971B2D345C0959B,$7E772A1DB823DE7A,$B1B4C99ECE7380BF,$6C771230C77F7E5E,$3BBA918E20E9A954
    Data.q $7AB9AC12E1807C16,$9988FBD96D695786,$79C1F935AC6C00E6,$7CBB5BB124389CF9,$BDC4D48D76969B7D
    Data.q $5D9E2FCEA08185A3,$C92C3C4FD6182ABF,$0C93DC0918FE80E3,$92E3DC3F1CBE9659,$06D39E88EDF2A0B4
    Data.q $2B17C034A4B08919,$D9E9EC9172C8295A,$DCD27701467BBFF9,$9A237FEB7568B1AE,$67F457E91E7EEEF9
    Data.q $8C26AFA5955D201F,$3596B5E25C9D7248,$166C77677DB58429,$EFC6977482596189,$DD50566F73CCDD5F
    Data.q $09075457D3C77878,$6E71121938EE8D47,$E45AB34805ABFB65,$7A7CBCCDCCCC57F9,$0F42B0CED7B6724E
    Data.q $6369C08421F12F1F,$22939126D3BEF89F,$EA89AF35BC680FE3,$022D8F5B24DE3086,$05B74BDB6DB5E2C0
    Data.q $8555EBDFACEBA41E,$1E7CEE7407C14CA7,$A961801E76B5C477,$92C292F8FE7F9689,$933168F6A77B0521
    Data.q $0616AAC163AABFF7,$198BC5FF7B8A4267,$3B7035AA6C13EF50,$09451187233BBE55,$9B8084EBF6BB3824
    Data.q $81C31B0A1CD55D1F,$9C5558123ADC83A6,$305376F41B5B2AA9,$C02CEFDE265C3885,$F869B9BF33F722F0
    Data.q $8A2BB23EDB14F4CC,$FCDCF2830F22F0C4,$1161C0BF269FA577,$A24322822B7B2CD8,$AC98A2C655272253
    Data.q $B6347567C6F00B2E,$ED8A872E32A8B046,$BF998534D6127B00,$2177CF174C6965A2,$8236C1A4E9F81BAA
    Data.q $0F8F8150B081109A,$8E8053BF46BDD8B1,$C4E4B45D7B6CB688,$4A7E0E01CA858921,$6ED38BD6369958F1
    Data.q $5612C3DA3E6593E1,$C8A7932F6956EC15,$9A6E40F0C890E090,$D780794D6510204C,$98D13B594D65AD3F
    Data.q $1D960AACD8492481,$B9B75F557FEFE6E9,$A885DA5042D7E3AA,$24298ABA6157700A,$FEC23C0918CFA34B
    Data.q $0005D8FE8CFBCB53,$35F9FADE3BA6E764,$19E09E0E78A72703,$8FAFF1F46C564CD1,$F5E1219C5048A3B6
    Data.q $284053275F6C1CC8,$1217C5474145082A,$2C9F027154624218,$5D0204C8A6190A6C,$2481D13CCCD408C9
    Data.q $8A810300C22B27C1,$C0160FE997B4951E,$A83F8087F4FB7C01,$AF2CC4EB4D68BFBF,$A513C07ED52B3923
    Data.q $E3E9C1C337224554,$C63EA5B375CA0CBC,$6C4C20281843EBD7,$12489DA860EBB4AA,$2EC1225D97095558
    Data.q $2C920412320826F0,$F886188F6834B645,$C8AE25908F721BAC,$26B4A6438F16AAF7,$87BA015C709F0066
    Data.q $4B2DBD22C58F732A,$7B29F0422181CFD2,$29AC6F99AA28422B,$2B0EA7086AA82F6F,$8B612F641EB2484C
    Data.q $14A8D263629E932A,$A2A76C9692F58DA6,$74547421F582C63E,$66FDA451604B205D,$1A09BFB32A2C5908
    Data.q $BEF376F7495C4C5A,$B56F951E4E9361C1,$580F3004C7569402,$0152E27DE85AFDD5,$9F77AAA765E70A6C
    Data.q $373AA6979F99CE37,$8B56F4ACE84AC756,$7AADC766B0534CC2,$E76AD66DAFDE262C,$64B0E59F91986A2C
    Data.q $6C380E96AEE5D8A4,$CA9D1E4E0EBC030A,$6283700E141949CC,$490D36F5674EBCA1,$21214A1DCC3312B5
    Data.q $E336FABECAB65404,$781F12BAAF8842E7,$DBAB36C184D9F81E,$32EBD7949B08132E,$A3C50956AE200BF0
    Data.q $4F1705A538F0E00F,$6AD75B7233B89D74,$A4F55A6B5B1A42F8,$767CCF8343F8D840,$53D7945AB20DCF3F
    Data.q $D1C0A8BA6FC32C93,$8B4175D081D83A55,$A11CDF51A7C5A35F,$A5BE90DAB6CC39B6,$B7D9538BA62CB436
    Data.q $AAAFE162D513DA3B,$5372B8A29D9E5D24,$EB3A0D15323CD255,$921E570662D7B52A,$E1450059DC48BD50
    Data.q $F21C79971D2369F2,$9724F6C8704C16AE,$185A6096AB7CB59C,$EA0791E1C8FC2B21,$0C64CE8502176151
    Data.q $7B2508EE466762D5,$5276CAFADB469CD6,$01CD1ED63C5236DC,$B64DE2A1DB84B2C8,$73369AD165689291
    Data.q $C39C5D318D8EF6D3,$7E0881815AFA57C1,$C54338B53D987933,$DA31B4584D309369,$B5621F5401DC19A6
    Data.q $ABB2E5A336F11AF4,$83BB3ECAC959DDD2,$BD45A27C518EA86F,$D6B41516814F1EEA,$5DAD3719B7EA231B
    Data.q $26134B42B8DCAD14,$651E284C4ABFF5E6,$78455F5582028671,$31B4CCAAAC72E5E6,$05000016CBFFE65E
    Data.q $30BC31544144496B,$68AE8854ED48CA41,$B9CDE7E15B58D769,$B12B4AC5085CD8D5,$24915E052E7E332E
    Data.q $38B973A3A898D182,$C017C426287A4D95,$5D4F13EF47579E92,$A2799EFFCBB2E480,$5A658FBCA744F2FD
    Data.q $A7E32B34D0631CD5,$054588085079F7DB,$7831AA69C5DEFB56,$4D9B10D1AD6D67F6,$784AED38A0138C43
    Data.q $4E9D39641447B164,$424DD310A6DD82BB,$CDBF5890BACA8311,$676C984E75FBB52F,$B75858468A7605F2
    Data.q $24757F94FEBD0B48,$B90008FB1D006624,$248C94D88793D6C0,$C87F09555814C305,$E40C14DF889AEE64
    Data.q $802C6E233EC351E0,$3BED88693BDF2AD3,$D9225DA7007C6BFB,$F1A7D8925F2F7FBB,$BABE7DCBF9D66FB7
    Data.q $036CB1E7405C4848,$BEBA5F48C450C280,$2CB261B6D2F2E86D,$62985DA028904B25,$D7D5D2AD57E2619B
    Data.q $65DB62992F49EBDC,$B9F8AF3AB24E462A,$EA13FFF94F1BF467,$8B29392E155BE710,$92DFEF8AEF551677
    Data.q $802A4A29D97D94E8,$2AB42BCB8E3A7722,$4E21F1B4E263F053,$5722375CA2DD802C,$F5E7B85AD0A4BFB9
    Data.q $A29593AF51504C68,$D0D563E96BAF5650,$1E076989491CF394,$FADC28FC2C3A19EE,$479C4868CAC1ABC9
    Data.q $CFA5387649618FCF,$EB18C86233D7BEAE,$9DFFA882F566E65E,$925DB35111CC763F,$257203AF31183564
    Data.q $D49CAE6C8309D289,$DFADB7A0D15BBADD,$FC3D03E6E9A73FAE,$E145409DCFA551FE,$B10D26EFCA29019C
    Data.q $2ABE0A8A16BCEF15,$B4D47510DFCEB68D,$B754A4C6D737DB18,$9FE581E4697CBED2,$4C249044E64BAC47
    Data.q $DC92125DDA724DAB,$1EFE79D0AEAF7639,$90D173D8B2E9555F,$C7A22F1EB68721F8,$02CCF4ED32C36378
    Data.q $320965D9403BD535,$5E6E6521D59B54F3,$B08199C971492B11,$D3904D481E249148,$AD9F873B2D59E646
    Data.q $A624B685796C661D,$65EC504BC3809B8B,$AFC972484C02DAFA,$F70773B859DE305F,$50C1426FA3E0888E
    Data.q $40E5009F82102C54,$56A1182FBE5BB25E,$AC61455E00DFCDD3,$14CE22245EFE4133,$FA53BB3610C36E06
    Data.q $011C3605EE21DC38,$777BEB34B70E5CD9,$79D9E6D1391B8C26,$8DD22F3442B7F3F1,$2C6D14D82CA4A724
    Data.q $EEA5C51EBCB8B7C9,$226BB9826B089798,$83B07E953131A26B,$96954D96402A5F58,$2DDD6EC039C9325D
    Data.q $A356EABEC2AB67C6,$46DDBC6FB3C6085E,$FFC8E143FB9221E7,$6ECB8DE904CE1CDA,$BAA4B6C9F475384F
    Data.q $A359C7C2FDCF3AAD,$7309869DB1FBA81C,$3A1CE2C206D784D7,$700BAAFA7B8B1677,$38A38C733ABE645B
    Data.q $964D05F73FBBB9D1,$7EEB601CE0766994,$9B2CC6F703583B9E,$B46C757CB778D31E,$470E97F5980F26C5
    Data.q $B6D5FF693B265BA6,$A6AF37E4DB5B4CAC,$84A49F417ECAA373,$7B64B6CC0DF732A9,$6B0833E0D9159D3D
    Data.q $2BCCB2FC47D72F82,$666800EB90BED2C0,$09C43A97ECD9FCCC,$D8471FF7724A16E9,$C0D3C5F937D462DE
    Data.q $C317D1E1DE2BA3EA,$81B8D3748A2DD3C0,$CB459697F78B5DB6,$E8EFB0BA6B2161FC,$95427E430909E3F7
    Data.q $B2436E9D33585B45,$7AB098608795BE5B,$48FA3FC5D511568B,$9549005B68E643C6,$7D9EF27B48EA7E79
    Data.q $13E26344E726C3A8,$8DA3F679EBA62821,$B998888115E66B08,$F848CAF662B69368,$AA2EBE93654D7DDB
    Data.q $D1C9877489F45F8B,$75246614041300B6,$A0D151A6D9AEF066,$D81CD3C0422E9A6B,$C5A65C05CA078BC1
    Data.q $7E639D83169AD6C4,$DC581858EAD284C3,$2802D5471A1DE2B7,$322AB16396187F12,$9A223BD0696C0AA8
    Data.q $9A396C089C9A6B58,$525AAE02B5221CB2,$F984D313417D3516,$3883B8A6639B221B,$539689244B8AF54B
    Data.q $938B71DFF5C5DB87,$F26742D12484DA87,$444920BC02C27F64,$0B5F6B732C809915,$7682402ED51C3874
    Data.q $080F49B2A0052659,$C4CF12B93FF66CC1,$341C4356E0859B80,$C1409D74705FA037,$E830C0130CDAEA7F
    Data.q $C3E37DFA0EE6FDB7,$75EA2B9A13005651,$EF681584C488085D,$187B472AF4E3A1F2,$89875B6B086EA6F8
    Data.q $CE399EAE74C92AC3,$4D19156B851425FF,$C73CB5F7E7018892,$6F5C4049955403E9,$C738E71CE39C78A0
    Data.q $1CE39C738E71CE39,$738E71CE39C738E7,$CE39C738E71CE39C,$8AA127C607FFC231,$00000000B05BEA31
    Data.q $826042AE444E4549
EndDataSection
www.posemotion.com

PureBasic Tools for OS X: PureMonitor, plist Tool, Data Maker & App Chef

Mac: 10.13.6 / 1.4GHz Core 2 Duo / 2GB DDR3 / Nvidia 320M
PC: Win 7 / AMD 64 4000+ / 3GB DDR / Nvidia 720GT


Even the vine knows it surroundings but the man with eyes does not.
User avatar
Danilo
Addict
Addict
Posts: 3037
Joined: Sat Apr 26, 2003 8:26 am
Location: Planet Earth

Re: [PB Cocoa] Methods, Tips & Tricks

Post by Danilo »

CanvasGadget GetWheelDeltaX() + GetWheelDeltaY():

Code: Select all

Procedure GetCurrentEvent()
    Protected app = CocoaMessage(0,0,"NSApplication sharedApplication")
    If app
        ProcedureReturn CocoaMessage(0,app,"currentEvent")
    EndIf
EndProcedure

Procedure.CGFloat GetWheelDeltaX()
    Protected wheelDeltaX.CGFloat = 0.0
    Protected currentEvent = GetCurrentEvent()
    If currentEvent
        CocoaMessage(@wheelDeltaX,currentEvent,"scrollingDeltaX")
    EndIf
    ProcedureReturn wheelDeltaX
EndProcedure

Procedure.CGFloat GetWheelDeltaY()
    Protected wheelDeltaY.CGFloat = 0.0
    Protected currentEvent = GetCurrentEvent()
    If currentEvent
        CocoaMessage(@wheelDeltaY,currentEvent,"scrollingDeltaY")
    EndIf
    ProcedureReturn wheelDeltaY
EndProcedure

If OpenWindow(0, 0, 0, 700, 400, "ScrollAreaGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ScrollAreaGadget(0, 10, 10, 680, 380, 1000, 1000, 30)
    ButtonGadget  (1, 10, 10, 230, 30,"Button 1")
    ButtonGadget  (2, 50, 50, 230, 30,"Button 2")
    ButtonGadget  (3, 90, 90, 230, 30,"Button 3")
    CanvasGadget  (5, 200, 200, 500, 500)
    CloseGadgetList()
    StartDrawing(CanvasOutput(5))
    Box(0,0,500,500,$FF0000)
    StopDrawing()
    Repeat
        Select WaitWindowEvent()
            Case  #PB_Event_CloseWindow
                End
            Case  #PB_Event_Gadget
                Select EventGadget()
                    Case 1
                        MessageRequester("Info","Button 1 was pressed!",#PB_MessageRequester_Ok)
                    Case 2
                        MessageRequester("Info","Button 2 was pressed!",#PB_MessageRequester_Ok)
                    Case 3
                        MessageRequester("Info","Button 3 was pressed!",#PB_MessageRequester_Ok)
                    Case 5
                        If EventType() = #PB_EventType_MouseWheel
                            wheelX.CGFloat = GetWheelDeltaX()
                            wheelY.CGFloat = GetWheelDeltaY()
                            If wheelX
                                SetGadgetAttribute(0, #PB_ScrollArea_X, GetGadgetAttribute(0, #PB_ScrollArea_X) - wheelX)
                            EndIf
                            If wheelY
                                SetGadgetAttribute(0, #PB_ScrollArea_Y, GetGadgetAttribute(0, #PB_ScrollArea_Y) - wheelY)
                            EndIf
                        EndIf
                        
                EndSelect
        EndSelect
    ForEver
EndIf
User avatar
grabiller
Enthusiast
Enthusiast
Posts: 309
Joined: Wed Jun 01, 2011 9:38 am
Location: France - 89220 Rogny-Les-Septs-Ecluses
Contact:

Re: [PB Cocoa] Methods, Tips & Tricks

Post by grabiller »

Wilbert,

If you have time, could you please post an example of how to retrieve all the currently open windows (from all running applications that is, not just PB) names, handles (or something), positions and sizes, and then how to move/resize any one of them, all this through Cocoa of course.

I'm trying to create a tool for an application that uses a lot of popup windows, to automatically arrange/snap/resize them in a clean way. The application is working on Windows & Mac but I only know how to do it on Windows. Would be great to have this tool working also on Mac OSX.

Cheers,
Guy.
guy rabiller | radfac founder / ceo | raafal.org
wilbert
PureBasic Expert
PureBasic Expert
Posts: 3870
Joined: Sun Aug 08, 2004 5:21 am
Location: Netherlands

Re: [PB Cocoa] Methods, Tips & Tricks

Post by wilbert »

@Grabiller, I think you don't need Cocoa for this.
Take a look at the "Quartz Window Services Reference"
https://developer.apple.com/library/mac ... tions.html
Does that make any sense ?
Windows (x64)
Raspberry Pi OS (Arm64)
User avatar
grabiller
Enthusiast
Enthusiast
Posts: 309
Joined: Wed Jun 01, 2011 9:38 am
Location: France - 89220 Rogny-Les-Septs-Ecluses
Contact:

Re: [PB Cocoa] Methods, Tips & Tricks

Post by grabiller »

wilbert wrote:@Grabiller, I think you don't need Cocoa for this.
Take a look at the "Quartz Window Services Reference"
https://developer.apple.com/library/mac ... tions.html
Does that make any sense ?
Hmm those functions seems to be limited to retrieve a list but I'm not sure what to do with it, how to then move and resize those windows. Plus I would really like to do it from Cocoa for later compatibility (how long the Carbon API will be available/supported by Apple ?).
guy rabiller | radfac founder / ceo | raafal.org
User avatar
grabiller
Enthusiast
Enthusiast
Posts: 309
Joined: Wed Jun 01, 2011 9:38 am
Location: France - 89220 Rogny-Les-Septs-Ecluses
Contact:

Re: [PB Cocoa] Methods, Tips & Tricks

Post by grabiller »

From "Quartz Window Services Reference", which API should I use to move/resize a window having its CGWindowID ?
guy rabiller | radfac founder / ceo | raafal.org
wilbert
PureBasic Expert
PureBasic Expert
Posts: 3870
Joined: Sun Aug 08, 2004 5:21 am
Location: Netherlands

Re: [PB Cocoa] Methods, Tips & Tricks

Post by wilbert »

grabiller wrote:From "Quartz Window Services Reference", which API should I use to move/resize a window having its CGWindowID ?
Apparently it's not that easy (or I'm missing something).

I've read some suggestions on using AppleScript to resize the window of another application.
Unfortunately I'm not very familiar with AppleScript :(
Windows (x64)
Raspberry Pi OS (Arm64)
User avatar
grabiller
Enthusiast
Enthusiast
Posts: 309
Joined: Wed Jun 01, 2011 9:38 am
Location: France - 89220 Rogny-Les-Septs-Ecluses
Contact:

Re: [PB Cocoa] Methods, Tips & Tricks

Post by grabiller »

wilbert wrote:
grabiller wrote:From "Quartz Window Services Reference", which API should I use to move/resize a window having its CGWindowID ?
Apparently it's not that easy (or I'm missing something).
I've read some suggestions on using AppleScript to resize the window of another application.
Unfortunately I'm not very familiar with AppleScript :(
After extensive search on Google, It seems no one knows how to do that on Mac OSX, which I found totally incredible.

Well, some pretend it's easy, but never give any solution/details. The only comment/answer I've seen close to an answer is:
Use CGWindowListCopyWindowInfo to grab the kCGWindowOwnerPID of each window. Then you can use "distributed objects" if you want access to ObjectiveC stuff, or Mach RPC for other stuff. All of this is documented at http://developer.apple.com

Unfortunately he does not give the exact/direct link on the Apple website.

Perhaps that gives you a hint where to look at ?
guy rabiller | radfac founder / ceo | raafal.org
Post Reply