Ooops
October 25, 2021, 12:02:40

Author Topic: SDL mky.mojo2  (Read 599 times)

Offline wombats

  • Jr. Member
  • **
  • Posts: 60
SDL mky.mojo2
« on: September 07, 2021, 18:21:04 »
Hi,

I'm trying to find a way to change the window title after it's created. SDL lets you do this with Max2D, but I can't figure out the way to do it with mojo2...if it's even possible.

I know this example doesn't work anyway. I don't know for sure mojo2 and SDL are even compatible.
Code: [Select]
SuperStrict
Framework mky.mojo2
Import sdl.glsdlgraphics
'Import brl.GLGraphics
Import brl.pngloader

Graphics(640, 480, 0)

Local window:TSDLWindow = TSDLGLContext.GetCurrentWindow()
window.SetTitle("Hello World")

Local canvas:TCanvas = New TCanvas.CreateCanvas()

Repeat
canvas.SetScissor(0, 0, GraphicsWidth(), GraphicsHeight())
canvas.Clear(0, 0, 0)
canvas.DrawRect(10, 10, 100, 100)
canvas.Flush()
Flip
Until KeyHit(KEY_ESCAPE) Or AppTerminate()

End

Offline fielder

  • Full Member
  • ***
  • Posts: 110
Re: SDL mky.mojo2
« Reply #1 on: September 29, 2021, 22:04:06 »
what about:

Code: [Select]
Function SetWindowTitle( title:String)
Extern "Win32"
Function SetWindowTextW:Int( handle:Int, text$w)
EndExtern
Local hwnd:Int = GetActiveWindow()
If hwnd
AppTitle = title
SetWindowTextW( hwnd, title)
EndIf
EndFunction

Offline Derron

  • Hero Member
  • *****
  • Posts: 3674
Re: SDL mky.mojo2
« Reply #2 on: September 30, 2021, 07:25:10 »
Code: BlitzMax
  1. SuperStrict
  2. Framework mky.mojo2
  3. Import SDL.gl2sdlmax2d
  4. 'Import sdl.glsdlgraphics
  5. Import Brl.PNGLoader
  6.  
  7. Graphics(640, 480, 0)
  8.  
  9. Local window:TSDLWindow = TSDLGLContext.GetCurrentWindow()
  10. if not window then throw "no window"
  11. window.SetTitle("Hello World")
  12.  
  13. Local canvas:TCanvas = New TCanvas.CreateCanvas()
  14.  
  15. Repeat
  16.         canvas.SetScissor(0, 0, GraphicsWidth(), GraphicsHeight())
  17.         canvas.Clear(0, 0, 0)
  18.         canvas.DrawRect(10, 10, 100, 100)
  19.         canvas.Flush()
  20.         Flip
  21. Until KeyHit(KEY_ESCAPE) Or AppTerminate()
  22.  
  23. End
  24.  
this works for me - dunno what the max2d-thing loads and might be incompatible once adding more modules.



Yet it is better to use some less invasive method like fielder suggested.

glgraphics.linux.c (glgraphics.mod) changes the window title this way:
Code: [Select]
XChangeProperty( xdisplay,window, XInternAtom( xdisplay,"_NET_WM_NAME",True ),
XInternAtom( xdisplay,"UTF8_STRING",True ), 8,PropModeReplace,appTitle,strlen( appTitle ) );

all the required things are stored somewhere (xdisplay, window, apptitle) so if one extended glgraphics.mod (for linux) for an "SetAppTitle" you could possibly simply call it from your app then. Do it for windows and mac too and it is "cross platform".

Yet some of my Pull Requests are open so I won't do that.


bye
Ron
« Last Edit: September 30, 2021, 07:37:23 by Derron »

Offline wombats

  • Jr. Member
  • **
  • Posts: 60
Re: SDL mky.mojo2
« Reply #3 on: October 01, 2021, 18:31:50 »
Thanks for the replies.

I'm looking for a cross-platform solution if possible (I know each platform needs its own code at some level), and GetActiveWindow relies on the game actually being the active window, right?

It would be nice to be able to do it without hacking the modules.

Code: [Select]
Extern "C"
Function Test(context:Byte Ptr)
EndExtern

Type WinFunc Extends TGLGraphics
Method SetWindowTitle:Int()
Test(_context)
EndMethod
EndType

Is this the right way to access the context in TGLGraphics? Then how would I handle it in a C file?

Code: [Select]
#include <brl.mod/glgraphics.mod/glgraphics.win32.c>

void Test(BBGLContext *context) {
  SetWindowTextW(context->hwnd, "hello");
}

This just crashes.

 

SimplePortal 2.3.6 © 2008-2014, SimplePortal