Detect the first 4 joystick buttons in GFXlib 2 clearly!

Post your FreeBASIC tips and tricks here. Please don’t post your code without including an explanation.
Adigun A. Polack
Posts: 230
Joined: May 27, 2005 15:14
Contact:

Detect the first 4 joystick buttons in GFXlib 2 clearly!

Postby Adigun A. Polack » Jul 01, 2005 5:31

For those of you with GFXlib 2 and would want a *much* easier way of detecting the presses of the first four (4) joystick buttons accurately and effectively, please try this code on for size:

Code: Select all

' F o u r - b u t t o n   J o y s t i c k   P r e s s   T e s t
'-------------------------------------------------------------------------
' Presented to you by Adigun Azikiwe Polack for GFXlib 2 and FB v0.14+.

WindowTitle "4-Button Joystick Press Test - FB/GFXlib 2"


Declare Function JoyButton1_Check(CheckButton)
Declare Function JoyButton2_Check(CheckButton)
Declare Function JoyButton3_Check(CheckButton)
Declare Function JoyButton4_Check(CheckButton)

Const Pressed = 1
Const NotPressed = 0

' Set video mode (2 pages) and enter loop
DIM x AS SINGLE, y AS SINGLE, throttle AS SINGLE, buttons AS INTEGER

SCREEN 13, 8, 2, 0

ScreenSet 1, 0

Do
  Cls

  ' Let's get the buttons, x, y, and 3rd axis status of joystick 0;
  ' assuming 3rd axis to be throttle.  We discard other axes.
  GetJoystick 0, buttons, x, y, throttle

  If x < -1.0 then
    ? "Joystick 0 is not available.  Sorry."
  else
    Locate 1, 1
    Color 15, 1: ? " -- Four-button Joystick Press Test --  "
    Color 9, 176
    Locate 2, 1: ? " presented for GFXlib 2 and FB v0.14+   "
    Locate 3, 1: ? "              by Adigun Azikiwe Polack. "

    Color 27, 0: ? "Now supporting the presses of the first"
    ? "four (4) joystick buttons only."
   
    Locate 10, 1
    Color 31: ?  "Testing Joystick 0......"
   
    ' Now, we test the first four (4) joystick buttons to make sure they
    ' work!!  ^_-
    '---------------------------------------------------------------------
    If JoyButton1_Check(buttons)= Pressed then
      Color 90: Locate 12, 4: ? "Button 1 Pressed!"
    else
      Color 210: Locate 12, 4: ? "Button 1 not pressed"
    End if

    If JoyButton2_Check(buttons)= Pressed then
      Color 90: Locate 13, 4: ? "Button 2 Pressed!"
    else
      Color 210: Locate 13, 4: ? "Button 2 not pressed"
    End if

    If JoyButton3_Check(buttons)= Pressed then
      Color 90: Locate 14, 4: ? "Button 3 Pressed!"
    else
      Color 210: Locate 14, 4: ? "Button 3 not pressed"
    End if

    If JoyButton4_Check(buttons)= Pressed then
      Color 90: Locate 15, 4: ? "Button 4 Pressed!"
    else
      Color 210: Locate 15, 4: ? "Button 4 not pressed"
    End if
    '---------------------------------------------------------------------

    ScreenCopy
  End if
Loop While INKEY$ = ""
End






' ========================================================================
' Now, here come the Functions for the *direct* detection of the presses
' of the first four (4) joystick buttons for GFXlib 2 for FB v0.14 and
' above!!  (^-^)v !
' ========================================================================

'_________________________________________________________________________
Function JoyButton1_Check(CheckButton)
If CheckButton > 1000 then Exit Function

If (val(BIN$(CheckButton)) and 1) > 0 then JoyButton1_Check = 1

End Function


'_________________________________________________________________________
Function JoyButton2_Check(CheckButton)
If CheckButton > 1000 then Exit Function

If (val(BIN$(CheckButton)) and 10) > 0 and _
NOT (val(BIN$(CheckButton)) and 10) = 8 then

  JoyButton2_Check = 1

End if

End Function


'_________________________________________________________________________
Function JoyButton3_Check(CheckButton)
If CheckButton > 1000 then Exit Sub

