// Receives keyboard events until a valid shortcut is found, to set it as entry text. // func onKeyGrabReceived(_ *gtk.Window, event *gdk.Event, data *textGrabData) { key := &gdk.EventKey{Event: event} if !gtk.AcceleratorValid(key.KeyVal(), gdk.ModifierType(key.State())) { return } data.entry.SetSensitive(true) data.win.HandlerDisconnect(data.cbID) data.cbID = 0 // This lets us ignore all ignorable modifier keys, including NumLock and many others. :) // The logic is: keep only the important modifiers that were pressed for this event. state := gdk.ModifierType(key.State()) & gtk.AcceleratorGetDefaultModMask() accel := gtk.AcceleratorName(key.KeyVal(), state) data.entry.SetText(accel) }
func wrapAccelKey(obj *C.struct__GtkAccelKey) *AccelKey { var v AccelKey v.key = uint(obj.accel_key) v.mods = gdk.ModifierType(obj.accel_mods) v.flags = uint16(obj.accel_flags) return &v }
// AcceleratorParse is a wrapper around gtk_accelerator_parse(). func AcceleratorParse(acc string) (key uint, mods gdk.ModifierType) { cstr := C.CString(acc) defer C.free(unsafe.Pointer(cstr)) k := C.guint(0) m := C.GdkModifierType(0) C.gtk_accelerator_parse((*C.gchar)(cstr), &k, &m) return uint(k), gdk.ModifierType(m) }
// onKeyGrabReceived is called when a grabbed keyboard events is received. // func (widget *Shortkeys) onKeyGrabReceived(win *gtk.Window, event *gdk.Event) { key := &gdk.EventKey{Event: event} if !gtk.AcceleratorValid(key.KeyVal(), gdk.ModifierType(key.State())) { return } // This lets us ignore all ignorable modifier keys, including NumLock and many others. :) // The logic is: keep only the important modifiers that were pressed for this event. state := gdk.ModifierType(key.State()) & gtk.AcceleratorGetDefaultModMask() accel := gtk.AcceleratorName(key.KeyVal(), state) if accel != "Escape" { // TODO: FIX widget.updateShortkey(accel) } else { widget.updateDisplay() } widget.onKeyGrabFinish() }
// AcceleratorGetDefaultModMask is a wrapper around gtk_accelerator_get_default_mod_mask(). func AcceleratorGetDefaultModMask() gdk.ModifierType { return gdk.ModifierType(C.gtk_accelerator_get_default_mod_mask()) }
// GetModifierMask is a wrapper around gtk_accel_group_get_modifier_mask(). func (v *AccelGroup) GetModifierMask() gdk.ModifierType { return gdk.ModifierType(C.gtk_accel_group_get_modifier_mask(v.native())) }
func (v *accelGroup) Connect2(v2 uint, v3 gdki.ModifierType, v4 gtki.AccelFlags, v5 interface{}) { v.internal.Connect(v2, gdk.ModifierType(v3), gtk.AccelFlags(v4), gliba.FixupFunction(v5)) }
// Entry adds a defined entry to the menu. Returns if a separator is needed. // func (m *DockMenu) Entry(entry MenuEntry) bool { switch entry { case MenuAbout: m.AddEntry( tran.Slate("About"), globals.IconNameAbout, about.New, ) case MenuAddApplet: m.AddEntry( tran.Slate("Applet"), globals.IconNameAdd, backendgui.ShowAddons) case MenuAddLauncher: m.AddEntry( tran.Slate("Custom launcher"), globals.IconNameAdd, func() { newIcon := gldi.LauncherAddNew("", m.Dock, nextOrder(m.Icon, m.Dock)) if newIcon == nil { // TODO: use log println("Couldn't create create the icon.\nCheck that you have writing permissions on ~/.config/cairo-dock and its sub-folders") } else { backendgui.ShowItems(newIcon, nil, nil, -1) } }, ).SetTooltipText(tran.Slate("Usually you would drag a launcher from the menu and drop it on the dock.")) case MenuAddMainDock: m.AddEntry( tran.Slate("Main dock"), globals.IconNameAdd, func() { key := gldi.DockAddConfFile() gldi.DockNew(key) backendgui.ReloadItems() // g_timeout_add_seconds (1, (GSourceFunc)_show_new_dock_msg, cDockName); // delai, car sa fenetre n'est pas encore bien placee (0,0). }) case MenuAddSeparator: m.AddEntry( tran.Slate("Separator"), globals.IconNameAdd, func() { newIcon := gldi.SeparatorIconAddNew(m.Dock, nextOrder(m.Icon, m.Dock)) if newIcon == nil { // TODO: use log println("Couldn't create create the icon.\nCheck that you have writing permissions on ~/.config/cairo-dock and its sub-folders") } }) case MenuAddSubDock: m.AddEntry( tran.Slate("Sub-dock"), globals.IconNameAdd, func() { newIcon := gldi.StackIconAddNew(m.Dock, nextOrder(m.Icon, m.Dock)) if newIcon == nil { // TODO: use log println("Couldn't create create the icon.\nCheck that you have writing permissions on ~/.config/cairo-dock and its sub-folders") } }) case MenuClassItems: //\_________________________ class actions. items := m.Icon.GetClass().MenuItems() for _, it := range items { cmd := strings.Fields(it[1]) m.AddEntry( it[0], // name it[2], // icon func() { log.ExecAsync(cmd[0], cmd[1:]...) }) // was gldi.LaunchCommand(cmd) } return len(items) > 0 case MenuConfigure: m.AddEntry( tran.Slate("Configure"), globals.IconNamePreferences, backendgui.ShowMainGui, ).SetTooltipText(tran.Slate("Configure behaviour, appearance, and applets.")) case MenuCustomIconRemove: classIcon := m.Icon.GetClass().Icon() if classIcon == "" { classIcon = m.Icon.GetClass().String() } path := filepath.Join(globals.DirCurrentIcons(), classIcon+".png") if _, e := os.Stat(path); e != nil { path = filepath.Join(globals.DirCurrentIcons(), classIcon+".svg") if _, e := os.Stat(path); e != nil { path = "" } } // println("custom icon", path) if path != "" { m.AddEntry( tran.Slate("Remove custom icon"), globals.IconNameRemove, func() { C._cairo_dock_remove_custom_appli_icon((*C.Icon)(unsafe.Pointer(m.Icon.ToNative())), (*C.CairoDock)(unsafe.Pointer(m.Dock.Ptr))) }) } case MenuCustomIconSet: m.AddEntry( tran.Slate("Set a custom icon"), globals.IconNameSelectColor, func() { C._cairo_dock_set_custom_appli_icon((*C.Icon)(unsafe.Pointer(m.Icon.ToNative())), (*C.CairoDock)(unsafe.Pointer(m.Dock.Ptr))) }) case MenuDeleteDock: m.AddEntry( tran.Slate("Delete this dock"), globals.IconNameDelete, func() { if m.Dock.GetRefCount() != 0 { dialog.ShowWithQuestion("Delete this dock?", m.Dock.GetPointedIcon(), m.Container, globals.FileCairoDockIcon(), cbDialogIsOK(func() { gldi.ObjectDelete(m.Dock) })) } }) case MenuDeskletLock: desklet := m.Container.ToDesklet() m.AddCheckEntry( tran.Slate("Lock position"), desklet.PositionLocked(), func(c *gtk.CheckMenuItem) { desklet.LockPosition(c.GetActive()) backendgui.UpdateDeskletVisibility(desklet) }) case MenuDeskletSticky: desklet := m.Container.ToDesklet() m.AddCheckEntry( tran.Slate("On all desktops"), m.Container.ToDesklet().IsSticky(), func(c *gtk.CheckMenuItem) { desklet.SetSticky(c.GetActive()) // TODO: check why SetSticky isn't working... println("get stick", desklet.IsSticky()) backendgui.UpdateDeskletVisibility(desklet) }) case MenuDeskletVisibility: submenu := m.AddSubMenu(tran.Slate("Visibility"), globals.IconNameFind) desklet := m.Container.ToDesklet() callback := func(radio *gtk.RadioMenuItem, val cdtype.DeskletVisibility) { if radio.GetActive() { desklet.SetVisibility(val, true) // with true, also save to conf. backendgui.UpdateDeskletVisibility(desklet) } } group := 42 visibility := desklet.Visibility() addRadio := func(vis cdtype.DeskletVisibility, label string) { radio := submenu.AddRadioEntry(label, visibility == vis, group, nil) radio.Connect("toggled", callback, vis) } addRadio(cdtype.DeskletVisibilityNormal, tran.Slate("Normal")) addRadio(cdtype.DeskletVisibilityKeepAbove, tran.Slate("Always on top")) addRadio(cdtype.DeskletVisibilityKeepBelow, tran.Slate("Always below")) if gldi.CanSetOnWidgetLayer() { addRadio(cdtype.DeskletVisibilityWidgetLayer, tran.Slate("Widget Layer")) } addRadio(cdtype.DeskletVisibilityReserveSpace, tran.Slate("Reserve space")) case MenuDetachApplet: m.AddEntry( ternary.String(m.Dock != nil, tran.Slate("Detach"), tran.Slate("Return to the dock")), ternary.String(m.Dock != nil, globals.IconNameGotoTop, globals.IconNameGotoBottom), func() { // if (CAIRO_DOCK_IS_DESKLET (pContainer)) // icon = (CAIRO_DESKLET (pContainer))->pIcon; // l'icone cliquee du desklet n'est pas forcement celle qui contient le module ! // g_return_if_fail (CAIRO_DOCK_IS_APPLET (icon)); m.Icon.ModuleInstance().Detach() }) case MenuDuplicateApplet: m.AddEntry( tran.Slate("Duplicate"), globals.IconNameAdd, func() { // if (CAIRO_DOCK_IS_DESKLET (pContainer)) // icon = (CAIRO_DESKLET (pContainer))->pIcon; // l'icone cliquee du desklet n'est pas forcement celle qui contient le module ! // g_return_if_fail (CAIRO_DOCK_IS_APPLET (icon)); m.Icon.ModuleInstance().Module().AddInstance() // gldi_module_add_instance (icon->pModuleInstance->pModule); }) case MenuEditApplet: m.AddEntry( tran.Slate("Edit"), globals.IconNameEdit, func() { // if (CAIRO_DOCK_IS_DESKLET (pContainer)) // icon = (CAIRO_DESKLET (pContainer))->pIcon; // l'icone cliquee du desklet n'est pas forcement celle qui contient le module. // g_return_if_fail (CAIRO_DOCK_IS_APPLET (icon)); backendgui.ShowItems(m.Icon, nil, nil, -1) }) case MenuEditDock: m.AddEntry( tran.Slate("Configure this dock"), globals.IconNameExecute, func() { backendgui.ShowItems(nil, m.Container, nil, 0) }, ).SetTooltipText(tran.Slate("Customize the position, visibility and appearance of this main dock.")) case MenuEditIcon: m.AddEntry(tran.Slate( tran.Slate("Edit")), globals.IconNameEdit, func() { switch m.Icon.GetDesktopFileName() { case "", "none": dialog.ShowTemporaryWithIcon("Sorry, this icon doesn't have a configuration file.", m.Icon, m.Container, 4000, "same icon") default: backendgui.ShowItems(m.Icon, nil, nil, -1) } }) case MenuEditTarget: _, img := m.Icon.DefaultNameIcon() m.AddEntry( tran.Slate("Edit icon"), img, func() { // if (CAIRO_DOCK_IS_DESKLET (pContainer)) // icon = (CAIRO_DESKLET (pContainer))->pIcon; // l'icone cliquee du desklet n'est pas forcement celle qui contient le module. // g_return_if_fail (CAIRO_DOCK_IS_APPLET (icon)); backendgui.ShowItems(m.Icon, nil, nil, -1) }) case MenuHandbook: m.AddEntry( tran.Slate("Applet's handbook"), globals.IconNameAbout, m.Icon.ModuleInstance().PopupAboutApplet) // handbook + 5x to facto // picon := icon // if container.IsDesklet() { // picon = container.Icon() // icon = (CAIRO_DESKLET (pContainer))->pIcon; // l'icone cliquee du desklet n'est pas forcement celle qui contient le module ! // } case MenuHelp: m.AddEntry( tran.Slate("Help"), globals.IconNameHelp, func() { backendgui.ShowModuleGui("Help") }, ).SetTooltipText(tran.Slate("There are no problems, only solutions (and a lot of useful hints!)")) case MenuLaunchNew: m.AddEntry( tran.Slate("Launch a new (Shift+clic)"), globals.IconNameAdd, func() { m.Icon.LaunchCommand(log) }) case MenuLockIcons: m.AddCheckEntry( tran.Slate("Lock icons position"), current.Docks.LockIcons(), func() { current.Docks.LockIcons(!current.Docks.LockIcons()) config.UpdateFile(log, globals.ConfigFile(), "Accessibility", "lock icons", current.Docks.LockIcons()) }, ).SetTooltipText(tran.Slate("This will (un)lock the position of the icons.")) case MenuMakeLauncher: m.AddEntry( tran.Slate("Make it a launcher"), globals.IconNameNew, func() { C._cairo_dock_make_launcher_from_appli((*C.Icon)(unsafe.Pointer(m.Icon.ToNative())), (*C.CairoDock)(unsafe.Pointer(m.Dock.Ptr))) }) case MenuMoveToDesktopClass: m.moveToDesktop(true) case MenuMoveToDesktopWindow: m.moveToDesktop(false) case MenuMoveToDock: sub := m.AddSubMenu(tran.Slate("Move to another dock"), globals.IconNameJumpTo) docks := gldi.GetAllAvailableDocks(m.Icon.GetContainer().ToCairoDock(), m.Icon.GetSubDock()) docks = append(docks, nil) for _, dock := range docks { name := "" key := "" icon := "" if dock == nil { name = tran.Slate("New main dock") icon = globals.IconNameAdd // globals.IconNameNew } else { name = ternary.String(dock.GetReadableName() != "", dock.GetReadableName(), dock.GetDockName()) key = dock.GetDockName() if dock.GetRefCount() == 0 { // Maindocks icon switch dock.Container().ScreenBorder() { case cdtype.ContainerPositionBottom: icon = "go-down" case cdtype.ContainerPositionTop: icon = "go-up" case cdtype.ContainerPositionLeft: icon = "go-previous" case cdtype.ContainerPositionRight: icon = "go-next" } } else { // Subdocks icon. dockicon := dock.SearchIconPointingOnDock(nil) if dockicon != nil { icon = dockicon.GetFileName() } } } sub.AddEntry( name, icon, func() { if key == "" { key = gldi.DockAddConfFile() } m.Icon.WriteContainerNameInConfFile(key) // Update icon conf file. if m.Icon.IsLauncher() || m.Icon.IsStackIcon() || m.Icon.IsSeparator() { // Reload icon (creating the dock). gldi.ObjectReload(m.Icon) } else if m.Icon.IsApplet() { gldi.ObjectReload(m.Icon.ModuleInstance()) } newdock := gldi.DockGet(key) if newdock != nil && newdock.GetRefCount() == 0 && len(newdock.Icons()) == 1 { str := tran.Slate("The new dock has been created.\nYou can customize it by right-clicking on it -> cairo-dock -> configure this dock.") dialog.ShowGeneralMessage(str, 8000) // we don't show it on the new dock as its window isn't positioned yet (0,0). } }) } case MenuQuickHide: m.AddEntry( tran.Slate("Quick-Hide"), globals.IconNameGotoBottom, gldi.QuickHideAllDocks, ).SetTooltipText(tran.Slate("This will hide the dock until you hover over it with the mouse.")) case MenuQuit: item := m.AddEntry( tran.Slate("Quit"), globals.IconNameQuit, func() { backendgui.CloseGui() // gtk.MainQuit() // TODO: remove SQP HACK, easy quit no confirm for tests. dialog.ShowWithQuestion("Quit Cairo-Dock?", GetIconForDesklet(m.Icon, m.Container), m.Container, globals.FileCairoDockIcon(), cbDialogIsOK(gtk.MainQuit)) }) // const gchar *cDesktopSession = g_getenv ("DESKTOP_SESSION"); // gboolean bIsCairoDockSession = cDesktopSession && g_str_has_prefix (cDesktopSession, "cairo-dock"); // // if we're using a Cairo-Dock session and we quit the dock we have... nothing to relaunch it! // if bIsCairoDockSession { // item.SetSensitive(false) // item.SetTooltipText("You're using a Cairo-Dock Session!\nIt's not advised to quit the dock but you can press Shift to unlock this menu entry.") // static void _cairo_dock_set_sensitive_quit_menu (G_GNUC_UNUSED GtkWidget *pMenuItem, GdkEventKey *pKey, GtkWidget *pQuitEntry) // { // pMenuItem not used because we want to only modify one entry // if (pKey->type == GDK_KEY_PRESS && // (pKey->keyval == GDK_KEY_Shift_L || // pKey->keyval == GDK_KEY_Shift_R)) // pressed // gtk_widget_set_sensitive (pQuitEntry, TRUE); // unlocked // else if (pKey->state & GDK_SHIFT_MASK) // released // gtk_widget_set_sensitive (pQuitEntry, FALSE); // locked) // } cbSensitive := func(_ *gtk.CheckMenuItem, event *gdk.Event) { key := &gdk.EventKey{Event: event} println("key", key.KeyVal()) if key.KeyVal() == uint(C.GDK_KEY_Shift_R) { // pressed. item.SetSensitive(true) } else if gdk.ModifierType(key.State())&gdk.GDK_SHIFT_MASK > 0 { // released. item.SetSensitive(false) } } _, e := item.Connect("key-press-event", cbSensitive) if e != nil { println((e.Error())) } item.Connect("key-release-event", cbSensitive) // gtk_widget_set_sensitive (pMenuItem, FALSE); // locked // gtk_widget_set_tooltip_text (pMenuItem, _("You're using a Cairo-Dock Session!\nIt's not advised to quit the dock but you can press Shift to unlock this menu entry.")); // // signal to unlock the entry (signal monitored only in the submenu) // g_signal_connect (pSubMenu, "key-press-event", G_CALLBACK (_cairo_dock_set_sensitive_quit_menu), pMenuItem); // g_signal_connect (pSubMenu, "key-release-event", G_CALLBACK (_cairo_dock_set_sensitive_quit_menu), pMenuItem); // } // case MenuAutostart: // gchar *cCairoAutoStartDirPath = g_strdup_printf ("%s/.config/autostart", g_getenv ("HOME")); // gchar *cCairoAutoStartEntryPath = g_strdup_printf ("%s/cairo-dock.desktop", cCairoAutoStartDirPath); // gchar *cCairoAutoStartEntryPath2 = g_strdup_printf ("%s/cairo-dock-cairo.desktop", cCairoAutoStartDirPath); // if (! bIsCairoDockSession && ! g_file_test (cCairoAutoStartEntryPath, G_FILE_TEST_EXISTS) && ! g_file_test (cCairoAutoStartEntryPath2, G_FILE_TEST_EXISTS)) // { // cairo_dock_add_in_menu_with_stock_and_data (_("Launch Cairo-Dock on startup"), // GLDI_ICON_NAME_ADD, // G_CALLBACK (_cairo_dock_add_autostart), // pSubMenu, // NULL); // } // g_free (cCairoAutoStartEntryPath); // g_free (cCairoAutoStartEntryPath2); // g_free (cCairoAutoStartDirPath); // case MenuThirdParty: // pMenuItem = cairo_dock_add_in_menu_with_stock_and_data (_("Get more applets!"), // GLDI_ICON_NAME_ADD, // G_CALLBACK (_cairo_dock_show_third_party_applets), // pSubMenu, // NULL); // gtk_widget_set_tooltip_text (pMenuItem, _("Third-party applets provide integration with many programs, like Pidgin")); case MenuRemoveApplet: m.AddEntry( tran.Slate("Remove"), globals.IconNameRemove, func() { // if (CAIRO_DOCK_IS_DESKLET (pContainer)) // icon = (CAIRO_DESKLET (pContainer))->pIcon; // l'icone cliquee du desklet n'est pas forcement celle qui contient le module ! // g_return_if_fail (CAIRO_DOCK_IS_APPLET (icon)); dialog.ShowWithQuestion( fmt.Sprintf("You're about to remove this applet (%s) from the dock. Are you sure?", m.Icon.ModuleInstance().Module().VisitCard().GetTitle()), m.Icon, m.Container, "same icon", cbDialogIsOK(func() { gldi.ObjectDelete(m.Icon.ModuleInstance()) })) }) case MenuRemoveIcon: m.AddEntry( tran.Slate("Remove"), globals.IconNameRemove, func() { name := ternary.String(m.Icon.GetInitialName() != "", m.Icon.GetInitialName(), m.Icon.GetName()) if name == "" { name = ternary.String(m.Icon.IsSeparator(), tran.Slate("separator"), "no name") } dialog.ShowWithQuestion( fmt.Sprintf(tran.Slate("You're about to remove this icon (%s) from the dock. Are you sure?"), name), m.Icon, m.Container, "same icon", cbDialogIsOK(func() { if m.Icon.IsStackIcon() && m.Icon.GetSubDock() != nil && len(m.Icon.GetSubDock().Icons()) > 0 { dialog.ShowWithQuestion( tran.Slate("Do you want to re-dispatch the icons contained inside this container into the dock?\n(otherwise they will be destroyed)"), m.Icon, m.Container, globals.FileCairoDockIcon(), cbDialogIsOK(func() { m.Icon.RemoveIconsFromSubdock(m.Dock) })) } m.Icon.RemoveFromDock() })) }).SetTooltipText(tran.Slate("You can remove a launcher by dragging it out of the dock with the mouse .")) case MenuThemes: // pMenuItem = cairo_dock_add_in_menu_with_stock_and_data (_("Manage themes"), // CAIRO_DOCK_SHARE_DATA_DIR"/icons/icon-appearance.svg", // G_CALLBACK (_cairo_dock_initiate_theme_management), // pSubMenu, // NULL); // gtk_widget_set_tooltip_text (pMenuItem, _("Choose from amongst many themes on the server or save your current theme.")); case MenuWindowAbove: flag := m.Icon.Window().IsAbove() m.AddEntry( ternary.String(flag, tran.Slate("Don't keep above"), tran.Slate("Keep above")), ternary.String(flag, globals.IconNameGotoBottom, globals.IconNameGotoTop), m.Icon.CallbackActionWindowToggle((cdglobal.Window).SetAbove, (cdglobal.Window).IsAbove)) case MenuWindowBelow: if !m.Icon.Window().IsHidden() { // this could be a button in the menu, if we find an icon that doesn't look too much like the "minimise" one m.AddEntry( tran.Slate("Below other windows")+actionMiddleClick(m.Icon, 4), globals.DirShareData("icons", "icon-lower.svg"), m.Icon.CallbackActionWindow((cdglobal.Window).Lower)) } case MenuWindowFullScreen: flag := m.Icon.Window().IsFullScreen() m.AddEntry( ternary.String(flag, tran.Slate("Not Fullscreen"), tran.Slate("Fullscreen")), ternary.String(flag, globals.IconNameLeaveFullScreen, globals.IconNameFullScreen), m.Icon.CallbackActionWindowToggle((cdglobal.Window).SetFullScreen, (cdglobal.Window).IsFullScreen)) case MenuWindowKill: m.AddEntry( tran.Slate("Kill"), globals.IconNameClose, m.Icon.CallbackActionWindow((cdglobal.Window).Kill)) case MenuWindowMoveAllHere: m.AddEntry( tran.Slate("Move all to this desktop"), globals.IconNameJumpTo, m.Icon.CallbackActionSubWindows((cdglobal.Window).MoveToCurrentDesktop)) case MenuWindowMoveHere: var callback func() if !m.Icon.Window().IsOnCurrentDesktop() { callback = m.Icon.CallbackActionWindow(func(win cdglobal.Window) { win.MoveToCurrentDesktop() if !win.IsHidden() { win.Show() } }) } m.AddEntry(tran.Slate("Move to this desktop"), globals.IconNameJumpTo, callback) case MenuWindowSticky: m.AddEntry( ternary.String(m.Icon.Window().IsSticky(), tran.Slate("Visible only on this desktop"), tran.Slate("Visible on all desktops")), globals.IconNameJumpTo, m.Icon.CallbackActionWindowToggle((cdglobal.Window).SetSticky, (cdglobal.Window).IsSticky)) } return notif.AnswerLetPass }
// OnLeftClick triggers a dock left click action on the icon. // func OnLeftClick(icon gldi.Icon, container *gldi.Container, btnState uint) bool { switch { case icon == nil || !gldi.ObjectIsDock(container): log.Debug("notifClickIcon", "ignored: no icon or dock target") return notif.AnswerLetPass // With shift or ctrl on an icon that is linked to a program => re-launch this program. case gdk.ModifierType(btnState)&(gdk.GDK_SHIFT_MASK|gdk.GDK_CONTROL_MASK) > 0: if icon.IsLauncher() || icon.IsAppli() || icon.IsStackIcon() { icon.LaunchCommand(log) } return notif.AnswerLetPass // scale on an icon holding a class sub-dock (fallback: show all windows). case icon.IsMultiAppli() && current.Taskbar.PresentClassOnClick() && // if we want to use this feature (!current.Docks.ShowSubDockOnClick() || // if sub-docks are shown on mouse over icon.SubDockIsVisible() && // or this sub-dock is already visible icon.DesktopPresentClass()): // we use the scale plugin if it's possible icon.CallbackActionSubWindows((cdglobal.Window).Show)() // in case the dock is visible or about to be visible, hide it, as it would confuse the user to have both. // cairo_dock_emit_leave_signal (CAIRO_CONTAINER (icon->pSubDock)); return notif.AnswerIntercept // // else handle sub-docks showing on click, applis and launchers (not applets). // icon pointing to a sub-dock with either "sub-dock activation on click" option enabled, // or sub-dock not visible -> open the sub-dock case icon.GetSubDock() != nil && (current.Docks.ShowSubDockOnClick() || !icon.SubDockIsVisible()): icon.ShowSubdock(container.ToCairoDock()) return notif.AnswerIntercept // icon holding an appli, but not being an applet -> show/hide the window. case icon.IsAppli() && !icon.IsApplet(): // ne marche que si le dock est une fenĂȘtre de type 'dock', sinon il prend le focus. if icon.Window().IsActive() && current.Taskbar.MinimizeOnClick() && !icon.Window().IsHidden() && icon.Window().IsOnCurrentDesktop() { icon.Window().Minimize() } else { icon.Window().Show() } return notif.AnswerIntercept // icon holding a class sub-dock -> show/hide the windows of the class. case icon.IsMultiAppli(): if current.Docks.ShowSubDockOnClick() { hideShowInClassSubdock(icon) } return notif.AnswerIntercept // finally, launcher being none of the previous cases -> launch the command case icon.IsLauncher(): // if (! gldi_class_is_starting (icon->cClass) && ! gldi_icon_is_launching (icon)) {// do not launch it twice (avoid wrong double click) => if we want to launch it 2 times in a row, we have to use Shift + Click icon.LaunchCommand(log) return notif.AnswerIntercept // wasn't there in real dock. } // for applets and their sub-icons, let the module-instance handles the click; for separators, no action. // cd_debug ("no action here"); return notif.AnswerLetPass }