A downloadable extension

Download NowName your own price

Quick links: documentation · source code
Versions: GameMaker: Studio, GameMaker Studio 2
Platforms: Windows, Windows (YYC)

This fancy extension addresses a quirk where GameMaker games cease to update while the window is being dragged around or resized.

The issue is Windows-specific behaviour - unless you run game logic and rendering on separate threads, system's dragging/resizing logic overtakes anything else and no other code executes until that's done.

The approach this extension takes is best called "a delightful hack" - the DLL starts up an simple helper program, into the window of which the game's window is then inserted as a child window.

This has the game window continue to run while the window is being manipulated, as well as allowing to enable/disable the window frame, allowing to also use it for borderless fullscreen.

The extension also includes it's own versions of Window Commands functions.

Note: Don't forget to disable the default border in Global Game Settings - Windows - Graphics (GMS1) / Game Options - Windows - Graphics (GMS2)!

Download

Download NowName your own price

Click download now to get access to the following files:

window_frame.gmez 65 kB
window_frame.gmz 73 kB

Development log

Comments

Log in with itch.io to leave a comment.

(2 edits)

This is amazing, and I'll definitely use for projects.
Just one thing...
What exactly happens when you disable border and then minimize? Because it creates a new window without having minimized the borderless, and then when you return it splits.

Easily avoidable by re-enabling border before minimizing, but I would like to know why that happens, and if it is intended.
Also, when that happens, it can't be closed through the X.

https://imgur.com/a/LWtFJhP

Window Commands like functions all apply to the frame, so using minimize command with frame disabled minimizes the frame, causing it to become visible but not attached to the game window. As mentioned in my comment below, the extension is currently undergoing a rewrite so it is not clear whether it is worth backporting a fix for this.

It's great that it's going to be updated! Will working code for this be compatible, just needing to replace the extension?
If not, please try to, I'd like to already start using this. hahaha

(1 edit)

Found another issue today: If the game "crashes" (i.e., Game Maker pops up an error window), window_frame_host.exe doesn't exit and just sticks around forever.

Also, if I'm in full-screen (via window_frame_set_fullscreen(true)) and I'm not running through the IDE/runner (found in a YYC package build specifically) game maker's error popups show behind the game so I can't see them and I can only close them or exit the game by pressing "enter"

(1 edit)

Fullscreen simply hides away the frame window and runs the regular fullscreen, so I'm not sure if that's something on my part or a more general Windows quirk.

There is in-progress work to make the DLL spawn a secondary thread instead of a separate process (which fixes oddities related to that), but that involves rewriting entirety of the code so may take a bit before it's out.

When I import the extension, only the objects, room, font, and HTML file are included. I tried downloading it again but it still doesn't work.

If you are importing the extension into GMS1, extension is always imported when clicking "Import" so it does not show under resources

I'm trying to import it into GMS2. This image is all I see when importing it.

(4 edits)

This works perfectly on my desktop, but on my laptop (Motile brand, AMD GPU) the code "window_frame_is_ready" always returns false. I'm going to test to see if I can get away with removing this conditional.

EDIT: Well, now I can switch between fullscreen and windowed, but I can't seem to get the window border to appear. Very weird.

That would suggest that the helper executable does not start up for some reason. You could try running it manually and see if the empty window opens at all.

(2 edits)

Love this extension! Couple of things I've noticed...

1) The title bar seems to deactivate when I click inside the game itself. The frame only shows active when I click on the frame itself. This doesn't break anything, but does seem like an odd user experience all the same. This may just be an unavoidable consequence of the fact that there are technically two windows. It'd be lovely if there's a way to fix it, but not end of the world if not.

2) A bit more problematic is that the resize arrows seem to stop showing up after the first time I resize the frame. It's still resizable, the cursors just don't show correctly. I'm working around this by setting the cursor myself, but I thought I'd let you know this is happening in case you weren't aware of it.

I'm not super familiar with WinAPI so I don't really know how easy either of these is to fix, but if you don't get to it in the next... oh, few months while I'm working on my game, I'll probably look into it eventually and see if I can't make you a pull request for it, since you've helpfully provided source. :)

Hey. Do you know why does this happen when pressing Alt + Space?
https://gyazo.com/6269b691321fa4ff36b2cc4cfbd6e165

I have now uploaded a new version that fixes that - a native menu pops up on most windows when you press Alt+Space, but this one certainly isn't having a good time drawing over the game window.

Hello. I tried importing the GMEZ file to a new project in GMStudio 2.
This is the result I got: 
https://gyazo.com/a5af1b486ba7670ef1e79cdf004cb443

It works fine in GMStudio 1... Can you please test it yourself and see if maybe I'm missing something? Thanks and it looks really cool, can't wait to use it!

Don't forget to flag disable the regular border!

Oh right! sorry...

I've seen it and tried to find it in the IDE but then I just forgot about it lol..

i have gms2 can't i include the extension ?

(+1)

You can! Right-click on Extensions section in the resource tree, pick "Import Extension", and it'll let you pick the GMEZ. Or pick "Import" on home tab and pick the GMZ.

i have emotional problems with this, i just want to switch between hd res with border to fullscreen borderless with one button, but after longass trying everything i still dont understand the functions xD if there is any advice you have, ill be thankful. This extension broke me, it broke my will and spirit XD

Unfortunately, in two years time no one agreed to pay me to write out documentation for the extension, and now I do not remember how most of it is supposed to work either, so you'll have to experiment and see how things work.

Hey, love that you made this!

I'm struggling getting window resizing working together with borderless toggling. I can get one or the other working, but I'm not sure how to resize the frame after the window itself has been resized. window_frame_set_rect and window_frame_set_region don't seem to do it, at least not in the order I'm doing it

