use UTF-8 for string representation
This commit is contained in:
		
							parent
							
								
									0a396c12c2
								
							
						
					
					
						commit
						a42ebe19b4
					
				| @ -1,7 +1,7 @@ | |||||||
| /*
 | /*
 | ||||||
|  *	The Deploy Implementation |  *	The Deploy Implementation | ||||||
|  *	Nana C++ Library(http://www.nanapro.org)
 |  *	Nana C++ Library(http://www.nanapro.org)
 | ||||||
|  *	Copyright(C) 2003-2014 Jinhao(cnjinhao@hotmail.com) |  *	Copyright(C) 2003-2015 Jinhao(cnjinhao@hotmail.com) | ||||||
|  * |  * | ||||||
|  *	Distributed under the Boost Software License, Version 1.0.  |  *	Distributed under the Boost Software License, Version 1.0.  | ||||||
|  *	(See accompanying file LICENSE_1_0.txt or copy at  |  *	(See accompanying file LICENSE_1_0.txt or copy at  | ||||||
| @ -134,51 +134,11 @@ namespace nana | |||||||
| 	detail::native_string_type to_nstring(std::size_t); | 	detail::native_string_type to_nstring(std::size_t); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #ifndef NANA_UNICODE |  | ||||||
| 	namespace nana |  | ||||||
| 	{ |  | ||||||
| 		typedef char		char_t; |  | ||||||
| 		typedef std::string string; ///< An alias of std::wstring or std::string, depending on the macro NANA_UNICODE
 |  | ||||||
| 	} |  | ||||||
| #else |  | ||||||
| 	namespace nana |  | ||||||
| 	{ |  | ||||||
| 		typedef wchar_t			char_t; |  | ||||||
| 		typedef std::wstring	string; ///< An alias of std::wstring or std::string, depending on the macro NANA_UNICODE
 |  | ||||||
| 	} |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| namespace nana |  | ||||||
| { |  | ||||||
| 	std::size_t strlen(const char_t* str); |  | ||||||
| 	char_t* strcpy(char_t* dest, const char_t* source); |  | ||||||
| #ifdef _MSC_VER |  | ||||||
| 	template <size_t N> |  | ||||||
| 	inline char* strcpy(char (&dest)[N], const char* source) |  | ||||||
| 	{ |  | ||||||
| 		::strncpy_s(dest, source, _TRUNCATE); |  | ||||||
| 		return dest; |  | ||||||
| 	} |  | ||||||
| 	template <size_t N> |  | ||||||
| 	inline wchar_t* strcpy(wchar_t (&dest)[N], const wchar_t* source) |  | ||||||
| 	{ |  | ||||||
| 		::wcsncpy_s(dest, source, _TRUNCATE); |  | ||||||
| 		return dest; |  | ||||||
| 	} |  | ||||||
| #endif // #ifdef _MSC_VER
 |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| #if defined(NANA_WINDOWS) |  | ||||||
| 	#define NANA_SHARED_EXPORT	extern "C" _declspec(dllexport) |  | ||||||
| #elif defined(NANA_LINUX) || defined(NANA_MACOS) |  | ||||||
| 	#define NANA_SHARED_EXPORT	extern "C" |  | ||||||
| #endif |  | ||||||
| 
 | 
 | ||||||
| namespace nana | namespace nana | ||||||
| { | { | ||||||
| 	inline unsigned make_rgb(unsigned char red, unsigned char green, unsigned char blue) | 	inline unsigned make_rgb(unsigned char red, unsigned char green, unsigned char blue) | ||||||
| 	{ | 	{ | ||||||
| 
 |  | ||||||
| 		return ((unsigned(red) << 16)|((unsigned(green)<<8))|blue); | 		return ((unsigned(red) << 16)|((unsigned(green)<<8))|blue); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | |||||||
| @ -102,7 +102,7 @@ namespace detail | |||||||
| #if defined(NANA_UNICODE) | #if defined(NANA_UNICODE) | ||||||
| 		XftDraw * xftdraw{nullptr}; | 		XftDraw * xftdraw{nullptr}; | ||||||
| 		XftColor	xft_fgcolor; | 		XftColor	xft_fgcolor; | ||||||
| 		const std::string charset(const nana::string& str, const std::string& strcode); | 		const std::string charset(const std::wstring& str, const std::string& strcode); | ||||||
| #endif | #endif | ||||||
| 		drawable_impl_type(); | 		drawable_impl_type(); | ||||||
| 		~drawable_impl_type(); | 		~drawable_impl_type(); | ||||||
|  | |||||||
| @ -279,7 +279,7 @@ namespace filesystem | |||||||
|                                (FILE_ATTRIBUTE_DIRECTORY & wfd_.dwFileAttributes) == FILE_ATTRIBUTE_DIRECTORY, |                                (FILE_ATTRIBUTE_DIRECTORY & wfd_.dwFileAttributes) == FILE_ATTRIBUTE_DIRECTORY, | ||||||
|                                 wfd_.nFileSizeLow); |                                 wfd_.nFileSizeLow); | ||||||
| 
 | 
 | ||||||
| 		#elif defined(NANA_LINUX) || defined(NANA_MACOS) | 		#elif defined(NANA_POSIX) | ||||||
| 			if(path_.size() && (path_[path_.size() - 1] != '/')) | 			if(path_.size() && (path_[path_.size() - 1] != '/')) | ||||||
| 				path_ += '/'; | 				path_ += '/'; | ||||||
| 			find_handle_t handle = opendir(path_.c_str()); | 			find_handle_t handle = opendir(path_.c_str()); | ||||||
| @ -307,7 +307,7 @@ namespace filesystem | |||||||
| 						is_directory = (0 != S_ISDIR(fst.st_mode)); | 						is_directory = (0 != S_ISDIR(fst.st_mode)); | ||||||
| 						size = fst.st_size; | 						size = fst.st_size; | ||||||
| 					} | 					} | ||||||
| 					value_ = value_type(static_cast<nana::string>(nana::charset(dnt->d_name)), is_directory, size); | 					value_ = value_type(static_cast<std::wstring>(nana::charset(dnt->d_name)), is_directory, size); | ||||||
| 					end_ = false; | 					end_ = false; | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| @ -354,7 +354,7 @@ namespace filesystem | |||||||
| 						} | 						} | ||||||
| 					} | 					} | ||||||
| 
 | 
 | ||||||
| 					nana::string d_name = nana::charset(dnt->d_name); | 					std::wstring d_name = nana::charset(dnt->d_name, nana::unicode::utf8); | ||||||
| 					struct stat fst; | 					struct stat fst; | ||||||
| 					if(stat((path_ + "/" + dnt->d_name).c_str(), &fst) == 0) | 					if(stat((path_ + "/" + dnt->d_name).c_str(), &fst) == 0) | ||||||
| 						value_ = value_type(std::move(d_name), (0 != S_ISDIR(fst.st_mode)), fst.st_size); | 						value_ = value_type(std::move(d_name), (0 != S_ISDIR(fst.st_mode)), fst.st_size); | ||||||
| @ -433,7 +433,6 @@ namespace filesystem | |||||||
| 
 | 
 | ||||||
| 	std::uintmax_t file_size(const path& p); | 	std::uintmax_t file_size(const path& p); | ||||||
| 	//uintmax_t file_size(const path& p, error_code& ec) noexcept;
 | 	//uintmax_t file_size(const path& p, error_code& ec) noexcept;
 | ||||||
| 	//long long filesize(const nana::string& file);
 |  | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 	bool create_directories(const path& p); | 	bool create_directories(const path& p); | ||||||
| @ -443,14 +442,6 @@ namespace filesystem | |||||||
| 	bool create_directory(const path& p, const path& attributes); | 	bool create_directory(const path& p, const path& attributes); | ||||||
| 	//bool create_directory(const path& p, const path& attributes,     error_code& ec) noexcept;
 | 	//bool create_directory(const path& p, const path& attributes,     error_code& ec) noexcept;
 | ||||||
| 	 | 	 | ||||||
| 	/*
 |  | ||||||
| 	bool create_directory(const std::wstring& p, bool & if_exist);	//deprecated
 |  | ||||||
| 	inline bool create_directory(const path& p, bool & if_exist) |  | ||||||
| 	{ |  | ||||||
| 		return create_directory(p.filename(), if_exist); |  | ||||||
| 	} |  | ||||||
| 	*/ |  | ||||||
| 	 |  | ||||||
| 	bool modified_file_time(const std::wstring& file, struct tm&); | 	bool modified_file_time(const std::wstring& file, struct tm&); | ||||||
| 	path path_user(); | 	path path_user(); | ||||||
| 	 | 	 | ||||||
| @ -458,7 +449,6 @@ namespace filesystem | |||||||
| 	//path current_path(error_code& ec);
 | 	//path current_path(error_code& ec);
 | ||||||
| 	void current_path(const path& p); | 	void current_path(const path& p); | ||||||
| 	//void current_path(const path& p, error_code& ec) noexcept;    
 | 	//void current_path(const path& p, error_code& ec) noexcept;    
 | ||||||
| 	//nana::string path_current();
 |  | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 	//bool remove(const path& p);
 | 	//bool remove(const path& p);
 | ||||||
|  | |||||||
| @ -27,36 +27,9 @@ namespace filesystem | |||||||
| 	bool modified_file_time(const ::std::string& file, struct tm&); | 	bool modified_file_time(const ::std::string& file, struct tm&); | ||||||
| 
 | 
 | ||||||
| 	std::wstring path_user(); | 	std::wstring path_user(); | ||||||
| 	std::wstring path_current(); |  | ||||||
| 
 | 
 | ||||||
| 	bool rmfile(const char* file_utf8); | 	bool rmfile(const char* file_utf8); | ||||||
| 	bool rmdir(const char* dir, bool fails_if_not_empty); | 	bool rmdir(const char* dir, bool fails_if_not_empty); | ||||||
| 	nana::string root(const nana::string& path); |  | ||||||
| 
 |  | ||||||
| 	/*
 |  | ||||||
| 	class path |  | ||||||
| 	{ |  | ||||||
| 	public: |  | ||||||
| 		struct type |  | ||||||
| 		{	enum{not_exist, file, directory}; |  | ||||||
| 		}; |  | ||||||
| 
 |  | ||||||
| 		path(); |  | ||||||
| 		path(const nana::string&); |  | ||||||
| 
 |  | ||||||
| 		bool empty() const; |  | ||||||
| 		path root() const; |  | ||||||
| 		int what() const; |  | ||||||
| 
 |  | ||||||
| 		nana::string name() const; |  | ||||||
| 	private: |  | ||||||
| #if defined(NANA_WINDOWS) |  | ||||||
| 		nana::string text_; |  | ||||||
| #else |  | ||||||
| 		std::string text_; |  | ||||||
| #endif |  | ||||||
| 	}; |  | ||||||
| 	*/ |  | ||||||
| 
 | 
 | ||||||
| }//end namespace filesystem
 | }//end namespace filesystem
 | ||||||
| }//end namespace nana
 | }//end namespace nana
 | ||||||
|  | |||||||
| @ -172,7 +172,7 @@ namespace nana | |||||||
| 		void clear(); | 		void clear(); | ||||||
| 		void editable(bool); | 		void editable(bool); | ||||||
| 		bool editable() const; | 		bool editable() const; | ||||||
| 		void set_accept(std::function<bool(nana::char_t)>); | 		void set_accept(std::function<bool(wchar_t)>); | ||||||
| 		combox& push_back(std::string); | 		combox& push_back(std::string); | ||||||
| 		std::size_t the_number_of_options() const; | 		std::size_t the_number_of_options() const; | ||||||
| 		std::size_t option() const;   ///< Index of the last selected, from drop-down list, item.
 | 		std::size_t option() const;   ///< Index of the last selected, from drop-down list, item.
 | ||||||
|  | |||||||
| @ -63,7 +63,7 @@ namespace nana | |||||||
| 		label& transparent(bool);		///< Switchs the label widget to the transparent background mode.
 | 		label& transparent(bool);		///< Switchs the label widget to the transparent background mode.
 | ||||||
| 		bool transparent() const throw(); | 		bool transparent() const throw(); | ||||||
| 		label& format(bool);		///< Switches the format mode of the widget.
 | 		label& format(bool);		///< Switches the format mode of the widget.
 | ||||||
| 		label& add_format_listener(std::function<void(command, const nana::string&)>); | 		label& add_format_listener(std::function<void(command, const std::string&)>); | ||||||
| 
 | 
 | ||||||
| 		label& click_for(window associated_window) throw();	// as same as the "for" attribute of a label
 | 		label& click_for(window associated_window) throw();	// as same as the "for" attribute of a label
 | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -259,7 +259,7 @@ namespace nana | |||||||
