ListBox & ColorPopup

The following example illustrates what I would like to do: clicking into a colored listbox cell to change the color. The following method works but it would be MUCH nicer if 1) the popup occurs exactly where the mouse clicked and 2) if the popup ist being killed automatically after selecting a new color. I guess both can be accomplished using hook functions but I don't see how at the moment (which may reflect my ignorance for working with structures...).

Ideally a built-in ListBox option (just like checkbox) would exist.

Any thoughts are welcome!

function myPanel() : Panel

    Make/O/T/N=(20,3) wList
    SetDimlabel 1, 0, Index, wList
    SetDimlabel 1, 1, Color, wList
    SetDimlabel 1, 2, Stuff, wList
    Make/O/N=(20,3,2) sWave = 0
    Make/O/N=(20,3) cWave = trunc(abs(enoise(65535)))
    wList[][0] = num2str(p)
    wList[][2] = "blah"

    NewPanel/K=1/N=TestPanel /W=(600,100,1300,500)
    ListBox list0,pos={50,50},size={600,300},listWave=wlist
    ListBox list0,selWave=sWave, colorWave = cWave, proc=myListBoxProc
    ListBox list0,fsize = 12, frame=3, userColumnResize=1
    //set color of second column
    sWave[][1][1]= p
    SetDimLabel 2,1,backColors, sWave  

Function myListBoxProc(lba) : ListBoxControl
    STRUCT WMListboxAction &lba
    Variable row = lba.row
    Variable col = lba.col
    WAVE/T/Z listWave = lba.listWave
    WAVE/Z cWave = lba.colorWave   
    switch( lba.eventCode )
        case -1: // control being killed
        case 1: // mouse down
            // clicked on color
            if(col == 1)
                variable/g WhichRow = row
                //get a color popup            
                GetWindow TestPanel wsizeRM
                variable top, left
                top = V_top * ScreenResolution/72
                left = V_left * ScreenResolution/72
                NewPanel/K=1 /N=cpop /W=(left+200, top+200, left+250, top+220)
                PopupMenu popup0 value="*COLORPOP*", proc = myPopMenuProc
                PopupMenu popup0 popColor=(cWave[row][0],cWave[row][1],cWave[row][2])
    // handle more events
    return 0

Function myPopMenuProc(pa) : PopupMenuControl
    STRUCT WMPopupAction &pa
    wave/Z cWave
    NVAR WhichRow
    variable rr, gg, bb
    switch( pa.eventCode )
        case 2: // mouse up
            Variable popNum = pa.popNum
            String popStr = pa.popStr
            sscanf popstr, "(%g,%g,%g)", rr,gg,bb  
            cWave[WhichRow][0] = rr; cWave[WhichRow][1] = gg; cWave[WhichRow][2] = bb;
        case -1: // control being killed

    return 0

EDIT: ok, I found a solution to problem 1). I overlooked mouseLoc.