/*********************************************************************** * DEFWND_HandleWindowPosChanged * * Handle the WM_WINDOWPOSCHANGED message. */ static void DEFWND_HandleWindowPosChanged( HWND hwnd, const WINDOWPOS *winpos ) { RECT rect; WND *wndPtr = WIN_GetPtr( hwnd ); rect = wndPtr->rectClient; WIN_ReleasePtr( wndPtr ); if (!(winpos->flags & SWP_NOCLIENTMOVE)) SendMessageW( hwnd, WM_MOVE, 0, MAKELONG(rect.left, rect.top)); if (!(winpos->flags & SWP_NOCLIENTSIZE) || (winpos->flags & SWP_STATECHANGED)) { if (IsIconic( hwnd )) { SendMessageW( hwnd, WM_SIZE, SIZE_MINIMIZED, 0 ); } else { WPARAM wp = IsZoomed( hwnd ) ? SIZE_MAXIMIZED : SIZE_RESTORED; SendMessageW( hwnd, WM_SIZE, wp, MAKELONG(rect.right-rect.left, rect.bottom-rect.top) ); } } }
/*********************************************************************** * DEFWND_HandleWindowPosChanged * * Handle the WM_WINDOWPOSCHANGED message. */ static void DEFWND_HandleWindowPosChanged( HWND hwnd, UINT flags ) { RECT rect; WND *wndPtr = WIN_GetPtr( hwnd ); rect = wndPtr->rectClient; WIN_ReleasePtr( wndPtr ); if (!(flags & SWP_NOCLIENTMOVE)) SendMessageW( hwnd, WM_MOVE, 0, MAKELONG(rect.left, rect.top)); if (!(flags & SWP_NOCLIENTSIZE)) { WPARAM wp = SIZE_RESTORED; if (IsZoomed(hwnd)) wp = SIZE_MAXIMIZED; else if (IsIconic(hwnd)) wp = SIZE_MINIMIZED; SendMessageW( hwnd, WM_SIZE, wp, MAKELONG(rect.right-rect.left, rect.bottom-rect.top) ); } }
/********************************************************************** * EVENT_DropURLs * * drop items are separated by \n * each item is prefixed by its mime type * * event->data.l[3], event->data.l[4] contains drop x,y position */ static void EVENT_DropURLs( HWND hWnd, XClientMessageEvent *event ) { unsigned long data_length; unsigned long aux_long, drop_len = 0; unsigned char *p_data = NULL; /* property data */ char *p_drop = NULL; char *p, *next; int x, y; DROPFILES *lpDrop; HDROP hDrop; union { Atom atom_aux; int i; Window w_aux; unsigned int u; } u; /* unused */ if (!(GetWindowLongW( hWnd, GWL_EXSTYLE ) & WS_EX_ACCEPTFILES)) return; wine_tsx11_lock(); XGetWindowProperty( event->display, DefaultRootWindow(event->display), x11drv_atom(DndSelection), 0, 65535, FALSE, AnyPropertyType, &u.atom_aux, &u.i, &data_length, &aux_long, &p_data); wine_tsx11_unlock(); if (aux_long) WARN("property too large, truncated!\n"); TRACE("urls=%s\n", p_data); if( !aux_long && p_data) { /* don't bother if > 64K */ /* calculate length */ p = (char*) p_data; next = strchr(p, '\n'); while (p) { if (next) *next=0; if (strncmp(p,"file:",5) == 0 ) { INT len = GetShortPathNameA( p+5, NULL, 0 ); if (len) drop_len += len + 1; } if (next) { *next = '\n'; p = next + 1; next = strchr(p, '\n'); } else { p = NULL; } } if( drop_len && drop_len < 65535 ) { wine_tsx11_lock(); XQueryPointer( event->display, root_window, &u.w_aux, &u.w_aux, &x, &y, &u.i, &u.i, &u.u); wine_tsx11_unlock(); drop_len += sizeof(DROPFILES) + 1; hDrop = GlobalAlloc( GMEM_SHARE, drop_len ); lpDrop = (DROPFILES *) GlobalLock( hDrop ); if( lpDrop ) { WND *pDropWnd = WIN_GetPtr( hWnd ); lpDrop->pFiles = sizeof(DROPFILES); lpDrop->pt.x = (INT)x; lpDrop->pt.y = (INT)y; lpDrop->fNC = ( x < (pDropWnd->rectClient.left - pDropWnd->rectWindow.left) || y < (pDropWnd->rectClient.top - pDropWnd->rectWindow.top) || x > (pDropWnd->rectClient.right - pDropWnd->rectWindow.left) || y > (pDropWnd->rectClient.bottom - pDropWnd->rectWindow.top) ); lpDrop->fWide = FALSE; p_drop = (char*)(lpDrop + 1); WIN_ReleasePtr(pDropWnd); } /* create message content */ if (p_drop) { p = (char*) p_data; next = strchr(p, '\n'); while (p) { if (next) *next=0; if (strncmp(p,"file:",5) == 0 ) { INT len = GetShortPathNameA( p+5, p_drop, 65535 ); if (len) { TRACE("drop file %s as %s\n", p+5, p_drop); p_drop += len+1; } else { WARN("can't convert file %s to dos name\n", p+5); } } else { WARN("unknown mime type %s\n", p); } if (next) { *next = '\n'; p = next + 1; next = strchr(p, '\n'); } else { p = NULL; } *p_drop = '\0'; } GlobalUnlock(hDrop); PostMessageA( hWnd, WM_DROPFILES, (WPARAM)hDrop, 0L ); } } wine_tsx11_lock(); if( p_data ) XFree(p_data); wine_tsx11_unlock(); } }
/********************************************************************** * EVENT_DropFromOffix * * don't know if it still works (last Changlog is from 96/11/04) */ static void EVENT_DropFromOffiX( HWND hWnd, XClientMessageEvent *event ) { unsigned long data_length; unsigned long aux_long; unsigned char* p_data = NULL; Atom atom_aux; int x, y, dummy; BOOL bAccept; Window win, w_aux_root, w_aux_child; WND* pWnd; HWND hScope = hWnd; win = X11DRV_get_whole_window(hWnd); wine_tsx11_lock(); XQueryPointer( event->display, win, &w_aux_root, &w_aux_child, &x, &y, &dummy, &dummy, (unsigned int*)&aux_long); wine_tsx11_unlock(); pWnd = WIN_GetPtr(hWnd); /* find out drop point and drop window */ if( x < 0 || y < 0 || x > (pWnd->rectWindow.right - pWnd->rectWindow.left) || y > (pWnd->rectWindow.bottom - pWnd->rectWindow.top) ) { bAccept = pWnd->dwExStyle & WS_EX_ACCEPTFILES; x = 0; y = 0; } else { POINT pt = { x, y }; HWND hwndDrop = find_drop_window( hWnd, &pt ); if (hwndDrop) { x = pt.x; y = pt.y; hScope = hwndDrop; bAccept = TRUE; } else { bAccept = FALSE; } } WIN_ReleasePtr(pWnd); if (!bAccept) return; wine_tsx11_lock(); XGetWindowProperty( event->display, DefaultRootWindow(event->display), x11drv_atom(DndSelection), 0, 65535, FALSE, AnyPropertyType, &atom_aux, &dummy, &data_length, &aux_long, &p_data); wine_tsx11_unlock(); if( !aux_long && p_data) /* don't bother if > 64K */ { char *p = (char *)p_data; char *p_drop; aux_long = 0; while( *p ) /* calculate buffer size */ { INT len = GetShortPathNameA( p, NULL, 0 ); if (len) aux_long += len + 1; p += strlen(p) + 1; } if( aux_long && aux_long < 65535 ) { HDROP hDrop; DROPFILES *lpDrop; aux_long += sizeof(DROPFILES) + 1; hDrop = GlobalAlloc( GMEM_SHARE, aux_long ); lpDrop = (DROPFILES*)GlobalLock( hDrop ); if( lpDrop ) { WND *pDropWnd = WIN_GetPtr( hScope ); lpDrop->pFiles = sizeof(DROPFILES); lpDrop->pt.x = x; lpDrop->pt.y = y; lpDrop->fNC = ( x < (pDropWnd->rectClient.left - pDropWnd->rectWindow.left) || y < (pDropWnd->rectClient.top - pDropWnd->rectWindow.top) || x > (pDropWnd->rectClient.right - pDropWnd->rectWindow.left) || y > (pDropWnd->rectClient.bottom - pDropWnd->rectWindow.top) ); lpDrop->fWide = FALSE; WIN_ReleasePtr(pDropWnd); p_drop = (char *)(lpDrop + 1); p = (char *)p_data; while(*p) { if (GetShortPathNameA( p, p_drop, aux_long - (p_drop - (char *)lpDrop) )) p_drop += strlen( p_drop ) + 1; p += strlen(p) + 1; } *p_drop = '\0'; PostMessageA( hWnd, WM_DROPFILES, (WPARAM)hDrop, 0L ); } } } wine_tsx11_lock(); if( p_data ) XFree(p_data); wine_tsx11_unlock(); }