diff options
Diffstat (limited to 'indra')
| -rw-r--r-- | indra/llwindow/llwindowcallbacks.cpp | 5 | ||||
| -rw-r--r-- | indra/llwindow/llwindowcallbacks.h | 1 | ||||
| -rw-r--r-- | indra/llwindow/llwindowwin32.cpp | 66 | ||||
| -rw-r--r-- | indra/newview/app_settings/settings.xml | 11 | ||||
| -rw-r--r-- | indra/newview/llviewerwindow.cpp | 28 | ||||
| -rw-r--r-- | indra/newview/llviewerwindow.h | 3 | 
6 files changed, 109 insertions, 5 deletions
| diff --git a/indra/llwindow/llwindowcallbacks.cpp b/indra/llwindow/llwindowcallbacks.cpp index 72f9997149..fda2c7ee6f 100644 --- a/indra/llwindow/llwindowcallbacks.cpp +++ b/indra/llwindow/llwindowcallbacks.cpp @@ -163,6 +163,11 @@ void LLWindowCallbacks::handleDataCopy(LLWindow *window, S32 data_type, void *da  {  } +BOOL LLWindowCallbacks::handleDrop(LLWindow *window, LLCoordGL pos, MASK mask, void *data) +{ +	return FALSE; +} +  BOOL LLWindowCallbacks::handleTimerEvent(LLWindow *window)  {  	return FALSE; diff --git a/indra/llwindow/llwindowcallbacks.h b/indra/llwindow/llwindowcallbacks.h index abc66c42a2..e1e257943a 100644 --- a/indra/llwindow/llwindowcallbacks.h +++ b/indra/llwindow/llwindowcallbacks.h @@ -68,6 +68,7 @@ public:  	virtual void handleWindowBlock(LLWindow *window);							// window is taking over CPU for a while  	virtual void handleWindowUnblock(LLWindow *window);							// window coming back after taking over CPU for a while  	virtual void handleDataCopy(LLWindow *window, S32 data_type, void *data); +	virtual BOOL handleDrop(LLWindow *window, LLCoordGL pos, MASK mask, void *data);  	virtual BOOL handleTimerEvent(LLWindow *window);  	virtual BOOL handleDeviceChange(LLWindow *window); diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp index c608c21d05..94c3e1af8c 100644 --- a/indra/llwindow/llwindowwin32.cpp +++ b/indra/llwindow/llwindowwin32.cpp @@ -52,6 +52,7 @@  #include <mapi.h>  #include <process.h>	// for _spawn  #include <shellapi.h> +#include <fstream>
  #include <Imm.h>  // Require DirectInput version 8 @@ -1348,6 +1349,9 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BO  	}  	SetWindowLong(mWindowHandle, GWL_USERDATA, (U32)this); + +	// register this window as handling drag/drop events from the OS +	DragAcceptFiles( mWindowHandle, TRUE );  	//register joystick timer callback  	SetTimer( mWindowHandle, 0, 1000 / 30, NULL ); // 30 fps timer @@ -2333,11 +2337,65 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_  			return 0;  		case WM_COPYDATA: -			window_imp->mCallbacks->handlePingWatchdog(window_imp, "Main:WM_COPYDATA"); -			// received a URL -			PCOPYDATASTRUCT myCDS = (PCOPYDATASTRUCT) l_param; -			window_imp->mCallbacks->handleDataCopy(window_imp, myCDS->dwData, myCDS->lpData); +			{ +				window_imp->mCallbacks->handlePingWatchdog(window_imp, "Main:WM_COPYDATA"); +				// received a URL +				PCOPYDATASTRUCT myCDS = (PCOPYDATASTRUCT) l_param; +				window_imp->mCallbacks->handleDataCopy(window_imp, myCDS->dwData, myCDS->lpData); +			};  			return 0;			 + +		case WM_DROPFILES: +			{ +				// HDROP contains what we need +				HDROP hdrop = (HDROP)w_param; + +				// get location in window space where drop occured and convert to OpenGL coordinate space +				POINT pt; +				DragQueryPoint( hdrop, &pt ); +				LLCoordGL gl_coord; +				LLCoordWindow cursor_coord_window( pt.x, pt.y ); +				window_imp->convertCoords(cursor_coord_window, &gl_coord); + +				// get payload (eventually, this needs to more advanced and grab size of payload dynamically +				static char file_name[ 1024 ]; +				DragQueryFileA( hdrop, 0, file_name, 1024 );
 +				void* url = (void*)( file_name ); +
 +				// if it's a .URL or .lnk ("shortcut") file
 +				if ( std::string( file_name ).find( ".lnk" ) != std::string::npos ||
 +					  std::string( file_name ).find( ".URL" ) != std::string::npos )
 +				{
 +					// read through file - looks like a 2 line file with second line URL= but who knows..
 +					std::ifstream file_handle( file_name );
 +					if ( file_handle.is_open() )
 +					{
 +						std::string line;
 +						while ( ! file_handle.eof() )
 +						{
 +							std::getline( file_handle, line );
 +							if ( ! file_handle.eof() )
 +							{
 +								std::string prefix( "URL=" );
 +								if ( line.find( prefix, 0 ) != std::string::npos )
 +								{
 +									line = line.substr( 4 );  // skip off the URL= bit
 +									strcpy( (char*)url, line.c_str() );
 +									break;
 +								};
 +							};
 +						};
 +						file_handle.close();
 +					};
 +				};
 +
 +				MASK mask = gKeyboard->currentMask(TRUE);
 +				if (window_imp->mCallbacks->handleDrop(window_imp, gl_coord, mask, url ) ) +				{ +					return 0; +				} +			} +			break;  		}  	window_imp->mCallbacks->handlePauseWatchdog(window_imp);	 diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index fd0e05e7e2..30ba9f6e2c 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -5316,6 +5316,17 @@        <key>Value</key>  	  <integer>13</integer>      </map> +	<key>PrimMediaDragNDrop</key> +	<map> +		<key>Comment</key> +		<string>Enable drag and drop</string> +		<key>Persist</key> +		<integer>1</integer> +		<key>Type</key> +		<string>Boolean</string> +		<key>Value</key> +		<integer>1</integer> +	</map>      <key>PrimMediaMaxRetries</key>      <map>        <key>Comment</key> diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index c659e58e47..a080243086 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -79,6 +79,7 @@  #include "timing.h"  #include "llviewermenu.h"  #include "lltooltip.h" +#include "llmediaentry.h"  // newview includes  #include "llagent.h" @@ -815,6 +816,33 @@ BOOL LLViewerWindow::handleMiddleMouseDown(LLWindow *window,  LLCoordGL pos, MAS    	// Always handled as far as the OS is concerned.  	return TRUE;  } + +BOOL LLViewerWindow::handleDrop(LLWindow *window,  LLCoordGL pos, MASK mask, void* data) +{ +	if (gSavedSettings.getBOOL("PrimMediaDragNDrop")) +	{ +		LLPickInfo pick_info = pickImmediate( pos.mX, pos.mY,  TRUE /*BOOL pick_transparent*/ ); + +		LLUUID object_id = pick_info.getObjectID(); +		S32 object_face = pick_info.mObjectFace; +		std::string url = std::string( (char*)data ); + +		llinfos << "### Object: picked at " << pos.mX << ", " << pos.mY << " - face = " << object_face << " - URL = " << url << llendl; + +		LLVOVolume *obj = dynamic_cast<LLVOVolume*>(static_cast<LLViewerObject*>(pick_info.getObject())); +		if (obj) +		{ +			LLSD media_data; +			/// XXX home URL too? +			media_data[LLMediaEntry::CURRENT_URL_KEY] = url; +			media_data[LLMediaEntry::AUTO_PLAY_KEY] = true; +			obj->syncMediaData(object_face, media_data, true, true); +			obj->sendMediaDataUpdate(); +		} +	} +  	// Always handled as far as the OS is concerned. +	return TRUE; +}  BOOL LLViewerWindow::handleMiddleMouseUp(LLWindow *window,  LLCoordGL pos, MASK mask)  { diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h index d7c403739e..44704b99e3 100644 --- a/indra/newview/llviewerwindow.h +++ b/indra/newview/llviewerwindow.h @@ -170,7 +170,8 @@ public:  	/*virtual*/ BOOL handleRightMouseUp(LLWindow *window,  LLCoordGL pos, MASK mask);  	/*virtual*/ BOOL handleMiddleMouseDown(LLWindow *window,  LLCoordGL pos, MASK mask);  	/*virtual*/ BOOL handleMiddleMouseUp(LLWindow *window,  LLCoordGL pos, MASK mask); -	/*virtual*/ void handleMouseMove(LLWindow *window,  LLCoordGL pos, MASK mask); +	/*virtual*/ BOOL handleDrop(LLWindow *window,  LLCoordGL pos, MASK mask, void* data); +				void handleMouseMove(LLWindow *window,  LLCoordGL pos, MASK mask);  	/*virtual*/ void handleMouseLeave(LLWindow *window);  	/*virtual*/ void handleResize(LLWindow *window,  S32 x,  S32 y);  	/*virtual*/ void handleFocus(LLWindow *window); | 