If (val(BIN$(CheckButton)) and 100) > 0 and _
NOT (val(BIN$(CheckButton)) and 100) = 96 and _
NOT (val(BIN$(CheckButton)) and 100) = 64 and _
NOT (val(BIN$(CheckButton)) and 100) = 32 then

  JoyButton3_Check = 1

End if

End Function


'_________________________________________________________________________
Function JoyButton4_Check(CheckButton)
If CheckButton > 1000 then Exit Sub

If (val(BIN$(CheckButton)) and 1000) > 0 and _
NOT (val(BIN$(CheckButton)) and 1000) = 8 and _
NOT (val(BIN$(CheckButton)) and 1000) = 32 and _
NOT (val(BIN$(CheckButton)) and 1000) = 40 and _
NOT (val(BIN$(CheckButton)) and 1000) = 96 and _
NOT (val(BIN$(CheckButton)) and 1000) = 104 and _
NOT (val(BIN$(CheckButton)) and 1000) = 128 and _
NOT (val(BIN$(CheckButton)) and 1000) = 136 and _
NOT (val(BIN$(CheckButton)) and 1000) = 192 and _
NOT (val(BIN$(CheckButton)) and 1000) = 200 and _
NOT (val(BIN$(CheckButton)) and 1000) = 224 and _
NOT (val(BIN$(CheckButton)) and 1000) = 232 and _
NOT (val(BIN$(CheckButton)) and 1000) = 256 and _
NOT (val(BIN$(CheckButton)) and 1000) = 264 and _
NOT (val(BIN$(CheckButton)) and 1000) = 288 and _
NOT (val(BIN$(CheckButton)) and 1000) = 296 and _
NOT (val(BIN$(CheckButton)) and 1000) = 320 and _
NOT (val(BIN$(CheckButton)) and 1000) = 328 and _
NOT (val(BIN$(CheckButton)) and 1000) = 352 and _
NOT (val(BIN$(CheckButton)) and 1000) = 360 and _
NOT (val(BIN$(CheckButton)) and 1000) = 384 and _
NOT (val(BIN$(CheckButton)) and 1000) = 392 and _
NOT (val(BIN$(CheckButton)) and 1000) = 416 and _
NOT (val(BIN$(CheckButton)) and 1000) = 424 and _
NOT (val(BIN$(CheckButton)) and 1000) = 448 and _
NOT (val(BIN$(CheckButton)) and 1000) = 456 and _
NOT (val(BIN$(CheckButton)) and 1000) = 480 and _
NOT (val(BIN$(CheckButton)) and 1000) = 488 and _
NOT (val(BIN$(CheckButton)) and 1000) = 512 and _
NOT (val(BIN$(CheckButton)) and 1000) = 520 and _
NOT (val(BIN$(CheckButton)) and 1000) = 544 and _
NOT (val(BIN$(CheckButton)) and 1000) = 552 and _
NOT (val(BIN$(CheckButton)) and 1000) = 576 and _
NOT (val(BIN$(CheckButton)) and 1000) = 584 and _
NOT (val(BIN$(CheckButton)) and 1000) = 608 and _
NOT (val(BIN$(CheckButton)) and 1000) = 616 and _
NOT (val(BIN$(CheckButton)) and 1000) = 640 and _
NOT (val(BIN$(CheckButton)) and 1000) = 648 and _
NOT (val(BIN$(CheckButton)) and 1000) = 672 and _
NOT (val(BIN$(CheckButton)) and 1000) = 680 and _
NOT (val(BIN$(CheckButton)) and 1000) = 704 and _
NOT (val(BIN$(CheckButton)) and 1000) = 712 and _
NOT (val(BIN$(CheckButton)) and 1000) = 736 and _
NOT (val(BIN$(CheckButton)) and 1000) = 744 and _
NOT (val(BIN$(CheckButton)) and 1000) = 768 and _
NOT (val(BIN$(CheckButton)) and 1000) = 776 and _
NOT (val(BIN$(CheckButton)) and 1000) = 864 and _
NOT (val(BIN$(CheckButton)) and 1000) = 872 and _
NOT (val(BIN$(CheckButton)) and 1000) = 960 and _
NOT (val(BIN$(CheckButton)) and 1000) = 968 then

  JoyButton4_Check = 1

End if

End Function


Note that this will only work with FB v0.14 and above, though. ;) It is not perfect, but hey, at least the four-button detection is more than handy enough for your programming of your new games in FB, including RPGs and others, too.

