winex11: Fix handling of property sizes for 64-bit platforms.
This commit is contained in:
parent
6d80f099f7
commit
3bfa90eeda
|
@ -1902,8 +1902,8 @@ static int X11DRV_CLIPBOARD_QueryAvailableData(LPCLIPBOARDINFO lpcbinfo)
|
||||||
* The TARGETS property should have returned us a list of atoms
|
* The TARGETS property should have returned us a list of atoms
|
||||||
* corresponding to each selection target format supported.
|
* corresponding to each selection target format supported.
|
||||||
*/
|
*/
|
||||||
if (atype == XA_ATOM || atype == x11drv_atom(TARGETS))
|
if (aformat == 32 && (atype == XA_ATOM || atype == x11drv_atom(TARGETS)))
|
||||||
X11DRV_CLIPBOARD_InsertSelectionProperties(display, targetList, (cSelectionTargets * aformat / (8 * sizeof(Atom))));
|
X11DRV_CLIPBOARD_InsertSelectionProperties(display, targetList, cSelectionTargets);
|
||||||
|
|
||||||
/* Free the list of targets */
|
/* Free the list of targets */
|
||||||
wine_tsx11_lock();
|
wine_tsx11_lock();
|
||||||
|
@ -2027,7 +2027,7 @@ static BOOL X11DRV_CLIPBOARD_ReadProperty(Window w, Atom prop,
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
count = nitems * (aformat / 8);
|
count = get_property_size( aformat, nitems );
|
||||||
if (!val) *data = HeapAlloc( GetProcessHeap(), 0, pos * sizeof(int) + count + 1 );
|
if (!val) *data = HeapAlloc( GetProcessHeap(), 0, pos * sizeof(int) + count + 1 );
|
||||||
else *data = HeapReAlloc( GetProcessHeap(), 0, val, pos * sizeof(int) + count + 1 );
|
else *data = HeapReAlloc( GetProcessHeap(), 0, val, pos * sizeof(int) + count + 1 );
|
||||||
|
|
||||||
|
|
|
@ -677,7 +677,7 @@ int get_window_wm_state( Display *display, struct x11drv_win_data *data )
|
||||||
sizeof(*state)/sizeof(CARD32), False, x11drv_atom(WM_STATE),
|
sizeof(*state)/sizeof(CARD32), False, x11drv_atom(WM_STATE),
|
||||||
&type, &format, &count, &remaining, (unsigned char **)&state ))
|
&type, &format, &count, &remaining, (unsigned char **)&state ))
|
||||||
{
|
{
|
||||||
if (type == x11drv_atom(WM_STATE) && format && count >= sizeof(*state)/(format/8))
|
if (type == x11drv_atom(WM_STATE) && get_property_size( format, count ) >= sizeof(*state))
|
||||||
ret = state->state;
|
ret = state->state;
|
||||||
XFree( state );
|
XFree( state );
|
||||||
}
|
}
|
||||||
|
|
|
@ -1394,7 +1394,7 @@ static unsigned char *get_icm_profile( unsigned long *size )
|
||||||
&type, &format, &count, &remaining, &profile );
|
&type, &format, &count, &remaining, &profile );
|
||||||
if (format && count)
|
if (format && count)
|
||||||
{
|
{
|
||||||
*size = count * (format / 8);
|
*size = get_property_size( format, count );
|
||||||
if ((ret = HeapAlloc( GetProcessHeap(), 0, *size ))) memcpy( ret, profile, *size );
|
if ((ret = HeapAlloc( GetProcessHeap(), 0, *size ))) memcpy( ret, profile, *size );
|
||||||
XFree( profile );
|
XFree( profile );
|
||||||
}
|
}
|
||||||
|
|
|
@ -866,7 +866,7 @@ static char *get_process_name(void)
|
||||||
*/
|
*/
|
||||||
static void set_initial_wm_hints( Display *display, struct x11drv_win_data *data )
|
static void set_initial_wm_hints( Display *display, struct x11drv_win_data *data )
|
||||||
{
|
{
|
||||||
int i;
|
long i;
|
||||||
Atom protocols[3];
|
Atom protocols[3];
|
||||||
Atom dndVersion = 4;
|
Atom dndVersion = 4;
|
||||||
XClassHint *class_hints;
|
XClassHint *class_hints;
|
||||||
|
|
|
@ -618,7 +618,7 @@ static BOOL is_netwm_supported( Display *display, Atom atom )
|
||||||
if (!XGetWindowProperty( display, DefaultRootWindow(display), x11drv_atom(_NET_SUPPORTED), 0,
|
if (!XGetWindowProperty( display, DefaultRootWindow(display), x11drv_atom(_NET_SUPPORTED), 0,
|
||||||
~0UL, False, XA_ATOM, &type, &format, &count,
|
~0UL, False, XA_ATOM, &type, &format, &count,
|
||||||
&remaining, (unsigned char **)&net_supported ))
|
&remaining, (unsigned char **)&net_supported ))
|
||||||
net_supported_count = count * (format / 8) / sizeof(Atom);
|
net_supported_count = get_property_size( format, count ) / sizeof(Atom);
|
||||||
else
|
else
|
||||||
net_supported_count = 0;
|
net_supported_count = 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -520,6 +520,13 @@ static inline struct x11drv_thread_data *x11drv_thread_data(void)
|
||||||
|
|
||||||
static inline Display *thread_display(void) { return x11drv_thread_data()->display; }
|
static inline Display *thread_display(void) { return x11drv_thread_data()->display; }
|
||||||
|
|
||||||
|
static inline size_t get_property_size( int format, unsigned long count )
|
||||||
|
{
|
||||||
|
/* format==32 means long, which can be 64 bits... */
|
||||||
|
if (format == 32) return count * sizeof(long);
|
||||||
|
return count * (format / 8);
|
||||||
|
}
|
||||||
|
|
||||||
extern Visual *visual;
|
extern Visual *visual;
|
||||||
extern Window root_window;
|
extern Window root_window;
|
||||||
extern unsigned int screen_width;
|
extern unsigned int screen_width;
|
||||||
|
|
|
@ -286,7 +286,7 @@ static void X11DRV_XDND_ResolveProperty(Display *display, Window xwin, Time tm,
|
||||||
AnyPropertyType, &acttype, &actfmt, &icount, &bytesret, &data);
|
AnyPropertyType, &acttype, &actfmt, &icount, &bytesret, &data);
|
||||||
wine_tsx11_unlock();
|
wine_tsx11_unlock();
|
||||||
|
|
||||||
entries += X11DRV_XDND_MapFormat(types[i], data, icount * (actfmt / 8));
|
entries += X11DRV_XDND_MapFormat(types[i], data, get_property_size( actfmt, icount ));
|
||||||
wine_tsx11_lock();
|
wine_tsx11_lock();
|
||||||
XFree(data);
|
XFree(data);
|
||||||
wine_tsx11_unlock();
|
wine_tsx11_unlock();
|
||||||
|
|
Loading…
Reference in New Issue