]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - cvar.c
Cvar onChange for qc menu for stable branch
[xonotic/darkplaces.git] / cvar.c
diff --git a/cvar.c b/cvar.c
index 119e296d656ca914c3bede8f16261b44c5fcc0fa..728f53096539e5eccac4931d1268556cff054713 100644 (file)
--- a/cvar.c
+++ b/cvar.c
@@ -21,6 +21,10 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
 #include "quakedef.h"
 
+#ifdef CONFIG_MENU
+    #include "progsvm.h"
+#endif
+
 const char *cvar_dummy_description = "custom cvar";
 
 cvar_t *cvar_vars = NULL;
@@ -345,6 +349,22 @@ static void Cvar_SetQuick_Internal (cvar_t *var, const char *value)
        // LordHavoc: don't reallocate when there is no change
        if (!changed)
                return;
+    
+    // Con_Printf("----> Changing \"%s\" value from \"%s\" to \"%s\"\n", var->name, var->string, value);
+
+#ifdef CONFIG_MENU
+    // prepare values to send into QC
+       prvm_prog_t *prog = MVM_prog;
+    qboolean qcSubscribed = PRVM_menufunction(m_cvar_changed);
+
+    if (qcSubscribed && prog->loaded)
+    {
+        prog->globals.ip[OFS_PARM0] = PRVM_SetTempString(prog, var->name);
+        prog->globals.ip[OFS_PARM1] = PRVM_SetTempString(prog, var->string);
+        prog->globals.ip[OFS_PARM2] = PRVM_SetTempString(prog, value);
+    }
+#endif
+
 
        // LordHavoc: don't reallocate when the buffer is the same size
        valuelen = strlen(value);
@@ -418,6 +438,14 @@ static void Cvar_SetQuick_Internal (cvar_t *var, const char *value)
        }
 
        Cvar_UpdateAutoCvar(var);
+
+#ifdef CONFIG_MENU
+    // call "onCvarChanged" like event
+    if (qcSubscribed && prog->loaded)
+    {
+        prog->ExecuteProgram(prog, PRVM_menufunction(m_cvar_changed), "QC function m_cvar_changed is missing");
+    }
+#endif
 }
 
 void Cvar_SetQuick (cvar_t *var, const char *value)
@@ -486,6 +514,7 @@ void Cvar_RegisterVariable (cvar_t *variable)
        cvar_t *current, *next, *cvar;
        char *oldstr;
        size_t alloclen;
+       int i;
 
        if (developer_extra.integer)
                Con_DPrintf("Cvar_RegisterVariable({\"%s\", \"%s\", %i});\n", variable->name, variable->string, variable->flags);
@@ -508,6 +537,9 @@ void Cvar_RegisterVariable (cvar_t *variable)
                        variable->defstring = cvar->defstring;
                        variable->value = atof (variable->string);
                        variable->integer = (int) variable->value;
+                       // Preserve autocvar status.
+                       memcpy(variable->globaldefindex, cvar->globaldefindex, sizeof(variable->globaldefindex));
+                       memcpy(variable->globaldefindex_stringno, cvar->globaldefindex_stringno, sizeof(variable->globaldefindex_stringno));
                        // replace cvar with this one...
                        variable->next = cvar->next;
                        if (cvar_vars == cvar)
@@ -550,6 +582,10 @@ void Cvar_RegisterVariable (cvar_t *variable)
        variable->value = atof (variable->string);
        variable->integer = (int) variable->value;
 
+       // Mark it as not an autocvar.
+       for (i = 0;i < PRVM_PROG_MAX;i++)
+               variable->globaldefindex[i] = -1;
+
 // link the variable in
 // alphanumerical order
        for( current = NULL, next = cvar_vars ; next && strcmp( next->name, variable->name ) < 0 ; current = next, next = next->next )
@@ -578,6 +614,7 @@ cvar_t *Cvar_Get (const char *name, const char *value, int flags, const char *ne
 {
        int hashindex;
        cvar_t *current, *next, *cvar;
+       int i;
 
        if (developer_extra.integer)
                Con_DPrintf("Cvar_Get(\"%s\", \"%s\", %i);\n", name, value, flags);
@@ -631,6 +668,10 @@ cvar_t *Cvar_Get (const char *name, const char *value, int flags, const char *ne
        else
                cvar->description = cvar_dummy_description; // actually checked by VM_cvar_type
 
+       // Mark it as not an autocvar.
+       for (i = 0;i < PRVM_PROG_MAX;i++)
+               cvar->globaldefindex[i] = -1;
+
 // link the variable in
 // alphanumerical order
        for( current = NULL, next = cvar_vars ; next && strcmp( next->name, cvar->name ) < 0 ; current = next, next = next->next )