| 					for (auto pos = 0u; pos < cols; ++pos) | 					for (auto pos = 0u; pos < cols; ++pos) | ||||||
| 					{ | 					{ | ||||||
| 						auto & el = cells[pos]; | 						auto & el = cells[pos]; | ||||||
| 						if (el.text.size() == 1 && el.text[0] == nana::char_t(0)) | 						if (el.text.size() == 1 && el.text[0] == '\0') | ||||||
| 							continue; | 							continue; | ||||||
| 						text(pos, std::move(el)); | 						text(pos, std::move(el)); | ||||||
| 					} | 					} | ||||||
|  | |||||||
| @ -25,6 +25,8 @@ namespace nana | |||||||
| 		{ | 		{ | ||||||
| 			struct menu_type; //declaration
 | 			struct menu_type; //declaration
 | ||||||
| 
 | 
 | ||||||
|  | 			using native_string_type = ::nana::detail::native_string_type; | ||||||
|  | 
 | ||||||
| 			enum class checks | 			enum class checks | ||||||
| 			{ | 			{ | ||||||
| 				none, | 				none, | ||||||
| @ -70,7 +72,7 @@ namespace nana | |||||||
| 				event_fn_t	functor; | 				event_fn_t	functor; | ||||||
| 				checks			style{checks::none}; | 				checks			style{checks::none}; | ||||||
| 				paint::image	image; | 				paint::image	image; | ||||||
| 				mutable nana::char_t	hotkey{0}; | 				mutable wchar_t	hotkey{0}; | ||||||
| 			}; | 			}; | ||||||
| 
 | 
 | ||||||
| 			struct menu_type | 			struct menu_type | ||||||
| @ -89,7 +91,7 @@ namespace nana | |||||||
| 			class renderer_interface | 			class renderer_interface | ||||||
| 			{ | 			{ | ||||||
| 			public: | 			public: | ||||||
| 				typedef nana::paint::graphics & graph_reference; | 				using graph_reference = nana::paint::graphics &; | ||||||
| 
 | 
 | ||||||
| 				enum class state | 				enum class state | ||||||
| 				{ | 				{ | ||||||
| @ -109,7 +111,7 @@ namespace nana | |||||||
| 				virtual void background(graph_reference, window) = 0; | 				virtual void background(graph_reference, window) = 0; | ||||||
| 				virtual void item(graph_reference, const nana::rectangle&, const attr&) = 0; | 				virtual void item(graph_reference, const nana::rectangle&, const attr&) = 0; | ||||||
| 				virtual void item_image(graph_reference, const nana::point&, unsigned image_px, const paint::image&) = 0; | 				virtual void item_image(graph_reference, const nana::point&, unsigned image_px, const paint::image&) = 0; | ||||||
| 				virtual void item_text(graph_reference, const nana::point&, const nana::string&, unsigned text_pixels, const attr&) = 0; | 				virtual void item_text(graph_reference, const nana::point&, const std::string&, unsigned text_pixels, const attr&) = 0; | ||||||
| 				virtual void sub_arrow(graph_reference, const nana::point&, unsigned item_pixels, const attr&) = 0; | 				virtual void sub_arrow(graph_reference, const nana::point&, unsigned item_pixels, const attr&) = 0; | ||||||
| 			}; | 			}; | ||||||
| 		}//end namespace menu
 | 		}//end namespace menu
 | ||||||
| @ -158,7 +160,7 @@ namespace nana | |||||||
| 		bool goto_submen();///< Popup the submenu of the current item if it has a sub menu. Returns true if succeeds.
 | 		bool goto_submen();///< Popup the submenu of the current item if it has a sub menu. Returns true if succeeds.
 | ||||||
| 		bool exit_submenu();						///< Closes the current window of the sub menu.
 | 		bool exit_submenu();						///< Closes the current window of the sub menu.
 | ||||||
| 		std::size_t size() const;					///< Return the number of items.
 | 		std::size_t size() const;					///< Return the number of items.
 | ||||||
| 		int send_shortkey(nana::char_t key); | 		int send_shortkey(wchar_t key); | ||||||
| 		void pick(); | 		void pick(); | ||||||
| 
 | 
 | ||||||
| 		menu& max_pixels(unsigned);				    ///< Sets the max width in pixels of the item.
 | 		menu& max_pixels(unsigned);				    ///< Sets the max width in pixels of the item.
 | ||||||
|  | |||||||
| @ -21,6 +21,8 @@ namespace nana | |||||||
| 	{ | 	{ | ||||||
| 		namespace menubar | 		namespace menubar | ||||||
| 		{ | 		{ | ||||||
|  | 			using native_string_type = ::nana::detail::native_string_type; | ||||||
|  | 
 | ||||||
| 			class item_renderer | 			class item_renderer | ||||||
| 			{ | 			{ | ||||||
| 			public: | 			public: | ||||||
| @ -33,7 +35,7 @@ namespace nana | |||||||
| 
 | 
 | ||||||
| 				item_renderer(window, graph_reference); | 				item_renderer(window, graph_reference); | ||||||
| 				virtual void background(const point&, const ::nana::size&, state); | 				virtual void background(const point&, const ::nana::size&, state); | ||||||
| 				virtual void caption(const point&, const ::nana::string&); | 				virtual void caption(const point&, const native_string_type&); | ||||||
| 			private: | 			private: | ||||||
| 				window	handle_; | 				window	handle_; | ||||||
| 				graph_reference graph_; | 				graph_reference graph_; | ||||||
| @ -46,7 +48,7 @@ namespace nana | |||||||
| 			public: | 			public: | ||||||
| 				trigger(); | 				trigger(); | ||||||
| 				~trigger(); | 				~trigger(); | ||||||
| 				nana::menu* push_back(const nana::string&); | 				nana::menu* push_back(const std::string&); | ||||||
| 				nana::menu* at(size_t) const; | 				nana::menu* at(size_t) const; | ||||||
| 				std::size_t size() const; | 				std::size_t size() const; | ||||||
| 			private: | 			private: | ||||||
|  | |||||||
| @ -221,7 +221,7 @@ namespace nana{	namespace widgets | |||||||
| 			bool hit_select_area(nana::upoint pos) const; | 			bool hit_select_area(nana::upoint pos) const; | ||||||
| 
 | 
 | ||||||
| 			bool move_select(); | 			bool move_select(); | ||||||
| 			bool mask(char_t); | 			bool mask(wchar_t); | ||||||
| 
 | 
 | ||||||
| 			/// Returns width of text area excluding the vscroll size.
 | 			/// Returns width of text area excluding the vscroll size.
 | ||||||
| 			unsigned width_pixels() const; | 			unsigned width_pixels() const; | ||||||
| @ -253,8 +253,8 @@ namespace nana{	namespace widgets | |||||||
| 			bool mouse_move(bool left_button, const point& screen_pos); | 			bool mouse_move(bool left_button, const point& screen_pos); | ||||||
| 			bool mouse_pressed(const arg_mouse& arg); | 			bool mouse_pressed(const arg_mouse& arg); | ||||||
| 
 | 
 | ||||||
| 			skeletons::textbase<nana::char_t>& textbase(); | 			skeletons::textbase<wchar_t>& textbase(); | ||||||
| 			const skeletons::textbase<nana::char_t>& textbase() const; | 			const skeletons::textbase<wchar_t>& textbase() const; | ||||||
| 		private: | 		private: | ||||||
| 			bool _m_accepts(char_type) const; | 			bool _m_accepts(char_type) const; | ||||||
| 			::nana::color _m_bgcolor() const; | 			::nana::color _m_bgcolor() const; | ||||||
|  | |||||||
| @ -1,7 +1,7 @@ | |||||||
| /*
 | /*
 | ||||||
|  *	Text Token Stream |  *	Text Token Stream | ||||||
|  *	Nana C++ Library(http://www.nanapro.org)
 |  *	Nana C++ Library(http://www.nanapro.org)
 | ||||||
|  *	Copyright(C) 2003-2013 Jinhao(cnjinhao@hotmail.com) |  *	Copyright(C) 2003-2015 Jinhao(cnjinhao@hotmail.com) | ||||||
|  * |  * | ||||||
|  *	Distributed under the Boost Software License, Version 1.0. |  *	Distributed under the Boost Software License, Version 1.0. | ||||||
|  *	(See accompanying file LICENSE_1_0.txt or copy at |  *	(See accompanying file LICENSE_1_0.txt or copy at | ||||||
| @ -108,7 +108,7 @@ namespace nana{ namespace widgets{	namespace skeletons | |||||||
| 			return n; | 			return n; | ||||||
| 		} | 		} | ||||||
| 	private: | 	private: | ||||||
| 		static bool _m_unicode_word_breakable(nana::char_t ch) | 		static bool _m_unicode_word_breakable(wchar_t ch) | ||||||
| 		{ | 		{ | ||||||
| 			return ((0x4E00 <= ch) && (ch <= 0x9FFF)); | 			return ((0x4E00 <= ch) && (ch <= 0x9FFF)); | ||||||
| 		} | 		} | ||||||
| @ -116,7 +116,7 @@ namespace nana{ namespace widgets{	namespace skeletons | |||||||
| 		//Read the data token
 | 		//Read the data token
 | ||||||
| 		token _m_token() | 		token _m_token() | ||||||
| 		{ | 		{ | ||||||
| 			nana::char_t ch = *iptr_; | 			wchar_t ch = *iptr_; | ||||||
| 
 | 
 | ||||||
| 			if(ch > 0xFF) | 			if(ch > 0xFF) | ||||||
| 			{ | 			{ | ||||||
| @ -150,7 +150,7 @@ namespace nana{ namespace widgets{	namespace skeletons | |||||||
| 
 | 
 | ||||||
| 			if(('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z')) | 			if(('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z')) | ||||||
| 			{ | 			{ | ||||||
| 				const nana::char_t * idstr = iptr_; | 				auto idstr = iptr_; | ||||||
| 				do | 				do | ||||||
| 				{ | 				{ | ||||||
| 					ch = *(++iptr_); | 					ch = *(++iptr_); | ||||||
| @ -172,7 +172,7 @@ namespace nana{ namespace widgets{	namespace skeletons | |||||||
| 			{ | 			{ | ||||||
| 				//pos keeps the current position, and it used for restring
 | 				//pos keeps the current position, and it used for restring
 | ||||||
| 				//iptr_ when the search is failed.
 | 				//iptr_ when the search is failed.
 | ||||||
| 				const nana::char_t * pos = ++iptr_; | 				auto pos = ++iptr_; | ||||||
| 				_m_eat_whitespace(); | 				_m_eat_whitespace(); | ||||||
| 				if(*iptr_ == '/') | 				if(*iptr_ == '/') | ||||||
| 				{ | 				{ | ||||||
| @ -219,7 +219,7 @@ namespace nana{ namespace widgets{	namespace skeletons | |||||||
| 		{ | 		{ | ||||||
| 			_m_eat_whitespace(); | 			_m_eat_whitespace(); | ||||||
| 
 | 
 | ||||||
| 			nana::char_t ch = *iptr_++; | 			auto ch = *iptr_++; | ||||||
| 
 | 
 | ||||||
| 			switch(ch) | 			switch(ch) | ||||||
| 			{ | 			{ | ||||||
| @ -232,7 +232,7 @@ namespace nana{ namespace widgets{	namespace skeletons | |||||||
| 			case '"': | 			case '"': | ||||||
| 				//Here is a string and all the meta characters will be ignored except "
 | 				//Here is a string and all the meta characters will be ignored except "
 | ||||||
| 				{ | 				{ | ||||||
| 					const nana::char_t * str = iptr_; | 					auto str = iptr_; | ||||||
| 
 | 
 | ||||||
| 					while((iptr_ != endptr_) && (*iptr_ != '"')) | 					while((iptr_ != endptr_) && (*iptr_ != '"')) | ||||||
| 						++iptr_; | 						++iptr_; | ||||||
| @ -244,7 +244,7 @@ namespace nana{ namespace widgets{	namespace skeletons | |||||||
| 				_m_eat_whitespace(); | 				_m_eat_whitespace(); | ||||||
| 				if((iptr_ < endptr_) && _m_is_idstr_element(*iptr_)) | 				if((iptr_ < endptr_) && _m_is_idstr_element(*iptr_)) | ||||||
| 				{ | 				{ | ||||||
| 					const nana::char_t * pbegin = iptr_; | 					auto pbegin = iptr_; | ||||||
| 					while((iptr_ < endptr_) && _m_is_idstr_element(*iptr_)) | 					while((iptr_ < endptr_) && _m_is_idstr_element(*iptr_)) | ||||||
| 						++iptr_; | 						++iptr_; | ||||||
| 
 | 
 | ||||||
| @ -335,7 +335,7 @@ namespace nana{ namespace widgets{	namespace skeletons | |||||||
| 			return token::eof; | 			return token::eof; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		static bool _m_is_idstr_element(nana::char_t ch) | 		static bool _m_is_idstr_element(wchar_t ch) | ||||||
| 		{ | 		{ | ||||||
| 			return (('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z') || ('_' == ch) || ('0' <= ch && ch <= '9')); | 			return (('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z') || ('_' == ch) || ('0' <= ch && ch <= '9')); | ||||||
| 		} | 		} | ||||||
| @ -343,9 +343,9 @@ namespace nana{ namespace widgets{	namespace skeletons | |||||||
| 		//Read the identifier.
 | 		//Read the identifier.
 | ||||||
| 		void _m_read_idstr() | 		void _m_read_idstr() | ||||||
| 		{ | 		{ | ||||||
| 			const nana::char_t * idstr = iptr_; | 			auto idstr = iptr_; | ||||||
| 
 | 
 | ||||||
| 			nana::char_t ch; | 			wchar_t ch; | ||||||
| 			do | 			do | ||||||
| 			{ | 			{ | ||||||
| 				ch = *(++iptr_); | 				ch = *(++iptr_); | ||||||
| @ -360,7 +360,7 @@ namespace nana{ namespace widgets{	namespace skeletons | |||||||
| 		{ | 		{ | ||||||
| 			idstr_.clear(); | 			idstr_.clear(); | ||||||
| 
 | 
 | ||||||
| 			nana::char_t ch = *iptr_; | 			wchar_t ch = *iptr_; | ||||||
| 
 | 
 | ||||||
| 			idstr_ += ch; | 			idstr_ += ch; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -171,12 +171,12 @@ namespace nana | |||||||
| 		textbox& multi_lines(bool); | 		textbox& multi_lines(bool); | ||||||
| 		bool editable() const; | 		bool editable() const; | ||||||
| 		textbox& editable(bool); | 		textbox& editable(bool); | ||||||
| 		void set_accept(std::function<bool(nana::char_t)>); | 		void set_accept(std::function<bool(wchar_t)>); | ||||||
| 
 | 
 | ||||||
| 		textbox& tip_string(::std::string); | 		textbox& tip_string(::std::string); | ||||||
| 
 | 
 | ||||||
|         /// Set a mask character. Text is displayed as mask character if a mask character is set. This is used for hiding some special text, such as password.
 |         /// Set a mask character. Text is displayed as mask character if a mask character is set. This is used for hiding some special text, such as password.
 | ||||||
| 		textbox& mask(nana::char_t); | 		textbox& mask(wchar_t); | ||||||
| 
 | 
 | ||||||
|         /// Returns true if some text is selected.
 |         /// Returns true if some text is selected.
 | ||||||
| 		bool selected() const; | 		bool selected() const; | ||||||
|  | |||||||
| @ -93,7 +93,7 @@ namespace nana | |||||||
| 
 | 
 | ||||||
| 		void umake_event(event_handle eh) const;              ///< Deletes an event callback by a handle.
 | 		void umake_event(event_handle eh) const;              ///< Deletes an event callback by a handle.
 | ||||||
| 
 | 
 | ||||||
| 		widget& register_shortkey(char_t);	///< Registers a shortkey. To remove a registered key, pass 0.
 | 		widget& register_shortkey(wchar_t);	///< Registers a shortkey. To remove a registered key, pass 0.
 | ||||||
| 
 | 
 | ||||||
| 		widget& take_active(bool activated, window take_if_not_activated); | 		widget& take_active(bool activated, window take_if_not_activated); | ||||||
| 		widget& tooltip(const ::std::string&); | 		widget& tooltip(const ::std::string&); | ||||||
|  | |||||||
| @ -32,9 +32,9 @@ namespace detail | |||||||
| 
 | 
 | ||||||
| 	void blend(drawable_type dw, const nana::rectangle& r, pixel_color_t, double fade_rate); | 	void blend(drawable_type dw, const nana::rectangle& r, pixel_color_t, double fade_rate); | ||||||
| 
 | 
 | ||||||
| 	nana::size raw_text_extent_size(drawable_type, const nana::char_t*, std::size_t len); | 	nana::size raw_text_extent_size(drawable_type, const wchar_t*, std::size_t len); | ||||||
| 	nana::size text_extent_size(drawable_type, const nana::char_t*, std::size_t len); | 	nana::size text_extent_size(drawable_type, const wchar_t*, std::size_t len); | ||||||
| 	void draw_string(drawable_type, const nana::point&, const nana::char_t *, std::size_t len); | 	void draw_string(drawable_type, const nana::point&, const wchar_t *, std::size_t len); | ||||||
| }//end namespace detail
 | }//end namespace detail
 | ||||||
| }//end namespace paint
 | }//end namespace paint
 | ||||||
| }//end namespace nana
 | }//end namespace nana
 | ||||||
|  | |||||||
| @ -144,7 +144,7 @@ namespace nana | |||||||
| 			::nana::color	palette(bool for_text) const; | 			::nana::color	palette(bool for_text) const; | ||||||
| 			graphics&		palette(bool for_text, const ::nana::color&); | 			graphics&		palette(bool for_text, const ::nana::color&); | ||||||
| 
 | 
 | ||||||
| 			unsigned bidi_string(const nana::point&, const char_t *, std::size_t len); | 			unsigned bidi_string(const nana::point&, const wchar_t *, std::size_t len); | ||||||
| 			unsigned bidi_string(const point& pos, const char*, std::size_t len); | 			unsigned bidi_string(const point& pos, const char*, std::size_t len); | ||||||
| 
 | 
 | ||||||
| 			void blend(const ::nana::rectangle& r, const ::nana::color&, double fade_rate); | 			void blend(const ::nana::rectangle& r, const ::nana::color&, double fade_rate); | ||||||
|  | |||||||
| @ -13,11 +13,11 @@ namespace nana | |||||||
| 			 | 			 | ||||||
| 			text_renderer(graph_reference graph, align = align::left); | 			text_renderer(graph_reference graph, align = align::left); | ||||||
| 
 | 
 | ||||||
| 			nana::size extent_size(int x, int y, const nana::char_t*, std::size_t len, unsigned restricted_pixels) const; | 			nana::size extent_size(int x, int y, const wchar_t*, std::size_t len, unsigned restricted_pixels) const; | ||||||
| 
 | 
 | ||||||
| 			void render(const point&, const char_t*, std::size_t len); | 			void render(const point&, const wchar_t*, std::size_t len); | ||||||
| 			void render(const point&, const char_t*, std::size_t len, unsigned restricted_pixels, bool omitted); | 			void render(const point&, const wchar_t*, std::size_t len, unsigned restricted_pixels, bool omitted); | ||||||
| 			void render(const point&, const char_t*, std::size_t len, unsigned restricted_pixels); | 			void render(const point&, const wchar_t*, std::size_t len, unsigned restricted_pixels); | ||||||
| 		private: | 		private: | ||||||
| 			graph_reference graph_; | 			graph_reference graph_; | ||||||
| 			align text_align_; | 			align text_align_; | ||||||
|  | |||||||
| @ -38,7 +38,7 @@ namespace system | |||||||
| 	bool get_async_mouse_state(int button); | 	bool get_async_mouse_state(int button); | ||||||
| 
 | 
 | ||||||
| 	//open an url through a default browser
 | 	//open an url through a default browser
 | ||||||
| 	void open_url(const nana::string& url); | 	void open_url(const std::string& url); | ||||||
| 
 | 
 | ||||||
| }//end namespace system
 | }//end namespace system
 | ||||||
| }//end namespace nana
 | }//end namespace nana
 | ||||||
|  | |||||||
| @ -600,22 +600,5 @@ namespace nana | |||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 	std::size_t strlen(const char_t* str) |  | ||||||
| 	{ |  | ||||||
| #if defined(NANA_UNICODE) |  | ||||||
| 		return ::wcslen(str); |  | ||||||
| #else |  | ||||||
| 		return ::strlen(str); |  | ||||||
| #endif |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	char_t* strcpy(char_t* dest, const char_t* source) |  | ||||||
| 	{ |  | ||||||
| #if defined(NANA_UNICODE) |  | ||||||
| 		return ::wcscpy(dest, source); |  | ||||||
| #else |  | ||||||
| 		return ::strcpy(dest, source); |  | ||||||
| #endif |  | ||||||
| 	} |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -244,9 +244,9 @@ namespace detail | |||||||
| 		memset(&logfont, 0, sizeof logfont); | 		memset(&logfont, 0, sizeof logfont); | ||||||
| 
 | 
 | ||||||
| 		if (name && *name) | 		if (name && *name) | ||||||
| 			strcpy(logfont.lfFaceName, utf8_cast(name).c_str()); | 			std::wcscpy(logfont.lfFaceName, utf8_cast(name).c_str()); | ||||||
| 		else | 		else | ||||||
| 			strcpy(logfont.lfFaceName, def_font_ptr_->name.c_str()); | 			std::wcscpy(logfont.lfFaceName, def_font_ptr_->name.c_str()); | ||||||
| 
 | 
 | ||||||
| 		logfont.lfCharSet = DEFAULT_CHARSET; | 		logfont.lfCharSet = DEFAULT_CHARSET; | ||||||
| 		HDC hdc = ::GetDC(0); | 		HDC hdc = ::GetDC(0); | ||||||
|  | |||||||
| @ -237,28 +237,6 @@ namespace nana {	namespace experimental { | |||||||
| 					return rmdir(dir, true); | 					return rmdir(dir, true); | ||||||
| 				} | 				} | ||||||
| 
 | 
 | ||||||
| 				bool mkdir_helper(const nana::string& dir, bool & if_exist) |  | ||||||
| 				{ |  | ||||||
| #if defined(NANA_WINDOWS) |  | ||||||
| 					if (::CreateDirectory(dir.c_str(), 0)) |  | ||||||
| 					{ |  | ||||||
| 						if_exist = false; |  | ||||||
| 						return true; |  | ||||||
| 					} |  | ||||||
| 
 |  | ||||||
| 					if_exist = (::GetLastError() == ERROR_ALREADY_EXISTS); |  | ||||||
| #elif defined(NANA_LINUX) || defined(NANA_MACOS) |  | ||||||
| 					if (0 == ::mkdir(static_cast<std::string>(nana::charset(dir)).c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH)) |  | ||||||
| 					{ |  | ||||||
| 						if_exist = false; |  | ||||||
| 						return true; |  | ||||||
| 					} |  | ||||||
| 
 |  | ||||||
| 					if_exist = (errno == EEXIST); |  | ||||||
| #endif |  | ||||||
| 					return false; |  | ||||||
| 				} |  | ||||||
| 
 |  | ||||||
| #if defined(NANA_WINDOWS) | #if defined(NANA_WINDOWS) | ||||||
| 				void filetime_to_c_tm(FILETIME& ft, struct tm& t) | 				void filetime_to_c_tm(FILETIME& ft, struct tm& t) | ||||||
| 				{ | 				{ | ||||||
| @ -513,13 +491,34 @@ namespace nana {	namespace experimental { | |||||||
| 					} | 					} | ||||||
| 					return buf; | 					return buf; | ||||||
| 				} | 				} | ||||||
| #elif defined(NANA_LINUX) || defined(NANA_MACOS) | #elif defined(NANA_POSIX) | ||||||
| 				auto pstr = ::getenv("PWD"); | 				char buf[260]; | ||||||
|  | 				auto pstr = ::getcwd(buf, 260); | ||||||
| 				if (pstr) | 				if (pstr) | ||||||
| 					return pstr; | 					return pstr; | ||||||
|  | 				 | ||||||
|  | 				int bytes = 260 + 260; | ||||||
|  | 				while (ERANGE == errno) | ||||||
|  | 				{ | ||||||
|  | 					std::unique_ptr<char[]> buf(new char[bytes]); | ||||||
|  | 					auto pstr = ::getcwd(buf.get(), bytes); | ||||||
|  | 					if (pstr) | ||||||
|  | 						return path(pstr); | ||||||
|  | 
 | ||||||
|  | 					bytes += 260; | ||||||
|  | 				} | ||||||
| #endif | #endif | ||||||
| 				return path(); | 				return path(); | ||||||
| 			} | 			} | ||||||
|  | 
 | ||||||
|  | 			void current_path(const path& p) | ||||||
|  | 			{ | ||||||
|  | #if defined(NANA_WINDOWS) | ||||||
|  | 				::SetCurrentDirectoryW(p.c_str()); | ||||||
|  | #elif defined(NANA_POSIX) | ||||||
|  | 				::chdir(p.c_str()); | ||||||
|  | #endif | ||||||
|  | 			} | ||||||
| 		}//end namespace filesystem
 | 		}//end namespace filesystem
 | ||||||
| 	} //end namespace experimental
 | 	} //end namespace experimental
 | ||||||
| }//end namespace nana
 | }//end namespace nana
 | ||||||
|  | |||||||
| @ -51,80 +51,6 @@ namespace filesystem | |||||||
| 	const wchar_t* splstr = L"/\\"; | 	const wchar_t* splstr = L"/\\"; | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| 	/*
 |  | ||||||
| 	//class path
 |  | ||||||
| 		path::path(){} |  | ||||||
| 
 |  | ||||||
| 		path::path(const nana::string& text) |  | ||||||
| #if defined(NANA_WINDOWS) |  | ||||||
| 			:text_(text) |  | ||||||
| 		{ |  | ||||||
| #else |  | ||||||
| 			:text_(nana::charset(text)) |  | ||||||
| 		{ |  | ||||||
| #endif |  | ||||||
| 			auto pos = text_.find_last_of(splstr); |  | ||||||
| 			for(; (pos != string_t::npos) && (pos + 1 == text_.size()); pos = text_.find_last_of(splstr)) |  | ||||||
| 				text_.erase(pos); |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		bool path::empty() const |  | ||||||
| 		{ |  | ||||||
| #if defined(NANA_WINDOWS) |  | ||||||
| 			return (::GetFileAttributes(text_.c_str()) == INVALID_FILE_ATTRIBUTES); |  | ||||||
| #elif defined(NANA_LINUX) || defined(NANA_MACOS) |  | ||||||
| 			struct stat sta; |  | ||||||
| 			return (::stat(text_.c_str(), &sta) == -1); |  | ||||||
| #endif |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		path path::root() const |  | ||||||
| 		{ |  | ||||||
| 		#if defined(NANA_WINDOWS) |  | ||||||
| 			return path(filesystem::root(text_)); |  | ||||||
| 		#elif defined(NANA_LINUX) || defined(NANA_MACOS) |  | ||||||
| 			return path(filesystem::root(nana::charset(text_))); |  | ||||||
| 		#endif |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		int path::what() const |  | ||||||
| 		{ |  | ||||||
| #if defined(NANA_WINDOWS) |  | ||||||
| 			unsigned long attr = ::GetFileAttributes(text_.c_str()); |  | ||||||
| 			if(INVALID_FILE_ATTRIBUTES == attr) |  | ||||||
| 				return type::not_exist; |  | ||||||
| 
 |  | ||||||
| 			if(FILE_ATTRIBUTE_DIRECTORY & attr) |  | ||||||
| 				return type::directory; |  | ||||||
| 
 |  | ||||||
| 			return type::file; |  | ||||||
| #elif defined(NANA_LINUX) || defined(NANA_MACOS) |  | ||||||
| 			struct stat sta; |  | ||||||
| 			if(-1 == ::stat(text_.c_str(), &sta)) |  | ||||||
| 				return type::not_exist; |  | ||||||
| 
 |  | ||||||
| 			if((S_IFDIR & sta.st_mode) == S_IFDIR) |  | ||||||
| 				return type::directory; |  | ||||||
| 
 |  | ||||||
| 			if((S_IFREG & sta.st_mode) == S_IFREG) |  | ||||||
| 				return type::file; |  | ||||||
| 
 |  | ||||||
| 			return type::not_exist; |  | ||||||
| #endif |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		nana::string path::name() const |  | ||||||
| 		{ |  | ||||||
| 			string_t::size_type pos = text_.find_last_of(splstr); |  | ||||||
| #if defined(NANA_WINDOWS) |  | ||||||
| 			return text_.substr(pos + 1); |  | ||||||
| #else |  | ||||||
| 			return nana::charset(text_.substr(pos + 1)); |  | ||||||
| #endif |  | ||||||
| 		} |  | ||||||
| 	//end class path
 |  | ||||||
| 	*/ |  | ||||||
| 
 |  | ||||||
| 	namespace detail | 	namespace detail | ||||||
| 	{ | 	{ | ||||||
| 		//rm_dir_recursive
 | 		//rm_dir_recursive
 | ||||||
| @ -148,28 +74,6 @@ namespace filesystem | |||||||
| 			return rmdir(dir.c_str(), true); | 			return rmdir(dir.c_str(), true); | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		bool mkdir_helper(const std::string& dir, bool & if_exist) |  | ||||||
| 		{ |  | ||||||
| #if defined(NANA_WINDOWS) |  | ||||||
| 			if(::CreateDirectory(utf8_cast(dir).c_str(), 0)) |  | ||||||
| 			{ |  | ||||||
| 				if_exist = false; |  | ||||||
| 				return true; |  | ||||||
| 			} |  | ||||||
| 
 |  | ||||||
| 			if_exist = (::GetLastError() == ERROR_ALREADY_EXISTS); |  | ||||||
| #elif defined(NANA_LINUX) || defined(NANA_MACOS) |  | ||||||
| 			if(0 == ::mkdir(dir.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH)) |  | ||||||
| 			{ |  | ||||||
| 				if_exist = false; |  | ||||||
| 				return true; |  | ||||||
| 			} |  | ||||||
| 
 |  | ||||||
| 			if_exist = (errno == EEXIST); |  | ||||||
| #endif |  | ||||||
| 			return false; |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| #if defined(NANA_WINDOWS) | #if defined(NANA_WINDOWS) | ||||||
| 		void filetime_to_c_tm(FILETIME& ft, struct tm& t) | 		void filetime_to_c_tm(FILETIME& ft, struct tm& t) | ||||||
| 		{ | 		{ | ||||||
| @ -269,36 +173,10 @@ namespace filesystem | |||||||
| 		return ret; | 		return ret; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	nana::string root(const nana::string& path) | 	std::wstring path_user() | ||||||
| 	{ |  | ||||||
| 		std::size_t index = path.size(); |  | ||||||
| 
 |  | ||||||
| 		if(index) |  | ||||||
| 		{ |  | ||||||
| 			const nana::char_t * str = path.c_str(); |  | ||||||
| 
 |  | ||||||
| 			for(--index; index > 0; --index) |  | ||||||
| 			{ |  | ||||||
| 				nana::char_t c = str[index]; |  | ||||||
| 				if(c != '\\' && c != '/') |  | ||||||
| 					break; |  | ||||||
| 			} |  | ||||||
| 
 |  | ||||||
| 			for(--index; index > 0; --index) |  | ||||||
| 			{ |  | ||||||
| 				nana::char_t c = str[index]; |  | ||||||
| 				if(c == '\\' || c == '/') |  | ||||||
| 					break; |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		return index?path.substr(0, index + 1):nana::string(); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	nana::string path_user() |  | ||||||
| 	{ | 	{ | ||||||
| #if defined(NANA_WINDOWS) | #if defined(NANA_WINDOWS) | ||||||
| 		nana::char_t path[MAX_PATH]; | 		wchar_t path[MAX_PATH]; | ||||||
| 		if(SUCCEEDED(SHGetFolderPath(0, CSIDL_PROFILE, 0, SHGFP_TYPE_CURRENT, path))) | 		if(SUCCEEDED(SHGetFolderPath(0, CSIDL_PROFILE, 0, SHGFP_TYPE_CURRENT, path))) | ||||||
| 			return path; | 			return path; | ||||||
| #elif defined(NANA_LINUX) || defined(NANA_MACOS) | #elif defined(NANA_LINUX) || defined(NANA_MACOS) | ||||||
| @ -306,32 +184,7 @@ namespace filesystem | |||||||
| 		if(s) | 		if(s) | ||||||
| 			return nana::charset(std::string(s, std::strlen(s)), nana::unicode::utf8); | 			return nana::charset(std::string(s, std::strlen(s)), nana::unicode::utf8); | ||||||
| #endif | #endif | ||||||
| 		return nana::string(); | 		return std::wstring(); | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	nana::string path_current() |  | ||||||
| 	{ |  | ||||||
| #if defined(NANA_WINDOWS) |  | ||||||
| 		nana::char_t buf[MAX_PATH]; |  | ||||||
| 		DWORD len = ::GetCurrentDirectory(MAX_PATH, buf); |  | ||||||
| 		if(len) |  | ||||||
| 		{ |  | ||||||
| 			if(len > MAX_PATH) |  | ||||||
| 			{ |  | ||||||
| 				nana::char_t * p = new nana::char_t[len + 1]; |  | ||||||
| 				::GetCurrentDirectory(len + 1, p); |  | ||||||
| 				nana::string s = p; |  | ||||||
| 				delete [] p; |  | ||||||
| 				return s; |  | ||||||
| 			} |  | ||||||
| 			return buf; |  | ||||||
| 		} |  | ||||||
| #elif defined(NANA_LINUX) || defined(NANA_MACOS) |  | ||||||
| 		const char * s = ::getenv("PWD"); |  | ||||||
| 		if(s) |  | ||||||
| 			return nana::charset(std::string(s, std::strlen(s)), nana::unicode::utf8); |  | ||||||
| #endif |  | ||||||
| 		return nana::string(); |  | ||||||
| 	} | 	} | ||||||
| }//end namespace filesystem
 | }//end namespace filesystem
 | ||||||
| }//end namespace nana
 | }//end namespace nana
 | ||||||
|  | |||||||
| @ -1017,7 +1017,7 @@ namespace detail | |||||||
| 						} | 						} | ||||||
| 
 | 
 | ||||||
| 						keybuf[len] = 0; | 						keybuf[len] = 0; | ||||||
| 						::nana::char_t os_code = 0; | 						wchar_t os_code = 0; | ||||||
| 						switch(status) | 						switch(status) | ||||||
| 						{ | 						{ | ||||||
| 						case XLookupKeySym: | 						case XLookupKeySym: | ||||||
| @ -1074,7 +1074,7 @@ namespace detail | |||||||
| 
 | 
 | ||||||
| 								if(brock.wd_manager().available(msgwnd) && (msgwnd->root_widget->other.attribute.root->menubar == msgwnd)) | 								if(brock.wd_manager().available(msgwnd) && (msgwnd->root_widget->other.attribute.root->menubar == msgwnd)) | ||||||
| 								{ | 								{ | ||||||
| 									int cmd = (menu_wd && (keyboard::escape == static_cast<nana::char_t>(arg.key)) ? 1 : 0 ); | 									int cmd = (menu_wd && (keyboard::escape == static_cast<wchar_t>(arg.key)) ? 1 : 0 ); | ||||||
| 									brock.delay_restore(cmd); | 									brock.delay_restore(cmd); | ||||||
| 								} | 								} | ||||||
| 							} | 							} | ||||||
| @ -1087,11 +1087,11 @@ namespace detail | |||||||
| 						case XLookupChars: | 						case XLookupChars: | ||||||
| 							if (msgwnd->flags.enabled) | 							if (msgwnd->flags.enabled) | ||||||
| 							{ | 							{ | ||||||
| 								const ::nana::char_t* charbuf; | 								const wchar_t* charbuf; | ||||||
| #if defined(NANA_UNICODE) | #if defined(NANA_UNICODE) | ||||||
| 								nana::detail::charset_conv charset("UTF-32", "UTF-8"); | 								nana::detail::charset_conv charset("UTF-32", "UTF-8"); | ||||||
| 								const std::string& str = charset.charset(std::string(keybuf, keybuf + len)); | 								const std::string& str = charset.charset(std::string(keybuf, keybuf + len)); | ||||||
| 								charbuf = reinterpret_cast<const nana::char_t*>(str.c_str()) + 1; | 								charbuf = reinterpret_cast<const wchar_t*>(str.c_str()) + 1; | ||||||
| 								len = str.size() / sizeof(wchar_t) - 1; | 								len = str.size() / sizeof(wchar_t) - 1; | ||||||
| #else | #else | ||||||
| 								charbuf = keybuf; | 								charbuf = keybuf; | ||||||
|  | |||||||
| @ -141,7 +141,7 @@ namespace detail | |||||||
| 
 | 
 | ||||||
| 		struct platform_detail_tag | 		struct platform_detail_tag | ||||||
| 		{ | 		{ | ||||||
| 			nana::char_t keychar; | 			wchar_t keychar; | ||||||
| 		}platform; | 		}platform; | ||||||
| 
 | 
 | ||||||
| 		struct cursor_tag | 		struct cursor_tag | ||||||
| @ -1185,7 +1185,7 @@ namespace detail | |||||||
| 							unsigned reqlen = ::DragQueryFile(drop, i, 0, 0) + 1; | 							unsigned reqlen = ::DragQueryFile(drop, i, 0, 0) + 1; | ||||||
| 							if(bufsize < reqlen) | 							if(bufsize < reqlen) | ||||||
| 							{ | 							{ | ||||||
| 								varbuf.reset(new nana::char_t[reqlen]); | 								varbuf.reset(new wchar_t[reqlen]); | ||||||
| 								bufsize = reqlen; | 								bufsize = reqlen; | ||||||
| 							} | 							} | ||||||
| 
 | 
 | ||||||
| @ -1345,7 +1345,7 @@ namespace detail | |||||||
| 						arg.evt_code = event_code::key_press; | 						arg.evt_code = event_code::key_press; | ||||||
| 						arg.window_handle = reinterpret_cast<window>(msgwnd); | 						arg.window_handle = reinterpret_cast<window>(msgwnd); | ||||||
| 						arg.ignore = false; | 						arg.ignore = false; | ||||||
| 						arg.key = static_cast<nana::char_t>(wParam); | 						arg.key = static_cast<wchar_t>(wParam); | ||||||
| 						brock.get_key_state(arg); | 						brock.get_key_state(arg); | ||||||
| 						brock.emit(event_code::key_press, msgwnd, arg, true, &context); | 						brock.emit(event_code::key_press, msgwnd, arg, true, &context); | ||||||
| 
 | 
 | ||||||
| @ -1373,7 +1373,7 @@ namespace detail | |||||||
| 						arg.evt_code = event_code::key_release; | 						arg.evt_code = event_code::key_release; | ||||||
| 						arg.window_handle = reinterpret_cast<window>(msgwnd); | 						arg.window_handle = reinterpret_cast<window>(msgwnd); | ||||||
| 						arg.ignore = false; | 						arg.ignore = false; | ||||||
| 						arg.key = static_cast<nana::char_t>(wParam); | 						arg.key = static_cast<wchar_t>(wParam); | ||||||
| 						brock.get_key_state(arg); | 						brock.get_key_state(arg); | ||||||
| 						brock.emit(event_code::key_release, msgwnd, arg, true, &context); | 						brock.emit(event_code::key_release, msgwnd, arg, true, &context); | ||||||
| 
 | 
 | ||||||
| @ -1415,7 +1415,7 @@ namespace detail | |||||||
| 							arg.evt_code = event_code::key_press; | 							arg.evt_code = event_code::key_press; | ||||||
| 							arg.window_handle = reinterpret_cast<window>(msgwnd); | 							arg.window_handle = reinterpret_cast<window>(msgwnd); | ||||||
| 							arg.ignore = false; | 							arg.ignore = false; | ||||||
| 							arg.key = static_cast<nana::char_t>(wParam); | 							arg.key = static_cast<wchar_t>(wParam); | ||||||
| 							brock.get_key_state(arg); | 							brock.get_key_state(arg); | ||||||
| 							brock.emit(event_code::key_press, msgwnd, arg, true, &context); | 							brock.emit(event_code::key_press, msgwnd, arg, true, &context); | ||||||
| 
 | 
 | ||||||
| @ -1426,7 +1426,7 @@ namespace detail | |||||||
| 								//If no menu popuped by the menubar, it should enable delay restore to
 | 								//If no menu popuped by the menubar, it should enable delay restore to
 | ||||||
| 								//restore the focus for taken window.
 | 								//restore the focus for taken window.
 | ||||||
| 
 | 
 | ||||||
| 								int cmd = (menu_wd && (keyboard::escape == static_cast<nana::char_t>(wParam)) ? 1 : 0); | 								int cmd = (menu_wd && (keyboard::escape == static_cast<wchar_t>(wParam)) ? 1 : 0); | ||||||
| 								brock.delay_restore(cmd); | 								brock.delay_restore(cmd); | ||||||
| 							} | 							} | ||||||
| 						} | 						} | ||||||
| @ -1443,7 +1443,7 @@ namespace detail | |||||||
| 						arg_keyboard arg; | 						arg_keyboard arg; | ||||||
| 						arg.evt_code = event_code::key_char; | 						arg.evt_code = event_code::key_char; | ||||||
| 						arg.window_handle = reinterpret_cast<window>(msgwnd); | 						arg.window_handle = reinterpret_cast<window>(msgwnd); | ||||||
| 						arg.key = static_cast<nana::char_t>(wParam); | 						arg.key = static_cast<wchar_t>(wParam); | ||||||
| 						brock.get_key_state(arg); | 						brock.get_key_state(arg); | ||||||
| 						arg.ignore = false; | 						arg.ignore = false; | ||||||
| 
 | 
 | ||||||
| @ -1464,7 +1464,7 @@ namespace detail | |||||||
| 						arg_keyboard arg; | 						arg_keyboard arg; | ||||||
| 						arg.evt_code = event_code::key_release; | 						arg.evt_code = event_code::key_release; | ||||||
| 						arg.window_handle = reinterpret_cast<window>(msgwnd); | 						arg.window_handle = reinterpret_cast<window>(msgwnd); | ||||||
| 						arg.key = static_cast<nana::char_t>(wParam); | 						arg.key = static_cast<wchar_t>(wParam); | ||||||
| 						brock.get_key_state(arg); | 						brock.get_key_state(arg); | ||||||
| 						arg.ignore = false; | 						arg.ignore = false; | ||||||
| 						brock.emit(event_code::key_release, msgwnd, arg, true, &context); | 						brock.emit(event_code::key_release, msgwnd, arg, true, &context); | ||||||
| @ -1729,9 +1729,9 @@ namespace detail | |||||||
| 		return true; | 		return true; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	const nana::char_t* translate(cursor id) | 	const wchar_t* translate(cursor id) | ||||||
| 	{ | 	{ | ||||||
| 		const nana::char_t* name = IDC_ARROW; | 		const wchar_t* name = IDC_ARROW; | ||||||
| 
 | 
 | ||||||
| 		switch(id) | 		switch(id) | ||||||
| 		{ | 		{ | ||||||
|  | |||||||
| @ -96,7 +96,7 @@ namespace nana | |||||||
| 				{ | 				{ | ||||||
| 					double cap = bytes / 1024.0; | 					double cap = bytes / 1024.0; | ||||||
| 					std::size_t uid = 0; | 					std::size_t uid = 0; | ||||||
| 					while((cap >= 1024.0) && (uid < (sizeof(ustr) / sizeof(nana::char_t*)))) | 					while((cap >= 1024.0) && (uid < (sizeof(ustr) / sizeof(char*)))) | ||||||
| 					{ | 					{ | ||||||
| 						cap /= 1024.0; | 						cap /= 1024.0; | ||||||
| 						++uid; | 						++uid; | ||||||
|  | |||||||
| @ -164,13 +164,13 @@ namespace nana{	namespace drawerbase | |||||||
| 
 | 
 | ||||||
| 		void trigger::key_char(graph_reference, const arg_keyboard& arg) | 		void trigger::key_char(graph_reference, const arg_keyboard& arg) | ||||||
| 		{ | 		{ | ||||||
| 			if (static_cast<char_t>(keyboard::enter) == arg.key) | 			if (static_cast<wchar_t>(keyboard::enter) == arg.key) | ||||||
| 				emit_click(); | 				emit_click(); | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		void trigger::key_press(graph_reference graph, const arg_keyboard& arg) | 		void trigger::key_press(graph_reference graph, const arg_keyboard& arg) | ||||||
| 		{ | 		{ | ||||||
| 			if (keyboard::space == static_cast<char_t>(arg.key)) | 			if (keyboard::space == static_cast<wchar_t>(arg.key)) | ||||||
| 			{ | 			{ | ||||||
| 				_m_press(graph, true); | 				_m_press(graph, true); | ||||||
| 				return; | 				return; | ||||||
| @ -193,7 +193,7 @@ namespace nana{	namespace drawerbase | |||||||
| 
 | 
 | ||||||
| 		void trigger::key_release(graph_reference graph, const arg_keyboard& arg) | 		void trigger::key_release(graph_reference graph, const arg_keyboard& arg) | ||||||
| 		{ | 		{ | ||||||
| 			if (arg.key != static_cast<char_t>(keyboard::space)) | 			if (arg.key != static_cast<wchar_t>(keyboard::space)) | ||||||
| 				return; | 				return; | ||||||
| 
 | 
 | ||||||
| 			emit_click(); | 			emit_click(); | ||||||
| @ -259,8 +259,13 @@ namespace nana{	namespace drawerbase | |||||||
| 					{ | 					{ | ||||||
| 						unsigned off_w = (shortkey_pos ? graph.text_extent_size(mbstr.c_str(), static_cast<unsigned>(shortkey_pos)).width : 0); | 						unsigned off_w = (shortkey_pos ? graph.text_extent_size(mbstr.c_str(), static_cast<unsigned>(shortkey_pos)).width : 0); | ||||||
| 						nana::size shortkey_size = graph.text_extent_size(to_wstring(mbstr.c_str() + shortkey_pos), 1); | 						nana::size shortkey_size = graph.text_extent_size(to_wstring(mbstr.c_str() + shortkey_pos), 1); | ||||||
|  | 
 | ||||||
|  | 						unsigned ascent, descent, inleading; | ||||||
|  | 						graph.text_metrics(ascent, descent, inleading); | ||||||
|  | 
 | ||||||
| 						pos.x += off_w; | 						pos.x += off_w; | ||||||
| 						pos.y += static_cast<int>(shortkey_size.height); | 						pos.y += static_cast<int>(ascent + 2); | ||||||
|  | 
 | ||||||
| 						graph.set_color(colors::black); | 						graph.set_color(colors::black); | ||||||
| 						graph.line(pos, point{ pos.x + static_cast<int>(shortkey_size.width) - 1, pos.y }); | 						graph.line(pos, point{ pos.x + static_cast<int>(shortkey_size.width) - 1, pos.y }); | ||||||
| 					} | 					} | ||||||
|  | |||||||
| @ -906,7 +906,7 @@ namespace nana | |||||||
| 			return _m_impl().editable(); | 			return _m_impl().editable(); | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		void combox::set_accept(std::function<bool(nana::char_t)> pred) | 		void combox::set_accept(std::function<bool(wchar_t)> pred) | ||||||
| 		{ | 		{ | ||||||
| 			internal_scope_guard lock; | 			internal_scope_guard lock; | ||||||
| 			auto editor = _m_impl().editor(); | 			auto editor = _m_impl().editor(); | ||||||
|  | |||||||
| @ -62,7 +62,7 @@ namespace nana | |||||||
| 				typedef widgets::skeletons::fblock fblock; | 				typedef widgets::skeletons::fblock fblock; | ||||||
| 				typedef widgets::skeletons::data data; | 				typedef widgets::skeletons::data data; | ||||||
| 
 | 
 | ||||||
| 				void parse(const nana::string& s) | 				void parse(const std::wstring& s) | ||||||
| 				{ | 				{ | ||||||
| 					dstream_.parse(s, format_enabled_); | 					dstream_.parse(s, format_enabled_); | ||||||
| 				} | 				} | ||||||
| @ -439,7 +439,7 @@ namespace nana | |||||||
| 
 | 
 | ||||||
| 				bool _m_each_line(graph_reference graph, dstream::linecontainer& line, render_status& rs) | 				bool _m_each_line(graph_reference graph, dstream::linecontainer& line, render_status& rs) | ||||||
| 				{ | 				{ | ||||||
| 					nana::string text; | 					std::wstring text; | ||||||
| 					iterator block_start; | 					iterator block_start; | ||||||
| 
 | 
 | ||||||
| 					const int lastpos = static_cast<int>(graph.height()) - 1; | 					const int lastpos = static_cast<int>(graph.height()) - 1; | ||||||
| @ -521,7 +521,7 @@ namespace nana | |||||||
| 					return 0; | 					return 0; | ||||||
| 				} | 				} | ||||||
| 
 | 
 | ||||||
| 				void _m_draw_block(graph_reference graph, const nana::string& s, dstream::linecontainer::iterator block_start, render_status& rs) | 				void _m_draw_block(graph_reference graph, const std::wstring& s, dstream::linecontainer::iterator block_start, render_status& rs) | ||||||
| 				{ | 				{ | ||||||
| 					nana::unicode_bidi bidi; | 					nana::unicode_bidi bidi; | ||||||
| 					std::vector<nana::unicode_bidi::entity> reordered; | 					std::vector<nana::unicode_bidi::entity> reordered; | ||||||
| @ -568,7 +568,7 @@ namespace nana | |||||||
| 							} | 							} | ||||||
| 							else | 							else | ||||||
| 							{ | 							{ | ||||||
| 								nana::string str = data_ptr->text().substr(text_range.first, text_range.second); | 								auto str = data_ptr->text().substr(text_range.first, text_range.second); | ||||||
| 								graph.string({ rs.pos.x, y }, str, _m_fgcolor(fblock_ptr)); | 								graph.string({ rs.pos.x, y }, str, _m_fgcolor(fblock_ptr)); | ||||||
| 								sz = graph.text_extent_size(str); | 								sz = graph.text_extent_size(str); | ||||||
| 							} | 							} | ||||||
| @ -625,23 +625,24 @@ namespace nana | |||||||
| 
 | 
 | ||||||
| 					class renderer renderer; | 					class renderer renderer; | ||||||
| 
 | 
 | ||||||
| 					nana::string target;	//It indicates which target is tracing.
 | 					std::wstring target;	//It indicates which target is tracing.
 | ||||||
| 					nana::string url; | 					std::wstring url; | ||||||
| 
 | 
 | ||||||
| 					window for_associated_wd{ nullptr }; | 					window for_associated_wd{ nullptr }; | ||||||
| 
 | 
 | ||||||
| 					void add_listener(std::function<void(command, const nana::string&)>&& fn) | 					void add_listener(std::function<void(command, const std::string&)>&& fn) | ||||||
| 					{ | 					{ | ||||||
| 						listener_.emplace_back(std::move(fn)); | 						listener_.emplace_back(std::move(fn)); | ||||||
| 					} | 					} | ||||||
| 
 | 
 | ||||||
| 					void call_listener(command cmd, const nana::string& tar) | 					void call_listener(command cmd, const std::wstring& tar) | ||||||
| 					{ | 					{ | ||||||
|  | 						auto str = to_utf8(tar); | ||||||
| 						for (auto & fn : listener_) | 						for (auto & fn : listener_) | ||||||
| 							fn(cmd, tar); | 							fn(cmd, str); | ||||||
| 					} | 					} | ||||||
| 				private: | 				private: | ||||||
| 					std::vector<std::function<void(command, const nana::string&)>> listener_; | 					std::vector<std::function<void(command, const std::string&)>> listener_; | ||||||
| 				}; | 				}; | ||||||
| 
 | 
 | ||||||
| 				trigger::trigger() | 				trigger::trigger() | ||||||
| @ -666,7 +667,7 @@ namespace nana | |||||||
| 
 | 
 | ||||||
| 				void trigger::mouse_move(graph_reference, const arg_mouse& arg) | 				void trigger::mouse_move(graph_reference, const arg_mouse& arg) | ||||||
| 				{ | 				{ | ||||||
| 					nana::string target, url; | 					std::wstring target, url; | ||||||
| 
 | 
 | ||||||
| 					if(impl_->renderer.find(arg.pos.x, arg.pos.y, target, url)) | 					if(impl_->renderer.find(arg.pos.x, arg.pos.y, target, url)) | ||||||
| 					{ | 					{ | ||||||
| @ -741,7 +742,7 @@ namespace nana | |||||||
| 					if(impl_->target.size()) | 					if(impl_->target.size()) | ||||||
| 						impl_->call_listener(command::click, impl_->target); | 						impl_->call_listener(command::click, impl_->target); | ||||||
| 
 | 
 | ||||||
| 					system::open_url(url); | 					system::open_url(to_utf8(url)); | ||||||
| 
 | 
 | ||||||
| 					API::focus_window(impl_->for_associated_wd); | 					API::focus_window(impl_->for_associated_wd); | ||||||
| 				} | 				} | ||||||
| @ -813,7 +814,7 @@ namespace nana | |||||||
| 			return *this; | 			return *this; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		label& label::add_format_listener(std::function<void(command, const nana::string&)> f) | 		label& label::add_format_listener(std::function<void(command, const std::string&)> f) | ||||||
| 		{ | 		{ | ||||||
| 			get_drawer_trigger().impl()->add_listener(std::move(f)); | 			get_drawer_trigger().impl()->add_listener(std::move(f)); | ||||||
| 			return *this; | 			return *this; | ||||||
|  | |||||||
| @ -197,7 +197,7 @@ namespace nana | |||||||
| 			oresolver& oresolver::operator<<(std::nullptr_t) | 			oresolver& oresolver::operator<<(std::nullptr_t) | ||||||
| 			{ | 			{ | ||||||
| 				cells_.emplace_back(); | 				cells_.emplace_back(); | ||||||
| 				cells_.back().text.assign(1, nana::char_t(0));	//means invalid cell
 | 				cells_.back().text.assign(1, wchar_t(0));	//means invalid cell
 | ||||||
| 				return *this; | 				return *this; | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| @ -4239,7 +4239,7 @@ namespace nana | |||||||
| 					//check invalid cells
 | 					//check invalid cells
 | ||||||
| 					for (auto & cl : cells) | 					for (auto & cl : cells) | ||||||
| 					{ | 					{ | ||||||
| 						if (cl.text.size() == 1 && cl.text[0] == nana::char_t(0)) | 						if (cl.text.size() == 1 && cl.text[0] == wchar_t(0)) | ||||||
| 						{ | 						{ | ||||||
| 							cl.text.clear(); | 							cl.text.clear(); | ||||||
| 							cl.custom_format.reset(); | 							cl.custom_format.reset(); | ||||||
|  | |||||||
| @ -148,11 +148,13 @@ namespace nana | |||||||
| 					img.stretch(rectangle{ img.size() }, graph, rectangle{ pos, ::nana::size(image_px, image_px) }); | 					img.stretch(rectangle{ img.size() }, graph, rectangle{ pos, ::nana::size(image_px, image_px) }); | ||||||
| 				} | 				} | ||||||
| 
 | 
 | ||||||
| 				void item_text(graph_reference graph, const nana::point& pos, const std::wstring& text, unsigned text_pixels, const attr& at) | 				void item_text(graph_reference graph, const nana::point& pos, const std::string& text, unsigned text_pixels, const attr& at) | ||||||
| 				{ | 				{ | ||||||
| 					graph.set_text_color(at.enabled ? colors::black : colors::gray_border); | 					graph.set_text_color(at.enabled ? colors::black : colors::gray_border); | ||||||
| 					nana::paint::text_renderer tr(graph); | 					nana::paint::text_renderer tr(graph); | ||||||
| 					tr.render(pos, text.c_str(), text.length(), text_pixels, true); | 
 | ||||||
|  | 					auto wstr = to_wstring(text); | ||||||
|  | 					tr.render(pos, wstr.c_str(), wstr.length(), text_pixels, true); | ||||||
| 				} | 				} | ||||||
| 
 | 
 | ||||||
| 				void sub_arrow(graph_reference graph, const nana::point& pos, unsigned pixels, const attr&) | 				void sub_arrow(graph_reference graph, const nana::point& pos, unsigned pixels, const attr&) | ||||||
| @ -389,7 +391,7 @@ namespace nana | |||||||
| 						if (m.image.empty() == false) | 						if (m.image.empty() == false) | ||||||
| 							renderer->item_image(graph, nana::point(item_r.x + 5, item_r.y + static_cast<int>(item_h_px - image_px) / 2 - 1), image_px, m.image); | 							renderer->item_image(graph, nana::point(item_r.x + 5, item_r.y + static_cast<int>(item_h_px - image_px) / 2 - 1), image_px, m.image); | ||||||
| 
 | 
 | ||||||
| 						renderer->item_text(graph, nana::point(item_r.x + 40, item_r.y + text_top_off), text, strpixels, attr); | 						renderer->item_text(graph, nana::point(item_r.x + 40, item_r.y + text_top_off), to_utf8(text), strpixels, attr); | ||||||
| 
 | 
 | ||||||
| 						if (hotkey) | 						if (hotkey) | ||||||
| 						{ | 						{ | ||||||
| @ -546,7 +548,7 @@ namespace nana | |||||||
| 				} | 				} | ||||||
| 
 | 
 | ||||||
| 				//send_shortkey has 3 states, 0 = UNKNOWN KEY, 1 = ITEM, 2 = GOTO SUBMENU
 | 				//send_shortkey has 3 states, 0 = UNKNOWN KEY, 1 = ITEM, 2 = GOTO SUBMENU
 | ||||||
| 				int send_shortkey(nana::char_t key) | 				int send_shortkey(wchar_t key) | ||||||
| 				{ | 				{ | ||||||
| 					key = std::tolower(key); | 					key = std::tolower(key); | ||||||
| 					std::size_t index = 0; | 					std::size_t index = 0; | ||||||
| @ -845,7 +847,7 @@ namespace nana | |||||||
| 					return menu_wd->_m_manipulate_sub(0, true); | 					return menu_wd->_m_manipulate_sub(0, true); | ||||||
| 				} | 				} | ||||||
| 
 | 
 | ||||||
| 				int send_shortkey(nana::char_t key) | 				int send_shortkey(wchar_t key) | ||||||
| 				{ | 				{ | ||||||
| 					menu_window * object = this; | 					menu_window * object = this; | ||||||
| 					while(object->submenu_.child) | 					while(object->submenu_.child) | ||||||
| @ -1254,7 +1256,7 @@ namespace nana | |||||||
| 			return impl_->mbuilder.data().items.size(); | 			return impl_->mbuilder.data().items.size(); | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		int menu::send_shortkey(nana::char_t key) | 		int menu::send_shortkey(wchar_t key) | ||||||
| 		{ | 		{ | ||||||
| 			return (impl_->uiobj ? impl_->uiobj->send_shortkey(key) : 0); | 			return (impl_->uiobj ? impl_->uiobj->send_shortkey(key) : 0); | ||||||
| 		} | 		} | ||||||
|  | |||||||
| @ -30,11 +30,11 @@ namespace nana | |||||||
| 		{ | 		{ | ||||||
| 			struct item_type | 			struct item_type | ||||||
| 			{ | 			{ | ||||||
| 				item_type(const ::std::wstring& text, unsigned long shortkey) | 				item_type(const native_string_type text, unsigned long shortkey) | ||||||
| 					: text(text), shortkey(shortkey) | 					: text(text), shortkey(shortkey) | ||||||
| 				{} | 				{} | ||||||
| 
 | 
 | ||||||
| 				::std::wstring	text; | 				native_string_type	text; | ||||||
| 				unsigned long	shortkey; | 				unsigned long	shortkey; | ||||||
| 				::nana::menu	menu_obj; | 				::nana::menu	menu_obj; | ||||||
| 				::nana::point	pos; | 				::nana::point	pos; | ||||||
| @ -52,7 +52,7 @@ namespace nana | |||||||
| 						delete i; | 						delete i; | ||||||
| 				} | 				} | ||||||
| 
 | 
 | ||||||
| 				void append(const ::std::wstring& text, unsigned long shortkey) | 				void append(const native_string_type& text, unsigned long shortkey) | ||||||
| 				{ | 				{ | ||||||
| 					if(shortkey && shortkey < 0x61) shortkey += (0x61 - 0x41); | 					if(shortkey && shortkey < 0x61) shortkey += (0x61 - 0x41); | ||||||
| 					cont_.push_back(new item_type(text, shortkey)); | 					cont_.push_back(new item_type(text, shortkey)); | ||||||
| @ -122,7 +122,7 @@ namespace nana | |||||||
| 					graph_.rectangle(r.pare_off(1), true, body); | 					graph_.rectangle(r.pare_off(1), true, body); | ||||||
| 				} | 				} | ||||||
| 
 | 
 | ||||||
| 				void item_renderer::caption(const point& pos, const std::wstring& text) | 				void item_renderer::caption(const point& pos, const native_string_type& text) | ||||||
| 				{ | 				{ | ||||||
| 					graph_.string(pos, text, colors::black); | 					graph_.string(pos, text, colors::black); | ||||||
| 				} | 				} | ||||||
| @ -138,16 +138,16 @@ namespace nana | |||||||
| 					delete items_; | 					delete items_; | ||||||
| 				} | 				} | ||||||
| 
 | 
 | ||||||
| 				nana::menu* trigger::push_back(const ::std::wstring& text) | 				nana::menu* trigger::push_back(const std::string& text) | ||||||
| 				{ | 				{ | ||||||
| 					wchar_t shkey; | 					wchar_t shkey; | ||||||
| 					API::transform_shortkey_text(to_utf8(text), shkey, nullptr); | 					API::transform_shortkey_text(text, shkey, nullptr); | ||||||
| 
 | 
 | ||||||
| 					if(shkey) | 					if(shkey) | ||||||
| 						API::register_shortkey(widget_->handle(), shkey); | 						API::register_shortkey(widget_->handle(), shkey); | ||||||
| 
 | 
 | ||||||
| 					auto pos = items_->cont().size(); | 					auto pos = items_->cont().size(); | ||||||
| 					items_->append(text, shkey); | 					items_->append(to_nstring(text), shkey); | ||||||
| 					refresh(*graph_); | 					refresh(*graph_); | ||||||
| 					API::update_window(*widget_); | 					API::update_window(*widget_); | ||||||
| 
 | 
 | ||||||
| @ -212,7 +212,7 @@ namespace nana | |||||||
| 
 | 
 | ||||||
| 						//Draw text, the text is transformed from orignal for hotkey character
 | 						//Draw text, the text is transformed from orignal for hotkey character
 | ||||||
| 						int text_top_off = (item_s.height - text_s.height) / 2; | 						int text_top_off = (item_s.height - text_s.height) / 2; | ||||||
| 						ird.caption({ item_pos.x + 8, item_pos.y + text_top_off }, to_wstring(text)); | 						ird.caption({ item_pos.x + 8, item_pos.y + text_top_off }, to_nstring(text)); | ||||||
| 
 | 
 | ||||||
| 						if (hotkey) | 						if (hotkey) | ||||||
| 						{ | 						{ | ||||||
| @ -619,7 +619,7 @@ namespace nana | |||||||
| 
 | 
 | ||||||
| 		menu& menubar::push_back(const std::string& text) | 		menu& menubar::push_back(const std::string& text) | ||||||
| 		{ | 		{ | ||||||
| 			return *(get_drawer_trigger().push_back(to_wstring(text))); | 			return *(get_drawer_trigger().push_back(text)); | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		menu& menubar::at(std::size_t index) const | 		menu& menubar::at(std::size_t index) const | ||||||
|  | |||||||
| @ -500,8 +500,8 @@ namespace nana{	namespace widgets | |||||||
| 		{ | 		{ | ||||||
| 			struct text_section | 			struct text_section | ||||||
| 			{ | 			{ | ||||||
| 				const nana::char_t* begin; | 				const wchar_t* begin; | ||||||
| 				const nana::char_t* end; | 				const wchar_t* end; | ||||||
| 				unsigned pixels; | 				unsigned pixels; | ||||||
| 
 | 
 | ||||||
| 				text_section() | 				text_section() | ||||||
| @ -509,7 +509,7 @@ namespace nana{	namespace widgets | |||||||
| 					throw std::runtime_error("text_section default construction is forbidden."); | 					throw std::runtime_error("text_section default construction is forbidden."); | ||||||
| 				} | 				} | ||||||
| 
 | 
 | ||||||
| 				text_section(const nana::char_t* ptr, const nana::char_t* endptr) | 				text_section(const wchar_t* ptr, const wchar_t* endptr) | ||||||
| 					: begin(ptr), end(endptr) | 					: begin(ptr), end(endptr) | ||||||
| 				{} | 				{} | ||||||
| 			}; | 			}; | ||||||
| @ -591,7 +591,7 @@ namespace nana{	namespace widgets | |||||||
| 				std::vector<text_section> line_sections; | 				std::vector<text_section> line_sections; | ||||||
| 
 | 
 | ||||||
| 				unsigned text_px = 0; | 				unsigned text_px = 0; | ||||||
| 				const nana::char_t * secondary_begin = nullptr; | 				const wchar_t * secondary_begin = nullptr; | ||||||
| 				for (auto & ts : sections) | 				for (auto & ts : sections) | ||||||
| 				{ | 				{ | ||||||
| 					if (!secondary_begin) | 					if (!secondary_begin) | ||||||
| @ -627,7 +627,7 @@ namespace nana{	namespace widgets | |||||||
| 								if (text_px < pixels) | 								if (text_px < pixels) | ||||||
| 									continue; | 									continue; | ||||||
| 
 | 
 | ||||||
| 								const nana::char_t * endptr = ts.begin + (pxi - pxptr) + (text_px == pixels ? 1 : 0); | 								const wchar_t * endptr = ts.begin + (pxi - pxptr) + (text_px == pixels ? 1 : 0); | ||||||
| 								line_sections.emplace_back(secondary_begin, endptr); | 								line_sections.emplace_back(secondary_begin, endptr); | ||||||
| 								line_sections.back().pixels = text_px - (text_px == pixels ? 0 : *pxi); | 								line_sections.back().pixels = text_px - (text_px == pixels ? 0 : *pxi); | ||||||
| 								secondary_begin = endptr; | 								secondary_begin = endptr; | ||||||
| @ -816,7 +816,7 @@ namespace nana{	namespace widgets | |||||||
| 				if (editor_.mask_char_) | 				if (editor_.mask_char_) | ||||||
| 					mask_str.reset(new std::wstring(real_str.end - real_str.begin, editor_.mask_char_)); | 					mask_str.reset(new std::wstring(real_str.end - real_str.begin, editor_.mask_char_)); | ||||||
| 
 | 
 | ||||||
| 				const ::nana::char_t * str = (editor_.mask_char_ ? mask_str->data() : real_str.begin); | 				const wchar_t * str = (editor_.mask_char_ ? mask_str->data() : real_str.begin); | ||||||
| 
 | 
 | ||||||
| 				std::vector<unicode_bidi::entity> reordered; | 				std::vector<unicode_bidi::entity> reordered; | ||||||
| 				unicode_bidi bidi; | 				unicode_bidi bidi; | ||||||
| @ -934,10 +934,10 @@ namespace nana{	namespace widgets | |||||||
| 				} | 				} | ||||||
| 				const auto end = str.data() + str.size(); | 				const auto end = str.data() + str.size(); | ||||||
| 
 | 
 | ||||||
| 				const nana::char_t * word = nullptr; | 				const wchar_t * word = nullptr; | ||||||
| 				for (auto i = str.data(); i != end; ++i) | 				for (auto i = str.data(); i != end; ++i) | ||||||
| 				{ | 				{ | ||||||
| 					nana::char_t const ch = *i; | 					wchar_t const ch = *i; | ||||||
| 
 | 
 | ||||||
| 					//CKJ characters and whitespace
 | 					//CKJ characters and whitespace
 | ||||||
| 					if (' ' == ch || '\t' == ch || (0x4E00 <= ch && ch <= 0x9FCF)) | 					if (' ' == ch || '\t' == ch || (0x4E00 <= ch && ch <= 0x9FCF)) | ||||||
| @ -1166,8 +1166,8 @@ namespace nana{	namespace widgets | |||||||
| 
 | 
 | ||||||
| 		struct entity | 		struct entity | ||||||
| 		{ | 		{ | ||||||
| 			const ::nana::char_t* begin; | 			const wchar_t* begin; | ||||||
| 			const ::nana::char_t* end; | 			const wchar_t* end; | ||||||
| 			const keyword_scheme * scheme; | 			const keyword_scheme * scheme; | ||||||
| 		}; | 		}; | ||||||
| 
 | 
 | ||||||
| @ -1388,7 +1388,7 @@ namespace nana{	namespace widgets | |||||||
| 				case keyboard::sync_idel: | 				case keyboard::sync_idel: | ||||||
| 					paste();	break; | 					paste();	break; | ||||||
| 				case keyboard::tab: | 				case keyboard::tab: | ||||||
| 					put(static_cast<char_t>(keyboard::tab)); break; | 					put(static_cast<wchar_t>(keyboard::tab)); break; | ||||||
| 				case keyboard::cancel: | 				case keyboard::cancel: | ||||||
| 					cut(); | 					cut(); | ||||||
| 					break; | 					break; | ||||||
| @ -1404,11 +1404,6 @@ namespace nana{	namespace widgets | |||||||
| 
 | 
 | ||||||
| 					if (key > 0x7F || (32 <= key && key <= 126)) | 					if (key > 0x7F || (32 <= key && key <= 126)) | ||||||
| 						put(key); | 						put(key); | ||||||
| 					else if (sizeof(nana::char_t) == sizeof(char)) |  | ||||||
| 					{	//Non-Unicode Version for Non-English characters
 |  | ||||||
| 						if (key & (1 << (sizeof(nana::char_t) * 8 - 1))) |  | ||||||
| 							put(key); |  | ||||||
| 					} |  | ||||||
| 				} | 				} | ||||||
| 				reset_caret(); | 				reset_caret(); | ||||||
| 				return true; | 				return true; | ||||||
| @ -1729,12 +1724,12 @@ namespace nana{	namespace widgets | |||||||
| 			return false; | 			return false; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		textbase<nana::char_t> & text_editor::textbase() | 		textbase<wchar_t> & text_editor::textbase() | ||||||
| 		{ | 		{ | ||||||
| 			return textbase_; | 			return textbase_; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		const textbase<nana::char_t> & text_editor::textbase() const | 		const textbase<wchar_t> & text_editor::textbase() const | ||||||
| 		{ | 		{ | ||||||
| 			return textbase_; | 			return textbase_; | ||||||
| 		} | 		} | ||||||
| @ -1896,7 +1891,7 @@ namespace nana{	namespace widgets | |||||||
| 			return false; | 			return false; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		bool text_editor::mask(nana::char_t ch) | 		bool text_editor::mask(wchar_t ch) | ||||||
| 		{ | 		{ | ||||||
| 			if (mask_char_ == ch) | 			if (mask_char_ == ch) | ||||||
| 				return false; | 				return false; | ||||||
| @ -2315,7 +2310,7 @@ namespace nana{	namespace widgets | |||||||
| 
 | 
 | ||||||
| 			bool changed = false; | 			bool changed = false; | ||||||
| 			nana::upoint caret = points_.caret; | 			nana::upoint caret = points_.caret; | ||||||
| 			char_t key = arg.key; | 			wchar_t key = arg.key; | ||||||
| 			size_t nlines = textbase_.lines(); | 			size_t nlines = textbase_.lines(); | ||||||
| 			if (arg.ctrl) { | 			if (arg.ctrl) { | ||||||
| 				switch (key) { | 				switch (key) { | ||||||
| @ -2853,7 +2848,7 @@ namespace nana{	namespace widgets | |||||||
| 		{ | 		{ | ||||||
| 			if(0 == tabs) return 0; | 			if(0 == tabs) return 0; | ||||||
| 
 | 
 | ||||||
| 			nana::char_t ws[2] = {}; | 			wchar_t ws[2] = {}; | ||||||
| 			ws[0] = mask_char_ ? mask_char_ : ' '; | 			ws[0] = mask_char_ ? mask_char_ : ' '; | ||||||
| 			return static_cast<unsigned>(tabs * graph_.text_extent_size(ws).width * text_area_.tab_space); | 			return static_cast<unsigned>(tabs * graph_.text_extent_size(ws).width * text_area_.tab_space); | ||||||
| 		} | 		} | ||||||
| @ -2999,7 +2994,7 @@ namespace nana{	namespace widgets | |||||||
| 
 | 
 | ||||||
| 			for (auto & ent : entities) | 			for (auto & ent : entities) | ||||||
| 			{ | 			{ | ||||||
| 				const ::nana::char_t* ent_begin = nullptr; | 				const wchar_t* ent_begin = nullptr; | ||||||
| 
 | 
 | ||||||
| 				int ent_off = 0; | 				int ent_off = 0; | ||||||
| 				if (str <= ent.begin && ent.begin < str_end) | 				if (str <= ent.begin && ent.begin < str_end) | ||||||
| @ -3094,7 +3089,7 @@ namespace nana{	namespace widgets | |||||||
| 			} | 			} | ||||||
| 			else | 			else | ||||||
| 			{ | 			{ | ||||||
| 				auto rtl_string = [this, line_h_pixels, &parser, &clr](point strpos, const nana::char_t* str, std::size_t len, std::size_t str_px, unsigned glyph_front, unsigned glyph_selected){ | 				auto rtl_string = [this, line_h_pixels, &parser, &clr](point strpos, const wchar_t* str, std::size_t len, std::size_t str_px, unsigned glyph_front, unsigned glyph_selected){ | ||||||
| 					this->_m_draw_parse_string(parser, true, strpos, clr, str, len); | 					this->_m_draw_parse_string(parser, true, strpos, clr, str, len); | ||||||
| 
 | 
 | ||||||
| 					//Draw selected part
 | 					//Draw selected part
 | ||||||
| @ -3109,7 +3104,7 @@ namespace nana{	namespace widgets | |||||||
| 					graph_.bitblt(nana::rectangle(strpos.x + sel_xpos, strpos.y, glyph_selected, line_h_pixels), graph); | 					graph_.bitblt(nana::rectangle(strpos.x + sel_xpos, strpos.y, glyph_selected, line_h_pixels), graph); | ||||||
| 				}; | 				}; | ||||||
| 
 | 
 | ||||||
| 				const nana::char_t * strbeg = linestr.c_str(); | 				const wchar_t * strbeg = linestr.c_str(); | ||||||
| 				if (a.y == b.y) | 				if (a.y == b.y) | ||||||
| 				{ | 				{ | ||||||
| 					for (auto & ent : reordered) | 					for (auto & ent : reordered) | ||||||
|  | |||||||
| @ -254,7 +254,7 @@ namespace nana | |||||||
| 					auto scheme = static_cast<::nana::widgets::skeletons::text_editor_scheme*>(API::dev::get_scheme(wd)); | 					auto scheme = static_cast<::nana::widgets::skeletons::text_editor_scheme*>(API::dev::get_scheme(wd)); | ||||||
| 					editor_ = new ::nana::widgets::skeletons::text_editor(wd, graph, scheme); | 					editor_ = new ::nana::widgets::skeletons::text_editor(wd, graph, scheme); | ||||||
| 					editor_->multi_lines(false); | 					editor_->multi_lines(false); | ||||||
| 					editor_->set_accept([this](::nana::char_t ch) | 					editor_->set_accept([this](wchar_t ch) | ||||||
| 					{ | 					{ | ||||||
| 						auto str = editor_->text(); | 						auto str = editor_->text(); | ||||||
| 						auto pos = editor_->caret().x; | 						auto pos = editor_->caret().x; | ||||||
|  | |||||||
| @ -422,7 +422,7 @@ namespace drawerbase { | |||||||
| 			return *this; | 			return *this; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		void textbox::set_accept(std::function<bool(nana::char_t)> fn) | 		void textbox::set_accept(std::function<bool(wchar_t)> fn) | ||||||
| 		{ | 		{ | ||||||
| 			internal_scope_guard lock; | 			internal_scope_guard lock; | ||||||
| 			auto editor = get_drawer_trigger().editor(); | 			auto editor = get_drawer_trigger().editor(); | ||||||
| @ -439,7 +439,7 @@ namespace drawerbase { | |||||||
| 			return *this; | 			return *this; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		textbox& textbox::mask(nana::char_t ch) | 		textbox& textbox::mask(wchar_t ch) | ||||||
| 		{ | 		{ | ||||||
| 			internal_scope_guard lock; | 			internal_scope_guard lock; | ||||||
| 			auto editor = get_drawer_trigger().editor(); | 			auto editor = get_drawer_trigger().editor(); | ||||||
|  | |||||||
| @ -233,7 +233,7 @@ namespace nana | |||||||
| 			API::umake_event(eh); | 			API::umake_event(eh); | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		widget& widget::register_shortkey(char_t key) | 		widget& widget::register_shortkey(wchar_t key) | ||||||
| 		{ | 		{ | ||||||
| 			if (key) | 			if (key) | ||||||
| 				API::register_shortkey(handle(), static_cast<unsigned long>(key)); | 				API::register_shortkey(handle(), static_cast<unsigned long>(key)); | ||||||
|  | |||||||
| @ -154,14 +154,14 @@ namespace detail | |||||||
| 		return nana::size(); | 		return nana::size(); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	nana::size text_extent_size(drawable_type dw, const nana::char_t * text, std::size_t len) | 	nana::size text_extent_size(drawable_type dw, const wchar_t * text, std::size_t len) | ||||||
| 	{ | 	{ | ||||||
| 		if (nullptr == dw || nullptr == text || 0 == len) | 		if (nullptr == dw || nullptr == text || 0 == len) | ||||||
| 			return{}; | 			return{}; | ||||||
| 
 | 
 | ||||||
| 		nana::size extents = raw_text_extent_size(dw, text, len); | 		nana::size extents = raw_text_extent_size(dw, text, len); | ||||||
| 
 | 
 | ||||||
| 		const nana::char_t* const end = text + len; | 		const wchar_t* const end = text + len; | ||||||
| 		int tabs = 0; | 		int tabs = 0; | ||||||
| 		for(; text != end; ++text) | 		for(; text != end; ++text) | ||||||
| 		{ | 		{ | ||||||
| @ -173,7 +173,7 @@ namespace detail | |||||||
| 		return extents; | 		return extents; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	void draw_string(drawable_type dw, const nana::point& pos, const nana::char_t * str, std::size_t len) | 	void draw_string(drawable_type dw, const nana::point& pos, const wchar_t * str, std::size_t len) | ||||||
| 	{ | 	{ | ||||||
| #if defined(NANA_WINDOWS) | #if defined(NANA_WINDOWS) | ||||||
| 		::TextOut(dw->context, pos.x, pos.y, str, static_cast<int>(len)); | 		::TextOut(dw->context, pos.x, pos.y, str, static_cast<int>(len)); | ||||||
|  | |||||||
| @ -405,8 +405,8 @@ namespace paint | |||||||
| 			::GetTextExtentExPoint(handle_->context, str, static_cast<int>(len), 0, 0, dx, &extents); | 			::GetTextExtentExPoint(handle_->context, str, static_cast<int>(len), 0, 0, dx, &extents); | ||||||
| 			sz.width = dx[end - 1] - (begin ? dx[begin - 1] : 0); | 			sz.width = dx[end - 1] - (begin ? dx[begin - 1] : 0); | ||||||
| 			unsigned tab_pixels = handle_->string.tab_length * handle_->string.whitespace_pixels; | 			unsigned tab_pixels = handle_->string.tab_length * handle_->string.whitespace_pixels; | ||||||
| 			const nana::char_t * pend = str + end; | 			const wchar_t * pend = str + end; | ||||||
| 			for(const nana::char_t * p = str + begin; p != pend; ++p) | 			for(const wchar_t * p = str + begin; p != pend; ++p) | ||||||
| 			{ | 			{ | ||||||
| 				if(*p == '\t') | 				if(*p == '\t') | ||||||
| 					sz.width += tab_pixels; | 					sz.width += tab_pixels; | ||||||
| @ -906,7 +906,7 @@ namespace paint | |||||||
| 			return *this; | 			return *this; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		unsigned graphics::bidi_string(const nana::point& pos, const char_t * str, std::size_t len) | 		unsigned graphics::bidi_string(const nana::point& pos, const wchar_t * str, std::size_t len) | ||||||
| 		{ | 		{ | ||||||
| 			auto moved_pos = pos; | 			auto moved_pos = pos; | ||||||
| 			unicode_bidi bidi; | 			unicode_bidi bidi; | ||||||
|  | |||||||
| @ -11,7 +11,7 @@ namespace nana | |||||||
| 		namespace helper | 		namespace helper | ||||||
| 		{ | 		{ | ||||||
| 			template<typename F> | 			template<typename F> | ||||||
| 			void for_each_line(const nana::char_t * str, std::size_t len, int top, F & f) | 			void for_each_line(const wchar_t * str, std::size_t len, int top, F & f) | ||||||
| 			{ | 			{ | ||||||
| 				auto head = str; | 				auto head = str; | ||||||
| 				auto end = str + len; | 				auto end = str + len; | ||||||
| @ -39,7 +39,7 @@ namespace nana | |||||||
| 					: dw(dw), x(x), endpos(endpos), text_align(ta) | 					: dw(dw), x(x), endpos(endpos), text_align(ta) | ||||||
| 				{} | 				{} | ||||||
| 
 | 
 | ||||||
| 				unsigned operator()(const int top, const nana::char_t * buf, std::size_t bufsize) | 				unsigned operator()(const int top, const wchar_t * buf, std::size_t bufsize) | ||||||
| 				{ | 				{ | ||||||
| 					nana::point pos{ x, top }; | 					nana::point pos{ x, top }; | ||||||
| 					unsigned pixels = 0; | 					unsigned pixels = 0; | ||||||
| @ -131,7 +131,7 @@ namespace nana | |||||||
| 						this->endpos = x; | 						this->endpos = x; | ||||||
| 				} | 				} | ||||||
| 
 | 
 | ||||||
| 				unsigned operator()(const int top, const nana::char_t * buf, std::size_t bufsize) | 				unsigned operator()(const int top, const wchar_t * buf, std::size_t bufsize) | ||||||
| 				{ | 				{ | ||||||
| 					drawable_type dw = graph.handle(); | 					drawable_type dw = graph.handle(); | ||||||
| 					::nana::point pos{ x, top }; | 					::nana::point pos{ x, top }; | ||||||
| @ -187,7 +187,7 @@ namespace nana | |||||||
| 					: graph(graph), x(x), endpos(endpos), text_align(ta) | 					: graph(graph), x(x), endpos(endpos), text_align(ta) | ||||||
| 				{} | 				{} | ||||||
| 
 | 
 | ||||||
| 				unsigned operator()(const int top, const nana::char_t * buf, std::size_t bufsize) | 				unsigned operator()(const int top, const wchar_t * buf, std::size_t bufsize) | ||||||
| 				{ | 				{ | ||||||
| 					unsigned pixels = 0; | 					unsigned pixels = 0; | ||||||
| 
 | 
 | ||||||
| @ -249,8 +249,8 @@ namespace nana | |||||||
| 										else | 										else | ||||||
| 										{ | 										{ | ||||||
| 											//Search the splittable character from idx_head to idx_splitted
 | 											//Search the splittable character from idx_head to idx_splitted
 | ||||||
| 											const nana::char_t * u = i.begin + idx_splitted; | 											const wchar_t * u = i.begin + idx_splitted; | ||||||
| 											const nana::char_t * head = i.begin + idx_head; | 											const wchar_t * head = i.begin + idx_head; | ||||||
| 
 | 
 | ||||||
| 											for(; head < u; --u) | 											for(; head < u; --u) | ||||||
| 											{ | 											{ | ||||||
| @ -269,7 +269,7 @@ namespace nana | |||||||
| 											else | 											else | ||||||
| 											{ | 											{ | ||||||
| 												u = i.begin + idx_splitted; | 												u = i.begin + idx_splitted; | ||||||
| 												const nana::char_t * end = i.begin + len; | 												const wchar_t * end = i.begin + len; | ||||||
| 												for(; u < end; ++u) | 												for(; u < end; ++u) | ||||||
| 												{ | 												{ | ||||||
| 													if(splittable(head, u - head)) | 													if(splittable(head, u - head)) | ||||||
| @ -372,12 +372,12 @@ namespace nana | |||||||
| 					return end; | 					return end; | ||||||
| 				} | 				} | ||||||
| 
 | 
 | ||||||
| 				static bool splittable(const nana::char_t * str, std::size_t index) | 				static bool splittable(const wchar_t * str, std::size_t index) | ||||||
| 				{ | 				{ | ||||||
| 					nana::char_t ch = str[index]; | 					wchar_t ch = str[index]; | ||||||
| 					if(('0' <= ch && ch <= '9') || ('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z')) | 					if(('0' <= ch && ch <= '9') || ('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z')) | ||||||
| 					{ | 					{ | ||||||
| 						nana::char_t prch; | 						wchar_t prch; | ||||||
| 						if(index) | 						if(index) | ||||||
| 						{ | 						{ | ||||||
| 							prch = str[index - 1]; | 							prch = str[index - 1]; | ||||||
| @ -406,7 +406,7 @@ namespace nana | |||||||
| 					: graph(graph), x(x), endpos(endpos), extents(0) | 					: graph(graph), x(x), endpos(endpos), extents(0) | ||||||
| 				{} | 				{} | ||||||
| 
 | 
 | ||||||
| 				unsigned operator()(int top, const nana::char_t * buf, std::size_t bufsize) | 				unsigned operator()(int top, const wchar_t * buf, std::size_t bufsize) | ||||||
| 				{ | 				{ | ||||||
| 					unsigned pixels = 0; | 					unsigned pixels = 0; | ||||||
| 
 | 
 | ||||||
| @ -467,8 +467,8 @@ namespace nana | |||||||
| 										else | 										else | ||||||
| 										{ | 										{ | ||||||
| 											//Search the splittable character from idx_head to idx_splitted
 | 											//Search the splittable character from idx_head to idx_splitted
 | ||||||
| 											const nana::char_t * u = i.begin + idx_splitted; | 											const wchar_t * u = i.begin + idx_splitted; | ||||||
| 											const nana::char_t * head = i.begin + idx_head; | 											const wchar_t * head = i.begin + idx_head; | ||||||
| 
 | 
 | ||||||
| 											for(; head < u; --u) | 											for(; head < u; --u) | ||||||
| 											{ | 											{ | ||||||
| @ -486,7 +486,7 @@ namespace nana | |||||||
| 											else | 											else | ||||||
| 											{ | 											{ | ||||||
| 												u = i.begin + idx_splitted; | 												u = i.begin + idx_splitted; | ||||||
| 												const nana::char_t * end = i.begin + len; | 												const wchar_t * end = i.begin + len; | ||||||
| 												for(; u < end; ++u) | 												for(; u < end; ++u) | ||||||
| 												{ | 												{ | ||||||
| 													if(draw_string_auto_changing_lines::splittable(head, u - head)) | 													if(draw_string_auto_changing_lines::splittable(head, u - head)) | ||||||
| @ -542,7 +542,7 @@ namespace nana | |||||||
| 			: graph_(graph), text_align_(ta) | 			: graph_(graph), text_align_(ta) | ||||||
| 		{} | 		{} | ||||||
| 
 | 
 | ||||||
| 		nana::size text_renderer::extent_size(int x, int y, const char_t* str, std::size_t len, unsigned restricted_pixels) const | 		nana::size text_renderer::extent_size(int x, int y, const wchar_t* str, std::size_t len, unsigned restricted_pixels) const | ||||||
| 		{ | 		{ | ||||||
| 			nana::size extents; | 			nana::size extents; | ||||||
| 			if(graph_) | 			if(graph_) | ||||||
| @ -555,7 +555,7 @@ namespace nana | |||||||
| 			return extents; | 			return extents; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		void text_renderer::render(const point& pos, const char_t * str, std::size_t len) | 		void text_renderer::render(const point& pos, const wchar_t * str, std::size_t len) | ||||||
| 		{ | 		{ | ||||||
| 			if (graph_) | 			if (graph_) | ||||||
| 			{ | 			{ | ||||||
| @ -564,7 +564,7 @@ namespace nana | |||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		void text_renderer::render(const point& pos, const char_t* str, std::size_t len, unsigned restricted_pixels, bool omitted) | 		void text_renderer::render(const point& pos, const wchar_t* str, std::size_t len, unsigned restricted_pixels, bool omitted) | ||||||
| 		{ | 		{ | ||||||
| 			if (graph_) | 			if (graph_) | ||||||
| 			{ | 			{ | ||||||
| @ -573,7 +573,7 @@ namespace nana | |||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		void text_renderer::render(const point& pos, const char_t * str, std::size_t len, unsigned restricted_pixels) | 		void text_renderer::render(const point& pos, const wchar_t * str, std::size_t len, unsigned restricted_pixels) | ||||||
| 		{ | 		{ | ||||||
| 			if (graph_) | 			if (graph_) | ||||||
| 			{ | 			{ | ||||||
|  | |||||||
| @ -98,12 +98,13 @@ namespace system | |||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	//open an url through a default browser
 | 	//open an url through a default browser
 | ||||||
| 	void open_url(const std::wstring& url) | 	void open_url(const std::string& url_utf8) | ||||||
| 	{ | 	{ | ||||||
| 		if(url.empty()) | 		if(url_utf8.empty()) | ||||||
| 			return; | 			return; | ||||||
| 
 | 
 | ||||||
| #if defined(NANA_WINDOWS) | #if defined(NANA_WINDOWS) | ||||||
|  | 		std::wstring url = to_wstring(url_utf8); | ||||||
| 		if(::ShellExecute(0, L"open", url.c_str(), 0, 0, SW_SHOWNORMAL) < reinterpret_cast<HINSTANCE>(32)) | 		if(::ShellExecute(0, L"open", url.c_str(), 0, 0, SW_SHOWNORMAL) < reinterpret_cast<HINSTANCE>(32)) | ||||||
| 		{ | 		{ | ||||||
| 			//Because ShellExecute can delegate execution to Shell extensions (data sources, context menu handlers,
 | 			//Because ShellExecute can delegate execution to Shell extensions (data sources, context menu handlers,
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Jinhao
						Jinhao