See you all again, and do enjoy this one!!! ^_-=b !
DrV
Site Admin
Posts: 2116
Joined: May 27, 2005 18:39
Location: Midwestern USA
Contact:

Postby DrV » Jul 01, 2005 12:48

Isn't the buttons parameter to getjoystick supposed to just return a bitfield? i.e.

Code: Select all

Function JoyButton1_Check(CheckButton)
Return CheckButton And &B1
End Function

Function JoyButton2_Check(CheckButton)
Return CheckButton And &B10
End Function

Function JoyButton3_Check(CheckButton)
Return CheckButton And &B100
End Function

Function JoyButton4_Check(CheckButton)
Return CheckButton And &B1000
End Function

I don't have a joystick, though, so I don't really know for sure. :)
Adigun A. Polack
Posts: 230
Joined: May 27, 2005 15:14
Contact:

To answer your question, DrV, let’s explain here.

Postby Adigun A. Polack » Jul 01, 2005 17:30

On your question, DrV, I normally do not know very much about bit fields myself (let alone some). But as my guess though, these kinds of patterns usually help make the joystick buttons function like they are supposed to, but sometimes, man, it can take some real complex brainstorming (like I did recently in searching for the bit patterns on the ‘net, for instance!) as well as a lot of experimenting, trial, and even some error in order to help accomplish this kind of thing, especially at first! ;-)

As for your piece of code here, though, I have tried it to replace my own version of the Functions for the first four joystick button presses. I compiled it using the current developing version of FB (FB v0.14 untested — June 20, 2005), and it went just fine. However, at run-time, it only returned “Button 1” rather instead of the first four buttons successfully like it was supposed to. :( That was what happened just now when I tested it, man.

I do have two (2) PC gamepads, and all I wanted here was to make at least the first four buttons work as accurately as ever in the program that I have originally placed at the very opening of this thread. Hey, you did your best on your part of my code, and I *really* appreciate your help anyway, DrV, whether your code snippet worked or not. ^_-=b !

And oh, I forgot to tell you that my original code was tested on Windows only. If anybody has a PC-based gamepad/joystick and has also tested that very same proggie in FB on Linux, do let me know in here, please.

Thank you so much now, and I am only doing what I know to do that works here. Later! :D
jofers
Posts: 1525
Joined: May 27, 2005 17:18
Contact:

Postby jofers » Jul 01, 2005 18:13

About bits:

As you've probably had drilled into your head by movie pseudo-science, computers handle numbers in ones and zeros.

For positive integers, it's a pretty simple breakdown.

1 = 001
2 = 010
3 = 011
4 = 100

...etc. How each "bit" works is like this:

Decimal numbers, arabic numerals, english numbers, whatever you call it, it's known as "base 10". This means that each digit holds 10 numbers.

Now, let's say you have a number 3 in base 10: in scientific notation is this: 3 * 10^0. Because it (rightmost digit) is digit "0". The next one is digit one, so 30 is 3 * 10^1, and so forth. So if you had a number like 4332, you could represent it as:

4*10^3 + 3*10^2 + 3*10^1 + 2*10^0, or 4000 + 300 + 30 + 2

Binary is the same way, only with "2" instead of 10. If you had a number 1010, the number in binary is:

1 * 2^3 + 0*2^2 + 1*2^1 + 0*2 or 8 + 0 + 2 + 0, or 10.

That's how binary numbers work, each digit is an on or off switch, and you can form positive integers out of it (decimal numbers use two positive integers to represent scientific notation).

NOW, back to FreeBASIC. All computer CPUs have some interesting functions to deal with numbers at the bit level. You know them by name: AND, OR, NOT, XOR, etc.

each of these operators take in two bits, and output 1 (except NOT, which just inverses a number). When you feed it two 32-bit numbers (INTEGER), it lines all the numbers up and performs each function individually.

Let's say you had two numbers, and you wanted to AND them:
1001 - 9
1100 - 12

The CPU would look at each column of that setup, and in that column of the answer it would place a '1' where both numbers have a 1. It's easier to demonstrate:

1001
1100
-----
1000

Notice that the leftmost column of each number is one, and because both are 1, the output in that column is one.

You can look all that crap up in the documentation, Sotsvart and I covered them pretty well. But, the important thing is that AND serves as a bit mask. If you want to extract the 4th bit of a number, you just do this:

1001
1000 AND
-----
1000

If you want to extract the 3rd bit of a number:

1001
0100 AND
-----
0000

If you want to extract the second bit of a number

1001
0010 AND
-----
0000

For the first bit:

1001
0001
-----
0001

So if the result of:
IF Var1 AND 2^a = 0 ' the a'th column is zero
IF Var2 AND 2^a <> 0 ' the a'th column is one

Etc. That's how bitfields work. If windows wants to send you the status of 4 buttons, it will return a 4-bit number, and each bit will be 1 for on and 0 for off for a represented button.
dumbledore
Posts: 680
Joined: May 28, 2005 1:11
Contact:

Postby dumbledore » Jul 01, 2005 19:02

fb has a function called "bit()" which can extract a bit a little nicer... its syntax is
bit( number_to_extract_from, bit_position )
so bit( &b1001101, 3 ) = -1

edit: here's a lil example func:

Code: Select all

Function JoyButton1_Check(CheckButton)
    return abs( bit( CheckButton, 1 ) ) ' abs() since your functions return 1, if you want it to return a logical true (-1), remove the abs()
end function
Last edited by dumbledore on Jul 01, 2005 22:55, edited 1 time in total.
DrV
Site Admin
Posts: 2116
Joined: May 27, 2005 18:39
Location: Midwestern USA
Contact:

Postby DrV » Jul 01, 2005 20:51

Well, AAP, I didn't notice that your code checked for PRESSED to see if a button was pressed; to make my functions return pressed requires a little modification:

Code: Select all

Function JoyButton1_Check(CheckButton)
Return iif(CheckButton And &B1, PRESSED, 0)
End Function

Function JoyButton2_Check(CheckButton)
Return iif(CheckButton And &B10, PRESSED, 0)
End Function

Function JoyButton3_Check(CheckButton)
Return iif(CheckButton And &B100, PRESSED, 0)
End Function

Function JoyButton4_Check(CheckButton)
Return iif(CheckButton And &B1000, PRESSED, 0)
End Function


EDIT: the problem with your code is that you are trying to use AND with a bit pattern, and the bit patterns would be correct if you just added a &B prefix to them, but you represented them in decimal, and you can't just do a bitwise AND and expect it to work out... for example, 10 in decimal is 1010 in binary, 1000 decimal is 1111101000, etc. This is a rather rushed explanation, but it's essentially what jofers said up higher... HTH :)
Adigun A. Polack
Posts: 230
Joined: May 27, 2005 15:14
Contact:

