summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoryusukes@google.com <yusukes@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2011-07-14 01:42:10 +0000
committeryusukes@google.com <yusukes@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2011-07-14 01:42:10 +0000
commitab79d1e0ce74f983b1baeddb83ba371658fe8fdc (patch)
tree818bc32bc98d2f46b67a66d3cb76417fa63904d2
parent79b44d53a743e3d2f96a786e68b3fda98485de28 (diff)
downloadchromium_src-ab79d1e0ce74f983b1baeddb83ba371658fe8fdc.zip
chromium_src-ab79d1e0ce74f983b1baeddb83ba371658fe8fdc.tar.gz
chromium_src-ab79d1e0ce74f983b1baeddb83ba371658fe8fdc.tar.bz2
Revert "Use an existing connection to the X server rather than opening a new one."
This reverts commit 88fdab9090c8d25aa3eefbaaf7f9544fd2c8ef11. BUG=chromium-os:17490 TEST=manual TBR=derat@chromium.org Review URL: http://codereview.chromium.org/7358008 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@92464 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/chromeos/input_method/xkeyboard.cc60
1 files changed, 50 insertions, 10 deletions
diff --git a/chrome/browser/chromeos/input_method/xkeyboard.cc b/chrome/browser/chromeos/input_method/xkeyboard.cc
index 30683f5..9def5e8 100644
--- a/chrome/browser/chromeos/input_method/xkeyboard.cc
+++ b/chrome/browser/chromeos/input_method/xkeyboard.cc
@@ -9,7 +9,6 @@
#include <X11/XKBlib.h>
#include <X11/Xlib.h>
-#include <gdk/gdkx.h>
#include <glib.h>
#include <stdlib.h>
#include <string.h>
@@ -103,6 +102,32 @@ bool KeepCapsLock(const std::string& xkb_layout_name) {
return false;
}
+// This is a wrapper class around Display, that opens and closes X display in
+// the constructor and destructor.
+class ScopedDisplay {
+ public:
+ explicit ScopedDisplay(Display* display) : display_(display) {
+ if (!display_) {
+ LOG(ERROR) << "NULL display_ is passed";
+ }
+ }
+
+ ~ScopedDisplay() {
+ if (display_) {
+ XCloseDisplay(display_);
+ }
+ }
+
+ Display* get() const {
+ return display_;
+ }
+
+ private:
+ Display* display_;
+
+ DISALLOW_COPY_AND_ASSIGN(ScopedDisplay);
+};
+
// A singleton class which wraps the setxkbmap command.
class XKeyboard {
public:
@@ -149,11 +174,14 @@ class XKeyboard {
// Turns on and off the auto-repeat of the keyboard. Returns true on success.
// TODO(yusukes): Remove this function.
bool SetAutoRepeatEnabled(bool enabled) {
- CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ ScopedDisplay display(XOpenDisplay(NULL));
+ if (!display.get()) {
+ return false;
+ }
if (enabled) {
- XAutoRepeatOn(GDK_DISPLAY());
+ XAutoRepeatOn(display.get());
} else {
- XAutoRepeatOff(GDK_DISPLAY());
+ XAutoRepeatOff(display.get());
}
DLOG(INFO) << "Set auto-repeat mode to: " << (enabled ? "on" : "off");
return true;
@@ -161,13 +189,18 @@ class XKeyboard {
// Sets the auto-repeat rate of the keyboard, initial delay in ms, and repeat
// interval in ms. Returns true on success.
+ // TODO(yusukes): Call this function in non-UI thread or in an idle callback.
bool SetAutoRepeatRate(const AutoRepeatRate& rate) {
// TODO(yusukes): write auto tests for the function.
- CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ ScopedDisplay display(XOpenDisplay(NULL));
+ if (!display.get()) {
+ return false;
+ }
+
DLOG(INFO) << "Set auto-repeat rate to: "
<< rate.initial_delay_in_ms << " ms delay, "
<< rate.repeat_interval_in_ms << " ms interval";
- if (XkbSetAutoRepeatRate(GDK_DISPLAY(), XkbUseCoreKbd,
+ if (XkbSetAutoRepeatRate(display.get(), XkbUseCoreKbd,
rate.initial_delay_in_ms,
rate.repeat_interval_in_ms) != True) {
LOG(ERROR) << "Failed to set auto-repeat rate";
@@ -369,16 +402,23 @@ std::string CreateFullXkbLayoutName(const std::string& layout_name,
}
bool CapsLockIsEnabled() {
- CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ ScopedDisplay display(XOpenDisplay(NULL));
+ if (!display.get()) {
+ return false;
+ }
XkbStateRec status;
- XkbGetState(GDK_DISPLAY(), XkbUseCoreKbd, &status);
+ XkbGetState(display.get(), XkbUseCoreKbd, &status);
return status.locked_mods & LockMask;
}
+// TODO(yusukes): Call this function in non-UI thread or in an idle callback.
void SetCapsLockEnabled(bool enable_caps_lock) {
- CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ ScopedDisplay display(XOpenDisplay(NULL));
+ if (!display.get()) {
+ return;
+ }
XkbLockModifiers(
- GDK_DISPLAY(), XkbUseCoreKbd, LockMask, enable_caps_lock ? LockMask : 0);
+ display.get(), XkbUseCoreKbd, LockMask, enable_caps_lock ? LockMask : 0);
}
bool ContainsModifierKeyAsReplacement(