[Spice-devel] [PATCH spice] client: The title control message contains 8 bit chars, not 16 bit wchars
Hans de Goede
hdegoede at redhat.com
Wed Oct 20 08:30:38 PDT 2010
Under windows we were casting the 8 bit char * input array to a wchar *,
then passing that around to eventually pass it to SetWindowText, resulting
in it getting cast back to a char * again.
Under X11 we were actually trying to interpret the data as wchars whcih
resulted in failure to set the window title (unsurprisingly).
---
client/application.cpp | 4 ++--
client/application.h | 4 ++--
client/controller.cpp | 8 ++------
client/controller.h | 2 +-
client/red_window.h | 2 +-
client/screen.cpp | 6 +++---
client/screen.h | 6 +++---
client/windows/red_window.cpp | 2 +-
client/x11/red_window.cpp | 8 ++++----
9 files changed, 19 insertions(+), 23 deletions(-)
diff --git a/client/application.cpp b/client/application.cpp
index 212b20e..d5b24a7 100644
--- a/client/application.cpp
+++ b/client/application.cpp
@@ -355,7 +355,7 @@ Application::Application()
, _key_handler (&default_key_handler)
, _mouse_handler (&default_mouse_handler)
, _monitors (NULL)
- , _title (L"SPICEc:%d")
+ , _title ("SPICEc:%d")
, _sys_key_intercept_mode (false)
, _enable_controller (false)
#ifdef USE_GUI
@@ -1603,7 +1603,7 @@ uint32_t Application::get_mouse_mode()
return _client.get_mouse_mode();
}
-void Application::set_title(const std::wstring& title)
+void Application::set_title(const std::string& title)
{
_title = title;
diff --git a/client/application.h b/client/application.h
index c01e08b..19c68a5 100644
--- a/client/application.h
+++ b/client/application.h
@@ -218,7 +218,7 @@ public:
void exit_full_screen();
bool toggle_full_screen();
void minimize();
- void set_title(const std::wstring& title);
+ void set_title(const std::string& title);
void hide();
void show();
void external_show();
@@ -367,7 +367,7 @@ private:
KeyHandlersStack _key_handlers;
MouseHandler* _mouse_handler;
const MonitorsList* _monitors;
- std::wstring _title;
+ std::string _title;
bool _sys_key_intercept_mode;
StickyInfo _sticky_info;
std::vector<int> _canvas_types;
diff --git a/client/controller.cpp b/client/controller.cpp
index b293771..b5bc0ba 100644
--- a/client/controller.cpp
+++ b/client/controller.cpp
@@ -304,12 +304,8 @@ bool ControllerConnection::handle_message(ControllerMsg *hdr)
_handler->set_auto_display_res(!!(value & CONTROLLER_AUTO_DISPLAY_RES));
break;
case CONTROLLER_SET_TITLE: {
- std::wstring str;
-#ifdef WIN32
- wstring_printf(str, L"%s", data);
-#else
- wstring_printf(str, L"%S", data);
-#endif
+ std::string str;
+ string_printf(str, "%s", data);
_handler->set_title(str);
break;
}
diff --git a/client/controller.h b/client/controller.h
index 89b2c23..924f351 100644
--- a/client/controller.h
+++ b/client/controller.h
@@ -33,7 +33,7 @@ public:
virtual bool connect(const std::string& host, int port, int sport,
const std::string& password) = 0;
- virtual void set_title(const std::wstring& title) = 0;
+ virtual void set_title(const std::string& title) = 0;
virtual void set_auto_display_res(bool auto_display_res) = 0;
virtual void show_me(bool full_screen) = 0;
virtual void hide_me() = 0;
diff --git a/client/red_window.h b/client/red_window.h
index 97f3b79..632564d 100644
--- a/client/red_window.h
+++ b/client/red_window.h
@@ -48,7 +48,7 @@ public:
void hide();
void minimize();
void activate();
- void set_title(std::wstring& title);
+ void set_title(std::string& title);
void set_icon(Icon *icon);
virtual RedDrawable::Format get_format();
diff --git a/client/screen.cpp b/client/screen.cpp
index 7c4e1e3..575ab5d 100644
--- a/client/screen.cpp
+++ b/client/screen.cpp
@@ -71,7 +71,7 @@ void UpdateTimer::response(AbstractProcessLoop& events_loop)
_screen->periodic_update();
}
-RedScreen::RedScreen(Application& owner, int id, const std::wstring& name, int width, int height)
+RedScreen::RedScreen(Application& owner, int id, const std::string& name, int width, int height)
: _owner (owner)
, _id (id)
, _refs (1)
@@ -216,10 +216,10 @@ void RedScreen::unlock_size()
_owner.on_screen_unlocked(*this);
}
-void RedScreen::set_name(const std::wstring& name)
+void RedScreen::set_name(const std::string& name)
{
if (!name.empty()) {
- wstring_printf(_name, name.c_str(), _id);
+ string_printf(_name, name.c_str(), _id);
}
_window.set_title(_name);
}
diff --git a/client/screen.h b/client/screen.h
index dfef989..d81ebf8 100644
--- a/client/screen.h
+++ b/client/screen.h
@@ -54,7 +54,7 @@ private:
class RedScreen: public RedWindow::Listener {
public:
- RedScreen(Application& owner, int id, const std::wstring& name, int width, int height);
+ RedScreen(Application& owner, int id, const std::string& name, int width, int height);
RedScreen* ref();
void unref();
@@ -63,7 +63,7 @@ public:
void detach_layer(ScreenLayer& layer);
void on_layer_changed(ScreenLayer& layer);
void resize(int width, int height);
- void set_name(const std::wstring& name);
+ void set_name(const std::string& name);
uint64_t invalidate(const SpiceRect& rect, bool urgent);
void invalidate(const QRegion ®ion);
void capture_mouse();
@@ -163,7 +163,7 @@ private:
Application& _owner;
int _id;
AtomicCount _refs;
- std::wstring _name;
+ std::string _name;
RedWindow _window;
std::vector<ScreenLayer*> _layes;
QRegion _dirty_region;
diff --git a/client/windows/red_window.cpp b/client/windows/red_window.cpp
index bab2d97..0413945 100644
--- a/client/windows/red_window.cpp
+++ b/client/windows/red_window.cpp
@@ -446,7 +446,7 @@ RedWindow::~RedWindow()
}
}
-void RedWindow::set_title(std::wstring& title)
+void RedWindow::set_title(std::string& title)
{
SetWindowText(_win, title.c_str());
}
diff --git a/client/x11/red_window.cpp b/client/x11/red_window.cpp
index 7cdf684..416f6c7 100644
--- a/client/x11/red_window.cpp
+++ b/client/x11/red_window.cpp
@@ -1331,16 +1331,16 @@ RedWindow::~RedWindow()
}
}
-void RedWindow::set_title(std::wstring& title)
+void RedWindow::set_title(std::string& title)
{
XTextProperty text_prop;
- wchar_t *name = const_cast<wchar_t *>(title.c_str());
+ char *name = const_cast<char *>(title.c_str());
int r;
if (_win) {
XLockDisplay(x_display);
- r = XwcTextListToTextProperty(x_display, &name, 1, XStringStyle, &text_prop);
+ r = Xutf8TextListToTextProperty(x_display, &name, 1, XUTF8StringStyle, &text_prop);
XUnlockDisplay(x_display);
- if (r >= 0) {
+ if (r == Success) {
XSetWMName(x_display, _win, &text_prop);
XFree(text_prop.value);
} else {
--
1.7.3.1
More information about the Spice-devel
mailing list