Ooops
October 26, 2020, 01:21:48 AM

Author Topic: SetGadgetShape for window resize?  (Read 2370 times)

Offline markcwm

  • Sr. Member
  • ****
  • Posts: 473
SetGadgetShape for window resize?
« on: November 28, 2017, 01:50:50 AM »
I'm hoping someone with more MaxGUI knowledge than me can figure this out.

Press keys 1,2,3 to change window and canvas size. This code works a bit, but it crashes after a while, also the canvas isn't resized properly and if I use RemoveHook and AddHook it crashes but I've used this in another example and it worked fine so I don't know.

Maybe there is already an example for this? Thanks!

Code: BlitzMax
  1. ' redrawgadget.bmx
  2.  
  3. ' version 3 - fixed to be compatible with virtual resolutions
  4.  
  5. Import MaxGui.Drivers
  6. 'Import Bah.Gtkmaxgui
  7. Import Brl.TimerDefault
  8. Import Brl.EventQueue
  9. Import Brl.FreetypeFont
  10.  
  11. Strict
  12.  
  13. Type TApplet
  14.  
  15.         Method OnEvent(Event:TEvent,data:Object) Abstract
  16.  
  17.         Method Run()
  18.                 AddHook EmitEventHook,eventhook,Self
  19.         End Method
  20.  
  21.         Function eventhook:Object(id,data:Object,context:Object)
  22.                 Local event:TEvent = TEvent(data)
  23.                 Local app:TApplet = TApplet(context)
  24.                 app.OnEvent( event,data )
  25.                 Return data
  26.         End Function
  27.  
  28. End Type
  29.  
  30. Type TSpinningApplet Extends TApplet
  31.        
  32.         Global image:TImage
  33.         Global key:Int[256]
  34.        
  35.         Field timer:TTimer
  36.         Field window:TGadget, canvas:TGadget
  37.         Field width%, height%, test%
  38.        
  39.         Method Draw()
  40.                
  41.                 SetGraphics CanvasGraphics(canvas)
  42.                 SetVirtualResolution width,height
  43.                 SetViewport 0,0,width,height
  44.  
  45.                 SetBlend( ALPHABLEND )
  46.                 'SetRotation( MilliSecs()*.1 )
  47.                 SetClsColor( 255, 0, 0 )
  48.                
  49.                 Cls()
  50.                 DrawText "width="+width+" height="+height,0,0
  51.                 DrawImage( image, GraphicsWidth()/2, GraphicsHeight()/2 )
  52.                 Flip()
  53.                
  54.         End Method
  55.        
  56.         Method OnEvent(event:TEvent,data:Object)
  57.                 If Not event Then Return
  58.                
  59.                 Select event.id
  60.                         Case EVENT_WINDOWCLOSE, EVENT_APPTERMINATE
  61.                                 End
  62.                         Case EVENT_TIMERTICK
  63.                                 RedrawGadget( canvas )
  64.                                
  65.                         Case EVENT_KEYUP
  66.                         Select event.data
  67.                                 Case KEY_1 ; key[KEY_1]=0
  68.                                 Case KEY_2 ; key[KEY_2]=0
  69.                                 Case KEY_3 ; key[KEY_3]=0
  70.                         End Select
  71.                        
  72.                         Case EVENT_KEYDOWN
  73.                         Select event.data
  74.                                 Case KEY_1 ; key[KEY_1]=1
  75.                                 Case KEY_2 ; key[KEY_2]=1
  76.                                 Case KEY_3 ; key[KEY_3]=1
  77.                         End Select
  78.                        
  79.                         Case EVENT_GADGETPAINT
  80.                                 If (event.source = canvas)
  81.                                
  82.                                         ' testing SetGadgetShape
  83.                                         If key[KEY_1]=1
  84.                                                 key[KEY_1]=0
  85.                                                 width=512
  86.                                                 height=512
  87.                                                 test=1
  88.                                         EndIf
  89.                                        
  90.                                         If key[KEY_2]=1
  91.                                                 key[KEY_2]=0
  92.                                                 width=800
  93.                                                 height=600
  94.                                                 test=1
  95.                                         EndIf
  96.                                        
  97.                                         If key[KEY_3]=1
  98.                                                 key[KEY_3]=0
  99.                                                 width=DesktopWidth()
  100.                                                 height=DesktopHeight()
  101.                                                 test=1
  102.                                         EndIf
  103.                                        
  104.                                         If test=1
  105.                                                 test=0
  106.                                                 'RemoveHook EmitEventHook, eventhook
  107.                                                 DisablePolledInput()
  108.                                                 ActivateGadget canvas
  109.                                                 EnablePolledInput canvas
  110.                                                 'AddHook EmitEventHook, eventhook
  111.                                                                        
  112.                                                 SetGadgetShape canvas, 0, 0, width, height
  113.                                                 RedrawGadget canvas
  114.                                                 SetGadgetShape window, 0, 0, width, height
  115.                                                 RedrawGadget window
  116.                                                 'SetViewport 0, 0, width, height       
  117.                                         EndIf
  118.                                        
  119.                                         Draw()
  120.                                 EndIf
  121.                 End Select
  122.         End Method
  123.        
  124.         Method Create:TSpinningApplet(name$)
  125.                
  126.                 If Not image Then image = LoadImage( "fltkwindow.png" )
  127.                
  128.                 width=512 ; height=512
  129.                 window = CreateWindow( name, 20, 20, width, height )
  130.                
  131.                 Local w = ClientWidth(window)
  132.                 Local h = ClientHeight(window)
  133.                
  134.                 canvas = CreateCanvas( 0, 0, w, h, window )
  135.                 SetGadgetLayout( canvas, EDGE_ALIGNED, EDGE_ALIGNED, EDGE_ALIGNED, EDGE_ALIGNED )
  136.                
  137.                 ActivateGadget canvas
  138.                 EnablePolledInput canvas
  139.  
  140.                 timer = CreateTimer( 100 )
  141.                 Run()
  142.                
  143.                 Return Self
  144.                
  145.         End Method
  146.        
  147. End Type
  148.  
  149. AutoMidHandle True
  150.  
  151. Local spinner:TSpinningApplet = New TSpinningApplet.Create("Spinning Applet")
  152.  
  153. Repeat
  154.         WaitSystem()
  155. Forever
  156.  

