davidkinder / windows-inform7 Goto Github PK
View Code? Open in Web Editor NEWFront-end for the Windows version of Inform 7.
Home Page: http://inform7.com/
License: Artistic License 2.0
Front-end for the Windows version of Inform 7.
Home Page: http://inform7.com/
License: Artistic License 2.0
The Windows front-end uses a lot of custom controls (e.g. the skein window). These should all be checked to make sure they expose Active Accessibility objects so that they are visible to screen readers, etc.
Declare the Windows front-end to use UTF-8 as the code page if supported, in the manifest (see https://docs.microsoft.com/en-us/windows/apps/design/globalizing/use-utf8-code-page).
If the code page is UTF-8, TextFormat::AnsiToUTF8() should be a no-op.
Currently, when waiting for line input in the story tab, arrow keys are captured to provide the edit history, and to stop the cursor moving out of the input area. A key (e.g. the tab key) should be used to toggle this behaviour, for times when users do want to move around the main story tab text area with the arrow keys.
Will need to think about how this works when playing a game, possibly disable undo/redo then, and clear undo history on starting a game. This will also affect the Trim option, or at least the warning shown before applying it.
Support dragging the skein by clicking on blank areas.
The button should produce a list of all matches in the source below the dialog controls, in the same style as the current "Find in Files" dialog.
On the current version of the OSX front end, the tab order is:
The Windows front-end should match this revised order, as much as is practical.
This might be related to the following issue: #27
I detected the following accessibility issues when attempting to use Windows Inform 7 Beta 5:
Many panels, such as the report page (on release and compilation outcome) and the panel the game gets played in appear to be completely empty when using a braille display with JAWS' standard cursor. As opposed to the last non-beta release of Windows Inform 7, the used cursor in the report page is the "PC cursor", not the "virtual PC cursor", indicating that JAWS does not perceive the panel as a HTML document anymore and instead tries treating it like a native Windows application, which apparently fails - at any rate, I cannot detect any text, tab to any controls.
Using the JAWS cursor (tethered to the mouse pointer) I can only perceive the menu and tab panels, but not the content of the panel. Using the touch cursor I can perceive the content of the panel, but navigation is tedious and in the game panel, the game's content is represented as a single line, forcing me to scroll far with the braille panning buttons if the game session is lengthy; also, all information on formatting, such as paragraphs, is lost.
The game panel is accessible, but the report panel is not - neither for reports on compilation, nor for reports on release. There appears to be no workaround to perceive the content of the panels. I also occasionally experienced issues with the welcome screen where the content of that screen was invisible, though that problem did not occur consistently.
Narrator performs best in many ways, all panels but one appear to get represented correctly. Unfortuantely, that one panel is the source panel - the source text is entirely invisible, and nothing I tried could change that fact (albeit I admit that I'm not too familiar with Narrator, so this might be a problem caused by my usage and not Windows Inform 7).
If you have any further questions or would like me to test further, let me know.€€
The "Open a Sample Project" links produce a "Create Project" dialog instead of opening the installed samples.
Some of the keyboard shortcuts use VK_OEM_? keycodes, such as Alt-/ (for commenting out code). This may or may not work, depending on the keyboard layout. Rather than using an accelerator table in the resources for these, they should probably be implemented directly in the code, so that the ASCII character that the keycode translates to can be checked directly.
The manifest needs to be updated with the "windowsSettings" section becoming
<asmv3:application>
<asmv3:windowsSettings>
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">True</dpiAware>
<dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2,System</dpiAwareness>
</asmv3:windowsSettings>
</asmv3:application>
The MacOS front-end now has separate toolbars icons for light and dark mode, which are also scalable. The Windows front-end should use a form of these icons, too.
This crash has been seen occasionally. For some reason it's more common on the "launcher" branch. The Chrome Browser I/O thread is in the process of stopping, when it dies here, especially if the front-end is closed shortly after it was started:
libcef.dll!base::SequencedTaskRunnerHandle::Get() Line 26 C++
[Inline Frame] libcef.dll!storage::`anonymous namespace'::MakeDeferredDeleter(std::__1::unique_ptr<storage::LocalStorageImpl,std::__1::default_delete<storage::LocalStorageImpl>> object) Line 30 C++
[Inline Frame] libcef.dll!storage::`anonymous namespace'::ShutDown(std::__1::unique_ptr<storage::LocalStorageImpl,std::__1::default_delete<storage::LocalStorageImpl>> object) Line 45 C++
libcef.dll!storage::PartitionImpl::~PartitionImpl() Line 58 C++
libcef.dll!storage::PartitionImpl::~PartitionImpl() Line 57 C++
[Inline Frame] libcef.dll!std::__1::default_delete<content::PeriodicBackgroundSyncServiceImpl>::operator()(content::PeriodicBackgroundSyncServiceImpl * __ptr) Line 54 C++
[Inline Frame] libcef.dll!std::__1::unique_ptr<content::PeriodicBackgroundSyncServiceImpl,std::__1::default_delete<content::PeriodicBackgroundSyncServiceImpl>>::reset(content::PeriodicBackgroundSyncServiceImpl * __p) Line 315 C++
[Inline Frame] libcef.dll!std::__1::unique_ptr<content::PeriodicBackgroundSyncServiceImpl,std::__1::default_delete<content::PeriodicBackgroundSyncServiceImpl>>::~unique_ptr() Line 269 C++
[Inline Frame] libcef.dll!std::__1::allocator_traits<std::__1::allocator<std::__1::__tree_node<std::__1::unique_ptr<content::PeriodicBackgroundSyncServiceImpl,std::__1::default_delete<content::PeriodicBackgroundSyncServiceImpl>>,void *>>>::destroy(std::__1::allocator<std::__1::__tree_node<std::__1::unique_ptr<content::PeriodicBackgroundSyncServiceImpl,std::__1::default_delete<content::PeriodicBackgroundSyncServiceImpl>>,void *>> &, std::__1::unique_ptr<content::PeriodicBackgroundSyncServiceImpl,std::__1::default_delete<content::PeriodicBackgroundSyncServiceImpl>> * __p) Line 318 C++
libcef.dll!std::__1::__tree<std::__1::unique_ptr<content::PeriodicBackgroundSyncServiceImpl,std::__1::default_delete<content::PeriodicBackgroundSyncServiceImpl>>,base::UniquePtrComparator,std::__1::allocator<std::__1::unique_ptr<content::PeriodicBackgroundSyncServiceImpl,std::__1::default_delete<content::PeriodicBackgroundSyncServiceImpl>>>>::destroy(std::__1::__tree_node<std::__1::unique_ptr<content::PeriodicBackgroundSyncServiceImpl,std::__1::default_delete<content::PeriodicBackgroundSyncServiceImpl>>,void *> * __nd) Line 1802 C++
[Inline Frame] libcef.dll!std::__1::__tree<std::__1::unique_ptr<storage::PartitionImpl,std::__1::default_delete<storage::PartitionImpl>>,base::UniquePtrComparator,std::__1::allocator<std::__1::unique_ptr<storage::PartitionImpl,std::__1::default_delete<storage::PartitionImpl>>>>::~__tree() Line 1789 C++
[Inline Frame] libcef.dll!std::__1::set<std::__1::unique_ptr<storage::PartitionImpl,std::__1::default_delete<storage::PartitionImpl>>,base::UniquePtrComparator,std::__1::allocator<std::__1::unique_ptr<storage::PartitionImpl,std::__1::default_delete<storage::PartitionImpl>>>>::~set() Line 617 C++
libcef.dll!storage::StorageServiceImpl::~StorageServiceImpl() Line 58 C++
libcef.dll!storage::StorageServiceImpl::~StorageServiceImpl() Line 58 C++
[Inline Frame] libcef.dll!std::__1::default_delete<device::DeviceService>::operator()(device::DeviceService * __ptr) Line 54 C++
[Inline Frame] libcef.dll!std::__1::unique_ptr<device::DeviceService,std::__1::default_delete<device::DeviceService>>::reset(device::DeviceService * __p) Line 315 C++
[Inline Frame] libcef.dll!std::__1::unique_ptr<device::DeviceService,std::__1::default_delete<device::DeviceService>>::~unique_ptr() Line 269 C++
libcef.dll!std::__1::default_delete<std::__1::unique_ptr<device::DeviceService,std::__1::default_delete<device::DeviceService>>>::operator()(std::__1::unique_ptr<device::DeviceService,std::__1::default_delete<device::DeviceService>> * __ptr) Line 54 C++
[Inline Frame] libcef.dll!base::SequenceLocalStorageSlot<std::__1::unique_ptr<device::DeviceService,std::__1::default_delete<device::DeviceService>>,std::__1::default_delete<std::__1::unique_ptr<device::DeviceService,std::__1::default_delete<device::DeviceService>>>>::Adopt::<lambda_1>::operator()(void * ptr) Line 110 C++
libcef.dll!base::SequenceLocalStorageSlot<std::__1::unique_ptr<device::DeviceService,std::__1::default_delete<device::DeviceService>>,std::__1::default_delete<std::__1::unique_ptr<device::DeviceService,std::__1::default_delete<device::DeviceService>>>>::Adopt::<lambda_1>::__invoke(void * ptr) Line 110 C++
[Inline Frame] libcef.dll!base::internal::SequenceLocalStorageMap::ValueDestructorPair::~ValueDestructorPair() Line 85 C++
[Inline Frame] libcef.dll!std::__1::pair<int,base::internal::SequenceLocalStorageMap::ValueDestructorPair>::~pair() Line 394 C++
[Inline Frame] libcef.dll!std::__1::allocator<std::__1::pair<int,base::internal::SequenceLocalStorageMap::ValueDestructorPair>>::destroy(std::__1::pair<int,base::internal::SequenceLocalStorageMap::ValueDestructorPair> * __p) Line 133 C++
[Inline Frame] libcef.dll!std::__1::allocator_traits<std::__1::allocator<std::__1::pair<int,base::internal::SequenceLocalStorageMap::ValueDestructorPair>>>::destroy(std::__1::allocator<std::__1::pair<int,base::internal::SequenceLocalStorageMap::ValueDestructorPair>> & __a, std::__1::pair<int,base::internal::SequenceLocalStorageMap::ValueDestructorPair> * __p) Line 308 C++
[Inline Frame] libcef.dll!std::__1::__vector_base<std::__1::pair<int,base::internal::SequenceLocalStorageMap::ValueDestructorPair>,std::__1::allocator<std::__1::pair<int,base::internal::SequenceLocalStorageMap::ValueDestructorPair>>>::__destruct_at_end(std::__1::pair<int,base::internal::SequenceLocalStorageMap::ValueDestructorPair> * __new_last) Line 429 C++
[Inline Frame] libcef.dll!std::__1::__vector_base<std::__1::pair<int,base::internal::SequenceLocalStorageMap::ValueDestructorPair>,std::__1::allocator<std::__1::pair<int,base::internal::SequenceLocalStorageMap::ValueDestructorPair>>>::clear() Line 372 C++
[Inline Frame] libcef.dll!std::__1::__vector_base<std::__1::pair<int,base::internal::SequenceLocalStorageMap::ValueDestructorPair>,std::__1::allocator<std::__1::pair<int,base::internal::SequenceLocalStorageMap::ValueDestructorPair>>>::~__vector_base() Line 466 C++
[Inline Frame] libcef.dll!std::__1::vector<std::__1::pair<int,base::internal::SequenceLocalStorageMap::ValueDestructorPair>,std::__1::allocator<std::__1::pair<int,base::internal::SequenceLocalStorageMap::ValueDestructorPair>>>::~vector() Line 558 C++
[Inline Frame] libcef.dll!base::internal::flat_tree<int,base::internal::GetFirst,std::__1::less<void>,std::__1::vector<std::__1::pair<int,base::internal::SequenceLocalStorageMap::ValueDestructorPair>,std::__1::allocator<std::__1::pair<int,base::internal::SequenceLocalStorageMap::ValueDestructorPair>>>>::~flat_tree() Line 222 C++
libcef.dll!base::internal::SequenceLocalStorageMap::~SequenceLocalStorageMap() Line 23 C++
libcef.dll!base::sequence_manager::internal::ThreadControllerWithMessagePumpImpl::~ThreadControllerWithMessagePumpImpl() Line 68 C++
libcef.dll!base::sequence_manager::internal::ThreadControllerWithMessagePumpImpl::~ThreadControllerWithMessagePumpImpl() Line 56 C++
[Inline Frame] libcef.dll!std::__1::default_delete<base::sequence_manager::internal::ThreadController>::operator()(base::sequence_manager::internal::ThreadController * __ptr) Line 54 C++
[Inline Frame] libcef.dll!std::__1::unique_ptr<base::sequence_manager::internal::ThreadController,std::__1::default_delete<base::sequence_manager::internal::ThreadController>>::reset(base::sequence_manager::internal::ThreadController * __p) Line 315 C++
[Inline Frame] libcef.dll!std::__1::unique_ptr<base::sequence_manager::internal::ThreadController,std::__1::default_delete<base::sequence_manager::internal::ThreadController>>::~unique_ptr() Line 269 C++
libcef.dll!base::sequence_manager::internal::SequenceManagerImpl::~SequenceManagerImpl() Line 262 C++
libcef.dll!base::sequence_manager::internal::SequenceManagerImpl::~SequenceManagerImpl() Line 216 C++
libcef.dll!content::BrowserIOThreadDelegate::~BrowserIOThreadDelegate() Line 92 C++
[Inline Frame] libcef.dll!std::__1::default_delete<base::Thread::Delegate>::operator()(base::Thread::Delegate * __ptr) Line 54 C++
[Inline Frame] libcef.dll!std::__1::unique_ptr<base::Thread::Delegate,std::__1::default_delete<base::Thread::Delegate>>::reset(base::Thread::Delegate * __p) Line 315 C++
libcef.dll!base::Thread::ThreadMain() Line 431 C++
libcef.dll!base::`anonymous namespace'::ThreadFunc(void * params) Line 113 C++
[External Code]
Add a "File / Open Recent" sub-menu of recently opened projects.
The button which pastes code examples from extension documentation into the Source panel does not seem to work (using the latest release, beta 4, on Windows 8.1 -- but the issue happened already with a previous version; I didn't get around to reporting it earlier).
The same goes for the button at the top beside the extension title, which should paste the line 'Include <ext. title> by <ext. author>.'
into the Source panel.
In contrast to that, the button to copy examples from the normal included documentation (WWI/RB) does work.
Steps to reproduce:
Selecting and copy-pasting the code examples by hand is a workaround, but unfortunately, not a very good one, because the formatting is not preserved completely -- for example, paragraph breaks are missing, which causes the compiler to misunderstand the code.
I know that the Gnome-Inform7 IDE is a separate project, but for what it's worth, the same issue seems to have cropped up there and was fixed in the gtk3 branch by this commit:
ptomato/inform7-ide@9858f76
("panel: Allow loading internal JS in Extensions pages")
Thanks for your work on the IDE!
Regards,
Michael
The switch to libcef seems to have broken the logic that does (or does not) set the focus when navigating to a HTML page in the front-end.
Need to investigate replacing ReportHtml::SetFocusOnContent() with an implementation of CefFocusHandler.
If the required interpreter is missing, or fails to start, the Story tab is just blank. At the least there should be a warning on the Results tab, possibly noting that we have had false positives from anti-virus tools in the past on interpreters.
The default install path is still "Inform 7". Probably should be Inform 10 or just Inform. Or I don't know.
The implementation of hyperlinks in text buffer windows in the story tab works by storing the numeric link value in the "style" field of the RichEdit CHARFORMAT2 structure. However, this is only a 16-bit value, so link vales larger than 65535 are not handled correctly.
See also https://intfiction.org/t/idea-for-a-unified-framework-for-handling-hyperlinks-in-inform-7/47246/15
When glk_image_draw() is called for a text buffer window, the alignment can be one of
Currently this is ignored, but the flags member of the REOBJECT structure passed to IRichEditOle::InsertObject() has the following flags, which may allow implementation of some of these alignments:
(not sure if this is the right place to flag this - but just to let you know that when I try to extract the gluxle interpretor my antivirus (bitdefender) flags it as infected with a virus. I assume it's probably a false flag, but it's preventing the interpretor in the IDE from running because of the missing file
In the HTML panes, you can hold down the middle mouse button (or scroll wheel) and move the mouse to scroll. It would be nice to have this in the Source pane, too.
This is (somewhat) implemented in MFC, and there is a modified version of this already in use for the Skein window. That could be improved by having a better icon image for when this mode activates - currently it's just a crudely drawn circle with arrows, with no anti-aliasing.
@DavidKinder What happened to the original inform7 source code?
According to this talk:
http://inform7.com/talks/2019/06/14/narrascope.html
The original source code should be here, but the link is dead:
https://github.com/ganelson/inform
Does this repo contain all the source? Is ganelson still around? Is Inform7 still maintained?
Thank you!
PS. I'm interested in using Inform7 as an engine to power a discord bot.
Currently, if the process exits while the background thread that decodes HTML for "Find in Files" is still running, that thread is suspended. This is not a good approach: the thread could be suspended while allocating memory and holding a lock in the memory allocator, for example.
Just a couple requests here, as per the thread title.
When the skein gets big, it would be REALLY useful to be able to zoom in and out to navigate quickly.
Regarding that, the middle-click panning function is VERY slow and not smooth.
Finally, being able to clear the ENTIRE skein with one click would be very very nice, as the skein gets QUITE full rather quickly as one is building a game. Having to delete every thread individually is very tiresome.
Similarly, it would be very nice if one could select multiple threads to delete in one go, rather than the entire skein (tho both, of course, would be very useful)
Also wondering when an official build will be available for download next. I'm not really "up to" compiling from source.
Thanks for your work! :D
Replace with calls to the Windows Imaging Component, see https://docs.microsoft.com/en-us/windows/win32/wic/-wic-about-windows-imaging-codec
The latest version of libcef has one fewer .bin files than the old version. When installing a new version, this file must be removed.
The MacOS front-end can syntax colour Inform 6 inclusions. This logic should be adapted and included in the Windows front-end.
When globally importing an Inform 7 extension in the IDE, it becomes available for use in the Extensions
panel.
(the extension gets copied into the Inform/Extensions/ folder)
This allows a user to open the extension inside the IDE itself.
However, there are no options for creating and opening a project specific extension.
The documentation states that these end up in the project's materials folder like so:
MyProject/
- MyProject.inform/
- MyProject.materials/
- Release/
- Extensions/
- Author/
- MyExtension.i7x
Such extensions can be successfully imported into the project.
The IDE just lacks menu options for creating them and opening them.
They are also not listed under Extensions
.
It would be nice if we could:
Extensions
panel. (perhaps marked with local extension
)Add a "File / Print" menu item to print the contents of some of the tabs.
It has been observed for one or more CEF processes to remain after the main Inform7 process has failed. This should not happen since a Windows job is used to ensure that all sub-processes die when the Inform7 process exits. However, the job is created after CefExecuteProcess() is called, so there is a chance of the sub-processes being created before the job is created.
Really the job needs to be created before CefExecuteProcess(), but only in the main process. We should pass a command line parameter to the sub-processes so that the Inform7 code can distinguish whether it is running as a sub-process or not before CefExecuteProcess() is called.
Currently, text buffer windows in the story tab are implemented as rich edit controls. This mostly works, but some corners of the Glk specification cannot be implemented using them. Investigate if it is practical to re-write the text buffer logic using DirectWrite, which would allow much more control over the display of the text buffer window.
On the Welcome to Inform launcher dialog, provide information on which buttons are links in two ways:
If you open an extension project and then close it really quickly, the front-end can crash. The problem occurs if the process that updates the examples list has not completed before the project window is closed.
Following the OSX front-end, support old versions of the compiler and cBlorb: at least 6L02 and 6L38.
In the front-end, there are "back" and "forward" arrow buttons at the top-left of the two panes that go back and forwards through the history of the UI items that the user has selected. It would be helpful if this also tracked the scroll position in HTML tabs so that going from one documentation page and then back left the scrollbar in the same position. This might be possible if the "document.body.scrollTop" property from the DOM was accessible.
Will need to think about how this works when playing a game, possibly disable undo/redo then, and clear undo history on starting a game. This will also affect the Trim option, or at least the warning shown before applying it.
The latest MacOS front-end supports a dark mode, which involves both changes to the front-end app itself, and the HTML generated by Inform 7. Given that the later work is done, it should be possible to have a dark mode on Windows, too.
However, Microsoft have made this extra difficult by not supporting dark mode with the standard Win32 common controls. There is logic in uxtheme.dll to draw controls in dark mode, but it's undocumented. It has been reverse engineered, see https://github.com/ysc3839/win32-darkmode, but using undocumented entry points is certainly less than ideal. Alternatively, it shouldn't be too hard to provide custom drawing logic for the few controls used by the Windows front-end so that they look okay in dark mode.
Following the OSX front-end, merge the skein and transcript into a new "Testing" tab. There are several related changes associated with this:
The Windows front-end has always had horizontal tabs for the main tabs (Story, Index, etc.) but the OSX and Linux front-ends have vertical tabs, with the actual tabs on the right.
Investigate making the Windows front-end have vertical tabs too, possibly optionally.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.