Working method for focusing widgets in panels and keyboard navigation for Tasks applet
Marco Martin
notmart at gmail.com
Fri Aug 21 22:29:17 CEST 2009
On Friday 21 August 2009, Emdek wrote:
> Hello
>
> As we talked yesterday on IRC, on notmart request I'll now describe how
> works (to allow to discuss that on Tokamak) this quite simply hack,
> workaround, only sensible method (;-)) or name it whatever you like.
>
as i said it's kinda brutal, the alternative is making kwin give focus to
docks in a normal way, but it would have so many drawbacks...
using this in every applet is a big no no for sure, what about putting it in
PanelView slot and having Applet::focusRequested(QGraphicsWidget*) signal
connected to it?
not super-pretty as well, but i think it would be a good compromise
> Some background
>
> I've did Run Command applet in October (my first plasmoid and first Qt /
> KDE application ;-)) but i has two serious limitations in panels caused by
> two problems:
> - not working menu and completion box (Qt bug still not fixed as of Qt 4.5
> and setting that flag to bypass QGraphicsView doesn't help either - I've
> found method that returns completion widget and others needed);
> - and second, more important, not possible to focus widget when there are
> active windows on desktop.
>
> Second is now fixed, idea come to me when Lechio (Daisy developer)
> described me workaround for problem with determining if window should be
> minimized when clicking on task in task managers located on desktop (yes,
> strange inspiration ;-)).
> And then One idea come to me...
>
>
> How it works
>
> I've took code that finds parent view (similar to that from Corona, used
> in tool tip positioning) and if it finds valid one then i takes it WId and
> says KWindowSystem to force it activation.
> In case of my applet it looks like this:
>
>
> void RunCommandApplet::focusWidget()
> {
> if (scene())
> {
> QGraphicsView *parentView = NULL;
> QGraphicsView *possibleParentView = NULL;
>
> foreach (QGraphicsView *view, scene()->views())
> {
> if (view->sceneRect().intersects(sceneBoundingRect()) ||
> view->sceneRect().contains(scenePos()))
> {
> if (view->isActiveWindow())
> {
> parentView = view;
>
> break;
> }
> else
> {
> possibleParentView = view;
> }
> }
> }
>
> if (!parentView)
> {
> parentView = possibleParentView;
> }
>
> if (parentView)
> {
> KWindowSystem::forceActiveWindow(parentView->winId());
> }
> }
>
> raise();
>
> m_comboBox->setFocus();
>
> QTimer::singleShot(250, m_comboBox, SLOT(setFocus()));
> }
>
> That repeated setFocus() after delay is ugly but without it widget is not
> focused...
>
>
> How it could be done for Plasma
>
> I think that this could be used directly in Plasma, but not exposed (maybe
> in future there will be better solution, who knows).
> It could be invoked internally when shortcut is activated (maybe there
> will be need to delay emitting activation signal to applet) and for mouse
> press on panel (event filter needed? widgets can block events before they
> will go to containment, right?), and maybe in other places, for example to
> focus panel to have possibility to switch between applets using tab (I'm
> not using keyboard navigation so I don't know how it should work in this
> case ;-)).
> Maybe also for desktop, I'm not sure if widgets are focusable there when
> there are windows (for example not maximized).
>
>
> I hope that it will help somehow and I've finally done something that will
> be really useful for all. :-P
>
>
> By the way, I want to add keyboard navigation to Tasks applet (I've done
> it already for new version of my own task manager, Fancy Tasks) and I've
> some questions...
>
> It should use only Tab and Shift + Tab?
> Is there artwork for "focus" state?
> Windows should be switched when task are (I've two modes, with pressed
> Ctrl it only switches focus and icon, I don't have only tasks ;-), could
> be activated by pressing Enter)?
> Any other suggestions?
>
> I'll prepare patch probably in next week (busy working on own projects
> now, sorry) and I want to do it myself.
>
>
> Best regards,
> Michał
> _______________________________________________
> Plasma-devel mailing list
> Plasma-devel at kde.org
> https://mail.kde.org/mailman/listinfo/plasma-devel
--
Marco Martin
More information about the Plasma-devel
mailing list