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   
end
 
 
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
            break
        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])
                    
            endif
        
            break
    
    // handle more events
    
    endswitch
    
    return 0
End
 
 
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;
            
            break
        case -1: // control being killed
            break
    endswitch
 
    return 0
End



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