Offline Henri

  • Sr. Member
  • ****
  • Posts: 263
Re: SetGadgetShape for window resize?
« Reply #1 on: November 28, 2017, 02:15:11 PM »
Hi Mark,

does this fix the sizing issue (regular Bmax):

Code: BlitzMax
  1.  
  2. ' version 3 - fixed to be compatible with virtual resolutions
  3.  
  4. Import MaxGui.Drivers
  5. 'Import Bah.Gtkmaxgui
  6. 'Import Brl.TimerDefault
  7. 'Import Brl.EventQueue
  8. 'Import Brl.FreetypeFont
  9.  
  10. Strict
  11.  
  12. Type TApplet
  13.  
  14.         Method OnEvent(Event:TEvent,data:Object) Abstract
  15.  
  16.         Method Run()
  17.                 AddHook EmitEventHook,eventhook,Self
  18.         End Method
  19.  
  20.         Function eventhook:Object(id,data:Object,context:Object)
  21.                 Local event:TEvent = TEvent(data)
  22.                 Local app:TApplet = TApplet(context)
  23.                 app.OnEvent( event,data )
  24.                 Return data
  25.         End Function
  26.  
  27. End Type
  28.  
  29. Type TSpinningApplet Extends TApplet
  30.        
  31.         Global image:TImage
  32.         Global key:Int[256]
  33.        
  34.         Field timer:TTimer
  35.         Field window:TGadget, canvas:TGadget
  36.         Field width%, height%, test%
  37.        
  38.         Method Draw()
  39.                
  40.                                 DebugLog "OnDraw"
  41.  
  42.                 SetGraphics CanvasGraphics(canvas)
  43.                 SetVirtualResolution width,height
  44.                 SetViewport 0,0,width,height
  45.  
  46.                 SetBlend( ALPHABLEND )
  47.                 'SetRotation( MilliSecs()*.1 )
  48.                 SetClsColor( 255, 0, 0 )
  49.                
  50.                 Cls()
  51.                 DrawText "width="+width+" height="+height,0,0
  52.                 DrawImage( image, GraphicsWidth()/2, GraphicsHeight()/2 )
  53.                 Flip()
  54.                
  55.         End Method
  56.        
  57.         Method OnEvent(event:TEvent,data:Object)
  58.                 If Not event Then Return
  59.                
  60.                 Select event.id
  61.                         Case EVENT_WINDOWCLOSE, EVENT_APPTERMINATE
  62.                                 End
  63.                         Case EVENT_TIMERTICK
  64.                                 RedrawGadget( canvas )
  65.                                
  66.                         Case EVENT_KEYUP
  67.                         Select event.data
  68.                                 Case KEY_1 ; key[KEY_1]=0
  69.                                 Case KEY_2 ; key[KEY_2]=0
  70.                                 Case KEY_3 ; key[KEY_3]=0
  71.                         End Select
  72.                        
  73.                         Case EVENT_KEYDOWN
  74.                         Select event.data
  75.                                 Case KEY_1 ; key[KEY_1]=1
  76.                                 Case KEY_2 ; key[KEY_2]=1
  77.                                 Case KEY_3 ; key[KEY_3]=1
  78.                         End Select
  79.                        
  80.                         Case EVENT_GADGETPAINT
  81.                                 If (event.source = canvas)
  82.                                
  83.                                         ' testing SetGadgetShape
  84.                                         If key[KEY_1]=1
  85.                                                 key[KEY_1]=0
  86.                                                 width=512
  87.                                                 height=512
  88.                                                 test=1
  89.                                         EndIf
  90.                                        
  91.                                         If key[KEY_2]=1
  92.                                                 key[KEY_2]=0
  93.                                                 width=800
  94.                                                 height=600
  95.                                                 test=1
  96.                                         EndIf
  97.                                        
  98.                                         If key[KEY_3]=1
  99.                                                 key[KEY_3]=0
  100.                                                 width=DesktopWidth()
  101.                                                 height=DesktopHeight()
  102.                                                 test=1
  103.                                         EndIf
  104.                                        
  105.                                         If test=1
  106.                                                 test=0
  107.                                                 'RemoveHook EmitEventHook, eventhook
  108.                                                 DisablePolledInput()
  109.                                                 ActivateGadget canvas
  110.                                                 EnablePolledInput canvas
  111.                                                 'AddHook EmitEventHook, eventhook
  112.                                                                        
  113.                                                 'SetGadgetShape canvas, 0, 0, width, height
  114.                                                 'RedrawGadget canvas
  115.                                                 SetGadgetShape window, 0, 0, width, height
  116.  
  117.                                                 SetViewport 0,0,width,height
  118.                                                 'RedrawGadget window
  119.                                                 'SetViewport 0, 0, width, height      
  120.                                         EndIf
  121.                                        
  122.                                         Draw()
  123.                                 EndIf
  124.                 End Select
  125.         End Method
  126.        
  127.         Method Create:TSpinningApplet(name$)
  128.                
  129.                 If Not image Then image = LoadImage( "fltkwindow.png" )
  130.                
  131.                 width=512 ; height=512
  132.                 window = CreateWindow( name, 20, 20, width, height )
  133.                
  134.                 Local w = ClientWidth(window)
  135.                 Local h = ClientHeight(window)
  136.                
  137.                 canvas = CreateCanvas( 0, 0, w, h, window )
  138.                 SetGadgetLayout( canvas, EDGE_ALIGNED, EDGE_ALIGNED, EDGE_ALIGNED, EDGE_ALIGNED )
  139.                
  140.                 ActivateGadget canvas
  141.                 EnablePolledInput canvas
  142.  
  143.                 timer = CreateTimer( 100 )
  144.                 Run()
  145.                
  146.                 Return Self
  147.                
  148.         End Method
  149.        
  150. End Type
  151.  
  152. AutoMidHandle True
  153.  
  154. Local spinner:TSpinningApplet = New TSpinningApplet.Create("Spinning Applet")
  155.  
  156. Repeat
  157.         WaitSystem()
  158. Forever
  159.  