Ahh, I see! It all makes a lot of sense now!! (^-^)v

Postby Adigun A. Polack » Jul 02, 2005 20:46

DrV and Jofers, you two are plain awesome, you know that? d=^_-=b !

With such excellent coding help and advice from the both of you, here is the following code that I came up with now:

Code: Select all

' T e n - b u t t o n   J o y s t i c k   P r e s s   T e s t
'-------------------------------------------------------------------------
' Presented to you by Adigun Azikiwe Polack for GFXlib 2 and FB v0.14+.

' A BIG Special Thanks to Jofers and DrV for such awesome help and
' support on getting the joystick/gamepad buttons to work right *without*
' conflicting the other buttons at all!!  (^_-)//

WindowTitle "10-Button Joystick Press Test - FB/GFXlib 2"


Declare Function JoyButton1_Check(CheckButton)
Declare Function JoyButton2_Check(CheckButton)
Declare Function JoyButton3_Check(CheckButton)
Declare Function JoyButton4_Check(CheckButton)
Declare Function JoyButton5_Check(CheckButton)
Declare Function JoyButton6_Check(CheckButton)
Declare Function JoyButton7_Check(CheckButton)
Declare Function JoyButton8_Check(CheckButton)
Declare Function JoyButton9_Check(CheckButton)
Declare Function JoyButton10_Check(CheckButton)

Const Pressed = 1
Const NotPressed = 0

' Set video mode (2 pages) and enter loop
DIM x AS SINGLE, y AS SINGLE, throttle AS SINGLE, buttons AS INTEGER

SCREEN 13, 8, 2, 0

ScreenSet 1, 0

