Seite 1 von 1

Re: #PB_Event_SizeWindow

Verfasst: 10.12.2014 19:21
von Shardik
Hier ist eine plattform-übergreifende Lösung für MacOS X (getestet auf MacOS X 10.9.5 Mavericks mit PB 5.31 x86 und x64 im ASCII- und Unicode-Modus), Linux (getestet mit PB 5.31 auf andLinux/Kubuntu 9.04 x86 mit KDE, Lubuntu 14.04 x86 mit LXDE und Ubuntu 14.04 x86 mit Unity) und Windows (getestet mit PB 5.31 auf Windows XP SP3 und Windows 7 SP1 x86).

Die MacOS-Lösung ist ähnlich wie in Windows (in MacOS löst die Notification NSWindowDidEndLiveResizeNotification den Aufruf des Callbacks aus, wenn die Fenstergrößenänderung beendet ist).

In Linux ist die Lösung weniger elegant, da in GTK2 und GDK2 kein spezielles Event bei Beendigung einer Fenstergrößenänderung vorhanden ist (weil das zugrunde liegende XWindow dies anscheinend nicht unterstützt, vielleicht ändert sich dies ja zukünftig mit dem neuen Wayland...). Daher wird ein Timer genutzt, der nach Ablauf von 200 Millisekunden ohne Fenstergrößenänderung die entsprechende Meldung ausgibt, indem das neu definierte Event #PB_Event_WindowResized mit PostEvent() in die WindowEvent-Schleife eingespeist wird.

Code: Alles auswählen

EnableExplicit

#PB_Event_WindowResized = #PB_Event_FirstCustomValue

CompilerSelect #PB_Compiler_OS
  CompilerCase #PB_OS_Linux ; -------------------------------------------------
    #Timeout = 200

    Define TimerID.I

    ProcedureC ResizingFinished(*UserData)
      Shared TimerID.I

      TimerID = 0
      PostEvent(#PB_Event_WindowResized, 0, 0)

      ProcedureReturn #False
    EndProcedure

    ProcedureC WindowCallback(*Window.GtkWindow, *Event.GdkEventConfigure,
      *UserData)
      Shared TimerID.I

      If TimerID
        g_source_remove_(TimerID)
      EndIf

      TimerID = g_timeout_add_(#Timeout, @ResizingFinished(), 0)

      ProcedureReturn #False
    EndProcedure
  CompilerCase #PB_OS_MacOS ; -------------------------------------------------
    ImportC ""
      sel_registerName(MethodName.P-ASCII)
      class_addMethod(Class.I, Selector.I, Implementation.I, Types.P-ASCII)
    EndImport

    ProcedureC WindowCallback(Object.I, Selector.I, Notification.I)
      PostEvent(#PB_Event_WindowResized, 0, 0)
    EndProcedure
  CompilerCase #PB_OS_Windows ; -----------------------------------------------
    Procedure WindowCallback(WindowHandle.I, Msg.I, WParam.I, LParam.I)
      If Msg = #WM_EXITSIZEMOVE
        PostEvent(#PB_Event_WindowResized, 0, 0)
      EndIf
 
      ProcedureReturn #PB_ProcessPureBasicEvents
    EndProcedure
CompilerEndSelect ; -----------------------------------------------------------


If OpenWindow(0, 0, 0, 500, 400,
  "Erkennung der Beendigung einer Fenstergrößenänderung",
  #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_SizeGadget)
  CompilerSelect #PB_Compiler_OS
    CompilerCase #PB_OS_Linux ; -----------------------------------------------
      gtk_widget_add_events_(WindowID(0), #GDK_CONFIGURE)
      g_signal_connect_(WindowID(0), "configure-event", @WindowCallback(), 0)
    CompilerCase #PB_OS_MacOS ; -----------------------------------------------
      Define AppDelegate.I = CocoaMessage(0, CocoaMessage(0, 0,
        "NSApplication sharedApplication"), "delegate")
      Define DelegateClass.I = CocoaMessage(0, AppDelegate, "class")
      Define NotificationCenter.I = CocoaMessage(0, 0,
       "NSNotificationCenter defaultCenter")
      Define Selector.I = sel_registerName("WindowResizeDidEnd:")

      class_addMethod(DelegateClass, Selector, @WindowCallback(), "v@:@")
      CocoaMessage(0, NotificationCenter,
        "addObserver:", AppDelegate,
        "selector:", Selector,
        "name:$", @"NSWindowDidEndLiveResizeNotification",
        "object:", WindowID(0))
    CompilerCase #PB_OS_Windows ; ---------------------------------------------
      SetWindowCallback(@WindowCallback())
  CompilerEndSelect ; ---------------------------------------------------------
 
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        Break
      Case #PB_Event_SizeWindow
        Debug "Fenstergröße wird gerade geändert..."
      Case #PB_Event_WindowResized
        Debug "Fenstergrößenänderung abgeschlossen!"
    EndSelect
  ForEver
EndIf

CompilerIf #PB_Compiler_OS = #PB_OS_MacOS
  CocoaMessage(0, NotificationCenter, "removeObserver:", AppDelegate,
    "name:$", @"NSWindowDidEndLiveResizeNotification", "object:", 0)
CompilerEndIf