Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

X11 clipboard support #5547

Merged
merged 6 commits into from Apr 21, 2015
Next

Implement X11 clipboard integration (Issue #5376).

  • Loading branch information
aweinstock314 committed Apr 21, 2015
commit ba4c45543889a09cccdd12aba39f4106b8a9346c
@@ -69,6 +69,12 @@ git = "https://github.com/servo/string-cache"
[dependencies.string_cache_plugin]
git = "https://github.com/servo/string-cache"

[dependencies.xlib]
git = "https://github.com/servo/rust-xlib"

[dependencies.clipboard]
git = "https://github.com/aweinstock314/rust-x11-clipboard"

[dependencies]
encoding = "0.2"
url = "0.2.16"
@@ -52,6 +52,7 @@ extern crate style;
extern crate url;
extern crate uuid;
extern crate string_cache;
extern crate clipboard;

pub mod cors;

@@ -14,6 +14,8 @@ use std::cmp::{min, max};
use std::default::Default;
use std::num::SignedInt;

use clipboard::ClipboardContext;

#[derive(Copy, PartialEq)]
pub enum Selection {
Selected,
@@ -29,6 +31,8 @@ pub struct TextPoint {
pub index: usize,
}

no_jsmanaged_fields!(ClipboardContext);

/// Encapsulated state for handling keyboard input in a single or multiline text input control.
#[jstraceable]
pub struct TextInput {
@@ -40,6 +44,8 @@ pub struct TextInput {
selection_begin: Option<TextPoint>,
/// Is this a multiline input?
multiline: bool,
/// Means of accessing the clipboard
clipboard_ctx: ClipboardContext,
}

/// Resulting action to be taken by the owner of a text input that is handling an event.
@@ -93,6 +99,7 @@ impl TextInput {
edit_point: Default::default(),
selection_begin: None,
multiline: lines == Lines::Multiple,
clipboard_ctx: ClipboardContext::new().unwrap(),
};
i.set_content(initial);
i
@@ -118,6 +125,15 @@ impl TextInput {
self.replace_selection(ch.to_string());
}

/// Insert a string at the current editing point
fn insert_string(&mut self, s: &str) {
// it looks like this could be made performant by avoiding some redundant
// selection-related checks, but use the simple implementation for now
for ch in s.chars() {
self.insert_char(ch);
}
}

pub fn get_sorted_selection(&self) -> (TextPoint, TextPoint) {
let begin = self.selection_begin.unwrap();
let end = self.edit_point;
@@ -282,10 +298,15 @@ impl TextInput {
self.select_all();
KeyReaction::Nothing
},
"v" if is_control_key(event) => {
let contents = self.clipboard_ctx.get_contents().unwrap();
self.insert_string(contents.as_slice());
KeyReaction::DispatchInput
},
// printable characters have single-character key values
c if c.len() == 1 => {
self.insert_char(c.char_at(0));
return KeyReaction::DispatchInput;
KeyReaction::DispatchInput
}
"Space" => {
self.insert_char(' ');

Some generated files are not rendered by default. Learn more.

ProTip! Use n and p to navigate between commits in a pull request.
You can’t perform that action at this time.