I have a little problem with differences Windows and lLnux ,
I put these two codes to here if somebody can explain what i have done wrong
I am a newbie in Purebasic
Problem is in repeat-until loop, straight once/cycle command 'gosub crosshair' , it works in Windows fine, but in Linux it worked only when I coded it inside the loop but same code (similar outside the loop in sub 'crosshair') needed imagegadget(.. in addition of setgadgetstate(.. to work.
but other similar calls later didn't need that
Here are both codes (working ones )
This code works fine in Windows but not in Linux
Code: Select all
Procedure WindowMouseButton(Wnd, ButtonNr)
If Wnd And GetForegroundWindow_() = Wnd
Select ButtonNr
Case 0
If GetAsyncKeyState_(#VK_LBUTTON) > 0
ProcedureReturn 1
EndIf
Case 1
If GetAsyncKeyState_(#VK_RBUTTON) > 0
ProcedureReturn 1
EndIf
Case 2
If GetAsyncKeyState_(#VK_MBUTTON) > 0
ProcedureReturn 1
EndIf
EndSelect
EndIf
ProcedureReturn 0
EndProcedure
;********************************************************************
WindowWidth = 1000
WindowHeight = 700
If OpenWindow(0, 10, 10, WindowWidth, WindowHeight, "PureQCad.018 ")
hWnd = WindowID(0)
If hWnd <> 0
If CreateMenu(0, WindowID(0))
MenuTitle("File")
MenuItem( 1, "&Load...")
MenuItem( 2, "Save")
MenuBar()
MenuItem( 5, "Exit")
MenuTitle("Edit")
MenuTitle("Draw")
MenuItem( 18, "Line")
MenuTitle("Mode")
MenuTitle("Help")
MenuItem( 44, "Help")
MenuItem( 45, "About")
EndIf
If CreateStatusBar(0, WindowID(0))
AddStatusBarField(100)
AddStatusBarField(100)
AddStatusBarField(100)
AddStatusBarField(100)
AddStatusBarField(100)
AddStatusBarField(100)
AddStatusBarField(100)
AddStatusBarField(100)
AddStatusBarField(100)
AddStatusBarField(100)
EndIf
StatusBarText(0, 0, "prog_name")
StatusBarText(0, 1, " xx= ")
StatusBarText(0, 2, " yy= ")
StatusBarText(0, 3, " orx= ")
StatusBarText(0, 4, " ory= ")
StatusBarText(0, 5, " DrawC ")
StatusBarText(0, 6, " x= " )
StatusBarText(0, 7, " y= " )
StatusBarText(0, 8, " ")
StatusBarText(0, 9, " ")
StatusBarText(0, 10, " ")
;******** init imagegadget ***********************************************
bitmap1_n = 1 ; image number 1
bitmap1_h = CreateImage(bitmap1_n,800,550) ; create the image and store the handle
gadget1_n = 1
ImageGadget(gadget1_n,0,0,800,500,bitmap1_h)
; ******** init cross hair ***************************************************
StartDrawing(ImageOutput(bitmap1_n))
FillArea(10,10,-1,$ffffff)
DrawingMode(#PB_2DDrawing_Outlined | #PB_2DDrawing_XOr)
ox=10
oy=10
oox=ox
ooy=oy
hwidth=WindowWidth-40
hheight=WindowHeight-45
Line(ox,10, 0, hheight , RGB(55,55,55))
Line(10,oy, hwidth , 0, RGB(55,55,55))
StopDrawing()
SetGadgetState(gadget1_n,bitmap1_h)
For iii=0 To 100000: Next
;********* menuloop ******************************************************************************
Repeat
event= WaitWindowEvent()
Select event
Case #PB_Event_Menu
Select EventMenu()
Case 18 ;Line
Gosub setLine
Case 45 ; About
MessageRequester("About", "image_gadget_test", 0)
Case 5 ; exit
Quit=#True ; End
Default
MessageRequester("Info", "MenuItem: "+Str(EventMenu()), 0)
EndSelect
Case #PB_Event_CloseWindow
Quit=#True
EndSelect
Gosub crosshair ;this does not work properly in Linux if :SetGadgetState).... is used incrosshair sub
Until Quit = #True
EndIf
End
;'****** end of menuloop ****************************************
crosshair:
StartDrawing(ImageOutput(bitmap1_n))
DrawingMode(#PB_2DDrawing_Outlined | #PB_2DDrawing_XOr)
ox=WindowMouseX(0)
oy=WindowMouseY(0)
Line ( oox, 10, 0, hheight, RGB(55,55,55))
Line (10, ooy, hwidth, 0, RGB(55,55,55))
Line ( ox, 10, 0, hheight, RGB(55,55,55))
Line ( 10, oy, hwidth,0 , RGB(55,55,55))
StopDrawing()
SetGadgetState(gadget1_n,bitmap1_h)
oox=ox
ooy=oy
StatusBarText(0, 1, " xx= "+Str(ox))
StatusBarText(0, 2, " yy= "+Str(oy))
StatusBarText(0, 3, " orx= "+Str(oox))
StatusBarText(0, 4, " ory= "+Str(ooy))
Return
setLine:
StatusBarText(0, 0, "Line")
iii=WindowMouseButton(hWnd, 0)
For iii=0 To 10000:Next
If WindowMouseButton(hWnd, 0)=1
Goto startLine
EndIf
Gosub crosshair
Goto setline
startLine:
startX =ox
startY = oy
Gosub crosshair
StartDrawing(ImageOutput(bitmap1_n))
DrawingMode(#PB_2DDrawing_Outlined | #PB_2DDrawing_XOr)
mousX = WindowMouseX(0)
mousY = WindowMouseY(0)
Line(startX,startY,mousX-startX,mousY-startY,RGB(5,5,200))
omousX=mousX
omousY=mousY
StatusBarText(0, 6, Str(startX) )
StatusBarText(0, 7, Str(startY))
StopDrawing()
SetGadgetState(gadget1_n,bitmap1_h)
For iii=0 To 10000:Next
drawLine:
If WindowMouseButton(hWnd, 0)=0
Goto finishLine
EndIf
Gosub crosshair
mousX =ox ; WindowMouseX(0)
mousY = oy ;WindowMouseY(0)
StartDrawing(ImageOutput(bitmap1_n))
DrawingMode(#PB_2DDrawing_Outlined | #PB_2DDrawing_XOr)
Line(startX,startY,omousX-startX, omousY-startY,RGB(5,5,200))
Line(startX,startY,mousX-startX,mousY-startY,RGB(5,5,200))
omousX=mousX
omousY=mousY
StatusBarText(0, 8, Str(mousX-startX))
StatusBarText(0, 9, Str(mousY-startY))
StopDrawing()
SetGadgetState(gadget1_n,bitmap1_h)
Goto drawline
finishLine:
mousX =ox ; WindowMouseX(0)
mousY = oy ;WindowMouseY(0)
StartDrawing(ImageOutput(bitmap1_n))
DrawingMode(#PB_2DDrawing_Outlined | #PB_2DDrawing_XOr)
Line(startX,startY,omousX-startX, omousY-startY,RGB(5,5,200))
Line(startX,startY,mousX-startX,mousY-startY,RGB(5,5,200))
StatusBarText(0, 8, Str(mousX-startX))
StatusBarText(0, 9, Str(mousY-startY))
StatusBarText(0, 0, " ")
StopDrawing()
SetGadgetState(gadget1_n,bitmap1_h)
Return
EndIf
In linux : gosub from repeat/until loop(but outside of case command) or imagedget / setgadget in some point in my prog.
I hope someone has time to check these. I have been really stuck with this couple weeks .
Code: Select all
Procedure WindowMouseButton(Wnd, ButtonNr)
Protected gdkWnd.l, x.l, y.l, mask.l
If Wnd
*Window.GTKWindow = Wnd
gdkWnd = *Window\bin\child\window
gdk_window_get_pointer_(gdkWnd, @x, @y, @mask)
Select ButtonNr
Case 0
If (mask & #GDK_BUTTON1_MASK)
ProcedureReturn 1
EndIf
Case 1
If (mask & #GDK_BUTTON3_MASK)
ProcedureReturn 1
EndIf
Case 2
If (mask & #GDK_BUTTON2_MASK)
ProcedureReturn 1
EndIf
EndSelect
EndIf
ProcedureReturn 0
EndProcedure
;***************************************************************************
WindowWidth = 1000
WindowHeight = 700
If OpenWindow(0, 10, 10, WindowWidth, WindowHeight, "PureQCad.018 ")
hWnd = WindowID(0)
If hWnd <> 0
If CreateMenu(0, WindowID(0))
MenuTitle("File")
MenuItem( 1, "&Load...")
MenuItem( 2, "Save")
MenuBar()
MenuItem( 5, "Exit")
MenuTitle("Edit")
MenuTitle("Draw")
MenuItem( 18, "Line")
MenuTitle("Mode")
MenuTitle("Help")
MenuItem( 44, "Help")
MenuItem( 45, "About")
EndIf
If CreateStatusBar(0, WindowID(0))
AddStatusBarField(100)
AddStatusBarField(100)
AddStatusBarField(100)
AddStatusBarField(100)
AddStatusBarField(100)
AddStatusBarField(100)
AddStatusBarField(100)
AddStatusBarField(100)
AddStatusBarField(100)
AddStatusBarField(100)
EndIf
StatusBarText(0, 0, "prog_name")
StatusBarText(0, 1, " xx= ")
StatusBarText(0, 2, " yy= ")
StatusBarText(0, 3, " orx= ")
StatusBarText(0, 4, " ory= ")
StatusBarText(0, 5, " DrawC ")
StatusBarText(0, 6, " x= " )
StatusBarText(0, 7, " y= " )
StatusBarText(0, 8, " ")
StatusBarText(0, 9, " ")
StatusBarText(0, 10, " ")
;******** init imagegadget ***********************************************
bitmap1_n = 1 ; empty image 1
bitmap1_h = CreateImage(bitmap1_n,800,550) ; create /store the handle
gadget1_n = 1
ImageGadget(gadget1_n,0,0,800,500,bitmap1_h)
; ******** init cross hair ************************************************
StartDrawing(ImageOutput(bitmap1_n))
FillArea(10,10,-1,$ffffff)
DrawingMode(#PB_2DDrawing_Outlined | #PB_2DDrawing_XOr)
ox=10
oy=10
oox=ox
ooy=oy
hwidth=WindowWidth-40
hheight=WindowHeight-45
Line(ox,10, 0, hheight , RGB(55,55,55))
Line(10,oy, hwidth , 0, RGB(55,55,55))
StopDrawing()
SetGadgetState(gadget1_n,bitmap1_h)
For iii=0 To 100000: Next
;********* menuloop ******************************************************
Repeat
event= WaitWindowEvent()
Select event
Case #PB_Event_Menu
Select EventMenu()
Case 18 ;Line
Gosub setLine
Case 45 ; About
MessageRequester("About", "image_gadget_test", 0)
Case 5 ; exit
Quit=#True ;End
Default
MessageRequester("Info", "MenuItem: "+Str(EventMenu()), 0)
EndSelect
Case #PB_Event_CloseWindow
Quit=#True
EndSelect
; **** continous cross hair outside case's / this works here inside the 'eventloop'
;**** if this bloc is used outside 'eventloop'
; ie. by : 'Gosub crosshair' then loop get slower at every event
StartDrawing(ImageOutput(bitmap1_n))
DrawingMode(#PB_2DDrawing_Outlined | #PB_2DDrawing_XOr)
ox=WindowMouseX(0)
oy=WindowMouseY(0)
Line ( oox, 10, 0, hheight, RGB(55,55,55))
Line (10, ooy, hwidth, 0, RGB(55,55,55))
Line ( ox, 10, 0, hheight, RGB(55,55,55))
Line ( 10, oy, hwidth,0 , RGB(55,55,55))
StopDrawing()
SetGadgetState(gadget1_n,bitmap1_h)
oox=ox
ooy=oy
StatusBarText(0, 1, " xx= "+Str(ox))
StatusBarText(0, 2, " yy= "+Str(oy))
StatusBarText(0, 3, " orx= "+Str(oox))
;**************************************
Until Quit = #True
EndIf
End
;'****** end of menuloop ****************************************
crosshair:
StartDrawing(ImageOutput(bitmap1_n))
DrawingMode(#PB_2DDrawing_Outlined | #PB_2DDrawing_XOr)
ox=WindowMouseX(0)
oy=WindowMouseY(0)
Line ( oox, 10, 0, hheight, RGB(55,55,55))
Line (10, ooy, hwidth, 0, RGB(55,55,55))
Line ( ox, 10, 0, hheight, RGB(55,55,55))
Line ( 10, oy, hwidth,0 , RGB(55,55,55))
StopDrawing()
ImageGadget(gadget1_n,0,0,800,500,bitmap1_h) ; but now this is needed in Linux ...not in Windows
SetGadgetState(gadget1_n,bitmap1_h)
oox=ox
ooy=oy
StatusBarText(0, 1, " xx= "+Str(ox))
StatusBarText(0, 2, " yy= "+Str(oy))
StatusBarText(0, 3, " orx= "+Str(oox))
StatusBarText(0, 4, " ory= "+Str(ooy))
Return
setLine:
StatusBarText(0, 0, "Line")
iii=WindowMouseButton(hWnd, 0)
For iii=0 To 10000:Next
If WindowMouseButton(hWnd, 0)=1
Goto startLine
EndIf
Gosub crosshair
Goto setline
startLine:
startX =ox
startY = oy
Gosub crosshair
StartDrawing(ImageOutput(bitmap1_n))
DrawingMode(#PB_2DDrawing_Outlined | #PB_2DDrawing_XOr)
mousX = WindowMouseX(0)
mousY = WindowMouseY(0)
Line(startX,startY,mousX-startX,mousY-startY,RGB(5,5,200))
omousX=mousX
omousY=mousY
StatusBarText(0, 6, Str(startX) )
StatusBarText(0, 7, Str(startY))
StopDrawing()
SetGadgetState(gadget1_n,bitmap1_h)
; but here and after these lines it does not need imagegadget).. why?
For iii=0 To 10000:Next
drawLine:
If WindowMouseButton(hWnd, 0)=0
Goto finishLine
EndIf
Gosub crosshair
mousX =ox ; WindowMouseX(0)
mousY = oy ;WindowMouseY(0)
StartDrawing(ImageOutput(bitmap1_n))
DrawingMode(#PB_2DDrawing_Outlined | #PB_2DDrawing_XOr)
Line(startX,startY,omousX-startX, omousY-startY,RGB(5,5,200))
Line(startX,startY,mousX-startX,mousY-startY,RGB(5,5,200))
omousX=mousX
omousY=mousY
StatusBarText(0, 8, Str(mousX-startX))
StatusBarText(0, 9, Str(mousY-startY))
StopDrawing()
SetGadgetState(gadget1_n,bitmap1_h)
Goto drawline
finishLine:
mousX =ox
mousY = oy
StartDrawing(ImageOutput(bitmap1_n))
DrawingMode(#PB_2DDrawing_Outlined | #PB_2DDrawing_XOr)
Line(startX,startY,omousX-startX, omousY-startY,RGB(5,5,200))
Line(startX,startY,mousX-startX,mousY-startY,RGB(5,5,200))
StatusBarText(0, 8, Str(mousX-startX))
StatusBarText(0, 9, Str(mousY-startY))
StatusBarText(0, 0, " ")
StopDrawing()
SetGadgetState(gadget1_n,bitmap1_h)
Return
EndIf
