On Sat, Feb 28, 2009 at 12:37 AM, Patrick <ragamuf...@datacomm.ch> wrote: > Dear Developpers of Wine > > I like wine and I like Tracker Software's PDFXChange-Viewer as well. > http://www.docu-track.com/home/prod_user/PDF-XChange_Tools/pdfx_viewer > > So, today I was not getting any rest until i found out why these two > won't work together nicely. I mean they DO, actually. But I'm kind of > touchy. I was wondering all the time, why most of the settings I changed > were not restored as I exited and restarted the app. > > I then discovered that if wineserver was preserved ("-p" option) beween > restarts they WERE restored. Further investigations unveiled that the > problem is triggered by the fact that wineserver is not storing the > registry key class name attributes. Something M$ must have come up with > in XP but that is not very wideley used. PDFXChange-Viewer however seems > to rely on it when parsing it's preferences from the registry on > startup. > > Wineservers unicode string handling gave me a though time in > implementing a solution to this but i finally managed. You can see that > I went quiet straightforward: adding the class name next to the key name > in the {system,user}.reg files. There are two different versions of the > fix. I would prefer the second one because it preserves backwards > compatibility: In case the key class attribute is set, it is put in > brackets between the key name and modification time. Otherwise nothing > changes. > > It would be really nice if this could be somehow integrated into wine. > (Not only because I worked on it for a whole day, but also because i > really miss the feature because i don't want to reconfigure > PDFXChange-Viewer every time i start it and also because I would like to > make that functionality available to all of my friends and all linux > users as well. > > Greets > > Patrick > > > [Software\\Tracker > Software\\PDFViewer\\FullScreen\\MainView\\Bars\\0011;ParamItem] 1235760987 > "Break"=dword:00000001 > "ID"=dword:000081c9 > "Name"="Properties" > > [Software\\Tracker Software\\PDFViewer\\FullScreen\\MainView\\Bars\\0011] > [ParamItem] 1235761189 > "Break"=dword:00000001 > "ID"=dword:000081c9 > "Name"="Properties" > > --- registry.c 2009-02-27 19:44:14.000000000 +0100 > +++ registry.PP1.c 2009-02-27 19:49:03.000000000 +0100 > @@ -176,7 +176,7 @@ > dump_path( key->parent, base, f ); > fprintf( f, "\\\\" ); > } > - dump_strW( key->name, key->namelen / sizeof(WCHAR), f, "[]" ); > + dump_strW( key->name, key->namelen / sizeof(WCHAR), f, "[;" ); > } > > /* dump a value to a text file */ > @@ -245,6 +245,8 @@ > { > fprintf( f, "\n[" ); > if (key != base) dump_path( key, base, f ); > + fprintf( f, ";" ); > + dump_strW( key->class, key->classlen / sizeof(WCHAR), f, "[]" ); > fprintf( f, "] %ld\n", (long)key->modif ); > for (i = 0; i <= key->last_value; i++) dump_value( &key->values[i], f > ); > } > @@ -1108,20 +1110,22 @@ > int prefix_len, struct file_load_info *info, > int default_modif ) > { > - WCHAR *p; > - struct unicode_str name; > - int res, modif; > - data_size_t len; > + WCHAR *p, cls[256]; > + struct unicode_str name, class; > + int res, res2, modif; > + data_size_t len, len2 = 256; > > if (!get_file_tmp_space( info, strlen(buffer) * sizeof(WCHAR) )) return > NULL; > > len = info->tmplen; > - if ((res = parse_strW( info->tmp, &len, buffer, ']' )) == -1) > + if ((res = parse_strW( info->tmp, &len, buffer, ';' )) == -1 || > + (res2 = parse_strW( cls, &len2, buffer+res, ']' ) == -1)) > { > file_read_error( "Malformed key", info ); > return NULL; > } > - if (sscanf( buffer + res, " %d", &modif ) != 1) modif = default_modif; > + > + if (sscanf( buffer + res + res2, " %d", &modif ) != 1) modif = > default_modif; > > p = info->tmp; > while (prefix_len && *p) { if (*p++ == '\\') prefix_len--; } > @@ -1138,7 +1142,10 @@ > } > name.str = p; > name.len = len - (p - info->tmp + 1) * sizeof(WCHAR); > - return create_key( base, &name, NULL, flags, modif, &res ); > + class.str = cls; > + class.len = len2 - sizeof(WCHAR); > + > + return create_key( base, &name, &class, flags, modif, &res ); > } > > /* parse a comma-separated list of hex digits */ > > > --- registry.c 2009-02-27 19:44:14.000000000 +0100 > +++ registry.PP2.c 2009-02-27 19:59:28.000000000 +0100 > @@ -245,6 +245,10 @@ > { > fprintf( f, "\n[" ); > if (key != base) dump_path( key, base, f ); > + if (key->class != NULL) { > + fprintf( f, "] [" ); > + dump_strW( key->class, key->classlen / sizeof(WCHAR), f, > "[]" ); > + } > fprintf( f, "] %ld\n", (long)key->modif ); > for (i = 0; i <= key->last_value; i++) dump_value( &key->values[i], f > ); > } > @@ -1108,10 +1112,10 @@ > int prefix_len, struct file_load_info *info, > int default_modif ) > { > - WCHAR *p; > - struct unicode_str name; > - int res, modif; > - data_size_t len; > + WCHAR *p, *c; > + struct unicode_str name, class; > + int res, c_res, modif; > + data_size_t len, c_len; > > if (!get_file_tmp_space( info, strlen(buffer) * sizeof(WCHAR) )) return > NULL; > > @@ -1121,6 +1125,23 @@ > file_read_error( "Malformed key", info ); > return NULL; > } > + > + c_len = info->tmplen - len; > + if ((c_res = parse_strW( info->tmp + len / sizeof(WCHAR), &c_len, buffer > + res, ']' )) == -1) > + { > + class.len = 0; > + } > + else > + { > + res += c_res; > + > + c = info->tmp + len / sizeof(WCHAR); > + while (*c) { if (*c++ == '[') break; } > + > + class.str = c; > + class.len = c_len - (c - (info->tmp + len / sizeof(WCHAR)) + 1) * > sizeof(WCHAR); > + } > + > if (sscanf( buffer + res, " %d", &modif ) != 1) modif = default_modif; > > p = info->tmp; > @@ -1138,6 +1159,9 @@ > } > name.str = p; > name.len = len - (p - info->tmp + 1) * sizeof(WCHAR); > + > + if (class.len > 0) > + return create_key( base, &name, &class, flags, modif, &res ); > return create_key( base, &name, NULL, flags, modif, &res ); > } > > > > > >
Patches should be sent in git diff format to wine-patc...@winehq.org. See http://wiki.winehq.org/Patching Thanks for helping Wine! -- -Austin