Merge pull request #270 from mahkoh/jorth/toplevel-drag-fix
Toplevel drag fixes
This commit is contained in:
commit
1bc344dcc2
7 changed files with 26 additions and 8 deletions
|
|
@ -830,6 +830,7 @@ fn write_request_handler<W: Write>(
|
||||||
writeln!(f, " }};")?;
|
writeln!(f, " }};")?;
|
||||||
writeln!(f, " Err({error}::MethodError {{")?;
|
writeln!(f, " Err({error}::MethodError {{")?;
|
||||||
writeln!(f, " interface: {camel_obj_name},")?;
|
writeln!(f, " interface: {camel_obj_name},")?;
|
||||||
|
writeln!(f, " id: self.id(),")?;
|
||||||
writeln!(f, " method,")?;
|
writeln!(f, " method,")?;
|
||||||
writeln!(f, " error,")?;
|
writeln!(f, " error,")?;
|
||||||
writeln!(f, " }})")?;
|
writeln!(f, " }})")?;
|
||||||
|
|
|
||||||
|
|
@ -37,9 +37,10 @@ pub enum ClientError {
|
||||||
ClientIdOutOfBounds,
|
ClientIdOutOfBounds,
|
||||||
#[error("Object {0} is not a display")]
|
#[error("Object {0} is not a display")]
|
||||||
NotADisplay(WlDisplayId),
|
NotADisplay(WlDisplayId),
|
||||||
#[error("Could not process a `{}.{}` request", .interface.name(), .method)]
|
#[error("Could not process a `{}#{}.{}` request", .interface.name(), .id, .method)]
|
||||||
MethodError {
|
MethodError {
|
||||||
interface: Interface,
|
interface: Interface,
|
||||||
|
id: ObjectId,
|
||||||
method: &'static str,
|
method: &'static str,
|
||||||
#[source]
|
#[source]
|
||||||
error: Box<dyn Error + 'static>,
|
error: Box<dyn Error + 'static>,
|
||||||
|
|
|
||||||
|
|
@ -154,16 +154,19 @@ impl WlDataSource {
|
||||||
shared.selected_action.get() != 0 && shared.state.get().contains(OFFER_STATE_ACCEPTED)
|
shared.selected_action.get() != 0 && shared.state.get().contains(OFFER_STATE_ACCEPTED)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn on_drop(&self, seat: &Rc<WlSeatGlobal>) {
|
pub fn on_drop(&self) {
|
||||||
self.data.state.or_assign(SOURCE_STATE_DROPPED);
|
self.data.state.or_assign(SOURCE_STATE_DROPPED);
|
||||||
if let Some(drag) = self.toplevel_drag.take() {
|
|
||||||
drag.finish_drag(seat);
|
|
||||||
}
|
|
||||||
self.send_dnd_drop_performed();
|
self.send_dnd_drop_performed();
|
||||||
let shared = self.data.shared.get();
|
let shared = self.data.shared.get();
|
||||||
shared.state.or_assign(OFFER_STATE_DROPPED);
|
shared.state.or_assign(OFFER_STATE_DROPPED);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn finish_toplevel_drag(&self, seat: &Rc<WlSeatGlobal>) {
|
||||||
|
if let Some(drag) = self.toplevel_drag.take() {
|
||||||
|
drag.finish_drag(seat);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn send_cancelled(&self, seat: &Rc<WlSeatGlobal>) {
|
pub fn send_cancelled(&self, seat: &Rc<WlSeatGlobal>) {
|
||||||
self.data.state.or_assign(SOURCE_STATE_CANCELLED);
|
self.data.state.or_assign(SOURCE_STATE_CANCELLED);
|
||||||
if let Some(drag) = self.toplevel_drag.take() {
|
if let Some(drag) = self.toplevel_drag.take() {
|
||||||
|
|
|
||||||
|
|
@ -811,9 +811,10 @@ impl WlSeatGlobal {
|
||||||
}
|
}
|
||||||
let scs = &*self.shortcuts.borrow();
|
let scs = &*self.shortcuts.borrow();
|
||||||
let keysyms = xkb_state.unmodified_keysyms(key);
|
let keysyms = xkb_state.unmodified_keysyms(key);
|
||||||
|
let mut revert_pointer_to_default = false;
|
||||||
for &sym in keysyms {
|
for &sym in keysyms {
|
||||||
if sym == SYM_Escape.0 && mods == 0 {
|
if sym == SYM_Escape.0 && mods == 0 {
|
||||||
self.pointer_owner.revert_to_default(self);
|
revert_pointer_to_default = true;
|
||||||
}
|
}
|
||||||
if !self.state.lock.locked.get() {
|
if !self.state.lock.locked.get() {
|
||||||
if let Some(key_mods) = scs.get(&sym) {
|
if let Some(key_mods) = scs.get(&sym) {
|
||||||
|
|
@ -829,6 +830,11 @@ impl WlSeatGlobal {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if revert_pointer_to_default {
|
||||||
|
drop(xkb_state);
|
||||||
|
self.pointer_owner.revert_to_default(self);
|
||||||
|
xkb_state = xkb_state_rc.borrow_mut();
|
||||||
|
}
|
||||||
new_mods = xkb_state.update(key, xkb_dir);
|
new_mods = xkb_state.update(key, xkb_dir);
|
||||||
}
|
}
|
||||||
self.state.for_each_seat_tester(|t| {
|
self.state.for_each_seat_tester(|t| {
|
||||||
|
|
|
||||||
|
|
@ -468,7 +468,7 @@ impl PointerOwner for DndPointerOwner {
|
||||||
let target = self.target.get();
|
let target = self.target.get();
|
||||||
target.node_on_dnd_drop(&self.dnd);
|
target.node_on_dnd_drop(&self.dnd);
|
||||||
if let Some(src) = &self.dnd.src {
|
if let Some(src) = &self.dnd.src {
|
||||||
src.on_drop(seat);
|
src.on_drop();
|
||||||
}
|
}
|
||||||
let should_drop = match &self.dnd.src {
|
let should_drop = match &self.dnd.src {
|
||||||
None => true,
|
None => true,
|
||||||
|
|
@ -491,6 +491,9 @@ impl PointerOwner for DndPointerOwner {
|
||||||
}
|
}
|
||||||
seat.pointer_owner.set_default_pointer_owner(seat);
|
seat.pointer_owner.set_default_pointer_owner(seat);
|
||||||
seat.tree_changed.trigger();
|
seat.tree_changed.trigger();
|
||||||
|
if let Some(src) = &self.dnd.src {
|
||||||
|
src.finish_toplevel_drag(seat);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn axis_node(&self, _seat: &Rc<WlSeatGlobal>) -> Option<Rc<dyn Node>> {
|
fn axis_node(&self, _seat: &Rc<WlSeatGlobal>) -> Option<Rc<dyn Node>> {
|
||||||
|
|
|
||||||
|
|
@ -388,6 +388,9 @@ impl XdgToplevel {
|
||||||
|
|
||||||
pub fn after_toplevel_drag(self: &Rc<Self>, output: &Rc<OutputNode>, x: i32, y: i32) {
|
pub fn after_toplevel_drag(self: &Rc<Self>, output: &Rc<OutputNode>, x: i32, y: i32) {
|
||||||
assert!(self.toplevel_data.parent.is_none());
|
assert!(self.toplevel_data.parent.is_none());
|
||||||
|
if self.node_visible() {
|
||||||
|
self.xdg.damage();
|
||||||
|
}
|
||||||
let extents = match self.xdg.geometry.get() {
|
let extents = match self.xdg.geometry.get() {
|
||||||
None => self.xdg.extents.get(),
|
None => self.xdg.extents.get(),
|
||||||
Some(g) => g,
|
Some(g) => g,
|
||||||
|
|
|
||||||
|
|
@ -63,9 +63,10 @@ pub enum UsrConError {
|
||||||
Write(#[source] BufFdError),
|
Write(#[source] BufFdError),
|
||||||
#[error("Server sent an event for object {0} that does not exist")]
|
#[error("Server sent an event for object {0} that does not exist")]
|
||||||
MissingObject(ObjectId),
|
MissingObject(ObjectId),
|
||||||
#[error("Could not process a `{}.{}` event", .interface.name(), .method)]
|
#[error("Could not process a `{}#{}.{}` event", .interface.name(), .id, .method)]
|
||||||
MethodError {
|
MethodError {
|
||||||
interface: Interface,
|
interface: Interface,
|
||||||
|
id: ObjectId,
|
||||||
method: &'static str,
|
method: &'static str,
|
||||||
#[source]
|
#[source]
|
||||||
error: Box<dyn Error + 'static>,
|
error: Box<dyn Error + 'static>,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue