Fix context menu position (#1136)
* chore: update libcosmic * fix(context menu): compensate for scroll virtual offset, and use window position
This commit is contained in:
parent
a4e3bf3eea
commit
c8e5d986f2
3 changed files with 72 additions and 47 deletions
36
Cargo.lock
generated
36
Cargo.lock
generated
|
|
@ -1473,7 +1473,7 @@ dependencies = [
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cosmic-config"
|
name = "cosmic-config"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://github.com/pop-os/libcosmic.git#05874e8ea252be0e6115c268aef18a19019842f4"
|
source = "git+https://github.com/pop-os/libcosmic.git#6a5076ecb7dc51fc3d255e8cc865acfc9a7b9343"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"atomicwrites",
|
"atomicwrites",
|
||||||
"cosmic-config-derive",
|
"cosmic-config-derive",
|
||||||
|
|
@ -1495,7 +1495,7 @@ dependencies = [
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cosmic-config-derive"
|
name = "cosmic-config-derive"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://github.com/pop-os/libcosmic.git#05874e8ea252be0e6115c268aef18a19019842f4"
|
source = "git+https://github.com/pop-os/libcosmic.git#6a5076ecb7dc51fc3d255e8cc865acfc9a7b9343"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"quote",
|
"quote",
|
||||||
"syn 2.0.104",
|
"syn 2.0.104",
|
||||||
|
|
@ -1617,7 +1617,7 @@ dependencies = [
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cosmic-settings-config"
|
name = "cosmic-settings-config"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://github.com/pop-os/cosmic-settings-daemon#f4f4fb39fb000bf8458404fe1629fb07cfd07235"
|
source = "git+https://github.com/pop-os/cosmic-settings-daemon#19f10525ff00d76558147ea060bd856a87122353"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cosmic-config",
|
"cosmic-config",
|
||||||
"ron",
|
"ron",
|
||||||
|
|
@ -1639,7 +1639,7 @@ dependencies = [
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cosmic-text"
|
name = "cosmic-text"
|
||||||
version = "0.14.2"
|
version = "0.14.2"
|
||||||
source = "git+https://github.com/pop-os/cosmic-text.git#7646989d6f5b0d2bfe32a123e10fe13693d7c89c"
|
source = "git+https://github.com/pop-os/cosmic-text.git#f7033bb0433f6a9ba109007027781ba46ea9ba27"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags 2.9.1",
|
"bitflags 2.9.1",
|
||||||
"fontdb 0.23.0",
|
"fontdb 0.23.0",
|
||||||
|
|
@ -1661,7 +1661,7 @@ dependencies = [
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cosmic-theme"
|
name = "cosmic-theme"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://github.com/pop-os/libcosmic.git#05874e8ea252be0e6115c268aef18a19019842f4"
|
source = "git+https://github.com/pop-os/libcosmic.git#6a5076ecb7dc51fc3d255e8cc865acfc9a7b9343"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"almost",
|
"almost",
|
||||||
"cosmic-config",
|
"cosmic-config",
|
||||||
|
|
@ -3136,7 +3136,7 @@ dependencies = [
|
||||||
"js-sys",
|
"js-sys",
|
||||||
"log",
|
"log",
|
||||||
"wasm-bindgen",
|
"wasm-bindgen",
|
||||||
"windows-core 0.56.0",
|
"windows-core 0.61.2",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
|
@ -3151,7 +3151,7 @@ dependencies = [
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "iced"
|
name = "iced"
|
||||||
version = "0.14.0-dev"
|
version = "0.14.0-dev"
|
||||||
source = "git+https://github.com/pop-os/libcosmic.git#05874e8ea252be0e6115c268aef18a19019842f4"
|
source = "git+https://github.com/pop-os/libcosmic.git#6a5076ecb7dc51fc3d255e8cc865acfc9a7b9343"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"dnd",
|
"dnd",
|
||||||
"iced_accessibility",
|
"iced_accessibility",
|
||||||
|
|
@ -3169,7 +3169,7 @@ dependencies = [
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "iced_accessibility"
|
name = "iced_accessibility"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://github.com/pop-os/libcosmic.git#05874e8ea252be0e6115c268aef18a19019842f4"
|
source = "git+https://github.com/pop-os/libcosmic.git#6a5076ecb7dc51fc3d255e8cc865acfc9a7b9343"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"accesskit",
|
"accesskit",
|
||||||
"accesskit_winit",
|
"accesskit_winit",
|
||||||
|
|
@ -3178,7 +3178,7 @@ dependencies = [
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "iced_core"
|
name = "iced_core"
|
||||||
version = "0.14.0-dev"
|
version = "0.14.0-dev"
|
||||||
source = "git+https://github.com/pop-os/libcosmic.git#05874e8ea252be0e6115c268aef18a19019842f4"
|
source = "git+https://github.com/pop-os/libcosmic.git#6a5076ecb7dc51fc3d255e8cc865acfc9a7b9343"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags 2.9.1",
|
"bitflags 2.9.1",
|
||||||
"bytes",
|
"bytes",
|
||||||
|
|
@ -3202,7 +3202,7 @@ dependencies = [
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "iced_futures"
|
name = "iced_futures"
|
||||||
version = "0.14.0-dev"
|
version = "0.14.0-dev"
|
||||||
source = "git+https://github.com/pop-os/libcosmic.git#05874e8ea252be0e6115c268aef18a19019842f4"
|
source = "git+https://github.com/pop-os/libcosmic.git#6a5076ecb7dc51fc3d255e8cc865acfc9a7b9343"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"futures",
|
"futures",
|
||||||
"iced_core",
|
"iced_core",
|
||||||
|
|
@ -3228,7 +3228,7 @@ dependencies = [
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "iced_graphics"
|
name = "iced_graphics"
|
||||||
version = "0.14.0-dev"
|
version = "0.14.0-dev"
|
||||||
source = "git+https://github.com/pop-os/libcosmic.git#05874e8ea252be0e6115c268aef18a19019842f4"
|
source = "git+https://github.com/pop-os/libcosmic.git#6a5076ecb7dc51fc3d255e8cc865acfc9a7b9343"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags 2.9.1",
|
"bitflags 2.9.1",
|
||||||
"bytemuck",
|
"bytemuck",
|
||||||
|
|
@ -3250,7 +3250,7 @@ dependencies = [
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "iced_renderer"
|
name = "iced_renderer"
|
||||||
version = "0.14.0-dev"
|
version = "0.14.0-dev"
|
||||||
source = "git+https://github.com/pop-os/libcosmic.git#05874e8ea252be0e6115c268aef18a19019842f4"
|
source = "git+https://github.com/pop-os/libcosmic.git#6a5076ecb7dc51fc3d255e8cc865acfc9a7b9343"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"iced_graphics",
|
"iced_graphics",
|
||||||
"iced_tiny_skia",
|
"iced_tiny_skia",
|
||||||
|
|
@ -3262,7 +3262,7 @@ dependencies = [
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "iced_runtime"
|
name = "iced_runtime"
|
||||||
version = "0.14.0-dev"
|
version = "0.14.0-dev"
|
||||||
source = "git+https://github.com/pop-os/libcosmic.git#05874e8ea252be0e6115c268aef18a19019842f4"
|
source = "git+https://github.com/pop-os/libcosmic.git#6a5076ecb7dc51fc3d255e8cc865acfc9a7b9343"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bytes",
|
"bytes",
|
||||||
"cosmic-client-toolkit",
|
"cosmic-client-toolkit",
|
||||||
|
|
@ -3277,7 +3277,7 @@ dependencies = [
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "iced_tiny_skia"
|
name = "iced_tiny_skia"
|
||||||
version = "0.14.0-dev"
|
version = "0.14.0-dev"
|
||||||
source = "git+https://github.com/pop-os/libcosmic.git#05874e8ea252be0e6115c268aef18a19019842f4"
|
source = "git+https://github.com/pop-os/libcosmic.git#6a5076ecb7dc51fc3d255e8cc865acfc9a7b9343"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bytemuck",
|
"bytemuck",
|
||||||
"cosmic-text",
|
"cosmic-text",
|
||||||
|
|
@ -3293,7 +3293,7 @@ dependencies = [
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "iced_wgpu"
|
name = "iced_wgpu"
|
||||||
version = "0.14.0-dev"
|
version = "0.14.0-dev"
|
||||||
source = "git+https://github.com/pop-os/libcosmic.git#05874e8ea252be0e6115c268aef18a19019842f4"
|
source = "git+https://github.com/pop-os/libcosmic.git#6a5076ecb7dc51fc3d255e8cc865acfc9a7b9343"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"as-raw-xcb-connection",
|
"as-raw-xcb-connection",
|
||||||
"bitflags 2.9.1",
|
"bitflags 2.9.1",
|
||||||
|
|
@ -3324,7 +3324,7 @@ dependencies = [
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "iced_widget"
|
name = "iced_widget"
|
||||||
version = "0.14.0-dev"
|
version = "0.14.0-dev"
|
||||||
source = "git+https://github.com/pop-os/libcosmic.git#05874e8ea252be0e6115c268aef18a19019842f4"
|
source = "git+https://github.com/pop-os/libcosmic.git#6a5076ecb7dc51fc3d255e8cc865acfc9a7b9343"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cosmic-client-toolkit",
|
"cosmic-client-toolkit",
|
||||||
"dnd",
|
"dnd",
|
||||||
|
|
@ -3343,7 +3343,7 @@ dependencies = [
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "iced_winit"
|
name = "iced_winit"
|
||||||
version = "0.14.0-dev"
|
version = "0.14.0-dev"
|
||||||
source = "git+https://github.com/pop-os/libcosmic.git#05874e8ea252be0e6115c268aef18a19019842f4"
|
source = "git+https://github.com/pop-os/libcosmic.git#6a5076ecb7dc51fc3d255e8cc865acfc9a7b9343"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cosmic-client-toolkit",
|
"cosmic-client-toolkit",
|
||||||
"dnd",
|
"dnd",
|
||||||
|
|
@ -4483,7 +4483,7 @@ checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776"
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "libcosmic"
|
name = "libcosmic"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://github.com/pop-os/libcosmic.git#05874e8ea252be0e6115c268aef18a19019842f4"
|
source = "git+https://github.com/pop-os/libcosmic.git#6a5076ecb7dc51fc3d255e8cc865acfc9a7b9343"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"apply",
|
"apply",
|
||||||
"ashpd",
|
"ashpd",
|
||||||
|
|
|
||||||
|
|
@ -111,6 +111,16 @@ impl<'a, Message> MouseArea<'a, Message> {
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Only on wayland, on_right_press will provide window position instead of widget relative
|
||||||
|
#[must_use]
|
||||||
|
pub fn wayland_on_right_press_window_position(mut self) -> Self {
|
||||||
|
#[cfg(feature = "wayland")]
|
||||||
|
{
|
||||||
|
self.on_right_press_window_position = true;
|
||||||
|
}
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
/// on_right_press will provide window position instead of widget relative
|
/// on_right_press will provide window position instead of widget relative
|
||||||
#[must_use]
|
#[must_use]
|
||||||
pub fn on_right_press_window_position(mut self) -> Self {
|
pub fn on_right_press_window_position(mut self) -> Self {
|
||||||
|
|
@ -513,7 +523,8 @@ fn update<Message: Clone>(
|
||||||
state: &mut State,
|
state: &mut State,
|
||||||
viewport: &Rectangle,
|
viewport: &Rectangle,
|
||||||
) -> event::Status {
|
) -> event::Status {
|
||||||
let layout_bounds = layout.bounds();
|
let offset = layout.virtual_offset();
|
||||||
|
let mut layout_bounds = layout.bounds();
|
||||||
|
|
||||||
if let Some(message) = widget.on_resize.as_ref() {
|
if let Some(message) = widget.on_resize.as_ref() {
|
||||||
if state.viewport != Some(*viewport) {
|
if state.viewport != Some(*viewport) {
|
||||||
|
|
@ -644,7 +655,11 @@ fn update<Message: Clone>(
|
||||||
if let Some(message) = widget.on_right_press.as_ref() {
|
if let Some(message) = widget.on_right_press.as_ref() {
|
||||||
if let Event::Mouse(mouse::Event::ButtonPressed(mouse::Button::Right)) = event {
|
if let Event::Mouse(mouse::Event::ButtonPressed(mouse::Button::Right)) = event {
|
||||||
let point_opt = if widget.on_right_press_window_position {
|
let point_opt = if widget.on_right_press_window_position {
|
||||||
cursor.position_over(layout_bounds)
|
cursor.position_over(layout_bounds).map(|mut p| {
|
||||||
|
p.x -= offset.x;
|
||||||
|
p.y -= offset.y;
|
||||||
|
p
|
||||||
|
})
|
||||||
} else {
|
} else {
|
||||||
cursor.position_in(layout_bounds)
|
cursor.position_in(layout_bounds)
|
||||||
};
|
};
|
||||||
|
|
|
||||||
64
src/tab.rs
64
src/tab.rs
|
|
@ -1552,7 +1552,7 @@ pub enum Message {
|
||||||
ContextAction(Action),
|
ContextAction(Action),
|
||||||
ContextMenu(Option<Point>, Option<window::Id>),
|
ContextMenu(Option<Point>, Option<window::Id>),
|
||||||
LocationContextMenuPoint(Option<Point>),
|
LocationContextMenuPoint(Option<Point>),
|
||||||
LocationContextMenuIndex(Option<usize>),
|
LocationContextMenuIndex(Option<Point>, Option<usize>),
|
||||||
LocationMenuAction(LocationMenuAction),
|
LocationMenuAction(LocationMenuAction),
|
||||||
Drag(Option<Rectangle>),
|
Drag(Option<Rectangle>),
|
||||||
DragEnd,
|
DragEnd,
|
||||||
|
|
@ -1579,7 +1579,7 @@ pub enum Message {
|
||||||
ModifiersChanged(Modifiers),
|
ModifiersChanged(Modifiers),
|
||||||
Open(Option<PathBuf>),
|
Open(Option<PathBuf>),
|
||||||
Reload,
|
Reload,
|
||||||
RightClick(Option<usize>),
|
RightClick(Option<Point>, Option<usize>),
|
||||||
MiddleClick(usize),
|
MiddleClick(usize),
|
||||||
Resize(Rectangle),
|
Resize(Rectangle),
|
||||||
Scroll(Viewport),
|
Scroll(Viewport),
|
||||||
|
|
@ -3165,9 +3165,12 @@ impl Tab {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Message::LocationContextMenuPoint(point_opt) => {
|
Message::LocationContextMenuPoint(point_opt) => {
|
||||||
|
self.context_menu = point_opt;
|
||||||
self.location_context_menu_point = point_opt;
|
self.location_context_menu_point = point_opt;
|
||||||
}
|
}
|
||||||
Message::LocationContextMenuIndex(index_opt) => {
|
Message::LocationContextMenuIndex(p, index_opt) => {
|
||||||
|
self.context_menu = p;
|
||||||
|
self.location_context_menu_point = p;
|
||||||
self.location_context_menu_index = index_opt;
|
self.location_context_menu_index = index_opt;
|
||||||
}
|
}
|
||||||
Message::LocationMenuAction(action) => {
|
Message::LocationMenuAction(action) => {
|
||||||
|
|
@ -3588,7 +3591,7 @@ impl Tab {
|
||||||
Some(selected_paths),
|
Some(selected_paths),
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
Message::RightClick(click_i_opt) => {
|
Message::RightClick(p, click_i_opt) => {
|
||||||
if mod_ctrl || mod_shift {
|
if mod_ctrl || mod_shift {
|
||||||
self.update(Message::Click(click_i_opt), modifiers);
|
self.update(Message::Click(click_i_opt), modifiers);
|
||||||
}
|
}
|
||||||
|
|
@ -3993,16 +3996,7 @@ impl Tab {
|
||||||
commands.push(Command::ContextMenu(None, self.window_id.clone()));
|
commands.push(Command::ContextMenu(None, self.window_id.clone()));
|
||||||
}
|
}
|
||||||
if let Some(point) = self.context_menu {
|
if let Some(point) = self.context_menu {
|
||||||
commands.push(Command::ContextMenu(
|
commands.push(Command::ContextMenu(Some(point), self.window_id.clone()));
|
||||||
Some(
|
|
||||||
point
|
|
||||||
+ self
|
|
||||||
.viewport_opt
|
|
||||||
.map(|v| Vector::new(v.x, v.y))
|
|
||||||
.unwrap_or_default(),
|
|
||||||
),
|
|
||||||
self.window_id.clone(),
|
|
||||||
));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -4566,13 +4560,18 @@ impl Tab {
|
||||||
);
|
);
|
||||||
|
|
||||||
if self.location_context_menu_index.is_some() {
|
if self.location_context_menu_index.is_some() {
|
||||||
mouse_area = mouse_area.on_right_press(move |_point_opt| {
|
mouse_area = mouse_area
|
||||||
Message::LocationContextMenuIndex(None)
|
.on_right_press(move |point_opt| {
|
||||||
})
|
Message::LocationContextMenuIndex(point_opt, None)
|
||||||
|
})
|
||||||
|
.wayland_on_right_press_window_position()
|
||||||
} else {
|
} else {
|
||||||
mouse_area = mouse_area.on_right_press_no_capture().on_right_press(
|
mouse_area = mouse_area
|
||||||
move |_point_opt| Message::LocationContextMenuIndex(Some(index)),
|
.on_right_press_no_capture()
|
||||||
)
|
.on_right_press(move |point_opt| {
|
||||||
|
Message::LocationContextMenuIndex(point_opt, Some(index))
|
||||||
|
})
|
||||||
|
.wayland_on_right_press_window_position()
|
||||||
}
|
}
|
||||||
|
|
||||||
let mouse_area = if let Location::Path(_) = &self.location {
|
let mouse_area = if let Location::Path(_) = &self.location {
|
||||||
|
|
@ -4636,7 +4635,8 @@ impl Tab {
|
||||||
}
|
}
|
||||||
|
|
||||||
let mouse_area = crate::mouse_area::MouseArea::new(column)
|
let mouse_area = crate::mouse_area::MouseArea::new(column)
|
||||||
.on_right_press(Message::LocationContextMenuPoint);
|
.on_right_press(Message::LocationContextMenuPoint)
|
||||||
|
.wayland_on_right_press_window_position();
|
||||||
|
|
||||||
let mut popover = widget::popover(mouse_area);
|
let mut popover = widget::popover(mouse_area);
|
||||||
if let (Some(point), Some(index)) = (
|
if let (Some(point), Some(index)) = (
|
||||||
|
|
@ -4831,7 +4831,10 @@ impl Tab {
|
||||||
column = column.push(
|
column = column.push(
|
||||||
mouse_area::MouseArea::new(button)
|
mouse_area::MouseArea::new(button)
|
||||||
.on_right_press_no_capture()
|
.on_right_press_no_capture()
|
||||||
.on_right_press(move |_point_opt| Message::RightClick(Some(i))),
|
.wayland_on_right_press_window_position()
|
||||||
|
.on_right_press(move |point_opt| {
|
||||||
|
Message::RightClick(point_opt, Some(i))
|
||||||
|
}),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -5250,7 +5253,10 @@ impl Tab {
|
||||||
} else {
|
} else {
|
||||||
mouse_area
|
mouse_area
|
||||||
.on_right_press_no_capture()
|
.on_right_press_no_capture()
|
||||||
.on_right_press(move |_point_opt| Message::RightClick(Some(i)))
|
.wayland_on_right_press_window_position()
|
||||||
|
.on_right_press(move |point_opt| {
|
||||||
|
Message::RightClick(point_opt, Some(i))
|
||||||
|
})
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -5471,12 +5477,16 @@ impl Tab {
|
||||||
.on_scroll(|delta| respond_to_scroll_direction(delta, self.modifiers));
|
.on_scroll(|delta| respond_to_scroll_direction(delta, self.modifiers));
|
||||||
|
|
||||||
if self.context_menu.is_some() {
|
if self.context_menu.is_some() {
|
||||||
mouse_area = mouse_area.on_right_press(move |_point_opt| {
|
mouse_area = mouse_area
|
||||||
Message::ContextMenu(None, self.window_id.clone())
|
.on_right_press(move |point_opt| {
|
||||||
});
|
Message::ContextMenu(point_opt, self.window_id.clone())
|
||||||
|
})
|
||||||
|
.wayland_on_right_press_window_position();
|
||||||
} else {
|
} else {
|
||||||
let window_id = self.window_id.clone();
|
let window_id = self.window_id.clone();
|
||||||
mouse_area = mouse_area.on_right_press(move |p| Message::ContextMenu(p, window_id));
|
mouse_area = mouse_area
|
||||||
|
.on_right_press(move |p| Message::ContextMenu(p, window_id))
|
||||||
|
.wayland_on_right_press_window_position();
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut popover = widget::popover(mouse_area);
|
let mut popover = widget::popover(mouse_area);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue