Author Topic: Hiccups while typing (continuation)  (Read 8540 times)

Offline ollydbg

  • Developer
  • Lives here!
  • *****
  • Posts: 6070
  • OpenCV and Robotics
    • Chinese OpenCV forum moderator
Re: Hiccups while typing (continuation)
« Reply #15 on: February 05, 2025, 02:23:01 am »
Another thought might be to issue a shared event to tell all parsers to re-read (update its parser.options) if a user clicks OK in the CodeCompletion settings dialog.

I don't mean to create a new global event, but I know that an event using an XRCID("mySharedEventId") is possible if both sender and receiver use the same XRCID.

I can't understand the logic here. But generally, I think this should be done inside the code completion plugin or its base plugin class.

I think the current logic is:

1, When a parser instance becomes "active", its options will be also get active, and "saved to the configure file".
2, When there is NO cbp files opened, a dummy parser(temp parser) will active, it also has its own options.

Case 1:
When you open C::B, the dummy parser is active, when you modify the CC's option, it was modifying the dummy parser's option. When you close C::B, the last active Parser is the dummy parser, so it setting is in the configure file.

Case 2:
You have one cbp(projectA) file opened, and the active parser is the opened cbp. So, when you tweak its CC setting, the option of this parser changed and saved to the configure file. Now, you click the "close button" to close C::B, it just "close the workspace" first. And if all the cbp files get closed, the dummy project parser will set active. You see that when a parser is set active, its option will be saved to the configure file. So, projectA's CC option will be overwritten by the dummy project parser's option to the configure file.


I think the logic here is that every Parser instance could have different options.

EDIT:

I only debugged the above 2 Cases, and I don't debugged other cases, and I can't say much about other cases.
« Last Edit: February 05, 2025, 02:24:33 am by ollydbg »
If some piece of memory should be reused, turn them to variables (or const variables).
If some piece of operations should be reused, turn them to functions.
If they happened together, then turn them to classes.

Offline ollydbg

  • Developer
  • Lives here!
  • *****
  • Posts: 6070
  • OpenCV and Robotics
    • Chinese OpenCV forum moderator
Re: Hiccups while typing (continuation)
« Reply #16 on: February 05, 2025, 02:41:07 am »
@ ollydbg

How about this idea.

The ccoptionsdlg can always record, in a global var, the address of the active parser that last updated the settings.

When the workspace is closed, if that var contains an address, that parser will be the only parser that is allows to update the .conf settings.

That way, any number of projects can be in the workspace, but only the last parser to update the settings can finally store them to the .conf .

Wouldn't that work for only one parser and also for multiple parsers?

If the global var is nullptr, ccoptionsdlg never got called to change any option, then we don't care about which parser updates the .conf .

ccoptionsdlg would only set the active parsers address in the global var, if the user clicked OK to dismiss the dialog.
I'm assuming that the dismiss dialog action (OK or Cancel) can be caught.
Else we'd have to find another way to determine that the user changed any option.

Edit: 10:35am
Got It. void CCOptionsDlg::OnApply() is only called when user clicks OK. I'm thinking that's the only place we need to set the global var with the active parser address.

Is all this true?

Some concerns from my mind.

The CC options includes the options from the ccoptionsdlg, but it also includes the options from the classbrowser's GUI.

So, when I see inside the SetParser() function call, it will also save the active classbrowser's GUI setting to the configure file.

Also, if a Parser instance is deleted, the global var (pointer) still point to the deleted memory?

If some piece of memory should be reused, turn them to variables (or const variables).
If some piece of operations should be reused, turn them to functions.
If they happened together, then turn them to classes.

Offline Pecan

  • Plugin developer
  • Lives here!
  • ****
  • Posts: 2839
Re: Hiccups while typing (continuation)
« Reply #17 on: February 05, 2025, 04:38:09 am »
@ ollydbg

Would you try the following CC patch. It works well for me.

It simply remembers the project that applied an options change.
At WriteOptions() it only lets that project update the CC Options and .conf and makes the other projects refresh their cached options.

Patch is also attached to this msg.

