55
66public class Dock.Launcher : BaseItem {
77 private const int DND_TIMEOUT = 1000 ;
8+ private const int POPOVER_NAME_TIMEOUT = 500 ;
89
910 private static Settings ? notify_settings;
1011
@@ -30,7 +31,10 @@ public class Dock.Launcher : BaseItem {
3031 private Gtk . Revealer badge_revealer;
3132 private Adw . TimedAnimation bounce_up;
3233 private Adw . TimedAnimation bounce_down;
33- private Gtk . PopoverMenu popover;
34+ private Gtk . PopoverMenu popover_menu;
35+ private Gtk . Popover popover_name;
36+
37+ private Gtk . EventControllerMotion motion_controller;
3438
3539 private Gtk . Image ? second_running_indicator;
3640 private bool multiple_windows_open {
@@ -53,6 +57,8 @@ public class Dock.Launcher : BaseItem {
5357 private uint queue_dnd_cycle_id = 0 ;
5458
5559 private bool flagged_for_removal = false ;
60+ private bool timeout_is_running = false ;
61+ private bool is_hover = false ;
5662
5763 public Launcher (App app ) {
5864 Object (app: app, group: Group . LAUNCHER );
@@ -63,11 +69,26 @@ public class Dock.Launcher : BaseItem {
6369 }
6470
6571 construct {
66- popover = new Gtk .PopoverMenu .from_model (app. menu_model) {
72+ popover_menu = new Gtk .PopoverMenu .from_model (app. menu_model) {
6773 autohide = true ,
6874 position = TOP
6975 };
70- popover. set_parent (this );
76+ popover_menu. set_parent (this );
77+
78+ var display_name = app. app_info. get_display_name ();
79+ var name_label = new Gtk .Label (display_name);
80+ name_label. add_css_class (" app-info" );
81+ popover_name = new Gtk .Popover () {
82+ position = TOP ,
83+ child = name_label,
84+ autohide = false
85+ };
86+ popover_name. set_parent (this );
87+
88+ motion_controller = new Gtk .EventControllerMotion ();
89+ motion_controller. enter. connect (on_enter);
90+ motion_controller. leave. connect (on_leave);
91+ add_controller (motion_controller);
7192
7293 image = new Gtk .Image ();
7394
@@ -99,8 +120,6 @@ public class Dock.Launcher : BaseItem {
99120 overlay. add_overlay (badge_revealer);
100121 overlay. add_overlay (progress_revealer);
101122
102- tooltip_text = app. app_info. get_display_name ();
103-
104123 insert_action_group (ACTION_GROUP_PREFIX , app. action_group);
105124
106125 // We have to destroy the progressbar when it is not needed otherwise it will
@@ -154,7 +173,10 @@ public class Dock.Launcher : BaseItem {
154173 gesture_click. released. connect (on_click_released);
155174
156175 var long_press = new Gtk .GestureLongPress ();
157- long_press. pressed. connect (popover. popup);
176+ long_press. pressed. connect (() = > {
177+ popover_menu. popup ();
178+ popover_name. popdown ();
179+ });
158180 add_controller (long_press);
159181
160182 var scroll_controller = new Gtk .EventControllerScroll (VERTICAL );
@@ -200,8 +222,10 @@ public class Dock.Launcher : BaseItem {
200222 }
201223
202224 ~Launcher () {
203- popover. unparent ();
204- popover. dispose ();
225+ popover_menu. unparent ();
226+ popover_menu. dispose ();
227+ popover_name. unparent ();
228+ popover_name. dispose ();
205229 }
206230
207231 /**
@@ -232,7 +256,8 @@ public class Dock.Launcher : BaseItem {
232256 }
233257 break ;
234258 case Gdk . BUTTON_SECONDARY:
235- popover. popup ();
259+ popover_menu. popup ();
260+ popover_name. popdown ();
236261 break ;
237262 }
238263 }
@@ -328,4 +353,24 @@ public class Dock.Launcher : BaseItem {
328353 multiple_windows_open = app. windows. length > 1 ;
329354 }
330355 }
356+
357+ private void on_enter (Gtk .EventControllerMotion controller , double event_x , double event_y ) {
358+ if (! timeout_is_running) {
359+ Timeout . add_once (POPOVER_NAME_TIMEOUT , show_popover_name);
360+ }
361+ timeout_is_running = true ;
362+ is_hover = true ;
363+ }
364+
365+ private void on_leave (Gtk .EventControllerMotion controller ) {
366+ popover_name. popdown ();
367+ is_hover = false ;
368+ }
369+
370+ private void show_popover_name () {
371+ timeout_is_running = false ;
372+ if (! popover_menu. visible && is_hover) {
373+ popover_name. popup ();
374+ }
375+ }
331376}
0 commit comments