Tcl Source Code

Artifact [75becda678]
Login

Artifact 75becda6780aa10acc038d0194a823f106d72ed6:

Attachment "regbroadcast.patch.3" to ticket [625453ffff] added by hobbs 2002-10-19 06:54:45.
Index: win/tclWinReg.c
===================================================================
RCS file: /cvsroot/tcl/tcl/win/tclWinReg.c,v
retrieving revision 1.17
diff -u -r1.17 tclWinReg.c
--- win/tclWinReg.c	29 Jan 2002 03:18:46 -0000	1.17
+++ win/tclWinReg.c	18 Oct 2002 23:53:14 -0000
@@ -159,6 +159,8 @@
  */
 
 static void		AppendSystemError(Tcl_Interp *interp, DWORD error);
+static int		BroadcastValue(Tcl_Interp *interp, int objc,
+			    Tcl_Obj * CONST objv[]);
 static DWORD		ConvertDWORD(DWORD type, DWORD value);
 static int		DeleteKey(Tcl_Interp *interp, Tcl_Obj *keyNameObj);
 static int		DeleteValue(Tcl_Interp *interp, Tcl_Obj *keyNameObj,
@@ -256,9 +258,12 @@
     char *errString;
 
     static CONST char *subcommands[] = {
-	"delete", "get", "keys", "set", "type", "values", (char *) NULL
+	"broadcast", "delete", "get", "keys", "set", "type", "values",
+	(char *) NULL
+    };
+    enum SubCmdIdx {
+	BroadcastIdx, DeleteIdx, GetIdx, KeysIdx, SetIdx, TypeIdx, ValuesIdx
     };
-    enum SubCmdIdx { DeleteIdx, GetIdx, KeysIdx, SetIdx, TypeIdx, ValuesIdx };
 
     if (objc < 2) {
 	Tcl_WrongNumArgs(interp, objc, objv, "option ?arg arg ...?");
@@ -271,6 +276,9 @@
     }
 
     switch (index) {
+	case BroadcastIdx:		/* broadcast */
+	    return BroadcastValue(interp, objc, objv);
+	    break;
 	case DeleteIdx:			/* delete */
 	    if (objc == 3) {
 		return DeleteKey(interp, objv[2]);
@@ -1293,6 +1301,71 @@
 	AppendSystemError(interp, result);
 	return TCL_ERROR;
     }
+    return TCL_OK;
+}
+
+/*
+ *----------------------------------------------------------------------
+ *
+ * BroadcastValue --
+ *
+ *	This function broadcasts a WM_SETTINGCHANGE message to indicate
+ *	to other programs that we have changed the contents of a registry
+ *	value.
+ *
+ * Results:
+ *	Returns a normal Tcl result.
+ *
+ * Side effects:
+ *	Will cause other programs to reload their system settings.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static int
+BroadcastValue(
+    Tcl_Interp *interp,		/* Current interpreter. */
+    int objc,			/* Number of arguments. */
+    Tcl_Obj * CONST objv[])	/* Argument values. */
+{
+    DWORD result, sendResult;
+    UINT timeout = 3000;
+    int len;
+    char *str;
+    Tcl_Obj *objPtr;
+
+    if ((objc != 3) && (objc != 5)) {
+	Tcl_WrongNumArgs(interp, 2, objv, "keyName ?-timeout millisecs?");
+	return TCL_ERROR;
+    }
+
+    if (objc > 3) {
+	str = Tcl_GetStringFromObj(objv[3], &len);
+	if ((len < 2) || (*str != '-') || strncmp(str, "-timeout", len)) {
+	    Tcl_WrongNumArgs(interp, 2, objv, "keyName ?-timeout millisecs?");
+	    return TCL_ERROR;
+	}
+	if (Tcl_GetIntFromObj(interp, objv[4], (int *) &timeout) != TCL_OK) {
+	    return TCL_ERROR;
+	}
+    }
+
+    str = Tcl_GetStringFromObj(objv[2], &len);
+    if (len = 0) {
+	str = NULL;
+    }
+
+    /*
+     * Use the ignore the result.
+     */
+    result = SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE,
+	    (WPARAM) 0, (LPARAM) str, SMTO_ABORTIFHUNG, timeout, &sendResult);
+
+    objPtr = Tcl_NewObj();
+    Tcl_ListObjAppendElement(NULL, objPtr, Tcl_NewIntObj(result));
+    Tcl_ListObjAppendElement(NULL, objPtr, Tcl_NewIntObj(sendResult));
+    Tcl_SetObjResult(interp, objPtr);
+
     return TCL_OK;
 }
 
Index: win/configure.in
===================================================================
RCS file: /cvsroot/tcl/tcl/win/configure.in,v
retrieving revision 1.56
diff -u -r1.56 configure.in
--- win/configure.in	27 Sep 2002 18:04:14 -0000	1.56
+++ win/configure.in	18 Oct 2002 23:53:14 -0000
@@ -20,9 +20,9 @@
 TCL_DDE_PATCH_LEVEL=""
 DDEVER=$TCL_DDE_MAJOR_VERSION$TCL_DDE_MINOR_VERSION
 
