Hook-System

Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Neue Antwort erstellen

Geeecko

Betreff: Hook-System

BeitragSo, Dez 07, 2008 21:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Wer kennt das nicht?
Man hat eine sehr große Select-Case Sammlung untereinander, weil man jedes Fenster "abfragen" muss.
Aber es interessieren einen nur ganz bestimme Fenster...
Das Problem ist nun mehr oder weniger gelöst!
Ich habe mir ein Hook-System zusammen gebaut habe, welches Events sortiert.
Man kann Filter erstellen, und diese Registrieren.
Jeder Filter hat eine Funktion, welche aufgerufen wird, fals ein Event durchkommt.
Ein Event wird auf folgende Sachen überprüft:
Code: [AUSKLAPPEN]

id
extra
data
source
x
y

Das sind alle "Sachen" in einem Event. Man kann so viele Werte wie man möchte hinzufügen.
Hier ein Beispiel:
Code: [AUSKLAPPEN]

'Treiber
Import maxgui.drivers

'Fenster erstellen
Global Window:TGadget = CreateWindow("Test-Fenster",0,0,500,500)

'Hook hinzufügen
Global MyHook:THookFilter = THookFilter.NormalHook(MyTestHook)
     MyHook.AddID(EVENT_WINDOWMOVE)
     MyHook.AddID(EVENT_WINDOWCLOSE)
THookSystem.RegisterHook(myhook)

'Schleife
Repeat
WaitEvent
Forever

'Hook-Funktion
Function MyTestHook(Event:TEvent)
   Print Event.toString()
End Function


Es wird ein Filter erstellt, die Funktion MytestHook zugewiesen und 2 ID´s hinzugefügt.
Die Funktion wird also nur aufgerufen, wenn ein Fenster bewegt worden ist, oder geschlossen.

Es gibt folgende Funktionen:
Code: [AUSKLAPPEN]

THookSystem.RegisterHook(Filter:THookFilter)  - Registriert einen Filter
THookSystem.UnregisterHook(Filter:THookFilter) - Löscht einen Filter


Code: [AUSKLAPPEN]

THookFilter.AddData(data:int) - Fügt "data" hinzu
THookFilter.AddExtra(extra:object)
THookFilter.AddSource(source:object)
THookFilter.AddID(id:int)
THookFilter.AddX(x:int)
THookFilter.AddY(y:int)
THookFilter.RemoveData() - Löscht die "daten" liste. "data" wird ignoiert
THookFilter.RemoveExtra()
THookFilter.RemoveID()
THookFilter.RemoveX()
THookFilter.RemoveY()
THookFilter.NormalHook(func(event:TEvent)) - Liefert einen Fitler zurück, der ALLE Events durchlässt


Hier der eigentliche Code:

Code: [AUSKLAPPEN]

Type THookSystem
   Global HookFilterList:TList
   Global initED:Int

   '###Initialisiert das Hooksystem
   Function Init()
      THookSystem.HookFilterList = New TList
      AddHook(EmitEventHook, TempHook)
      THookSystem.initED = True
   End Function
   
   
   '###Registriert ein "Hook"
   Function RegisterHook(HookFilter:THookFilter)
      If THookSystem.InitED = False Then THookSystem.Init()
      THookSystem.HookFilterList.AddLast(HookFilter)
   End Function
   
   
   '###Löscht einen "Hook"
   Function UnregisterHook(HookFilter:THookFilter)
      If THookSystem.InitED = False Then THookSystem.Init()
      THookSystem.HookFilterList.FindLink(HookFilter).Remove()
   End Function
End Type

