#WM_LBUTTONUP equivalent under linux?

Linux specific forum
Num3
PureBasic Expert
PureBasic Expert
Posts: 2812
Joined: Fri Apr 25, 2003 4:51 pm
Location: Portugal, Lisbon
Contact:

#WM_LBUTTONUP equivalent under linux?

Post by Num3 »

I've used google and forum search, but no luck :$

Anyone knows if there is an equivalent to #WM_LBUTTONUP ??
walker
Enthusiast
Enthusiast
Posts: 634
Joined: Wed May 05, 2004 4:04 pm
Location: Germany

Re: #WM_LBUTTONUP equivalent under linux?

Post by walker »

You need to connect the signal "button-release-event" to your button

i.e. g_signal_connect_object_(*widget,"button-release-event",@yourprocedurename(),#Null,#Null)
or
g_signal_connect_data_(*widget,"button-release-event",@yourprocedurename(),userl_data,#Null,#Null)

if you want to pass some data to your procedure when called

at least you'll need a procedure like this one to react on the release event ...

yourProcedureName(*widget, *event, *user_data)
;
;
Endprocedure

thats all

I recommend you to install DEVHELP (if not already installed as you use linux Mint ... afaik :-.)) as there are nearly all essential docs in one place


edit: if you use PB-Gadgets, you can use Gadgetid(gadget) as *widget to connect the event
devashe
New User
New User
Posts: 1
Joined: Thu Aug 19, 2010 3:31 am

Re: #WM_LBUTTONUP equivalent under linux?

Post by devashe »

walker! Could you please post a complete example?
walker
Enthusiast
Enthusiast
Posts: 634
Joined: Wed May 05, 2004 4:04 pm
Location: Germany

Re: #WM_LBUTTONUP equivalent under linux?

Post by walker »

Sorry for the delay.....

In my post above some informations are missing ....

Here an example of all possible (and usefull) events that can be used by a button:

Code: Select all

;************************************************
; Demo to show the use of Events of buttons beside
; the usual "clicked" ;-) behavior
; 2010 walker
; tested on Linux Mint x64 --- PB 4.51 RC2
;************************************************

EnableExplicit
Define hwnd
Define event, quit
Define b1, t1
Define *w_id.GtkWidget