Code
Index: ccoptionsdlg.cpp
===================================================================
--- ccoptionsdlg.cpp (revision 13609)
+++ ccoptionsdlg.cpp (working copy)
@@ -183,6 +183,10 @@
 
 void CCOptionsDlg::OnApply()
 {
+    //(ph 2025/02/04) // Set the project that changed the .conf data //(ph 2025/02/04)
+    cbProject* pProject = Manager::Get()->GetProjectManager()->GetActiveProject();
+    m_ParseManager->SetOptsChangerProject(pProject);
+
     ConfigManager* cfg = Manager::Get()->GetConfigManager(_T("code_completion"));
 
     // -----------------------------------------------------------------------
Index: parsemanager.h
===================================================================
--- parsemanager.h (revision 13609)
+++ parsemanager.h (working copy)
@@ -258,6 +258,9 @@
     void SetSymbolsWindowHasFocus(bool trueOrFalse){ m_SymbolsWindowHasFocus = trueOrFalse;}
     bool GetSymbolsWindowHasFocus(){return m_SymbolsWindowHasFocus;}
 
+    cbProject* GetOptsChangerProject(){ return m_pOptsChangerProject;} //(ph 2025/02/04)
+    void SetOptsChangerProject(cbProject* pProject){m_pOptsChangerProject = pProject;} //(ph 2025/02/04)
+
 protected:
     /** When a Parser is created, we need a full parsing stage including:
      * 1, parse the priority header files firstly.
@@ -527,6 +530,9 @@
     bool m_ClassBrowserViewIsStale = true;
     bool m_SymbolsWindowHasFocus = false;
 
+    //The last project to change the .conf file //(ph 2025/02/04)
+    cbProject* m_pOptsChangerProject = nullptr;
+
 };
 
 #endif // PARSEMANAGER_H
Index: parser/parser.cpp
===================================================================
--- parser/parser.cpp (revision 13609)
+++ parser/parser.cpp (working copy)
@@ -29,6 +29,7 @@
 
 #include <wx/tokenzr.h>
 #include <cbstyledtextctrl.h>
+#include "..\parsemanager.h" //(ph 2025/02/04)
 
 #include "parser.h"
 #include "parserthreadedtask.h"
@@ -921,6 +922,16 @@
 
 void Parser::WriteOptions()
 {
+    // If this project didn't change the options, then don't let it overwrite them. //(ph 2025/02/04)
+    cbProject* pActiveProject = Manager::Get()->GetProjectManager()->GetActiveProject();
+    ParseManager* pParseMgr = (ParseManager*)m_Parent;
+    cbProject* pOptsChangerProject = pParseMgr->GetOptsChangerProject();
+    if ( pActiveProject != pOptsChangerProject )
+    {
+        ReadOptions();  // force projects that did not change options to re-read them.
+        return;
+    }
+
     ConfigManager* cfg = Manager::Get()->GetConfigManager(_T("code_completion"));
 
     // Page "Code Completion"
Index: resources/manifest.xml
===================================================================
--- resources/manifest.xml (revision 13609)
+++ resources/manifest.xml (working copy)
@@ -3,7 +3,7 @@
     <SdkVersion major="1" minor="10" release="0" />
     <Plugin name="CodeCompletion">
         <Value title="Code completion" />
-        <Value version="1.0.5 24/01/29" />
+        <Value version="1.0.6(ph) 25/02/04" />
         <Value description="This plugin provides a symbols browser for your projects and code-completion inside the editor.
 
 

« Last Edit: February 05, 2025, 04:44:02 am by Pecan »

Offline stahta01

  • Lives here!
  • ****
  • Posts: 7721
    • My Best Post
Re: Hiccups while typing (continuation)
« Reply #18 on: February 05, 2025, 04:48:06 am »
@ ollydbg

Would you try the following CC patch. It works well for me.

It simply remembers the project that applied an options change.
At WriteOptions() it only lets that project update the CC Options and .conf and makes the other projects refresh their cached options.

Patch is also attached to this msg.

Code
Index: ccoptionsdlg.cpp
===================================================================
--- ccoptionsdlg.cpp (revision 13609)
+++ ccoptionsdlg.cpp (working copy)
@@ -183,6 +183,10 @@
 
 void CCOptionsDlg::OnApply()
 {
+    //(ph 2025/02/04) // Set the project that changed the .conf data //(ph 2025/02/04)
+    cbProject* pProject = Manager::Get()->GetProjectManager()->GetActiveProject();
+    m_ParseManager->SetOptsChangerProject(pProject);
+
     ConfigManager* cfg = Manager::Get()->GetConfigManager(_T("code_completion"));
 
     // -----------------------------------------------------------------------
Index: parsemanager.h
===================================================================
--- parsemanager.h (revision 13609)
+++ parsemanager.h (working copy)
@@ -258,6 +258,9 @@
     void SetSymbolsWindowHasFocus(bool trueOrFalse){ m_SymbolsWindowHasFocus = trueOrFalse;}
     bool GetSymbolsWindowHasFocus(){return m_SymbolsWindowHasFocus;}
 
+    cbProject* GetOptsChangerProject(){ return m_pOptsChangerProject;} //(ph 2025/02/04)
+    void SetOptsChangerProject(cbProject* pProject){m_pOptsChangerProject = pProject;} //(ph 2025/02/04)
+
 protected:
     /** When a Parser is created, we need a full parsing stage including:
      * 1, parse the priority header files firstly.
@@ -527,6 +530,9 @@
     bool m_ClassBrowserViewIsStale = true;
     bool m_SymbolsWindowHasFocus = false;
 
+    //The last project to change the .conf file //(ph 2025/02/04)
+    cbProject* m_pOptsChangerProject = nullptr;
+
 };
 
 #endif // PARSEMANAGER_H
Index: parser/parser.cpp
===================================================================
--- parser/parser.cpp (revision 13609)
+++ parser/parser.cpp (working copy)
@@ -29,6 +29,7 @@
 
 #include <wx/tokenzr.h>
 #include <cbstyledtextctrl.h>
+#include "..\parsemanager.h" //(ph 2025/02/04)
 
 #include "parser.h"
 #include "parserthreadedtask.h"
@@ -921,6 +922,16 @@
 
 void Parser::WriteOptions()
 {
+    // If this project didn't change the options, then don't let it overwrite them. //(ph 2025/02/04)
+    cbProject* pActiveProject = Manager::Get()->GetProjectManager()->GetActiveProject();
+    ParseManager* pParseMgr = (ParseManager*)m_Parent;
+    cbProject* pOptsChangerProject = pParseMgr->GetOptsChangerProject();
+    if ( pActiveProject != pOptsChangerProject )
+    {
+        ReadOptions();  // force projects that did not change options to re-read them.
+        return;
+    }
+
     ConfigManager* cfg = Manager::Get()->GetConfigManager(_T("code_completion"));
 
     // Page "Code Completion"
Index: resources/manifest.xml
===================================================================
--- resources/manifest.xml (revision 13609)
+++ resources/manifest.xml (working copy)
@@ -3,7 +3,7 @@
     <SdkVersion major="1" minor="10" release="0" />
     <Plugin name="CodeCompletion">
         <Value title="Code completion" />
-        <Value version="1.0.5 24/01/29" />
+        <Value version="1.0.6(ph) 25/02/04" />
         <Value description="This plugin provides a symbols browser for your projects and code-completion inside the editor.
 
 


Code
#include "..\parsemanager.h"

My guess is the above line will fail under Linux.

Tim S.
C Programmer working to learn more about C++ and Git.
On Windows 7 64 bit and Windows 10 64 bit.
--
When in doubt, read the CB WiKi FAQ. http://wiki.codeblocks.org

Offline Pecan

  • Plugin developer
  • Lives here!
  • ****
  • Posts: 2839
Re: Hiccups while typing (continuation)
« Reply #19 on: February 05, 2025, 06:37:57 am »


Code
#include "..\parsemanager.h"

My guess is the above line will fail under Linux.

Tim S.

Thanks

Offline ollydbg

  • Developer
  • Lives here!
  • *****
  • Posts: 6070
  • OpenCV and Robotics
    • Chinese OpenCV forum moderator
Re: Hiccups while typing (continuation)
« Reply #20 on: February 05, 2025, 09:42:56 am »
I'm not fully understand the patch, it looks like all the Parser instance will share the same "option".

If you set a breakpoint(BP) in the file: parser.cpp, in the function body: void Parser::WriteOptions()

Then do something like below:

1, start C::B, this will hit the BP
2, when you open a project, the BP will hit again, at this time, "ReadOptions()" will be called, and returned without writing to the configure file.
3, when you change the classbrowser's option, from current "project" to "everything", the BP will hit again, and "ReadOptions()" will be called again, but still not write to the configure file.

From my point of view, this is not correct.

As Tim said, we should use "../xxxxx.h" include directive, thanks.
If some piece of memory should be reused, turn them to variables (or const variables).
If some piece of operations should be reused, turn them to functions.
If they happened together, then turn them to classes.

Offline Pecan

  • Plugin developer
  • Lives here!
  • ****
  • Posts: 2839
Re: Hiccups while typing (continuation)
« Reply #21 on: February 05, 2025, 06:57:53 pm »
I'm not fully understand the patch, it looks like all the Parser instance will share the same "option".

If you set a breakpoint(BP) in the file: parser.cpp, in the function body: void Parser::WriteOptions()

Then do something like below:

1, start C::B, this will hit the BP
2, when you open a project, the BP will hit again, at this time, "ReadOptions()" will be called, and returned without writing to the configure file.
3, when you change the classbrowser's option, from current "project" to "everything", the BP will hit again, and "ReadOptions()" will be called again, but still not write to the configure file.

From my point of view, this is not correct.

As Tim said, we should use "../xxxxx.h" include directive, thanks.

I can't find a "Class browser's option. Where is that?
I can possible make those options "always write" if I could figure out where that is.

As it is with the patch:
If no changes were ever made to settings, why should anything be written to the .conf?

The write to .conf takes place when a user changes an item in MainMenu>settings>CodeCompletion.

@parser.cpp void Parser::WriteOptions()
WriteOptions take place on CB startup but changes nothing because active parser is null and m_pOptsChangerProject is null.

Any change made while no project is active gets written to .conf

When a project is loaded nothing has changed in .conf, so no write options need to be done.

If changes are made to settings (OnApply is entered), the active parser that made the changes
is recorded by OnApply().
Those changes are then written to the .conf, and only the settings made by that
active project are written to the .conf. all other projects read those settings.

If no user setting are made via settings, no need to care about writing the .conf.]
Code
ActiveProject   OnAppy project  ActiveProject != OnApplyProject     action
--------------  --------------  -------------------------------    ----------
nullptr          nullptr        False,  will write                  .conf written at startup
nullptr          nullptr        False,  will write                  no projects,.option changed, .conf wrtten
Nullptr          Not null       Does not happen                     Can't happen, no project to record
Not null         nullptr        True,   no write                    no setting changed, no writes
Not null         not null       False,  will write                  option changed, .conf written
nullptr          nullptr        False,  will write                  project closed but no options change, no write
nullptr          not null       True,   no write                    project closed, .conf written for matching project

Writes to the .conf take place only when there is no project or when a project changes options.
when a project changes options, only that project is allow to write the .conf
« Last Edit: February 05, 2025, 08:21:43 pm by Pecan »

Offline ollydbg

  • Developer
  • Lives here!
  • *****
  • Posts: 6070
  • OpenCV and Robotics
    • Chinese OpenCV forum moderator
Re: Hiccups while typing (continuation)
« Reply #22 on: February 06, 2025, 02:56:14 am »
I can't find a "Class browser's option. Where is that?
I can possible make those options "always write" if I could figure out where that is.

If you look at this function: void Parser::WriteOptions(), you will see that it actually save two member variables: one is the m_Options, and the other is the m_BrowserOptions.
In my mind, it looks like the "m_BrowserOptions" is shared by all the Parser instances. But the "m_Options" is not, so each Parser instance has its own "m_Options". So, switch the Parser won't switch the browser options, instead, it keep the browser options, but the "m_Options" need to be changed if different Parsers have different m_Options.

So, when a Parser is constructed, it first read the "m_BrowserOptions" and "m_Options" from the configure file, and later user can adjust its own options.

When we switch cbp in a workspace, one Parser get active, so its "m_Options" get active, at this time, the configure file is updated, I mean the active parser's "m_Options" is saved to the configure file.

But if you look at the function: void ClassBrowser::SetParser(ParserBase* parser), you will see:

Code
// ----------------------------------------------------------------------------
void ClassBrowser::SetParser(ParserBase* parser)
// ----------------------------------------------------------------------------
{
    if (m_Parser == parser)
        return;

    m_Parser = parser;
    if (m_Parser)
    {
        const int sel = XRCCTRL(*this, "cmbView", wxChoice)->GetSelection();
        BrowserDisplayFilter filter = static_cast<BrowserDisplayFilter>(sel);
        if (!m_ParseManager->IsParserPerWorkspace() && filter == bdfWorkspace)
            filter = bdfProject;

        m_Parser->ClassBrowserOptions().displayFilter = filter;
        m_Parser->WriteOptions();
        UpdateClassBrowserView();
    }
    else
        CCLogger::Get()->DebugLog("SetParser: No parser available.");
}

You see the "m_Parser->WriteOptions();" also get called.

So, maybe, it looks like we may need to call the "WriteClassBrowserOptions()" like function here inside the "void ClassBrowser::SetParser(ParserBase* parser)", because this class only response for the ClassBrowser related options.

If some piece of memory should be reused, turn them to variables (or const variables).
If some piece of operations should be reused, turn them to functions.
If they happened together, then turn them to classes.

Offline ollydbg

  • Developer
  • Lives here!
  • *****
  • Posts: 6070
  • OpenCV and Robotics
    • Chinese OpenCV forum moderator
Re: Hiccups while typing (continuation)
« Reply #23 on: February 06, 2025, 03:09:40 am »
Quote
Any change made while no project is active gets written to .conf

I agree, this include the m_Options and the m_BrowserOptions.

Quote
When a project is loaded nothing has changed in .conf, so no write options need to be done.

I agree.

Quote
If changes are made to settings (OnApply is entered), the active parser that made the changes is recorded by OnApply().
Those changes are then written to the .conf, and only the settings made by that active project are written to the .conf.
all other projects read those settings.

I agree that the writing of m_Options to the configure file should only happens inside the OnApply() function.
When user tweak the Class browser GUI options, it should always to saved to configure file.

But, I think the last sentence ("all other projects read those settings") is not correct. When we switch the Parser, the other Parser should read the m_BrowserOptions, because this is a global setting.
But we don't need to "re-read" the m_Options from the configure file, because different Parsers may have different parsing options.


Quote
If no user setting are made via settings, no need to care about writing the .conf.
I agree.
If some piece of memory should be reused, turn them to variables (or const variables).
If some piece of operations should be reused, turn them to functions.
If they happened together, then turn them to classes.

Offline Pecan

  • Plugin developer
  • Lives here!
  • ****
  • Posts: 2839
Re: Hiccups while typing (continuation)
« Reply #24 on: February 07, 2025, 09:43:47 pm »
@ ollydbg

Please evaluate this patch.
I've tested it with single and mult-project workspaces, Single file workspace and empty ones as well.

I think I've followed your outline (previous msg) to guard against stowing any stale global status while always allowing ClassBrowser status to be updated.


Code
Index: ccoptionsdlg.cpp
===================================================================
--- ccoptionsdlg.cpp (revision 13610)
+++ ccoptionsdlg.cpp (working copy)
@@ -183,6 +183,12 @@
 
 void CCOptionsDlg::OnApply()
 {
+    cbProject* pProject = Manager::Get()->GetProjectManager()->GetActiveProject();
+     // Remember the project that changed the .conf data //(ph 2025/02/04)
+    m_ParseManager->SetOptsChangedByProject(pProject);
+    // Renember the Parser that changed the .conf data //(ph 2025/02/04)
+    m_ParseManager->SetOptsChangedByParser(&(m_ParseManager->GetParser())); //(ph 2025/02/07)
+
     ConfigManager* cfg = Manager::Get()->GetConfigManager(_T("code_completion"));
 
     // -----------------------------------------------------------------------
Index: parsemanager.h
===================================================================
--- parsemanager.h (revision 13610)
+++ parsemanager.h (working copy)
@@ -9,8 +9,8 @@
 #include "parsemanager_base.h"
 #include "parser/parser.h"
 
-#include <queue>
-#include <map>
+//unused #include <queue>
+// unused #include <map>
 #include <memory>
 #include <unordered_map>
 
@@ -258,6 +258,14 @@
     void SetSymbolsWindowHasFocus(bool trueOrFalse){ m_SymbolsWindowHasFocus = trueOrFalse;}
     bool GetSymbolsWindowHasFocus(){return m_SymbolsWindowHasFocus;}
 
+    // Set or return Project that changed "Global setting" in workspace
+    cbProject* GetOptsChangedByProject(){ return m_pOptsChangedProject;}
+    void SetOptsChangedByProject(cbProject* pProject){m_pOptsChangedProject = pProject;}
+    // Set or return Parser that changed "Global setting" in Single File workspace
+    ParserBase* GetTempParser(){return m_TempParser;}
+    ParserBase* GetOptsChangedByParser(){ return m_pOptsChangedParser;}
+    void SetOptsChangedByParser(ParserBase* pParserBase){m_pOptsChangedParser = &(GetParser());}
+
 protected:
     /** When a Parser is created, we need a full parsing stage including:
      * 1, parse the priority header files firstly.
@@ -474,11 +482,12 @@
      */
     bool RemoveProjectFromParser(cbProject* project);
 
+
 private:
     typedef std::pair<cbProject*, ParserBase*> ProjectParserPair;
     typedef std::list<ProjectParserPair>       ParserList;
 
-    /** a list holing all the cbp->parser pairs, if in one parser per project mode, there are many
+    /** a list holding all the cbp->parser pairs, if in one parser per project mode, there are many
      * many pairs in this list. In one parser per workspace mode, there is only one pair, and the
      * m_ParserList.begin()->second is the common parser for all the projects in workspace.
      */
@@ -527,6 +536,11 @@
     bool m_ClassBrowserViewIsStale = true;
     bool m_SymbolsWindowHasFocus = false;
 
+    //The latest project to change the .conf file //(ph 2025/02/04)
+    cbProject* m_pOptsChangedProject = nullptr;
+    //The latest parser to change the .conf file //(ph 2025/02/04)
+    ParserBase* m_pOptsChangedParser = nullptr;
+
 };
 
 #endif // PARSEMANAGER_H