'###Diese Funktion leitet die Events nur weiter
Function TempHook:Object(id:Int, data:Object, context:Object)
   If THookSystem.InitED = False Then THookSystem.Init()
   
   Local event:TEvent = TEvent(data)
   
   '###HookFilters durchgehen und vergleichen
   For Local HookFilter:THookFilter = EachIn THookSystem.HookFilterList
      
      Local okay:Int = True 'Wird auf false gesetzt, fals eine Option nicht übereinstimmt
   
      '###Data
         If HookFilter.data_list And okay Then
            For Local data_object:THookFilterObject = EachIn HookFilter.data_list
               If data_object._int <> event.data Then
                  okay = False
               Else
                  okay = True
                  Exit
               EndIf
            Next
         End If
         
      '###Extra
         If HookFilter.extra_list And okay Then
            For Local extra_object:THookFilterObject = EachIn HookFilter.extra_list
               If extra_object._object <> event.extra Then
                  okay = False
               Else
                  okay = True
                  Exit
               EndIf
            Next
         EndIf
         
      '###ID
         If HookFilter.id_list And okay Then
            For Local id_object:THookFilterObject = EachIn HookFilter.id_list
               If id_object._int <> event.id Then
                  okay = False
               Else
                  okay = True
                  Exit
               EndIf
            Next
         End If
         
      '###Source
         If HookFilter.source_list And okay Then
            For Local source_object:THookFilterObject = EachIn HookFilter.source_list
               If source_object._object <> event.source Then
                  okay = False
               Else
                  okay = True
                  Exit
               EndIf
            Next
         End If
      
      '###X
         If HookFilter.x_list And okay Then
            For Local x_object:THookFilterObject = EachIn HookFilter.x_list
               If x_object._int <> event.x Then
                  okay = False
               Else
                  okay = True
                  Exit
               EndIf
            Next
         End If
         
      '###Y
         If HookFilter.y_list And okay Then
            For Local y_object:THookFilterObject = EachIn HookFilter.y_list
               If y_object._int <> event.y Then
                  okay = False
               Else
                  okay = True
                  Exit
               EndIf
            Next
         End If
            
      '###Wenn okay = true ist, dann das event weiterleiten
         If okay Then HookFilter.func(event)
   Next
End Function


'###Informationen für das HookSystem welche Events weitergeleitet sollen und welche nicht
Type THookFilter
   '###Listen welche übereinstimmen müssen (wenn die liste NULL ist, wird die "gruppe" ignoiert)
   Field data_list:TList
   Field extra_list:TList
   Field id_list:TList
   Field source_list:TList
   Field x_list:TList
   Field y_list:TList
   Field func(event:TEvent)   'Funktion die aufgerufen werden soll
   
   
   '###Fügt etwas zu "data" hinzu
   Method AddData(data:Int)
      If Not Self.data_list Then Self.data_list = New TList
      Local data_object:THookFilterObject = New THookFilterObject
           data_object._int = data
      Self.data_list.AddLast(data_object)
   End Method
   
   
   '###Fügt etwas zu "extra" hinzu
   Method AddExtra(extra:Object)
      If Not Self.extra_list Then Self.extra_list = New TList
      Local extra_object:THookFilterObject = New THookFilterObject
           extra_object._object = extra
      Self.extra_list.AddLast(extra_object)
   End Method
   
   
   '###Fügt etwas zu "source" hinzu
   Method AddSource(source:Object)
      If Not Self.source_list Then Self.source_list = New TList
      Local source_object:THookFilterObject = New THookFilterObject
           source_object._object = source
      Self.source_list.AddLast(source_object)
   End Method
   
   
   '###Fügt etwas zu "id" hinzu
   Method AddID(id:Int)
      If Not Self.id_list Then Self.id_list = New TList
      Local id_object:THookFilterObject = New THookFilterObject
           id_object._int = id
      Self.id_list.AddLast(id_object)
   End Method
   
   
   '###Fügt etwas zu "id" hinzu
   Method AddX(x:Int)
      If Not Self.x_list Then Self.x_list = New TList
      Local x_object:THookFilterObject = New THookFilterObject
           x_object._int = x
      Self.x_list.AddLast(x_object)
   End Method
   
   
   '###Fügt etwas zu "y" hinzu
   Method AddY(y:Int)
      If Not Self.y_list Then Self.y_list = New TList
      Local y_object:THookFilterObject = New THookFilterObject
           y_object._int = y
      Self.y_list.AddLast(y_object)
   End Method
   
   
   '###Löscht die "data"-liste
   Method RemoveData()
      Self.data_list = Null
   End Method
   
   
   '###Löscht die "extra" liste
   Method RemoveExtra()
      Self.extra_list = Null
   End Method
   
   
   '###Löscht die "id" liste
   Method RemoveID()
      Self.id_list = Null
   End Method
   
   
   '###Löscht die "source" liste
   Method RemoveSource()
      Self.source_list = Null
   End Method
   
   
   '###Löscht die "x" liste
   Method RemoveX()
      Self.x_list = Null
   End Method
   

   '###Löscht die "y" liste
   Method RemoveY()
      Self.y_list = Null
   End Method
   
      
   '###Erstellt einn Hook, zu dem ALLE Events weitergeleitet werden
   Function NormalHook:THookFilter(func(event:TEvent))
      Local HookFilter:THookFilter = New THookFilter
           HookFilter.data_list = Null
           HookFilter.extra_list = Null
           HookFilter.id_list = Null
           HookFilter.source_list = Null
           HookFilter.x_list = Null
           HookFilter.y_list = Null
           HookFilter.func = func
      Return HookFilter
   End Function