ProcedureC button_clicked(*widget, *signal, user_data)
    ;*widget contains the data given at creation time of this handler 
    ;*signal contains the detailed signal
    SetGadgetText(*widget,GetGadgetText(*widget)+"clicked"+#CRLF$)    
EndProcedure

ProcedureC button_released(*widget, *signal, user_data)
    SetGadgetText(*widget,GetGadgetText(*widget)+"bye bye"+#CRLF$)
EndProcedure

ProcedureC button_pressed(*widget, *signal, user_data)
    SetGadgetText(*widget,GetGadgetText(*widget)+"hello there"+#CRLF$)
EndProcedure

ProcedureC button_enter(*widget, *signal, user_data)
    SetGadgetText(*widget,"touched"+#CRLF$)    
EndProcedure

ProcedureC button_leave(*widget, *signal, user_data)
    SetGadgetText(*widget,"away...")
EndProcedure

hwnd = OpenWindow(#PB_Any, 0, 0, 500, 300, "Button Event", #PB_Window_ScreenCentered | #PB_Window_SystemMenu)

If hwnd
    *w_id = WindowID(hwnd);use the structure of the widgets to access the gdk window id... which is necessary for setting the event mask; see below
    b1    = ButtonGadget(#PB_Any, 10, 10, 100, 30, "button :-)")    
    t1    = EditorGadget(#PB_Any, 10, 80, 250, 200)

    g_signal_connect_data_(GadgetID(b1), "clicked", @button_clicked(), t1, #Null, #G_CONNECT_SWAPPED)
    g_signal_connect_data_(GadgetID(b1), "button_release_event", @button_released(), t1, #Null, #G_CONNECT_SWAPPED)
    g_signal_connect_data_(GadgetID(b1), "button_press_event", @button_pressed(), t1, #Null, #G_CONNECT_SWAPPED)

    g_signal_connect_data_(GadgetID(b1), "enter-notify-event", @button_enter(), t1, #Null, #G_CONNECT_SWAPPED)
    g_signal_connect_data_(GadgetID(b1), "leave-notify-event", @button_leave(), t1, #Null, #G_CONNECT_SWAPPED)
    gdk_window_set_events_(*w_id\window, #GDK_ALL_EVENTS_MASK);here we are using the gdk window id for setting the event mask necessary for the button press and release event
                                                                                                                    ; NOT for the enter and leave events or the clicked event.... they are enabled by default
EndIf

Repeat
    event = WaitWindowEvent(1)
    If event = #PB_Event_CloseWindow
        quit = 1
    EndIf

Until quit = 1
End

this should be quite self-explanatory .. but if you have questions ... ask :D

[Edit] added the missing C to Procedure ......
Last edited by walker on Fri Aug 27, 2010 10:12 pm, edited 1 time in total.
freak
PureBasic Team
PureBasic Team
Posts: 5940
Joined: Fri Apr 25, 2003 5:21 pm
Location: Germany

Re: #WM_LBUTTONUP equivalent under linux?

Post by freak »

You have to use ProcedureC for the signal callbacks or you will get problems on x86.
quidquid Latine dictum sit altum videtur
walker
Enthusiast
Enthusiast
Posts: 634
Joined: Wed May 05, 2004 4:04 pm
Location: Germany

Re: #WM_LBUTTONUP equivalent under linux?

Post by walker »

Oh ... damned ... I forget this little C all the time since I use the x64 version .... :shock:
must write a reminder to myself.... :roll:
lakomet
User
User
Posts: 53
Joined: Mon Apr 04, 2011 3:56 am
Location: Russia,Angarsk

Re: #WM_LBUTTONUP equivalent under linux?

Post by lakomet »

Hello. walker Why your code does not work with ImageGadget () and TextGadget ()?
Linux Mint Maya(Mate), x86, PureBasic 5.00(5.10b1)
walker
Enthusiast
Enthusiast
Posts: 634
Joined: Wed May 05, 2004 4:04 pm
Location: Germany

Re: #WM_LBUTTONUP equivalent under linux?

Post by walker »

Hi,

it doesn't work for the imagegadget because the imagegadget does not receive any event
you can use a workaround for tis type of gadget by placing it into an event-box :wink:

the following code is written down from my mind .. could not test it ATM as i have only windows available

Code: Select all

*image.GtkWidget
*event_box.GtkWidget

*image = gtk_image_new_from_file_("myfile.png");
*event_box = gtk_event_box_new_();
gtk_container_add_(*event_box, *image);
g_signal_connect_(*event_box, "button_press_event",@button_pressed(),*image);

The textgadget does not recognize events others than "changed", "delete-text","insert-text" (maybe it works with an event-box too......) EDIT : this applies for the string-gadget .. not for the textgadget /EDIT

[EDIT]
here is an full example (modified the one above) which shows how to use events in eventless gadgets :wink:
You can see how to manage the different buttons of the mouse too. It was a surprise, that those (eventless) Gadgets are already placed in an Event-box.
@Fred: do you plan this for a future version (implementing events for so far "eventless" gadgets)?

Code: Select all

;************************************************
; Demo to show the use of Events of buttons beside
; the usual "clicked" ;-) behavior
; 2010 walker
; tested on Linux Mint x64 --- PB 4.51 RC2
; ----------------------------
;modified 04/2011
;added events for imagegadget and the textgadget
;lLinux Mint (9) X64 [b]PB 4.60 beta 1[/b]
;************************************************

EnableExplicit
Define hwnd
Define event, quit
Define b1, t1, im, image, t2
Define *w_id.GtkWidget, *event_box.GtkWidget,*event_box2.GtkWidget

ProcedureC button_clicked(*widget, *signal, user_data)
    ;*widget contains the data given at creation time of this handler
    ;*signal contains the detailed signal
    SetGadgetText(*widget, GetGadgetText(*widget) + "clicked" + #CRLF$)
EndProcedure

ProcedureC button_released(*widget, *signal, user_data)
    SetGadgetText(*widget, GetGadgetText(*widget) + "bye bye" + #CRLF$)
EndProcedure

ProcedureC button_pressed(*widget, *signal, user_data)
    SetGadgetText(*widget, GetGadgetText(*widget) + "hello there" + #CRLF$)
EndProcedure

ProcedureC button_enter(*widget, *signal, user_data)
    SetGadgetText(*widget, "touched" + #CRLF$)
EndProcedure

ProcedureC button_leave(*widget, *signal, user_data)
    SetGadgetText(*widget, "away...")
EndProcedure

ProcedureC image_enter(*widget, *signal, user_data)
    SetGadgetText(user_data, "entering image.....")
EndProcedure

ProcedureC image_leave(*widget, *signal, user_data)
    SetGadgetText(user_data, "image left.....")
EndProcedure

ProcedureC image_clicked(*widget, *signal, user_data)
    Protected image              = CreateImage(#PB_Any, 50, 50, 32)
    Protected *eb.GdkEventButton = *signal
    StartDrawing(ImageOutput(image))
    DrawingMode(#PB_2DDrawing_AlphaChannel)
    Box(0, 0, 50, 50, RGBA(0, 0, 0, 0))
    DrawingMode(#PB_2DDrawing_AlphaBlend)
    Circle(25, 25, 25, RGBA(Random(255), Random(255), Random(255), 255))
    StopDrawing()
    SetGadgetState(user_data, ImageID(image))
    Select  *eb\button
        Case 1
            Debug "left mousebutton"
            If *eb\type = #GDK_2BUTTON_PRESS
                Debug "----  doubleclick -----"
            EndIf
        Case 2
            Debug "middle mousebutton"
        Case 3
            Debug "right mousebutton"
    EndSelect

EndProcedure


ProcedureC text_enter(*widget, *signal, user_data)
    SetGadgetText(user_data, "mouse over  text .....")
EndProcedure

ProcedureC text_leave(*widget, *signal, user_data)
    SetGadgetText(user_data, "text left.....")
EndProcedure

ProcedureC text_pressed(*widget, *signal, user_data)
    Protected inp.s=InputRequester("enter text","Enter new text","")
    SetGadgetText(user_data, inp)
EndProcedure


hwnd = OpenWindow(#PB_Any, 0, 0, 500, 300, "Button Event", #PB_Window_ScreenCentered | #PB_Window_SystemMenu)

If hwnd
    *w_id = WindowID(hwnd);use the structure of the widgets to access the gdk window id... which is necessary for setting the event mask; see below
    b1    = ButtonGadget(#PB_Any, 10, 10, 100, 30, "button :-)")
    t1    = EditorGadget(#PB_Any, 10, 80, 250, 200)
    t2= TextGadget(#PB_Any,300,100,150,30,"this is a textgadget")
    image = CreateImage(#PB_Any, 50, 50, 32)
    StartDrawing(ImageOutput(image))
    DrawingMode(#PB_2DDrawing_AlphaChannel)
    Box(0, 0, 50, 50, RGBA(0, 0, 0, 00))
    DrawingMode(#PB_2DDrawing_AlphaBlend)
    Circle(25, 25, 25, RGBA(100, 500, 20, 255))
    StopDrawing()
    im = ImageGadget(#PB_Any, 200, 10, 50, 50, ImageID(image))

    *event_box = gtk_widget_get_parent_(GadgetID(im));surprise surprise .. the imagegadget is already placed in an event-box... 
    *event_box2=gtk_widget_get_parent_(GadgetID(t2));this too .... 
       
    g_signal_connect_(*event_box, "enter-notify-event", @image_enter(), t1)
    g_signal_connect_(*event_box, "leave-notify-event", @image_leave(), t1)
    g_signal_connect_(*event_box, "button_press_event", @image_clicked(), im)
    
    g_signal_connect_(*event_box2, "enter-notify-event", @text_enter(), t1)
    g_signal_connect_(*event_box2, "leave-notify-event", @text_leave(), t1)
    g_signal_connect_(*event_box2, "button_press_event", @text_pressed(), t2)
    
    g_signal_connect_data_(GadgetID(b1), "clicked", @button_clicked(), t1, #Null, #G_CONNECT_SWAPPED)
    g_signal_connect_data_(GadgetID(b1), "button_release_event", @button_released(), t1, #Null, #G_CONNECT_SWAPPED)
    g_signal_connect_data_(GadgetID(b1), "button_press_event", @button_pressed(), t1, #Null, #G_CONNECT_SWAPPED)

    g_signal_connect_data_(GadgetID(b1), "enter-notify-event", @button_enter(), t1, #Null, #G_CONNECT_SWAPPED)
    g_signal_connect_data_(GadgetID(b1), "leave-notify-event", @button_leave(), t1, #Null, #G_CONNECT_SWAPPED)


    gdk_window_set_events_(*w_id\window, #GDK_ALL_EVENTS_MASK);here we are using the gdk window id for setting the event mask necessary for the button press and release event
    ;                                                                                                                NOT for the enter and leave events or the clicked event.... they are enabled by default


EndIf

Repeat
    event = WaitWindowEvent(1)
    If event = #PB_Event_CloseWindow
        quit = 1
    EndIf

Until quit = 1
End
lakomet
User
User
Posts: 53
Joined: Mon Apr 04, 2011 3:56 am
Location: Russia,Angarsk

Re: #WM_LBUTTONUP equivalent under linux?

Post by lakomet »

Hello. Thanks walker, it work perfectly. There is no event #WM_LBUTTONUP, but now have made CanvasGadget(), in it all works. Once again thanks for the answer. Excuse for bad English.
Linux Mint Maya(Mate), x86, PureBasic 5.00(5.10b1)
Post Reply