Draw dimmer icons for windows of a different WM_CLASS when using GroupNext/PrevKey in the switchpanel.
From 31d24c7c3f7404d68b82cb9e087fbe4e6a9296c5 Mon Sep 17 00:00:00 2001
From: Iain Patterson <w...@iain.cx>
Date: Thu, 23 May 2013 14:54:35 +0100
Subject: [PATCH 2/2] Dim switchpanel icons when same-class cycling.

When cycling through windows in the switchpanel using the GroupNextKey
or GroupPrevKey shortcuts, dim the icons of windows which are of a
different WM_CLASS.
---
 src/switchpanel.c | 33 +++++++++++++++++++++------------
 1 file changed, 21 insertions(+), 12 deletions(-)

diff --git a/src/switchpanel.c b/src/switchpanel.c
index cedc487..6c8f6ea 100644
--- a/src/switchpanel.c
+++ b/src/switchpanel.c
@@ -105,7 +105,7 @@ static Bool sameWindowClass(WWindow *wwin, WWindow *curwin)
        return True;
 }
 
-static void changeImage(WSwitchPanel *panel, int idecks, int selected)
+static void changeImage(WSwitchPanel *panel, int idecks, int selected, Bool 
dim)
 {
        WMFrame *icon = WMGetFromArray(panel->icons, idecks);
        RImage *image = WMGetFromArray(panel->images, idecks);
@@ -115,7 +115,7 @@ static void changeImage(WSwitchPanel *panel, int idecks, 
int selected)
 
        if (image && icon) {
                RImage *back;
-               int opaq = 255;
+               int opaq = (dim) ? 75 : 255;
                RImage *tile;
                WMPoint pos;
                Pixmap p;
@@ -204,7 +204,7 @@ static void scrollIcons(WSwitchPanel *panel, int delta)
        panel->firstVisible = nfirst;
 
        for (i = panel->firstVisible; i < panel->firstVisible + 
panel->visibleCount; i++)
-               changeImage(panel, i, i == panel->current);
+               changeImage(panel, i, i == panel->current, 0);
 }
 
 /*
@@ -471,7 +471,7 @@ WSwitchPanel *wInitSwitchPanel(WScreen *scr, WWindow 
*curwin, Bool class_only)
        WMRealizeWidget(panel->win);
 
        WM_ITERATE_ARRAY(panel->windows, wwin, i) {
-               changeImage(panel, i, 0);
+               changeImage(panel, i, 0, False);
        }
 
        if (panel->bg) {
@@ -501,7 +501,7 @@ WSwitchPanel *wInitSwitchPanel(WScreen *scr, WWindow 
*curwin, Bool class_only)
 
        panel->current = WMGetFirstInArray(panel->windows, curwin);
        if (panel->current >= 0)
-               changeImage(panel, panel->current, 1);
+               changeImage(panel, panel->current, 1, False);
 
        WMMapWidget(panel->win);
 
@@ -564,15 +564,16 @@ void wSwitchPanelDestroy(WSwitchPanel *panel)
 
 WWindow *wSwitchPanelSelectNext(WSwitchPanel *panel, int back, int 
ignore_minimized, Bool class_only)
 {
-       WWindow *wwin, *curwin;
+       WWindow *wwin, *curwin, *tmpwin;
        int count = WMGetArrayItemCount(panel->windows);
        int orig = panel->current;
+       int i;
 
        if (count == 0)
                return NULL;
 
        if (panel->win)
-               changeImage(panel, panel->current, 0);
+               changeImage(panel, panel->current, 0, False);
 
        if (!wPreferences.cycle_ignore_minimized)
                ignore_minimized = False;
@@ -598,6 +599,14 @@ WWindow *wSwitchPanelSelectNext(WSwitchPanel *panel, int 
back, int ignore_minimi
                } while (!sameWindowClass(wwin, curwin));
        } while (ignore_minimized && panel->current != orig && 
canReceiveFocus(wwin) < 0);
 
+       WM_ITERATE_ARRAY(panel->windows, tmpwin, i) {
+               if (!class_only || sameWindowClass(tmpwin, curwin))
+                       changeImage(panel, i, 0, False);
+               else
+                       changeImage(panel, i, 0, True);
+
+       }
+
        if (panel->current < panel->firstVisible)
                scrollIcons(panel, panel->current - panel->firstVisible);
        else if (panel->current - panel->firstVisible >= panel->visibleCount)
@@ -606,7 +615,7 @@ WWindow *wSwitchPanelSelectNext(WSwitchPanel *panel, int 
back, int ignore_minimi
        if (panel->win) {
                drawTitle(panel, panel->current, wwin->frame->title);
 
-               changeImage(panel, panel->current, 1);
+               changeImage(panel, panel->current, 1, False);
        }
 
        return wwin;
@@ -621,7 +630,7 @@ WWindow *wSwitchPanelSelectFirst(WSwitchPanel *panel, int 
back)
                return NULL;
 
        if (panel->win)
-               changeImage(panel, panel->current, 0);
+               changeImage(panel, panel->current, 0, False);
 
        if (back) {
                panel->current = count - 1;
@@ -635,7 +644,7 @@ WWindow *wSwitchPanelSelectFirst(WSwitchPanel *panel, int 
back)
 
        if (panel->win) {
                drawTitle(panel, panel->current, wwin->frame->title);
-               changeImage(panel, panel->current, 1);
+               changeImage(panel, panel->current, 1, False);
        }
 
        return wwin;
@@ -662,8 +671,8 @@ WWindow *wSwitchPanelHandleEvent(WSwitchPanel *panel, 
XEvent *event)
        if (focus >= 0 && panel->current != focus) {
                WWindow *wwin;
 
-               changeImage(panel, panel->current, 0);
-               changeImage(panel, focus, 1);
+               changeImage(panel, panel->current, 0, False);
+               changeImage(panel, focus, 1, False);
                panel->current = focus;
 
                wwin = WMGetFromArray(panel->windows, focus);
-- 
1.8.1.4

Reply via email to