[RESOLVED] How to Trap a GTK Event?

Linux specific forum
Straker
Enthusiast
Enthusiast
Posts: 701
Joined: Wed Apr 13, 2005 10:45 pm
Location: Idaho, USA

Post by Straker »

StanDan you da man!

I was able to test your code and I modified it to include ImageGadget within the Container gadget. I resized the Container gadget to the same size as the ImageGadget to give the illusion that its just an image. Then coded the image switcheroo when capturing the Container events.

Here is the revised code now with hover goodness:

Code: Select all

; From glib-2.0/gobject/gsignal.h:239
; #define g_signal_connect(instance, detailed_signal, c_handler, Data) \
;     g_signal_connect_data ((instance), (detailed_signal), (c_handler), (Data), NULL, (GConnectFlags) 0)

UsePNGImageDecoder()

#MyContainer = 10
#MyButton = 11
#MyImageGadget = 12

#MyImage = 21
#MyImage1 = 22
#MyImage2 = 23

Procedure g_signal_connect(*object, name$, *func, *func_data)
  g_signal_connect_data_(*object, @name$, *func, *func_data, 0, 0)
EndProcedure
ProcedureCDLL BEventCallback(*Widget, *Event.GdkEventAny, user_data)
  Select user_data
   Case 3 : Debug "button enter event"
   Case 4 : Debug "button leave event"
  EndSelect
EndProcedure
ProcedureCDLL CEventCallback(*Widget, *Event.GdkEventAny, user_data)
  Debug Str(*Event\type) + " user_data: " + Str(user_data)
  Select *Event\type
    Case #GDK_DELETE
        Debug "Event: GDK_DELETE: 0"
    Case #GDK_DESTROY
        Debug "Event: GDK_DESTROY: 1"
    Case #GDK_EXPOSE
        Debug "Event: GDK_EXPOSE: 2"
    Case #GDK_MOTION_NOTIFY
        Debug "Event: GDK_MOTION_NOTIFY: 3"
    Case #GDK_BUTTON_PRESS
        Debug "Event: GDK_BUTTON_PRESS: 4"
    Case #GDK_2BUTTON_PRESS
        Debug "Event: GDK_2BUTTON_PRESS: 5"
    Case #GDK_3BUTTON_PRESS
        Debug "Event: GDK_3BUTTON_PRESS: 6"
    Case #GDK_BUTTON_RELEASE
        Debug "Event: GDK_BUTTON_RELEASE: 7"
    Case #GDK_KEY_PRESS
        Debug "Event: GDK_KEY_PRESS: 8"
    Case #GDK_KEY_RELEASE
        Debug "Event: GDK_KEY_RELEASE: 9"
    Case #GDK_ENTER_NOTIFY
        Debug "Event: GDK_ENTER_NOTIFY: 10"
        SetGadgetState(#MyImageGadget,UseImage(#MyImage2))
    Case #GDK_LEAVE_NOTIFY
        Debug "Event: GDK_LEAVE_NOTIFY: 11"
        SetGadgetState(#MyImageGadget,UseImage(#MyImage))
    Case #GDK_FOCUS_CHANGE
        Debug "Event: GDK_FOCUS_CHANGE: 12"
    Case #GDK_CONFIGURE
        Debug "Event: GDK_CONFIGURE: 13"
    Case #GDK_MAP
        Debug "Event: GDK_MAP: 14"
    Case #GDK_UNMAP
        Debug "Event: GDK_UNMAP: 15"
    Case #GDK_PROPERTY_NOTIFY
        Debug "Event: GDK_PROPERTY_NOTIFY: 16"
    Case #GDK_SELECTION_CLEAR
        Debug "Event: GDK_SELECTION_CLEAR: 17"
    Case #GDK_SELECTION_REQUEST
        Debug "Event: GDK_SELECTION_REQUEST: 18"
    Case #GDK_SELECTION_NOTIFY
        Debug "Event: GDK_SELECTION_NOTIFY: 19"
    Case #GDK_PROXIMITY_IN
        Debug "Event: GDK_PROXIMITY_IN: 20"
    Case #GDK_PROXIMITY_OUT
        Debug "Event: GDK_PROXIMITY_OUT: 21"
    Case #GDK_DRAG_ENTER
        Debug "Event: GDK_DRAG_ENTER: 22"
    Case #GDK_DRAG_LEAVE
        Debug "Event: GDK_DRAG_LEAVE: 23"
    Case #GDK_DRAG_MOTION
        Debug "Event: GDK_DRAG_MOTION: 24"
    Case #GDK_DRAG_STATUS
        Debug "Event: GDK_DRAG_STATUS: 25"
    Case #GDK_DROP_START
        Debug "Event: GDK_DROP_START: 26"
    Case #GDK_DROP_FINISHED
        Debug "Event: GDK_DROP_FINISHED: 27"
    Case #GDK_CLIENT_EVENT
        Debug "Event: GDK_CLIENT_EVENT: 28"
    Case #GDK_VISIBILITY_NOTIFY
        Debug "Event: GDK_VISIBILITY_NOTIFY: 29"
    Case #GDK_NO_EXPOSE
        Debug "Event: GDK_NO_EXPOSE: 30"
    Case #GDK_SCROLL
        Debug "Event: GDK_SCROLL: 31"
    Case #GDK_WINDOW_STATE
        Debug "Event: GDK_WINDOW_STATE: 32"
  EndSelect
EndProcedure

If OpenWindow(0,0,0,345,105,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"Event Test") And CreateGadgetList(WindowID(0))
  ;ButtonGadget(#MyButton, 200, 10, 100, 30, "Test")
  ContainerGadget(#MyContainer, 10,10,91,55,#PB_Container_BorderLess)   
  ; connect the signals...
  
  LoadImage(#MyImage,"/home/ubuntu/normal.png")
  LoadImage(#MyImage2,"/home/ubuntu/highlight.png")

  ImageGadget(#MyImageGadget, 0, 0, 87, 51, UseImage(#MyImage)) 
  
  gtk_widget_add_events_(*GadgetID(#MyContainer), #GDK_ENTER_NOTIFY_MASK|#GDK_LEAVE_NOTIFY_MASK)
  
  g_signal_connect(*GadgetID(#MyContainer), "event", @CEventCallback(), 1) 
  ;g_signal_connect(*GadgetID(#MyButton), "enter-notify-event", @BEventCallback(), 3)
  ;g_signal_connect(*GadgetID(#MyButton), "leave-notify-event", @BEventCallback(), 4)
  Repeat
     EventID = WaitWindowEvent()         
     Select EventID     
       Case #PB_Event_Gadget
         Select EventGadgetID()
           Case #MyContainer : Debug "Container clicked!"
           ;Case #MyButton : Debug "Button clicked!"
         EndSelect     
     EndSelect
   Until EventID = #PB_Event_CloseWindow   
EndIf 
Here are the images:
Normal:
Image

Highlight:
Image

BTW, I noticed that the container gadget needs to be 4 pixels wider and 4 pixels higher than the image gadget, not a big deal.

Thanks again.
Post Reply