End Type

'###Hier drin können Werte in einem object abgepsiehcert werden
Type THookFilterObject
   Field _int:Int
   Field _string:String
   Field _object:Object
End Type


ich hoffe es gefällt so einigermaßen xD
Ich kann es gut gebrauchen!

PS: Ich weiß, das es davon schon einige Sachen gibt, aber ich habs selber gemacht Wink

lg MD

Geeecko

BeitragSa, Dez 20, 2008 22:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe noch ein paar Bugs entfernt.
Jetzt sollte alles Funktionieren.
Funktionen sind kommentiert.
Viel Spaß!

Code: [AUSKLAPPEN]

Type THookSystem
   Global HookFilterList:TList
   Global initED:Int

   '###Initialisiert das Hooksystem
   Function Init()
      THookSystem.HookFilterList = New TList
      AddHook(EmitEventHook, TempHook)
      THookSystem.initED = True
   End Function
   
   
   '###Registriert ein "Hook"
   Function RegisterHook(HookFilter:THookFilter)
      If THookSystem.InitED = False Then THookSystem.Init()
      THookSystem.HookFilterList.AddLast(HookFilter)
   End Function
   
   
   '###Löscht einen "Hook"
   Function UnregisterHook(HookFilter:THookFilter)
      If THookSystem.InitED = False Then THookSystem.Init()
      THookSystem.HookFilterList.FindLink(HookFilter).Remove()
   End Function
End Type

'###Diese Funktion leitet die Events nur weiter
Function TempHook:Object(id:Int, data:Object, context:Object)
   If THookSystem.InitED = False Then THookSystem.Init()
   
   Local event:TEvent = TEvent(data)
   
   '###HookFilters durchgehen und vergleichen
   For Local HookFilter:THookFilter = EachIn THookSystem.HookFilterList
       
      Local okay:Int = True 'Wird auf false gesetzt, fals eine Option nicht übereinstimmt
   
      '###Data
         If HookFilter.data_list And okay Then
            For Local data_object:THookFilterObject = EachIn HookFilter.data_list
               If data_object._int <> event.data Then
                  okay = False
               Else
                  okay = True
                  Exit
               EndIf
            Next
         If HookFilter.data_list.Count() = 0 Then okay = False
         End If
         
      '###Extra
         If HookFilter.extra_list And okay Then
            For Local extra_object:THookFilterObject = EachIn HookFilter.extra_list
               If extra_object._object <> event.extra Then
                  okay = False
               Else
                  okay = True
                  Exit
               EndIf
            Next
         If HookFilter.extra_list.Count() = 0 Then okay = False
         EndIf
         
      '###ID
         If HookFilter.id_list And okay Then
            For Local id_object:THookFilterObject = EachIn HookFilter.id_list
               If id_object._int <> event.id Then
                  okay = False
               Else
                  okay = True
                  Exit
               EndIf
            Next
         If HookFilter.id_list.Count() = 0 Then okay = False
         End If
         
      '###Source
         If HookFilter.source_list And okay Then
            For Local source_object:THookFilterObject = EachIn HookFilter.source_list
               If source_object._object <> event.source Then
                  okay = False
               Else
                  okay = True
                  Exit
               EndIf
            Next
         If HookFilter.source_list.Count() = 0 Then okay = False
         End If
       
      '###X
         If HookFilter.x_list And okay Then
            For Local x_object:THookFilterObject = EachIn HookFilter.x_list
               If x_object._int <> event.x Then
                  okay = False
               Else
                  okay = True
                  Exit
               EndIf
            Next
         If HookFilter.x_list.Count() = 0 Then okay = False
         End If
         
      '###Y
         If HookFilter.y_list And okay Then
            For Local y_object:THookFilterObject = EachIn HookFilter.y_list
               If y_object._int <> event.y Then
                  okay = False
               Else
                  okay = True
                  Exit
               EndIf
            Next
         If HookFilter.y_list.Count() = 0 Then okay = False
         End If
             
      '###Wenn okay = true ist, dann das event weiterleiten
         If okay Then HookFilter.func(event)
   Next
