Project

General

Profile

[Script] Simple window layout manager

Added by Per Amundsen about 6 years ago

Save all open status/channel window sizes and positions to a profile.

Restore saved window sizes and positions from a profile.

Changes

08/17/2020

Fixed a missing parenthese

04/18/2018

Added a check for empty/broken profile names
Fixed allow using spaces in profile names
Fixed restoring and removing layouts doesn't work properly

04/16/2018

Added option to activate windows on restore

Script

on *:START:{
  if ($exists(windowlayout.ini)) { 
    var %s 0, %c $ini(windowlayout.ini, 0)
    while (%s < %c) {
      inc %s
      var %section $ini(windowlayout.ini, %s)
      hload -mi %section windowlayout.ini %section
    }
  }
}

menu * {
  Save layout:savelayout $$input(Enter name, e)
  Remove layout
  .$submenu($removelayoutlist($1)))
  Load layout
  .$submenu($loadlayoutlist($1)))
  Layout options
  .Activate Windows $iif(%windowlayout_activate,$style(1),) :.set %windowlayout_activate $iif(%windowlayout_activate,0,1)
}

alias loadlayoutlist {
  var %tok = $replace($gettok($listlayouts, $1, 44), windowlayout, )
  return $iif(%tok && $1 isnum, %tok :loadlayout %tok,)
}

alias removelayoutlist {
  var %tok = $replace($gettok($listlayouts, $1, 44), windowlayout, )
  return $iif(%tok && $1 isnum, %tok :removelayout %tok,)
}

alias loadlayout {
  var %layout windowlayout $+ $replace($1-, $chr(32), _)

  if (!$hget(%layout)) {
    return
  }

  var %window window $iif(%windowlayout_activate,$chr(32) -a,)

  var %s 0
  while (%s < $scon(0)) {
    inc %s
    scon %s

    var %w 0
    while (%w < $window(*,0)) {
      inc %w

      if ($window(*,%w).type == status) {
        if ($hget(%layout, $network)) {
          %window "Status Window" $hget(%layout, $network)
        }
      }      
      else if ($window(*,%w).type == channel) {
        if ($hget(%layout, $network $+ $window(*, %w))) {
          %window $window(*, %w) $hget(%layout, $network $+ $window(*, %w))          
        }
      }
    }    
  }
}

alias listlayouts {
  var %text
  var %s 0
  while (%s < $hget(0)) {
    inc %s

    if (windowlayout isin $hget(%s) && $hget(%s) != windowlayout) {
       %text = %text $+ $replace($hget(%s),_,$chr(32)) $+ ,
    }
  } 

  return %text
}

alias removelayout {
  var %layout windowlayout $+ $replace($1-,$chr(32),_)

  if ($hget(%layout)) {
    hfree %layout

    if ($exists(windowlayout.ini)) {
      remini windowlayout.ini %layout
    }
  }
}

alias savelayout {
  var %name = $replace($1-, $chr(32), _)

  if (!%name) {
    return
  }

  var %layout windowlayout $+ %name

  if ($hget(%layout)) {
    if (!$input(Overwrite $1- ?,y)) {
      return
    }
    hfree %layout
  }

  hmake %layout

  var %s 0
  while (%s < $scon(0)) {
    inc %s
    scon %s

    var %w 0
    while (%w < $window(*,0)) {
      inc %w

      if ($window(*,%w).type == status) {
        hadd %layout $network $window(*, %w).x $window(*, %w).y $window(*, %w).w $window(*, %w).h
      }      
      else if ($window(*,%w).type == channel) {
        hadd %layout $network $+ $window(*,%w) $window(*, %w).x $window(*, %w).y $window(*, %w).w $window(*, %w).h
      }
    }    
  }

  hsave -i %layout windowlayout.ini %layout
}