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 ); }
On Sat, Feb 28, 2009 at 12:37 AM, Patrick ragamuffin@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-patches@winehq.org.
See http://wiki.winehq.org/Patching
Thanks for helping Wine!
On Sat, Feb 28, 2009 at 7:04 PM, Austin English austinenglish@gmail.com wrote:
On Sat, Feb 28, 2009 at 12:37 AM, Patrick ragamuffin@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-patches@winehq.org.
See http://wiki.winehq.org/Patching
Thanks for helping Wine!
-- -Austin
Err, make that http://wiki.winehq.org/SubmittingPatches
On Sam, 2009-02-28 at 19:04 -0600, Austin English wrote:
On Sat, Feb 28, 2009 at 7:04 PM, Austin English austinenglish@gmail.com wrote:
On Sat, Feb 28, 2009 at 12:37 AM, Patrick ragamuffin@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 ||
{ file_read_error( "Malformed key", info ); return NULL; }(res2 = parse_strW( cls, &len2, buffer+res, ']' ) == -1))
- 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, NULL, flags, modif, &res );return create_key( base, &name, &class, flags, modif, &res );
}
Patches should be sent in git diff format to wine-patches@winehq.org.
See http://wiki.winehq.org/Patching
Thanks for helping Wine!
-- -Austin
Err, make that http://wiki.winehq.org/SubmittingPatches
Sorry, lenghty conformance tests & learning git would take me another day.... It's unlikely that I'll do that before Christmas 2010 or so... Thank you for the reply anyway!
In case anybody wants to use the code - put it through the whole preocess - modify it or implement the idea in another way, he should feel free to do so. It's hereby set free from any license/copyright or other obstacles. You could even claim that you wrote it yourself ;-) I won't mind. Just get it into wine somehow.
Patrick