End Function


'###Informationen für das HookSystem welche Events weitergeleitet sollen und welche nicht
Type THookFilter
   '###Listen welche übereinstimmen müssen (wenn die liste NULL ist, wird die "gruppe" ignoiert)
   Field data_list:TList
   Field extra_list:TList
   Field id_list:TList
   Field source_list:TList
   Field x_list:TList
   Field y_list:TList
   Field func(event:TEvent)   'Funktion die aufgerufen werden soll
   
   
   '###Fügt etwas zu "data" hinzu
   Method AddData(data:Int)
      If Not Self.data_list Then Self.data_list = New TList
      Local data_object:THookFilterObject = New THookFilterObject
           data_object._int = data
      Self.data_list.AddLast(data_object)
   End Method
   
   
   '###Fügt etwas zu "extra" hinzu
   Method AddExtra(extra:Object)
      If Not Self.extra_list Then Self.extra_list = New TList
      Local extra_object:THookFilterObject = New THookFilterObject
           extra_object._object = extra
      Self.extra_list.AddLast(extra_object)
   End Method
   
   
   '###Fügt etwas zu "source" hinzu
   Method AddSource(source:TGadget)
      If Not Self.source_list Then Self.source_list = New TList
      Local source_object:THookFilterObject = New THookFilterObject
           source_object._object = source
      Self.source_list.AddLast(source_object)
   End Method
   
   
   '###Fügt etwas zu "id" hinzu
   Method AddID(id:Int)
      If Not Self.id_list Then Self.id_list = New TList
      Local id_object:THookFilterObject = New THookFilterObject
           id_object._int = id
      Self.id_list.AddLast(id_object)
   End Method
   
   
   '###Fügt etwas zu "id" hinzu
   Method AddX(x:Int)
      If Not Self.x_list Then Self.x_list = New TList
      Local x_object:THookFilterObject = New THookFilterObject
           x_object._int = x
      Self.x_list.AddLast(x_object)
   End Method
   
   
   '###Fügt etwas zu "y" hinzu
   Method AddY(y:Int)
      If Not Self.y_list Then Self.y_list = New TList
      Local y_object:THookFilterObject = New THookFilterObject
           y_object._int = y
      Self.y_list.AddLast(y_object)
   End Method
   
   
   '###Löscht die "data"-liste
   Method RemoveData()
      Self.data_list = Null
   End Method
   
   
   '###Löscht die "extra" liste
   Method RemoveExtra()
      Self.extra_list = Null
   End Method
   
   
   '###Löscht die "id" liste
   Method RemoveID()
      Self.id_list = Null
   End Method
   
   
   '###Löscht die "source" liste
   Method RemoveSource()
      Self.source_list = Null
   End Method
   
   
   '###Löscht die "x" liste
   Method RemoveX()
      Self.x_list = Null
   End Method
   

   '###Löscht die "y" liste
   Method RemoveY()
      Self.y_list = Null
   End Method
   
       
   '###Erstellt einen Hook, zu dem ALLE Events weitergeleitet werden
   Function CreateEmptyHook:THookFilter(func(event:TEvent))
      Local HookFilter:THookFilter = New THookFilter
           HookFilter.data_list = Null
           HookFilter.extra_list = Null
           HookFilter.id_list = Null
           HookFilter.source_list = Null
           HookFilter.x_list = Null
           HookFilter.y_list = Null
           HookFilter.func = func
      Return HookFilter
   End Function
   
   
   '###Erstellt einen Hook, zu dem keine Events weitergeleitet werden. Optionen müssen erst getroffen werden
   Function CreateNormalHook:THookFilter(func(event:TEvent))
      Local HookFilter:THookFilter = New THookFilter
           HookFilter.data_list = New TList
           HookFilter.extra_list = New TList
           HookFilter.id_list = New TList
           HookFilter.source_list = New TList
           HookFilter.x_list = New TList
           HookFilter.y_list = New TList
           HookFilter.func = func
      Return HookFilter
   End Function
End Type

'###Hier drin können Werte in einem object abgepsiehcert werden
Type THookFilterObject
   Field _int:Int
   Field _string:String
   Field _object:Object
End Type


lg MD

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group