-Henri
- Got 01100011 problems, but the bit ain't 00000001

Offline markcwm

  • Sr. Member
  • ****
  • Posts: 473
Re: SetGadgetShape for window resize?
« Reply #2 on: November 28, 2017, 07:33:06 PM »
Hi Henri,

thanks but no, it still crashes and the screen is not resized. I think this may just be an issue on Linux, I'll have to test on Win/Mac and post my findings.

Offline markcwm

  • Sr. Member
  • ****
  • Posts: 473
Re: SetGadgetShape for window resize?
« Reply #3 on: November 29, 2017, 04:57:31 AM »
Yep! Your code works fine on Mac/Win Henri, so it's a bug in GTK Maxgui, that code should work. I'm happy enough with this for now though.

I confused myself with RemoveHook, it was taken from code with 2 windows, so I think you can't remove then add the hook to the same canvas gadget again (at least in Linux).

Thanks again!

Offline Henri

  • Sr. Member
  • ****
  • Posts: 263
Re: SetGadgetShape for window resize?
« Reply #4 on: November 29, 2017, 09:12:22 AM »
Eventhook is not directly related to canvas so it can be removed and added at will.

Only thing wrong I see in your eventhook function is that the validity of app variable is not tested before accessing the OnEvent method.

Something like 'If app then app.OnEvent( event, data)'


Edit: Did you try 'Framework bah.gtkmaxgui' ? Without Framework, Bmax imports FLTK by default.

-Henri
- Got 01100011 problems, but the bit ain't 00000001

Offline markcwm

  • Sr. Member
  • ****
  • Posts: 473
Re: SetGadgetShape for window resize?
« Reply #5 on: November 29, 2017, 07:58:25 PM »
Hi Henri,

no framework didn't work either, so must be a GTKMaxgui bug.

And yes, adding "if app then" stops RemoveHook from crashing. So thanks again!

 

SimplePortal 2.3.6 © 2008-2014, SimplePortal