-TCL_REG_VERSION=1.0
+TCL_REG_VERSION=1.1
 TCL_REG_MAJOR_VERSION=1
-TCL_REG_MINOR_VERSION=0
+TCL_REG_MINOR_VERSION=1
 TCL_REG_PATCH_LEVEL=""
 REGVER=$TCL_REG_MAJOR_VERSION$TCL_REG_MINOR_VERSION
 
Index: win/Makefile.in
===================================================================
RCS file: /cvsroot/tcl/tcl/win/Makefile.in,v
retrieving revision 1.65
diff -u -r1.65 Makefile.in
--- win/Makefile.in	22 Aug 2002 00:52:33 -0000	1.65
+++ win/Makefile.in	18 Oct 2002 23:53:14 -0000
@@ -433,7 +433,7 @@
 		else true; \
 		fi; \
 	    done;
-	@for i in dde1.2 reg1.0; \
+	@for i in dde1.2 reg1.1; \
 	    do \
 	    if [ ! -d $(LIB_INSTALL_DIR)/$$i ] ; then \
 		echo "Making directory $(LIB_INSTALL_DIR)/$$i"; \
@@ -467,13 +467,13 @@
 	    fi
 	@if [ -f $(REG_DLL_FILE) ]; then \
 	    echo installing $(REG_DLL_FILE); \
-	    $(COPY) $(REG_DLL_FILE) $(LIB_INSTALL_DIR)/reg1.0; \
+	    $(COPY) $(REG_DLL_FILE) $(LIB_INSTALL_DIR)/reg1.1; \
 	    $(COPY) $(ROOT_DIR)/library/reg/pkgIndex.tcl \
-		$(LIB_INSTALL_DIR)/reg1.0; \
+		$(LIB_INSTALL_DIR)/reg1.1; \
 	    fi
 	@if [ -f $(REG_LIB_FILE) ]; then \
 	    echo installing $(REG_LIB_FILE); \
-	    $(COPY) $(REG_LIB_FILE) $(LIB_INSTALL_DIR)/reg1.0; \
+	    $(COPY) $(REG_LIB_FILE) $(LIB_INSTALL_DIR)/reg1.1; \
 	    fi
 
 install-libraries: libraries
Index: win/makefile.vc
===================================================================
RCS file: /cvsroot/tcl/tcl/win/makefile.vc,v
retrieving revision 1.93
diff -u -r1.93 makefile.vc
--- win/makefile.vc	29 Sep 2002 20:41:16 -0000	1.93
+++ win/makefile.vc	18 Oct 2002 23:53:14 -0000
@@ -160,7 +160,7 @@
 DDEDOTVERSION = 1.2
 DDEVERSION = $(DDEDOTVERSION:.=)
 
-REGDOTVERSION = 1.0
+REGDOTVERSION = 1.1
 REGVERSION = $(REGDOTVERSION:.=)
 
 BINROOT		= .
Index: win/makefile.bc
===================================================================
RCS file: /cvsroot/tcl/tcl/win/makefile.bc,v
retrieving revision 1.11
diff -u -r1.11 makefile.bc
--- win/makefile.bc	20 Aug 2002 15:33:34 -0000	1.11
+++ win/makefile.bc	18 Oct 2002 23:53:14 -0000
@@ -113,8 +113,8 @@
 DDEVERSION = 12
 DDEDOTVERSION = 1.2
 
-REGVERSION = 10
-REGDOTVERSION = 1.0
+REGVERSION = 11
+REGDOTVERSION = 1.1
 
 BINROOT		= ..
 !IF "$(NODEBUG)" == "1"
@@ -421,9 +421,9 @@
 	-@copy "$(TCLDDEDLL)" "$(SCRIPT_INSTALL_DIR)\dde1.1"
 	-@copy "$(ROOT)\library\dde\pkgIndex.tcl" "$(SCRIPT_INSTALL_DIR)\dde1.1"
 	@echo installing $(TCLREGDLLNAME)
-	-@$(MKDIR) "$(SCRIPT_INSTALL_DIR)\reg1.0"
-	-@copy "$(TCLREGDLL)" "$(SCRIPT_INSTALL_DIR)\reg1.0"
-	-@copy "$(ROOT)\library\reg\pkgIndex.tcl" "$(SCRIPT_INSTALL_DIR)\reg1.0"
+	-@$(MKDIR) "$(SCRIPT_INSTALL_DIR)\reg1.1"
+	-@copy "$(TCLREGDLL)" "$(SCRIPT_INSTALL_DIR)\reg1.1"
+	-@copy "$(ROOT)\library\reg\pkgIndex.tcl" "$(SCRIPT_INSTALL_DIR)\reg1.1"
 	@echo installing encoding files
 	-@$(MKDIR) "$(SCRIPT_INSTALL_DIR)\encoding"
 	-@copy "$(ROOT)\library\encoding\*.enc" "$(SCRIPT_INSTALL_DIR)\encoding"