Do
  Cls

  ' Let's get the buttons, x, y, and 3rd axis status of joystick 0;
  ' assuming 3rd axis to be throttle.  We discard other axes.
  GetJoystick 0, buttons, x, y, throttle

  If x < -1.0 then
    ? "Joystick 0 is not available.  Sorry."
  else
    Locate 1, 1
    Color 15, 1: ? "  -- Ten-button Joystick Press Test --  "
    Color 9, 176
    Locate 2, 1: ? " presented for GFXlib 2 and FB v0.14+   "
    Locate 3, 1: ? "              by Adigun Azikiwe Polack. "

    Color 27, 0: ? "Now supporting the presses of the first"
    ? "ten (10) joystick buttons only."
   
    Locate 10, 1
    Color 31: ?  "Testing Joystick 0......"
   
    ' Now, we test the first ten (10) joystick buttons to make sure they
    ' work!!  ^_-
    '---------------------------------------------------------------------
    If JoyButton1_Check(buttons)= Pressed then
      Color 90: Locate 12, 4: ? "Button 1 Pressed!"
    else
      Color 210: Locate 12, 4: ? "Button 1 not pressed"
    End if

    If JoyButton2_Check(buttons)= Pressed then
      Color 90: Locate 13, 4: ? "Button 2 Pressed!"
    else
      Color 210: Locate 13, 4: ? "Button 2 not pressed"
    End if

    If JoyButton3_Check(buttons)= Pressed then
      Color 90: Locate 14, 4: ? "Button 3 Pressed!"
    else
      Color 210: Locate 14, 4: ? "Button 3 not pressed"
    End if

    If JoyButton4_Check(buttons)= Pressed then
      Color 90: Locate 15, 4: ? "Button 4 Pressed!"
    else
      Color 210: Locate 15, 4: ? "Button 4 not pressed"
    End if

    If JoyButton5_Check(buttons)= Pressed then
      Color 90: Locate 16, 4: ? "Button 5 Pressed!"
    else
      Color 210: Locate 16, 4: ? "Button 5 not pressed"
    End if

    If JoyButton6_Check(buttons)= Pressed then
      Color 90: Locate 17, 4: ? "Button 6 Pressed!"
    else
      Color 210: Locate 17, 4: ? "Button 6 not pressed"
    End if

    If JoyButton7_Check(buttons)= Pressed then
      Color 90: Locate 18, 4: ? "Button 7 Pressed!"
    else
      Color 210: Locate 18, 4: ? "Button 7 not pressed"
    End if

    If JoyButton8_Check(buttons)= Pressed then
      Color 90: Locate 19, 4: ? "Button 8 Pressed!"
    else
      Color 210: Locate 19, 4: ? "Button 8 not pressed"
    End if

    If JoyButton9_Check(buttons)= Pressed then
      Color 90: Locate 20, 4: ? "Button 9 Pressed!"
    else
      Color 210: Locate 20, 4: ? "Button 9 not pressed"
    End if

    If JoyButton10_Check(buttons)= Pressed then
      Color 90: Locate 21, 4: ? "Button 10 Pressed!"
    else
      Color 210: Locate 21, 4: ? "Button 10 not pressed"
    End if
    '---------------------------------------------------------------------

    ScreenCopy
  End if
Loop While INKEY$ = ""
End






' ========================================================================
' Now, here come the Functions for the *direct* detection of the presses
' of the first ten (10) joystick buttons for GFXlib 2 for FB v0.14 and
' above!!  (^-^)v !
' ========================================================================

'_________________________________________________________________________
Function JoyButton1_Check(CheckButton)
Return iif(CheckButton And &B1, PRESSED, 0)
End Function

'_________________________________________________________________________
Function JoyButton2_Check(CheckButton)
Return iif(CheckButton And &B10, PRESSED, 0)
End Function

'_________________________________________________________________________
Function JoyButton3_Check(CheckButton)
Return iif(CheckButton And &B100, PRESSED, 0)
End Function

'_________________________________________________________________________
Function JoyButton4_Check(CheckButton)
Return iif(CheckButton And &B1000, PRESSED, 0)
End Function

'_________________________________________________________________________
Function JoyButton5_Check(CheckButton)
Return iif(CheckButton And &B10000, PRESSED, 0)
End Function

'_________________________________________________________________________
Function JoyButton6_Check(CheckButton)
Return iif(CheckButton And &B100000, PRESSED, 0)
End Function

'_________________________________________________________________________
Function JoyButton7_Check(CheckButton)
Return iif(CheckButton And &B1000000, PRESSED, 0)
End Function