Also, when "borderless windowed" matches the full size of the screen (fake fullscreen), the taskbar sometimes covers the game. Is there any way around this too?

window_frame_set_rect should work. If you've got a minimal reproducible example, I'll take a look at weekend.

As for taskbar overlap, I've seen someone mention that but again, it's hard to tell what's up without reproduction steps, and even then it sounds like something on Windows' end so is a matter of whether someone is willing to sit down and try different hacks until something fixes it.

It took a bit of finagling, but I figured it out. Had to do window_frame_set_rect(middleX,middleY,w,h), then window_frame_set_region(0,0,w,h), then window_set_size(w,h), then window_set_position(0,0). 

As far as the taskbar overlap, it only shows up on game load, not when player was setting the resolution in game. I just set an alarm on my window manager object with a 20 frame delay that triggers my resolution change script. That puts it back over the taskbar.

Thanks again! Nice to have borderless "fullscreen" windowed be the default but be able to see the frame when it's at lower resolutions. :)

GameMaker Studio 2 support?

The extension reportedly works in GMS2, are you seeing anything particular?

Deleted 7 days ago
(+1)

На данный момент документации не существует, лишь проект-пример (GMZ) и примечания к некоторым функциям в авто-завершении. Если есть возможность пожертвовать ~$20 через итч, документация по 26 функциям расширения может быть написана (пример) на русском или английском языке в ближайший выходной.

Deleted 7 days ago
(+1)

Для игры настраивается borderless режим в global game settings; спустя несколько вызовов window_frame_update расширение подвязывает к игре свое окно-рамку, благодаря которому фриз и устраняется

Deleted 7 days ago
Deleted 7 days ago
(+1)

Не слышал о таком. Если можно маленький проект-пример, на котором проблема воспроизводится, я гляну на досуге

(1 edit)

Hi, I was curious if you had problems with Asynchronous System events while using window_frame. It doesn't seem to fire them anymore while being used. I disabled window_frame temporarily and the async events started firing again.

I need Asynchronous System events for gamepad support :]

Apparently the issue with both is that, since it is the frame window that is in focus rather than the game (though it is a child of it and takes input), it is not counted as active and will not take inputs. Not actually sure if there's an easy fix, but if you know anyone experienced with WinAPI and willing to help, you can have them look at the source code.

I checked the source code and I fixed the focus issue with ( to wndproc of the window_frame_host )

case WM_SETFOCUS: {
            HWND game = (HWND)GetWindowLongPtr( hWnd, GWLP_USERDATA );
            if ( game != nullptr ) {
                if ( IsWindow( game ) ) {
                    SetFocus( game );
                }
            }
            return 0;
        };

This just checks for focus on the window and passes it to the game window. Seems to work for me.

Doesn't fix the gamepad issue though :[

Can you share an edited extension that has this fix? I have downloaded the source code and attempted to fix it myself, but I have no idea what I am doing and my attempts at learning aren't going so well.

Any chance it can be updated with 'window_frame_has_focus' function to check for focus, The 'window_has_focus' gamemaker has won't function properly with this.

TY anyway :)

1) Yes, I see an example from the Window Commands, but I think that this extensions minimizes the window in the Windows Taskbar, and not in the System Tray. Am I mistaken?

2) Let is the question yet. By default, window_set_fullscreen in GMS2 opens a window on the main monitor, or am i mistaken?

Ah, sorry. I didn't pay enough attention to your first message.

  1. It'd take an entirely different system to minimize to tray instead.
    If you are able to pay for that (rough estimate is $100..$150 depending on features), that could be implemented into this or a separate extension.
    (if you are wondering, this extension similarly exists only because someone sponsored the development and was fine with it being made publicly available)
  2. Conventional (DirectX) fullscreen rolls up on the monitor that it was initialized for, so usually the primary one.
    It's usually possible to move the game window between screens via Win+Shift+Left/Right, but I'm not sure if you could cheat it by pressing those keys via keyboard_key_press.
    If window_set_rect has any effect in fullscreen (or you are fine with borderless fullscreen), I could modify my other extension to return screen XYWH per monitor index.

I understand! =) I do not have free money for my non-commercial projects. Maybe later, maybe never, but definitely not now... In other words, I'm a beggar! =) I was just curious about your plans to change this extension. Thanks for answers.

Very nice idea of such an extension. Thank you! Little questions: 1) Is it planned to make to minimize window in system tray? 2) Is it planned to make to fullscreen mode on the monitor on which window is located? Thanks for answers.

(+1)

1. See the example from Window Commands extension, this one has the same-styled functions.
2. Disabling border (see the example attached) would allow you to call window_set_fullscreen as usual.

Very often this blocks the steam overlay from launching with tab-shift. Otherwise works like a charm.

When using this together with Window Commands for GameMaker you get an error:
Maybe include the Freeze feature into Windows Commands?

Compile Extensions...Error : duplicate script name found window_command_hook in extension window_frame in file window_frame.gml
Error : duplicate script name found window_command_unhook in extension window_frame in file window_frame.gml
Error : duplicate script name found window_command_run in extension window_frame in file window_frame.gml
Error : duplicate script name found window_command_get_active in extension window_frame in file window_frame.gml
Error : duplicate script name found window_command_set_active in extension window_frame in file window_frame.gml

(1 edit)

As the description states, this extension includes it's own versions of all of Window Commands functions as they had to be reimplemented in a different way (the window being in an external process and all). You would remove Window Commands when switching to this extension.

ahh. Sorry. I should read more :-)

This extension doesn't appear to include the window_set_topmost function from Window Commands - or am I missing something?

Thank you for all of the excellent software, by the way.

I have to manually backport any functions that I add to Window Commands, so that is not here yet.

gr8 work again mah dood