Index: tests/registry.test
===================================================================
RCS file: /cvsroot/tcl/tcl/tests/registry.test,v
retrieving revision 1.11
diff -u -r1.11 registry.test
--- tests/registry.test	31 Jul 2001 19:12:07 -0000	1.11
+++ tests/registry.test	18 Oct 2002 23:53:14 -0000
@@ -44,7 +44,7 @@
 } {1 {wrong # args: should be "registry option ?arg arg ...?"}}
 test registry-1.2 {argument parsing for registry command} {pcOnly} {
     list [catch {registry foo} msg] $msg
-} {1 {bad option "foo": must be delete, get, keys, set, type, or values}}
+} {1 {bad option "foo": must be broadcast, delete, get, keys, set, type, or values}}
 
 test registry-1.3 {argument parsing for registry command} {pcOnly} {
     list [catch {registry d} msg] $msg
@@ -582,21 +582,23 @@
     list [catch {registry set {\\mom\HKEY_CLASSES_ROOT\TclFoobar} bar foobar} msg] $msg
 } {1 {unable to open key: Access is denied.}}
 
+test registry-12.1 {BroadcastValue} {pcOnly} {
+    list [catch {registry broadcast} msg] $msg
+} {1 {wrong # args: should be "registry broadcast keyName ?-timeout millisecs?"}}
+test registry-12.2 {BroadcastValue} {pcOnly} {
+    list [catch {registry broadcast "" -time} msg] $msg
+} {1 {wrong # args: should be "registry broadcast keyName ?-timeout millisecs?"}}
+test registry-12.3 {BroadcastValue} {pcOnly} {
+    list [catch {registry broadcast "" - 500} msg] $msg
+} {1 {wrong # args: should be "registry broadcast keyName ?-timeout millisecs?"}}
+test registry-12.4 {BroadcastValue} {pcOnly} {
+    list [catch {registry broadcast {Environment}} msg] $msg
+} {0 {1 0}}
+test registry-12.5 {BroadcastValue} {pcOnly} {
+    list [catch {registry b {}} msg] $msg
+} {0 {1 0}}
 
 # cleanup
 unset hostname
 ::tcltest::cleanupTests
 return
-
-
-
-
-
-
-
-
-
-
-
-
-
Index: doc/registry.n
===================================================================
RCS file: /cvsroot/tcl/tcl/doc/registry.n,v
retrieving revision 1.6
diff -u -r1.6 registry.n
--- doc/registry.n	1 Jul 2002 18:24:39 -0000	1.6
+++ doc/registry.n	18 Oct 2002 23:53:14 -0000
@@ -50,6 +50,24 @@
 unique abbreviation for \fIoption\fR is acceptable.  The valid options
 are:
 .TP
+.VS 8.4
+\fBregistry broadcast \fIkeyName\fR ?\fI-timeout milliseconds\fR?
+.
+Sends a broadcast message to the system and running programs to notify them
+of certain updates.  This is necessary to propagate changes to key registry
+keys like Environment.  The timeout specifies the amount of time, in
+milliseconds, to wait for applications to respond to the broadcast message.
+It defaults to 3000.  The following example demonstrates how to add a path
+to the global Environment and notify applications of the change without
+reguiring a logoff/logon step (assumes admin privileges):
+.CS
+set regPath {HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment}
+set curPath [registry get $regPath "Path"]
+registry set $regPath "Path" "$curPath;$addPath"
+registry broadcast "Environment"
+.CE
+.VE 8.4
+.TP
 \fBregistry delete \fIkeyName\fR ?\fIvalueName\fR?
 .
 If the optional \fIvalueName\fR argument is present, the specified
Index: library/reg/pkgIndex.tcl
===================================================================
RCS file: /cvsroot/tcl/tcl/library/reg/pkgIndex.tcl,v
retrieving revision 1.10
diff -u -r1.10 pkgIndex.tcl
--- library/reg/pkgIndex.tcl	14 Sep 2001 01:00:59 -0000	1.10
+++ library/reg/pkgIndex.tcl	18 Oct 2002 23:53:14 -0000
@@ -1,8 +1,8 @@
 if {![package vsatisfies [package provide Tcl] 8]} {return}
 if {[info exists tcl_platform(debug)]} {
-    package ifneeded registry 1.0 \
-            [list load [file join $dir tclreg10d.dll] registry]
+    package ifneeded registry 1.1 \
+            [list load [file join $dir tclreg11d.dll] registry]
 } else {
-    package ifneeded registry 1.0 \
-            [list load [file join $dir tclreg10.dll] registry]
+    package ifneeded registry 1.1 \
+            [list load [file join $dir tclreg11.dll] registry]
 }