'_________________________________________________________________________
Function JoyButton8_Check(CheckButton)
Return iif(CheckButton And &B10000000, PRESSED, 0)
End Function

'_________________________________________________________________________
Function JoyButton9_Check(CheckButton)
Return iif(CheckButton And &B100000000, PRESSED, 0)
End Function

'_________________________________________________________________________
Function JoyButton10_Check(CheckButton)
Return iif(CheckButton And &B1000000000, PRESSED, 0)
End Function


You see, I have now upped the ante to ten (10) buttons so far. ;) And folks, let me tell ‘ya something now, when I compiled this latest code of mine here, ran it, and tested the presses of the buttons, THEY ALL WORKED 100%!! That was just what happened today in my tests here, which is excellent news indeed, richly!! (^_^)v

And Jofers, I honestly believe that your explanation on bit fields and how they are formed is *very* fascinating stuff for me (and anybody as well) to be truly inspired by! Man, you’re good here, what can I say? :D

DrV, I want to thank both you and Jofers for successfully helping me place the missing pieces of this button-testing puzzle together. Truly excellent work overall, and be catching you later!!! ;-) !
SJ Zero
Posts: 130
Joined: Jun 19, 2005 4:12

Postby SJ Zero » Jul 02, 2005 21:41

Maybe I'm missing something here...

but why not just make a single CheckButton routine?

ie.

CheckButton (buttons as integer, button as integer) = true or false ?
cha0s
Site Admin
Posts: 5317
Joined: May 27, 2005 6:42
Location: Illinois
Contact:

Postby cha0s » Jul 02, 2005 22:49

here's a sample, can't test it (no joystick), but i believe it will work


Code: Select all

Dim x As Single, y As Single, throttle As Single, buttons As Integer

Screen 13, 8, 2, 0

ScreenSet 1, 0

Do
  Cls

  ' Let's get the buttons, x, y, and 3rd axis status of joystick 0;
  ' assuming 3rd axis to be throttle.  We discard other axes.
  GetJoystick 0, buttons, x, y, throttle

  If x < -1.0 Then
    ? "Joystick 0 is not available.  Sorry."
  Else

    For cheg_em = 0 To 31

      button_state = iif(buttons And (2 ^ cheg_em), 1, 0)

    If button_state then
      Color 90: Locate 12 + cheg_em, 4: ? "Button "; cheg_em; " Pressed!"
    else
      Color 210: Locate 12 + cheg_em, 4: ? "Button "; cheg_em; " Not pressed"
    End If

    Next

  End If

  ScreenCopy
 
Loop While Inkey$ = ""
Last edited by cha0s on Jul 03, 2005 2:25, edited 1 time in total.
dumbledore
Posts: 680
Joined: May 28, 2005 1:11
Contact:

Postby dumbledore » Jul 03, 2005 2:17

you forgot, locate works in y,x form, not x,y, you probably wanted

Code: Select all

If button_state then
      Color 90: Locate 12 + cheg_em, 4: ? "Button "; cheg_em; " Pressed!"
    else
      Color 210: Locate 12 + cheg_em, 4: ? "Button "; cheg_em; " Not pressed"
    End If


(still untested :P)
cha0s
Site Admin
Posts: 5317
Joined: May 27, 2005 6:42
Location: Illinois
Contact:

Postby cha0s » Jul 03, 2005 2:24

indeed ;)
Adigun A. Polack
Posts: 230
Joined: May 27, 2005 15:14
Contact:

Nice, Cha0s. Nice!

Postby Adigun A. Polack » Jul 03, 2005 4:57

Cha0s, your version of my code works true and good as well, I am very happy to report this morning! I have just tested it in action here (even in a higher screen resolution), and found out that the joystick button presses do work wonders, without any conflicts whatsoever! ^-^ ! Very good, man!

And to all of you, I am very, very proud to announce to you now my newest wrapper for FB v0.14+ and GFXlib 2 that is based on the tests in this topic, but now supporting all 16 buttons! I invite you all to sample it right here in this following download:

......before it is even seen on my *official* projects site called the AAP Official Projects Squad.

Thank you all once again, and have yourselves an awesome new week now!! ^_-=b

Return to “Tips and Tricks”

Who is online

Users browsing this forum: No registered users and 2 guests