Skip to content

Commit

Permalink
Merge pull request #814 from BowDown097/master
Browse files Browse the repository at this point in the history
feat(launcher): open new window on middle-click
  • Loading branch information
JakeStanger authored Dec 18, 2024
2 parents 4e6db91 + 7bff8c0 commit cfaa998
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 12 deletions.
5 changes: 3 additions & 2 deletions docs/modules/Launcher.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
Windows-style taskbar that displays running windows, grouped by program.
Hovering over a program with multiple windows open shows a popup with each window.
Clicking an icon/popup item focuses or launches the program.
Left clicking an icon/popup item focuses the program if it has any open instances or otherwise launches a new instance of the program.
Middle clicking an icon always launches a new instance of the program.
Optionally displays a launchable set of favourites.

![Screenshot showing several open applications, including a popup showing multiple terminal windows.](https://f.jstanger.dev/github/ironbar/launcher.png)
Expand Down Expand Up @@ -113,4 +114,4 @@ start:
| `.popup-launcher` | Popup container |
| `.popup-launcher .popup-item` | Window button in popup |

For more information on styling, please see the [styling guide](styling-guide).
For more information on styling, please see the [styling guide](styling-guide).
28 changes: 18 additions & 10 deletions src/modules/launcher/item.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ use crate::modules::launcher::{ItemEvent, LauncherUpdate};
use crate::modules::ModuleUpdateEvent;
use crate::{read_lock, try_send};
use glib::Propagation;
use gtk::gdk::{BUTTON_MIDDLE, BUTTON_PRIMARY};
use gtk::prelude::*;
use gtk::{Button, IconTheme, Image, Label, Orientation};
use indexmap::IndexMap;
Expand Down Expand Up @@ -201,20 +202,27 @@ impl ItemButton {
let app_id = item.app_id.clone();
let tx = controller_tx.clone();
let menu_state = menu_state.clone();
button.connect_clicked(move |button| {
// lazy check :| TODO: Improve this
let style_context = button.style_context();
if style_context.has_class("open") {
let menu_state = read_lock!(menu_state);

if style_context.has_class("focused") && menu_state.num_windows == 1 {
try_send!(tx, ItemEvent::MinimizeItem(app_id.clone()));

button.connect_button_release_event(move |button, event| {
if event.button() == BUTTON_PRIMARY {
// lazy check :| TODO: Improve this
let style_context = button.style_context();
if style_context.has_class("open") {
let menu_state = read_lock!(menu_state);

if style_context.has_class("focused") && menu_state.num_windows == 1 {
try_send!(tx, ItemEvent::MinimizeItem(app_id.clone()));
} else {
try_send!(tx, ItemEvent::FocusItem(app_id.clone()));
}
} else {
try_send!(tx, ItemEvent::FocusItem(app_id.clone()));
try_send!(tx, ItemEvent::OpenItem(app_id.clone()));
}
} else {
} else if event.button() == BUTTON_MIDDLE {
try_send!(tx, ItemEvent::OpenItem(app_id.clone()));
}

Propagation::Proceed
});
}

Expand Down

0 comments on commit cfaa998

Please sign in to comment.