Index: parser/parser.cpp
===================================================================
--- parser/parser.cpp (revision 13610)
+++ parser/parser.cpp (working copy)
@@ -32,9 +32,10 @@
 
 #include "parser.h"
 #include "parserthreadedtask.h"
+#include "../parsemanager.h" //(ph 2025/02/04)
 
 #include "../classbrowser.h"
-#include "../classbrowserbuilderthread.h"
+//unused - #include "../classbrowserbuilderthread.h"
 
 
 #ifndef CB_PRECOMP
@@ -921,19 +922,59 @@
 
 void Parser::WriteOptions()
 {
+     //(ph 2025/02/06)
+    // Assemble status to determine if a Parser or Project changed a global setting.
+    ProjectManager* pPrjMgr = Manager::Get()->GetProjectManager();
+    cbProject*      pActiveProject = pPrjMgr->GetActiveProject();
+    ParseManager*   pParseMgr = (ParseManager*)m_Parent;
+    ParserBase*     pParser = &(pParseMgr->GetParser());
+    ParserBase*     pTempParser = pParseMgr->GetTempParser();
+    cbProject*      pOptsChangerProject = pParseMgr->GetOptsChangedByProject();
+
+    int  projectsCount = pPrjMgr->GetProjects()->size();
+    bool isTempParser  = (pParser == pTempParser);
+    bool globalOptionChanged = pParseMgr->GetOptsChangedByParser() or pParseMgr->GetOptsChangedByProject();
+
     ConfigManager* cfg = Manager::Get()->GetConfigManager(_T("code_completion"));
 
-    // Page "Code Completion"
-    cfg->Write(_T("/use_SmartSense"),                m_Options.useSmartSense);
-    cfg->Write(_T("/while_typing"),                  m_Options.whileTyping);
+    // **Debugging** use this global to verify logic
+    // bool parseWhileTypingStatus = m_Options.whileTyping;
 
-    // Page "C / C++ parser"
-    cfg->Write(_T("/parser_follow_local_includes"),  m_Options.followLocalIncludes);
-    cfg->Write(_T("/parser_follow_global_includes"), m_Options.followGlobalIncludes);
-    cfg->Write(_T("/want_preprocessor"),             m_Options.wantPreprocessor);
-    cfg->Write(_T("/parse_complex_macros"),          m_Options.parseComplexMacros);
-    cfg->Write(_T("/platform_check"),                m_Options.platformCheck);
+    // Do not allow stale parser settings to change the global settings
+    bool allowGlobalUpdate = false;
+    if ( (projectsCount == 0) and globalOptionChanged)
+        allowGlobalUpdate = true;   //Single file settings changes
+    if (projectsCount and (pOptsChangerProject == pActiveProject) )
+        allowGlobalUpdate = true;   // changes made by a project
+    if ( (projectsCount==0) and isTempParser and globalOptionChanged)
+        allowGlobalUpdate = false; // TempParser has stale settings on Close()
+    if (not globalOptionChanged)
+        allowGlobalUpdate = false; // no global settings have changed
 
+    if (allowGlobalUpdate)
+    {
+        // Page "Code Completion"
+        cfg->Write(_T("/use_SmartSense"),                m_Options.useSmartSense);
+        cfg->Write(_T("/while_typing"),                  m_Options.whileTyping);
+
+        // Page "C / C++ parser"
+        cfg->Write(_T("/parser_follow_local_includes"),  m_Options.followLocalIncludes);
+        cfg->Write(_T("/parser_follow_global_includes"), m_Options.followGlobalIncludes);
+        cfg->Write(_T("/want_preprocessor"),             m_Options.wantPreprocessor);
+        cfg->Write(_T("/parse_complex_macros"),          m_Options.parseComplexMacros);
+        cfg->Write(_T("/platform_check"),                m_Options.platformCheck);
+    }
+    if ((projectsCount == 0) and isTempParser and globalOptionChanged)
+    {
+        // When no projects exists but the CB main settings have been changed,
+        // force the TempParser to reread settings/options else stale ones
+        // will be displayed on the next use of MenuBar/Settings/Editor/CodeCompletion dialog
+        ReadOptions();
+        // The global settings changed status can now be reset
+        pParseMgr->SetOptsChangedByParser(nullptr);
+        pParseMgr->SetOptsChangedByProject(nullptr);
+    }
+
     // Page "Symbol browser"
     cfg->Write(_T("/browser_show_inheritance"),      m_BrowserOptions.showInheritance);
     cfg->Write(_T("/browser_expand_ns"),             m_BrowserOptions.expandNS);
Index: resources/manifest.xml
===================================================================
--- resources/manifest.xml (revision 13610)
+++ resources/manifest.xml (working copy)
@@ -3,7 +3,7 @@
     <SdkVersion major="1" minor="10" release="0" />
     <Plugin name="CodeCompletion">
         <Value title="Code completion" />
-        <Value version="1.0.5 24/01/29" />
+        <Value version="1.0.6 25/02/7" />
         <Value description="This plugin provides a symbols browser for your projects and code-completion inside the editor.
 
 

« Last Edit: February 07, 2025, 10:17:54 pm by Pecan »

Offline ollydbg

  • Developer
  • Lives here!
  • *****
  • Posts: 6070
  • OpenCV and Robotics
    • Chinese OpenCV forum moderator
Re: Hiccups while typing (continuation)
« Reply #25 on: February 08, 2025, 08:42:14 am »
Thanks for your work.

Quote
I've tested it with single and mult-project workspaces, Single file workspace and empty ones as well.

single project workspace: a workspace only has one project.
mult-project workspace: a workspace has many projects.
Single file workspace: a single Parser will hold all the tokens in the whole workspace, whenever the workspace has one projects or more projects.
empty: no workspace is opened, neither a project is opened, in this case, the temp parser instance will be used.

Am I correct about the above description?
If some piece of memory should be reused, turn them to variables (or const variables).
If some piece of operations should be reused, turn them to functions.
If they happened together, then turn them to classes.

Offline ollydbg

  • Developer
  • Lives here!
  • *****
  • Posts: 6070
  • OpenCV and Robotics
    • Chinese OpenCV forum moderator
Re: Hiccups while typing (continuation)
« Reply #26 on: February 08, 2025, 02:02:57 pm »
I debugged your patch, and I found it still has logic errors, here is my steps:

1, start the debuggee C::B
2, load a cbp file
3, change some CC setting(from the code completion plugin's setting dialog)
4, close the cbp
5, change some CC setting(from the code completion plugin's setting dialog)
6, exit the debugee C::B

Note that from my point of view, in step 5, when I open the CC setting dialog, and change some settings, when I close the dialog, I need to "Save the setting to the configure file).
But actually, it is NOT.

If some piece of memory should be reused, turn them to variables (or const variables).
If some piece of operations should be reused, turn them to functions.
If they happened together, then turn them to classes.

Offline Pecan

  • Plugin developer
  • Lives here!
  • ****
  • Posts: 2839
Re: Hiccups while typing (continuation)
« Reply #27 on: February 08, 2025, 05:29:25 pm »
I debugged your patch, and I found it still has logic errors, here is my steps:

1, start the debuggee C::B
2, load a cbp file
3, change some CC setting(from the code completion plugin's setting dialog)
4, close the cbp
5, change some CC setting(from the code completion plugin's setting dialog)
6, exit the debugee C::B

Note that from my point of view, in step 5, when I open the CC setting dialog, and change some settings, when I close the dialog, I need to "Save the setting to the configure file).
But actually, it is NOT.

It seems I'm not forcing TempParser to update soon enough.
This is just no fun. 8>{

Offline Pecan

  • Plugin developer
  • Lives here!
  • ****
  • Posts: 2839
Re: Hiccups while typing (continuation)
« Reply #28 on: February 09, 2025, 12:22:20 am »
@ ollydbg

Thanks for doing all this testing.
I moved the forced TempParse update to before the .conf write.
That seemed to do the trick.

When you get a chance, would you test to see if I'm doing any better. So far, I'm batting 0 for 5.

Code
Index: ccoptionsdlg.cpp
===================================================================
--- ccoptionsdlg.cpp (revision 13610)
+++ ccoptionsdlg.cpp (working copy)
@@ -183,6 +183,12 @@
 
 void CCOptionsDlg::OnApply()
 {
+    cbProject* pProject = Manager::Get()->GetProjectManager()->GetActiveProject();
+     // Remember the project that changed the .conf data //(ph 2025/02/04)
+    m_ParseManager->SetOptsChangedByProject(pProject);
+    // Renember the Parser that changed the .conf data //(ph 2025/02/04)
+    m_ParseManager->SetOptsChangedByParser(&(m_ParseManager->GetParser())); //(ph 2025/02/07)
+
     ConfigManager* cfg = Manager::Get()->GetConfigManager(_T("code_completion"));
 
     // -----------------------------------------------------------------------
Index: parsemanager.h
===================================================================
--- parsemanager.h (revision 13610)
+++ parsemanager.h (working copy)
@@ -9,8 +9,8 @@
 #include "parsemanager_base.h"
 #include "parser/parser.h"
 
-#include <queue>
-#include <map>
+//unused #include <queue>
+// unused #include <map>
 #include <memory>
 #include <unordered_map>
 
@@ -258,6 +258,14 @@
     void SetSymbolsWindowHasFocus(bool trueOrFalse){ m_SymbolsWindowHasFocus = trueOrFalse;}
     bool GetSymbolsWindowHasFocus(){return m_SymbolsWindowHasFocus;}
 
+    // Set or return Project that changed "Global setting" in workspace
+    cbProject* GetOptsChangedByProject(){ return m_pOptsChangedProject;}
+    void SetOptsChangedByProject(cbProject* pProject){m_pOptsChangedProject = pProject;}
+    // Set or return Parser that changed "Global setting" in Single File workspace
+    ParserBase* GetOptsChangedByParser(){ return m_pOptsChangedParser;}
+    void SetOptsChangedByParser(ParserBase* pParserBase){m_pOptsChangedParser = pParserBase;}
+    ParserBase* GetTempParser(){return m_TempParser;}
+
 protected:
     /** When a Parser is created, we need a full parsing stage including:
      * 1, parse the priority header files firstly.
@@ -474,11 +482,12 @@
      */
     bool RemoveProjectFromParser(cbProject* project);
 
+
 private:
     typedef std::pair<cbProject*, ParserBase*> ProjectParserPair;
     typedef std::list<ProjectParserPair>       ParserList;
 
-    /** a list holing all the cbp->parser pairs, if in one parser per project mode, there are many
+    /** a list holding all the cbp->parser pairs, if in one parser per project mode, there are many
      * many pairs in this list. In one parser per workspace mode, there is only one pair, and the
      * m_ParserList.begin()->second is the common parser for all the projects in workspace.
      */
@@ -527,6 +536,11 @@
     bool m_ClassBrowserViewIsStale = true;
     bool m_SymbolsWindowHasFocus = false;
 
+    //The latest project to change the .conf file //(ph 2025/02/04)
+    cbProject* m_pOptsChangedProject = nullptr;
+    //The latest parser to change the .conf file //(ph 2025/02/04)
+    ParserBase* m_pOptsChangedParser = nullptr;
+
 };
 
 #endif // PARSEMANAGER_H
Index: parser/parser.cpp
===================================================================
--- parser/parser.cpp (revision 13610)
+++ parser/parser.cpp (working copy)
@@ -32,9 +32,10 @@
 
 #include "parser.h"
 #include "parserthreadedtask.h"
+#include "../parsemanager.h" //(ph 2025/02/04)
 
 #include "../classbrowser.h"
-#include "../classbrowserbuilderthread.h"
+//unused - #include "../classbrowserbuilderthread.h"
 
 
 #ifndef CB_PRECOMP
@@ -921,19 +922,66 @@
 
 void Parser::WriteOptions()
 {
+     //(ph 2025/02/06) Global settings bug fix
+     //https://forums.codeblocks.org/index.php/topic,25955 Hiccups while typing
+    // Assemble status to check if a Parser or Project changed a global setting.
+    ProjectManager* pPrjMgr = Manager::Get()->GetProjectManager();
+    cbProject*      pActiveProject = pPrjMgr->GetActiveProject();
+    ParseManager*   pParseMgr = (ParseManager*)m_Parent;
+    ParserBase*     pParser = &(pParseMgr->GetParser());
+    ParserBase*     pTempParser = pParseMgr->GetTempParser();
+    cbProject*      pOptsChangerProject = pParseMgr->GetOptsChangedByProject();
+
+    int  projectsCount = pPrjMgr->GetProjects()->size();
+    bool isTempParser = pTempParser == pParser;
+    bool globalOptionChanged = pParseMgr->GetOptsChangedByParser() or pParseMgr->GetOptsChangedByProject();
+
     ConfigManager* cfg = Manager::Get()->GetConfigManager(_T("code_completion"));
 
-    // Page "Code Completion"
-    cfg->Write(_T("/use_SmartSense"),                m_Options.useSmartSense);
-    cfg->Write(_T("/while_typing"),                  m_Options.whileTyping);
+    // **Debugging** use this global to verify logic (cached values)
+    bool OldWhileTypingStatus = m_Options.whileTyping;
+    asm("nop"); // **Debugging** set brkpt here
 
-    // Page "C / C++ parser"
-    cfg->Write(_T("/parser_follow_local_includes"),  m_Options.followLocalIncludes);
-    cfg->Write(_T("/parser_follow_global_includes"), m_Options.followGlobalIncludes);
-    cfg->Write(_T("/want_preprocessor"),             m_Options.wantPreprocessor);
-    cfg->Write(_T("/parse_complex_macros"),          m_Options.parseComplexMacros);
-    cfg->Write(_T("/platform_check"),                m_Options.platformCheck);
+    // Do not allow stale parser settings to change the global settings
+    bool allowGlobalUpdate = false;
+    if ( (projectsCount == 0) and globalOptionChanged)
+        allowGlobalUpdate = true;   //Single file settings changes
+    if (projectsCount and (pOptsChangerProject == pActiveProject) )
+        allowGlobalUpdate = true;   // changes made by a project
+    if ( (projectsCount==0) and isTempParser and globalOptionChanged)
+    {
+        // When no projects exists but the CB main settings have been changed,
+        // force the TempParser to reread settings/options else stale ones
+        // will be set and displayed on the next use of MenuBar/Settings/Editor/CodeCompletion dialog
+        #warning CodeCompletion: Remove the **Debugging** statements before commiting
+        bool oldWhileTypingStatus = m_Options.whileTyping; // **Debugging** //(ph 2025/02/08)
+        ReadOptions();  //force TempParser to update its settings
+        bool actualWhileTypingStatus = m_Options.whileTyping; // **Debugging** //(ph 2025/02/08)
+        allowGlobalUpdate = true;
+    }
+    if (not globalOptionChanged)
+        allowGlobalUpdate = false; // no global settings have changed
 
+    if (allowGlobalUpdate)
+    {
+        // Page "Code Completion"
+        cfg->Write(_T("/use_SmartSense"),                m_Options.useSmartSense);
+        cfg->Write(_T("/while_typing"),                  m_Options.whileTyping);
+
+        // Page "C / C++ parser"
+        cfg->Write(_T("/parser_follow_local_includes"),  m_Options.followLocalIncludes);
+        cfg->Write(_T("/parser_follow_global_includes"), m_Options.followGlobalIncludes);
+        cfg->Write(_T("/want_preprocessor"),             m_Options.wantPreprocessor);
+        cfg->Write(_T("/parse_complex_macros"),          m_Options.parseComplexMacros);
+        cfg->Write(_T("/platform_check"),                m_Options.platformCheck);
+    }
+    if ((projectsCount == 0) and isTempParser and globalOptionChanged)
+    {
+        // The global settings changed status can now be reset
+        pParseMgr->SetOptsChangedByParser(nullptr);
+        pParseMgr->SetOptsChangedByProject(nullptr);
+    }
+
     // Page "Symbol browser"
     cfg->Write(_T("/browser_show_inheritance"),      m_BrowserOptions.showInheritance);
     cfg->Write(_T("/browser_expand_ns"),             m_BrowserOptions.expandNS);
Index: resources/manifest.xml
===================================================================
--- resources/manifest.xml (revision 13610)
+++ resources/manifest.xml (working copy)
@@ -3,7 +3,7 @@
     <SdkVersion major="1" minor="10" release="0" />
     <Plugin name="CodeCompletion">
         <Value title="Code completion" />
-        <Value version="1.0.5 24/01/29" />
+        <Value version="1.0.6 25/02/8" />
         <Value description="This plugin provides a symbols browser for your projects and code-completion inside the editor.
 
 


I'll remove all the "**debugging**" tags and statements before any commit.
« Last Edit: February 09, 2025, 12:28:21 am by Pecan »

Offline ollydbg

  • Developer
  • Lives here!
  • *****
  • Posts: 6070
  • OpenCV and Robotics
    • Chinese OpenCV forum moderator
Re: Hiccups while typing (continuation)
« Reply #29 on: February 09, 2025, 08:01:43 am »
@ ollydbg

Thanks for doing all this testing.
I moved the forced TempParse update to before the .conf write.
That seemed to do the trick.

When you get a chance, would you test to see if I'm doing any better. So far, I'm batting 0 for 5.
...
...
I'll remove all the "**debugging**" tags and statements before any commit.

Sorry, it looks like this patch still has some errors, here is the steps. You see, I don't load any cbp files, but just open the debugee C::B for testing.

1, start the debuggee C::B
2, change some CC setting(from the code completion plugin's setting dialog)
3, change some CC setting(from the code completion plugin's setting dialog)
4, exit the debugee C::B

It looks like when the setting dialog's OnApply() function get called for the TempParser, the below code will be called:

Code
    if ( (projectsCount==0) and isTempParser and globalOptionChanged)
    {
        // When no projects exists but the CB main settings have been changed,
        // force the TempParser to reread settings/options else stale ones
        // will be set and displayed on the next use of MenuBar/Settings/Editor/CodeCompletion dialog
        // #warning CodeCompletion: Remove the **Debugging** statements before commiting
        // bool oldWhileTypingStatus = m_Options.whileTyping; // **Debugging** //(ph 2025/02/08)
        ReadOptions();  //force TempParser to update its settings
        // bool actualWhileTypingStatus = m_Options.whileTyping; // **Debugging** //(ph 2025/02/08)
        allowGlobalUpdate = true;
    }

So, in the step 3, when I open the CC's setting dialog, I see the setting are not saved in the step2.

If some piece of memory should be reused, turn them to variables (or const variables).
If some piece of operations should be reused, turn them to functions.
If they happened together, then turn them to classes.