Open Side Menu Go to the Top
Register
AHK Script: Stacked Table Previewer AHK Script: Stacked Table Previewer

11-15-2010 , 09:15 AM
AHK script which shows thumbnail previews of all open stars tables. Like those that show when you hover over the task bar except all tables are shown rather than just the one hovered over.

Image below shows 14 tables stacked on the left. On the right is the thumbnail previews of all 14 tables in a preview window. Requires Vista/Windows7 with aero turned on.
Uploaded with ImageShack.us[/IMG]

Code:
; freo's Stacked Table Previewer for PokerStars v1.0
; Shows thumbnails of all stacked tables in a preview window
; Only works in Vista/Windows7 with aero enabled
; 'clay973' on PS for donations


#SingleInstance Force
#NoEnv

DetectHiddenWindows,On
SetTitleMatchMode, 2

;------------------------------------------------------------------------------------------------------------------
;User defined settings
hostwindoww=800         ;Host preview window width             
hostwindowh=990        ;Host preview window height
hostwindowx=870         ;Host preview window x position on screen
hostwindowy=0           ;Host preview window y position on screen
ptablebasew=483         ;Poker table base resolution (For stars this is the smallest table resolution (483 x 353)
ptablebaseh=353
refreshrate=3000        ;Number of seconds to wait between refreshes (1000 = 1 second)
;------------------------------------------------------------------------------------------------------------------

hModule := DllCall("LoadLibrary", "str", "dwmapi.dll")       ;Load dwmapi.dll for handling thumbnails
ptablehwratio := ptablebaseh / ptablebasew                  ;Ratio used for scaling thumbnail window size
SysGet, borderxa, 45                                         ;Size of the x window 3D border
Sysget, borderya, 46                                         ;Size of the y window 3D border
Sysget, captionha, 4                                         ;Size of the caption
Sysget, borderxb, 5                                          ;Size of the x window normal border
Sysget, borderyb, 6                                          ;Size of the y window normal border
borderx := borderxa + borderxb                               ;Total size of the x border
bordery := borderya + borderyb                               ;Total size of the y border
captionh := captionha + borderyb                             ;Total size of the caption
clientareah := hostwindowh - bordery - captionh              ;Height of the area thumbnail windows can be placed in
clientareaw := hostwindoww - borderx - borderx               ;Width of the area thumbnail windows can be placed in

;Create preview window
Gui, 99: +LastFound +LabelForm1_                            
target := WinExist()
Gui, 99: Show, w%hostwindoww% h%hostwindowh% x%hostwindowx% y%hostwindowy%, Table Preview

;Create Empty variables for storing thumbnail links
Loop, 98
{
    source%A_Index%_hnd:=0
    source%A_Index%_thumb:=0
    source%A_Index%_wide:=0
}

;Show existing tables
WinGet, list, list, Logged In as, ,PokerStars Lobby        ;Get list of open tables
;WinGet, list, list, Windows Internet Explorer              ;For testing. Shows internet explorer windows instead of poker tables
    
;Need to filter out false windows that have no controls
tblcount:=0
Loop, %list%
{
    thisid:=list%A_Index%
    WinGet,ctrllist,ControlList,ahk_id %thisid%
    ;WinGetTitle,thistitle,ahk_id %thisid%
    If (ctrllist != "") and (thisid > 0)
    {
        tblcount+=1
        tblcount%tblcount%:=list%A_Index%
    }    
}

currentcnt:=tblcount                           

;Calculate child window size and number per row
tablesw := numtablesw(currentcnt)
childwinw := Floor(calcwinsize(tablesw, currentcnt))
childwinh := Floor(childwinw * ptablehwratio)

;Create child windows for tables already open
Loop, %tblcount%
{
    thisid:=tblcount%A_Index%
    addchild(A_Index, thisid)
}

;Infinite loop to monitor table opens, closes & resizes.
Loop,
{    
    Sleep, %refreshrate%
    
    wasredrawn:=0
    
    ;Find any closed tables
    Loop, 98
    {
        thishnd:=source%A_Index%_hnd
        if (thishnd > 0)
        {
            IfWinNotExist, ahk_id %thishnd%
            {
                source%A_Index%_hnd:=0
                source%A_Index%_thumb:=0
                source%A_Index%_wide:=0
            }
        }
    }
        
    ;Get new list of tables
    WinGet, list, list, Logged In as, ,PokerStars Lobby        ;Get list of open tables
    ;WinGet, list, list, Windows Internet Explorer               ;For testing. Shows internet explorer windows instead of poker tables
    
    ;Need to filter out false windows that have no controls
    tblcount:=0
    Loop, %list%
    {
        thisid:=list%A_Index%
        WinGet,ctrllist,ControlList,ahk_id %thisid%
        WinGetTitle,thistitle,Title,ahk_id %thisid%
        If (ctrllist != "") and (thisid > 0)
        {
            tblcount+=1
            tblcount%tblcount%:=list%A_Index%
        }    
    }    
    
    ;Find any new tables
    Loop, %tblcount%
    {
        thishnd:=tblcount%A_Index%
        found:=0
        Loop,98
        {
            if (source%A_Index%_hnd = thishnd)
            {
                found:=1
                break            
            }
        }
        
        ;New table found
        if (found = 0)
        {
            ;Find first avail slot
            newslot:=0
            Loop,98
            {
                if (source%A_Index%_hnd = 0)
                {
                    newslot:=A_Index
                    break                    
                }
            }

            ;Determine whether an existing slot is available or a recalculation is required as its a new slot.
            if (newslot <= currentcnt)         ;Existing slot taken, no recalc required
            {
                addchild(newslot, thishnd)
            }
            else                                ;Need to recalculate to determine if new rows or columns are required
            {
                currentcnt += 1
                oldcols:=tablesw
                oldw:=childwinw
                tablesw := numtablesw(currentcnt)
                childwinw := Floor(calcwinsize(tablesw, currentcnt))
                childwinh := Floor(childwinw * ptablehwratio)
                if (oldcols = tablesw) and (oldw = childwinw)       ;Still a slot left at the end of the current config
                    addchild(newslot, thishnd)
                else                                                ;Need to redraw all thumbnails with diff config
                {
                    Loop, 98
                    {
                        unregisterthumbnail(source%A_Index%_thumb)            ;Unregister existing thumbs                         
                    }
                    
                    Loop, %tblcount%
                    {
                        if(A_Index < tblcount)
                        {
                            thisid:=source%A_Index%_hnd
                            addchild(A_Index, thisid)
                        }
                        else
                        {
                            thisid:=tblcount%A_Index%
                            addchild(A_Index, thishnd)
                        }
                    }
                    wasredrawn:=1
                }
            }
        }
    }
    
    ;Check if any tables have been resized and if so, redraw
    if (wasredrawn = 0)                 
    {
        Loop, %tblcount%
        {
            retable:=source%A_Index%_hnd
            WinGetPos,wx,wy,ww,wh,ahk_id %retable%
            if (ww != source%A_Index%_wide)
            {
                unregisterthumbnail(source%A_Index%_thumb)
                addchild(A_Index, retable)
            }
        }
    }
}

Return


;Function to register the thumbnail to the GUI
registerthumbnail(target, source, thumbnum)
{
    Global    
    
    VarSetCapacity(thumbnail,4,0)
    hr1:=DllCall("dwmapi\DwmRegisterThumbnail",UInt,target,UInt,source,UInt, &thumbnail)
    thumbnail:=Numget(thumbnail,0,true)
    source%thumbnum%_hnd:=source
    source%thumbnum%_thumb:=thumbnail
    
    updatethumbnail(source, thumbnum, thumbnail)
}

;Function sets thumbnail properties and displays
updatethumbnail(source, thumbnum, thumbnail)
{    
    /*
    DWM_TNP_RECTDESTINATION (0x00000001)
    Indicates a value for rcDestination has been specified.
    DWM_TNP_RECTSOURCE (0x00000002)
    Indicates a value for rcSource has been specified.
    DWM_TNP_OPACITY (0x00000004)
    Indicates a value for opacity has been specified.
    DWM_TNP_VISIBLE (0x00000008)
    Indicates a value for fVisible has been specified.
    DWM_TNP_SOURCECLIENTAREAONLY (0x00000010)
    Indicates a value for fSourceClientAreaOnly has been specified.
    */
    
    Global  
    
    dwFlags:=0X1 | 0x2 | 0x10
    opacity:=150
    fVisible:=1
    fSourceClientAreaOnly:=1
    
    ;Determine where to position thumbnail based on its number
    rownum := Ceil(thumbnum / tablesw)
    colnum := Mod(thumbnum - 1,tablesw)
    newx := ((colnum) * childwinw)
    newy := ((rownum - 1) * childwinh)
    neww := newx + childwinw
    newh := newy + childwinh
    
    WinGetPos,wx,wy,ww,wh,ahk_id %source%
    
    VarSetCapacity(dskThumbProps,45,0)
    ;struct _DWM_THUMBNAIL_PROPERTIES
    NumPut(dwFlags,dskThumbProps,0,"UInt")
    NumPut(newx,dskThumbProps,4,"Int")                     ;x coord in relation to the target
    NumPut(newy,dskThumbProps,8,"Int")                     ;y coord in relation to the target
    NumPut(neww,dskThumbProps,12,"Int")                   ;x coord of bottom of the thumb in relation to the target
    NumPut(newh,dskThumbProps,16,"Int")                   ;y coord of the right edge of the thumb in relation to the target
    NumPut(0,dskThumbProps,20,"Int")                      ;x coord of target to start thumb
    NumPut(0,dskThumbProps,24,"Int")                      ;y coord of target to start thumb
    NumPut(ww,dskThumbProps,28,"Int")                    ;x coord of bottom of the thumb in relation to the source
    NumPut(wh,dskThumbProps,32,"Int")                    ;y coord of the right edge of the thumb in relation to the source
    NumPut(opacity,dskThumbProps,36,"UChar")
    NumPut(fVisible,dskThumbProps,37,"Int")
    NumPut(fSourceClientAreaOnly,dskThumbProps,41,"Int")
    hr2:=DllCall("dwmapi\DwmUpdateThumbnailProperties","UInt",thumbnail,"UInt",&dskThumbProps) 
    source%thumbnum%_wide:=ww
}


unregisterthumbnail(unthumbnail)
{
    ur1:=DllCall("dwmapi.dll\DwmUnregisterThumbnail", "UInt", unthumbnail)
}


;Function to determine the optimal number of tables wide to show in preview window
numtablesw(totaltables)
{
    if(totaltables > "1")
    {   
        global clientareah
        global clientareaw
        global ptablehwratio
        
        wsize := 0
        wnum := 0
        
        ;The loop value will equal the number of tables per row
        Loop,%totaltables%
        {            
            thiswsize := floor(calcwinsize(A_Index, totaltables))
            
            if (thiswsize >= wsize)
            {    
                wsize := thiswsize
                wnum := A_Index
            }
        }
        return, %wnum%
    }
    Else 
    {
        return, 1
    }
}

;Calculates child window size based on number of tables per row
calcwinsize(tblperrow, totaltables)
{
    global clientareaw
    global clientareah
    global ptablehwratio
    
    calcwsize := clientareaw / tblperrow
    calcrownum := ceil(totaltables / tblperrow)
            
    if ((clientareah / calcrownum) < (ptablehwratio * calcwsize))
    {
        calcwsize := (1 / ptablehwratio) * (clientareah / calcrownum)
    }
    
    Return, calcwsize    
}

;Adds child window to the preview pane
addchild(usenum, previewid)
{
    Global childwinw
    Global childwinh
    Global hostwindoww
    Global hostwindowh
    Global target

    if (usenum > 0) ;If usenum is 0 it is not part of the initial load of existing windows
    {
        registerthumbnail(target, previewid, usenum)
        Return
    }
}

Form1_Close:
	ExitApp
return
AHK Script: Stacked Table Previewer Quote
11-15-2010 , 12:10 PM
very cool, nice work.
AHK Script: Stacked Table Previewer Quote
11-15-2010 , 03:34 PM
Yes, very cool indeed!
AHK Script: Stacked Table Previewer Quote
11-15-2010 , 05:29 PM
How could I change the script to make the preview window bigger???
AHK Script: Stacked Table Previewer Quote
11-15-2010 , 05:47 PM
I guess those "hostwindow" lines at the start of the script - there's a short section
Code:
;User defined settings
AHK Script: Stacked Table Previewer Quote
11-15-2010 , 05:57 PM
ty, that worked nicely.
AHK Script: Stacked Table Previewer Quote
11-15-2010 , 06:05 PM
Great script. So awesome to finally have this, will send a donation.

Of course, in keeping with the tradition of those who have received something good but want something more, how difficult is it to make it so that clicking on a table in the preview calls up that table? I'm guessing this is a major project, unfortunately...
AHK Script: Stacked Table Previewer Quote
11-15-2010 , 06:15 PM
That was my first thought also - Ideally I'd want the previews almost "active",but an option to just bring to front would be similar in difficulty. It would be great for clicking "I'm Back", or leaving tables, or even advance-folding EP-Trash hands etc.

I *think* any of the above isn't too hard - but I can't do anything as I don't have a Vista / Win7 box. Which has always not bothered me... but similarly this is something I have always wanted since I started stacking.

Hopefully Freo starts posting more
AHK Script: Stacked Table Previewer Quote
11-15-2010 , 08:05 PM
Here you go, changes i've made are shown in red
Code:
; freo's Stacked Table Previewer for PokerStars v1.0
; Shows thumbnails of all stacked tables in a preview window
; Only works in Vista/Windows7 with aero enabled
; 'clay973' on PS for donations


#SingleInstance Force
#NoEnv

DetectHiddenWindows,On
SetTitleMatchMode, 2

OnMessage(0x201,"activatethumbsource")
;------------------------------------------------------------------------------------------------------------------
;User defined settings
hostwindoww=800         ;Host preview window width             
hostwindowh=990        ;Host preview window height
hostwindowx=870         ;Host preview window x position on screen
hostwindowy=0           ;Host preview window y position on screen
ptablebasew=483         ;Poker table base resolution (For stars this is the smallest table resolution (483 x 353)
ptablebaseh=353
refreshrate=3000        ;Number of seconds to wait between refreshes (1000 = 1 second)
;------------------------------------------------------------------------------------------------------------------


hModule := DllCall("LoadLibrary", "str", "dwmapi.dll")       ;Load dwmapi.dll for handling thumbnails
ptablehwratio := ptablebaseh / ptablebasew                  ;Ratio used for scaling thumbnail window size
SysGet, borderxa, 45                                         ;Size of the x window 3D border
Sysget, borderya, 46                                         ;Size of the y window 3D border
Sysget, captionha, 4                                         ;Size of the caption
Sysget, borderxb, 5                                          ;Size of the x window normal border
Sysget, borderyb, 6                                          ;Size of the y window normal border
borderx := borderxa + borderxb                               ;Total size of the x border
bordery := borderya + borderyb                               ;Total size of the y border
captionh := captionha + borderyb                             ;Total size of the caption
clientareah := hostwindowh - bordery - captionh              ;Height of the area thumbnail windows can be placed in
clientareaw := hostwindoww - borderx - borderx               ;Width of the area thumbnail windows can be placed in

;Create preview window
Gui, 99: +LastFound +LabelForm1_                            
target := WinExist()
Gui, 99: Show, w%hostwindoww% h%hostwindowh% x%hostwindowx% y%hostwindowy%, Table Preview

;Create Empty variables for storing thumbnail links
Loop, 98
{
    source%A_Index%_hnd:=0
    source%A_Index%_thumb:=0
    source%A_Index%_wide:=0
}

;Show existing tables
;WinGet, list, list, Logged In as, ,PokerStars Lobby        ;Get list of open tables
;WinGet, list, list, Windows Internet Explorer              ;For testing. Shows internet explorer windows instead of poker tables
 WinGet, list, list, ahk_class PokerStarsTableFrameClass
 
;Need to filter out false windows that have no controls
tblcount:=0
Loop, %list%
{
    thisid:=list%A_Index%
    WinGet,ctrllist,ControlList,ahk_id %thisid%
    ;WinGetTitle,thistitle,ahk_id %thisid%
    If (ctrllist != "") and (thisid > 0)
    {
        tblcount+=1
        tblcount%tblcount%:=list%A_Index%
    }    
}

currentcnt:=tblcount                           

;Calculate child window size and number per row
tablesw := numtablesw(currentcnt)
childwinw := Floor(calcwinsize(tablesw, currentcnt))
childwinh := Floor(childwinw * ptablehwratio)

;Create child windows for tables already open
Loop, %tblcount%
{
    thisid:=tblcount%A_Index%
    addchild(A_Index, thisid)
}


;Infinite loop to monitor table opens, closes & resizes.
Loop,
{    
    Sleep, %refreshrate%
    
    wasredrawn:=0
    
    ;Find any closed tables
    Loop, 98
    {
        thishnd:=source%A_Index%_hnd
        if (thishnd > 0)
        {
            IfWinNotExist, ahk_id %thishnd%
            {
                source%A_Index%_hnd:=0
                source%A_Index%_thumb:=0
                source%A_Index%_wide:=0
            }
        }
    }
        
    ;Get new list of tables
    ;WinGet, list, list, Logged In as, ,PokerStars Lobby        ;Get list of open tables
    ;WinGet, list, list, Windows Internet Explorer               ;For testing. Shows internet explorer windows instead of poker tables
    WinGet, list, list, ahk_class PokerStarsTableFrameClass

    ;Need to filter out false windows that have no controls
    tblcount:=0
    Loop, %list%
    {
        thisid:=list%A_Index%
        WinGet,ctrllist,ControlList,ahk_id %thisid%
        WinGetTitle,thistitle,Title,ahk_id %thisid%
        If (ctrllist != "") and (thisid > 0)
        {
            tblcount+=1
            tblcount%tblcount%:=list%A_Index%
        }    
    }    
    
    ;Find any new tables
    Loop, %tblcount%
    {
        thishnd:=tblcount%A_Index%
        found:=0
        Loop,98
        {
            if (source%A_Index%_hnd = thishnd)
            {
                found:=1
                break            
            }
        }
        
        ;New table found
        if (found = 0)
        {
            ;Find first avail slot
            newslot:=0
            Loop,98
            {
                if (source%A_Index%_hnd = 0)
                {
                    newslot:=A_Index
                    break                    
                }
            }

            ;Determine whether an existing slot is available or a recalculation is required as its a new slot.
            if (newslot <= currentcnt)         ;Existing slot taken, no recalc required
            {
                addchild(newslot, thishnd)
            }
            else                                ;Need to recalculate to determine if new rows or columns are required
            {
                currentcnt += 1
                oldcols:=tablesw
                oldw:=childwinw
                tablesw := numtablesw(currentcnt)
                childwinw := Floor(calcwinsize(tablesw, currentcnt))
                childwinh := Floor(childwinw * ptablehwratio)
                if (oldcols = tablesw) and (oldw = childwinw)       ;Still a slot left at the end of the current config
                    addchild(newslot, thishnd)
                else                                                ;Need to redraw all thumbnails with diff config
                {
                    Loop, 98
                    {
                        unregisterthumbnail(source%A_Index%_thumb)            ;Unregister existing thumbs                         
                    }
                    
                    Loop, %tblcount%
                    {
                        if(A_Index < tblcount)
                        {
                            thisid:=source%A_Index%_hnd
                            addchild(A_Index, thisid)
                        }
                        else
                        {
                            thisid:=tblcount%A_Index%
                            addchild(A_Index, thishnd)
                        }
                    }
                    wasredrawn:=1
                }
            }
        }
    }
    
    ;Check if any tables have been resized and if so, redraw
    if (wasredrawn = 0)                 
    {
        Loop, %tblcount%
        {
            retable:=source%A_Index%_hnd
            WinGetPos,wx,wy,ww,wh,ahk_id %retable%
            if (ww != source%A_Index%_wide)
            {
                unregisterthumbnail(source%A_Index%_thumb)
                addchild(A_Index, retable)
            }
        }
    }
}

Return


;Function to register the thumbnail to the GUI
registerthumbnail(target, source, thumbnum)
{
    Global    
    
    VarSetCapacity(thumbnail,4,0)
    hr1:=DllCall("dwmapi\DwmRegisterThumbnail",UInt,target,UInt,source,UInt, &thumbnail)
    thumbnail:=Numget(thumbnail,0,true)
    source%thumbnum%_hnd:=source
    source%thumbnum%_thumb:=thumbnail
    
    updatethumbnail(source, thumbnum, thumbnail)
}

;Function sets thumbnail properties and displays
updatethumbnail(source, thumbnum, thumbnail)
{    
    /*
    DWM_TNP_RECTDESTINATION (0x00000001)
    Indicates a value for rcDestination has been specified.
    DWM_TNP_RECTSOURCE (0x00000002)
    Indicates a value for rcSource has been specified.
    DWM_TNP_OPACITY (0x00000004)
    Indicates a value for opacity has been specified.
    DWM_TNP_VISIBLE (0x00000008)
    Indicates a value for fVisible has been specified.
    DWM_TNP_SOURCECLIENTAREAONLY (0x00000010)
    Indicates a value for fSourceClientAreaOnly has been specified.
    */
    
    Global  
    
    dwFlags:=0X1 | 0x2 | 0x10
    opacity:=150
    fVisible:=1
    fSourceClientAreaOnly:=1
    
    ;Determine where to position thumbnail based on its number
    rownum := Ceil(thumbnum / tablesw)
    colnum := Mod(thumbnum - 1,tablesw)
    newx := ((colnum) * childwinw)
    newy := ((rownum - 1) * childwinh)
    neww := newx + childwinw
    newh := newy + childwinh
    
    WinGetPos,wx,wy,ww,wh,ahk_id %source%
    
    VarSetCapacity(dskThumbProps,45,0)
    ;struct _DWM_THUMBNAIL_PROPERTIES
    NumPut(dwFlags,dskThumbProps,0,"UInt")
    NumPut(newx,dskThumbProps,4,"Int")                     ;x coord in relation to the target
    NumPut(newy,dskThumbProps,8,"Int")                     ;y coord in relation to the target
    NumPut(neww,dskThumbProps,12,"Int")                   ;x coord of bottom of the thumb in relation to the target
    NumPut(newh,dskThumbProps,16,"Int")                   ;y coord of the right edge of the thumb in relation to the target
    NumPut(0,dskThumbProps,20,"Int")                      ;x coord of target to start thumb
    NumPut(0,dskThumbProps,24,"Int")                      ;y coord of target to start thumb
    NumPut(ww,dskThumbProps,28,"Int")                    ;x coord of bottom of the thumb in relation to the source
    NumPut(wh,dskThumbProps,32,"Int")                    ;y coord of the right edge of the thumb in relation to the source
    NumPut(opacity,dskThumbProps,36,"UChar")
    NumPut(fVisible,dskThumbProps,37,"Int")
    NumPut(fSourceClientAreaOnly,dskThumbProps,41,"Int")
    hr2:=DllCall("dwmapi\DwmUpdateThumbnailProperties","UInt",thumbnail,"UInt",&dskThumbProps) 
    source%thumbnum%_wide:=ww
}


unregisterthumbnail(unthumbnail)
{
    ur1:=DllCall("dwmapi.dll\DwmUnregisterThumbnail", "UInt", unthumbnail)
}


;Function to determine the optimal number of tables wide to show in preview window
numtablesw(totaltables)
{
    if(totaltables > "1")
    {   
        global clientareah
        global clientareaw
        global ptablehwratio
        
        wsize := 0
        wnum := 0
        
        ;The loop value will equal the number of tables per row
        Loop,%totaltables%
        {            
            thiswsize := floor(calcwinsize(A_Index, totaltables))
            
            if (thiswsize >= wsize)
            {    
                wsize := thiswsize
                wnum := A_Index
            }
        }
        return, %wnum%
    }
    Else 
    {
        return, 1
    }
}

;Calculates child window size based on number of tables per row
calcwinsize(tblperrow, totaltables)
{
    global clientareaw
    global clientareah
    global ptablehwratio
    
    calcwsize := clientareaw / tblperrow
    calcrownum := ceil(totaltables / tblperrow)
            
    if ((clientareah / calcrownum) < (ptablehwratio * calcwsize))
    {
        calcwsize := (1 / ptablehwratio) * (clientareah / calcrownum)
    }
    
    Return, calcwsize    
}

;Adds child window to the preview pane
addchild(usenum, previewid)
{
    Global childwinw
    Global childwinh
    Global hostwindoww
    Global hostwindowh
    Global target

    if (usenum > 0) ;If usenum is 0 it is not part of the initial load of existing windows
    {
        registerthumbnail(target, previewid, usenum)
        Return
    }
}

Form1_Close:
	ExitApp
return

activatethumbsource(wparam)
{
local id,win,mousex,mousey,thumbx,thumby,thumbleftxpos,thumbrightxpos,thumbtopypos,thumbbottomypos
coordmode,mouse,relative
mousegetpos,mousex,mousey,id
if (id=target)
{
thumbx:=borderxb+borderxa
thumby:=captionh
loop 98
{
 thumbleftxpos:=thumbx
 thumbrightxpos:=thumbx+childwinw
 thumbtopypos:=thumby
 thumbbottomypos:=thumby+childwinh
 if (mousex>thumbleftxpos) & (mousex<thumbrightxpos) & (mousey>thumbtopypos) & (mousey<thumbbottomypos)
 {
  win:=source%A_Index%_hnd
  winactivate,ahk_id%win%
  break
 }
 thumbx+=childwinw
 if (thumbx+childwinw>hostwindoww)
 {
  thumby+=childwinh
  thumbx:=borderxb+borderxa
 }
}
}
}
return

Last edited by _dave_; 11-16-2010 at 03:34 AM.
AHK Script: Stacked Table Previewer Quote
11-15-2010 , 08:09 PM
wow, this is really awesome. thank you.
AHK Script: Stacked Table Previewer Quote
11-15-2010 , 08:24 PM
Hey guys, glad you like it. Thanks Max1mums for the table activation change, I havent had a chance a test that yet as i've been asleep (I live in Australia).

My thoughts for the next steps for this would be to make the preview window resizable, and also possibly be able to close the table by clicking to top right corner of the preview. Would this be useful or a waste of time?
AHK Script: Stacked Table Previewer Quote
11-15-2010 , 08:33 PM
being able to close would be very useful imo
AHK Script: Stacked Table Previewer Quote
11-15-2010 , 08:33 PM
Dude, the close table option would be the absolute nuts. At this rate I'm going to be donating to you once a day, stop pulling this holding features back crap. (Joking.)

Thanks for an awesome script.
AHK Script: Stacked Table Previewer Quote
11-15-2010 , 08:38 PM
Just a note on the settings you can change:

;User defined settings
hostwindoww=800 ;Host preview window width
hostwindowh=990 ;Host preview window height
hostwindowx=870 ;Host preview window x position on screen
hostwindowy=0 ;Host preview window y position on screen
ptablebasew=483 ;Poker table base resolution (For stars this is the smallest table resolution (483 x 353)
ptablebaseh=353
refreshrate=3000 ;Number of seconds to wait between refreshes (1000 = 1 second)


As indicated by _dave_ you can change the height and width of the preview window by changing hostwindoww and hostwindowh.

You can also change where it appears on the screen using hostwindowx and hostwindowy.

Note also that this should work with any type of app, including other poker sites. If you want to use it for another site you just need to change the ptablebasew and ptablebaseh to the size of that site's tables. This is used to optimize the number of tables wide and high that fit into the preview pane. You then need to change wherever you see this line to suit the title of your windows:
WinGet, list, list, Logged In as, ,PokerStars Lobby

As an example, for testing I used Internet Explorer windows
WinGet, list, list, Windows Internet Explorer
AHK Script: Stacked Table Previewer Quote
11-15-2010 , 08:59 PM
Quote:
Originally Posted by Michael Davis
Dude, the close table option would be the absolute nuts. At this rate I'm going to be donating to you once a day, stop pulling this holding features back crap. (Joking.)

Thanks for an awesome script.
tis!

would be nice if you could pm me ur sn... i will donate something end of the month as well... pretty awesome work...
AHK Script: Stacked Table Previewer Quote
11-15-2010 , 09:01 PM
My stars SN is on the 4th line of the script. 'clay973'

Thanks to those who have donated, I really appreciate it.
AHK Script: Stacked Table Previewer Quote
11-15-2010 , 09:05 PM
Ok, looks like the close table option will be the next thing to look at. I just want to revise the table activation script first as I think the method posted by Max1mums restricts the script to Pokerstars. I was hoping to keep it so that the script would work with any app, particularly other poker sites.
AHK Script: Stacked Table Previewer Quote
11-15-2010 , 09:16 PM
freo, why do you think so? It worked fine for me with FullTilt tables and explorer windows as well. The only thing is that not all poker tables have controls on them (eg fulltilt, ongame tables) so these lines
Code:
;Need to filter out false windows that have no controls
tblcount:=0
Loop, %list%
{
    thisid:=list%A_Index%
    WinGet,ctrllist,ControlList,ahk_id %thisid%
    ;WinGetTitle,thistitle,ahk_id %thisid%
    If (ctrllist != "") and (thisid > 0)
    {
        tblcount+=1
        tblcount%tblcount%:=list%A_Index%
    }    
}
should be replaced with
Code:
tblcount:=0
Loop, %list%
{
    if thisid:=list%A_Index%
    {
        tblcount++
        tblcount%tblcount%:=list%A_Index%
    }    
}
and title pattern should be chosen carefully to avoid popups/lobbies etc, eg for FullTilt
Code:
WinGet, list, list, Logged In ahk_class QWidget,,Full Tilt
It would be better to create own Gui control for every slot of course.
AHK Script: Stacked Table Previewer Quote
11-15-2010 , 09:26 PM
I thought PS and FTP were the only sites where stacking was a viable option, don't others all have issues with tables not popping up / correct ordering? Tho with table activation this script may alleviate that somewhat.
AHK Script: Stacked Table Previewer Quote
11-15-2010 , 09:29 PM
Max1mus, you may be correct, I havent had a chance to test your changes yet as i am at work.

In relation to the blank controls, unfortunately when you select a table using the icon on the task bar it creates a taskbar thumbnail real quick before activating the table which gets picked up by the list command and then created a blank slot. The only way i could think to filter that out to avoid blank slots was to filter out those windows with no controls.
AHK Script: Stacked Table Previewer Quote
11-15-2010 , 09:39 PM
Those thumbnails have class "TaskListThumbnailWnd" so it should be easy to filter them eg "if class!=TaskListThumbnailWnd", specifying window class in winget,list function should solve this problem too eg for explorer windows "WinGet, list, list, Windows Internet Explorer ahk_class IEFrame" will sort thumbs out.
Good job anyway, gl with the script.
AHK Script: Stacked Table Previewer Quote
11-15-2010 , 09:51 PM
Thanks for the tips Max1mums, i'll give them a try. I'm not a programmer so some of my code may be a bit clunky. It's been a good learning exercise for me.
AHK Script: Stacked Table Previewer Quote
11-15-2010 , 10:02 PM
Once you start messing with DllCall, VarSetCapacity & NumPut to make structs I think that def. makes you a programmer lol.
AHK Script: Stacked Table Previewer Quote
11-16-2010 , 02:09 AM
This is a very nice script. I do not stack because I seem to feel that I am at the mercy of the table that needs action. This script might just be the thing that converts me so tyvm

It is also great to see Max1mums helping out. He edited bits of the mark current hand script and thanks to him it is the first thing I open when I play a session.

One question I have is that it seems this does not auto update. If I have 20 tables open, close 10 and open 10 new ones I can only see the remaining 10 from the start unless I right click > reload script. Is there an AHK command that can be used to reload/refresh the script every x seconds? (Sorry I have zero point zero knowledge of this stuff and can only see a refresh rate in the AHK for the table itself, not the table preview, unless I misunderstood it.)

Thanks once again to both people who have worked on this and dave for posting it in the SNE thread otherwise I might have missed it
AHK Script: Stacked Table Previewer Quote
11-16-2010 , 02:14 AM
Furio, it should add tables as they are opened and remove them as they are closed. It does so for me.

Are you using the original script or Max1mus modified one? If so please try the original script to see if it loads new tables correctly. As I said, mine does but I dont yet have Max1mums changes added.

I'm hoping to have the table close feature done soon.
AHK Script: Stacked Table Previewer Quote

      
m