Hi Axel,

Axel Simon <axel.si...@in.tum.de> writes:

> On 30.06.2010, at 17:34, Andy Stewart wrote:
>>>>
>>>> So my question is how to binding gtk_main_do_event ?
>>>> Looks I should use Graphics.UI.Gtk.Gdk.Events.Event and not EventM.
>>>>
>>>
>>> Event is deprecated and will be removed soon. The problem with the C
>>> Event structure is that it can contains pointers and varying fields.
>>> Event did not mangage to translate all of them, also because new  
>>> event
>>> are being added to Gtk+ occasionally. If you want to convert a C  
>>> Event
>>> structure completely to Haskell, send it over the network and then
>>> reemit the event inside a different application, I suggest that you
>>> start with the Event module and create an opaque but serializable  
>>> data
>>> type. This data type should contain some events of interest (keys,
>>> mouse) but not all events. You would probably need to re-insert the
>>> time stamp of the event when you reemit it in the other application.
>>>
>>> If you implement this, then the extraction of an event should be a
>>> function
>>>
>>> serializeEvent :: EventM t SerializedEvent
>>>
>>> that runs in the EventM monad. It should throw an exception if it is
>>> applied to an event that it can't handle.
>>>
>>> Then at the client side, we can implement gtk_main_do_event as
>>>
>>> mainDoEvent :: EventM t ()
>>>
>>> and have
>>>
>>> deserializeEvent :: SerializedEvent -> (EventM t a) -> IO a
>>>
>>> which executes any EventM function with the serialized event.
>>>
>>> Let me know if you need further help. The functions in Event.hs may
>>> help you to get started with marshalling the events, but you should
>>> use the EventM interface as described above.
>> For make problem simpler, let us just think GdkEventKey.
>>
>> I have below SerializedEventKey for serialized the value of  
>> GdkEventKey
>> on *Server* side.
>>
>> data SerializedEventKey =
>>                    -- sEventType          :: Int               --  
>> get EventType when deserialize
>
> No, you need to get the event type from the event itself. You don't  
> know what the event type is at the deserialisation point.
>
>>                    -- ,sEventWindow       :: DrawWindow        --  
>> get DrawWindow when deserialize
>>                    -- ,sEventTime         :: TimeStamp         --  
>> get TimeStamp when deserialize
>>
>>    SerializedEventKey {sEventSent         :: Bool
>>                       ,sEventState        :: [Modifier]
>>                       ,sEventKeyval       :: KeyVal
>>                       ,sEventLength       :: Int
>>                       ,sEventString       :: String
>>                       ,sEventKeycode      :: Word16
>>                       ,sEventGroup        :: Word8
>>                       ,sEventIsModifier   :: Bool}
>>
>> I use below function to pick-up SerializeEventKey value from EventM
>> monad at *Server* side:
>>
>> serializedEventKey :: EventM EKey SerializedEventKey
>> serializedEventKey = do
>>  sent       <- eventSent
>>  state      <- eventModifier
>>  keyval     <- eventKeyVal
>>  string     <- eventKeyName
>>  keycode    <- eventHardwareKeycode
>>  group      <- eventKeyboardGroup
>>  liftIO $ return $
>>    SerializedEventKey sent
>>                       state
>>                       keyval
>>                       (length string)
>>                       string
>>                       keycode
>>                       group
>>                       False
>>
>
> Ok. I was suggesting a function that can deal with several, different  
> events. You could copy and paste code from the deprecated Event module.
>
>> Now we can send SerializedEventKey value to *client* side through
>> DBus-system.
>>
>> When *client* receive the value of SerializedEventKey,
>> We can use
>>
>> "deserializeEvent :: SerializedEventKey -> IO EventKey"
>>
>> add three new values:
>>
>>    sEventType          : GDK_KEY_RELEASE or GDK_KEY_PRESS
>>    sEventWindow        : The DrawWindow of *client* that event focus
>>    sEventTime          : The TimeStamp when *client* process re-emit  
>> key event
>>
>> to re-build EventKey.
>>
>> Because gtk_main_do_event need GdkEvent, so we transfer EventKey to
>> is okay.
>>
>
> What is EventKey?
>
> What EventM is doing is to wrap a pointer to a C event struct. So your  
> EventKey could be a ForeignPtr to a C event struct and mainDoEvent  
> could take this ForeignPtr and call the main_do_event function with it.
>
> Or you could provide a function
>
>>> deserializeEvent :: SerializedEvent -> (EventM t a) -> IO a
>
> that executes the action with a pointer to a C event struct (and  
> destroys the memory associated with this pointer after the action has  
> finished). The mainDoEvent can send this event by reading this pointer.
>
> The advantages:
>
> - you can use mainDoEvent not only on deserialized events, but also on  
> local events in any event callback
> - you can use other functions to query a deserialized event, e.g., you  
> could check if the deserialized event is a left-mouse-button click and  
> only call mainDoEvent on those
>
> It's more consistent with the rest of the interface.
I success!

Code at
https://patch-tag.com/r/AndyStewart/gtk-serialized-event/snapshot/current/content/pretty/Graphics/UI/Gtk/Gdk/SerializedEvent.hsc

Can you help me review it?

In EventM, 

   sEvent <- serializedEvent
   
will got SerializedEventValue, you can pass SerializedEventValue over the 
network.

When client receive SerializedEventValue from network, client can use
below code propagate same event at child process:

     drawWindow <- widgetGetDrawWindow targetWidget
     postGUIAsync $ deserializeEvent event drawWindow (widgetEvent 
targetWidget) >> return ()
     
Demo at
https://patch-tag.com/r/AndyStewart/gtk-serialized-event/snapshot/current/content/pretty/demo/Main.hs

To test demo program, you need install below packages: 

   dbus-core, dbus-client, webkit
   
and apply the patch i send.

Here is demo screenshot : 
http://farm5.static.flickr.com/4080/4758242386_5230d3d54d_b.jpg

Since Events.hsc has deprecated, i guess you don't like SerializedEvent style.
I need merge SerializedEvent.hsc into gtk2hs or release it as individual 
package?

Cheers,

  -- Andy





------------------------------------------------------------------------------
This SF.net email is sponsored by Sprint
What will you do first with EVO, the first 4G phone?
Visit sprint.com/first -- http://p.sf.net/sfu/sprint-com-first
_______________________________________________
Gtk2hs-devel mailing list
Gtk2hs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/gtk2hs-devel

Reply via email to