On Sat, Feb 28, 2009 at 7:04 PM, Austin English <austinengl...@gmail.com> wrote: > 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 >
Err, make that http://wiki.winehq.org/SubmittingPatches -- -Austin