Aktuelle Zeit: 30.09.2020 19:50

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Re: #PB_Event_SizeWindow
BeitragVerfasst: 10.12.2014 19:21 
Offline
Benutzeravatar

Registriert: 25.01.2005 12:19
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:
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


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 20 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye