#!/usr/bin/python

import sys, os, commands, string, time, pwd, re, stat

def getdisplay():
  import stat, re

  # See if tmp dir exists.
  if not os.access('/tmp/.X11-unix',os.F_OK):
    return None

  files = os.listdir('/tmp/.X11-unix')
  dir_re = re.compile("X(.+)")
  for file in files:
    fileuid = os.stat(os.path.join('/tmp/.X11-unix',file))[stat.ST_UID]
    if str(fileuid) == str(uid):
      displaymatch = dir_re.search(file)
      display = ':'+displaymatch.group(1)+'.0'
      return display
      break
  return None

if __name__ == '__main__':

  home = os.environ['HOME']
  os.environ['GDIS_START_DIR'] = home
  error_file = file(home + '/gdis_debug', 'w')
  error_file.write("Starting GDIS...\n")
  error_file.write(str(os.environ))
  error_file.write('\n')
  sys.stderr = error_file
  sys.stdout = error_file

  thisdir = sys.path[0]
  uid = str(os.getuid())
  tmpdir = '/tmp'

  pixbuf_file_name = os.path.join(tmpdir,uid+'-gdk-pixbuf.loaders')
  pangorc_file_name = os.path.join(tmpdir,uid+'-pangorc')
  gtkimmodules_file_name = os.path.join(tmpdir,uid+'-gtk.immodules')
  pangomodules_file_name = os.path.join(tmpdir,uid+'-pango.modules')
  pangoxaliases_file_name = os.path.join(thisdir,'etc/pango/pangox.aliases')
  getx11_file_name = os.path.join(tmpdir,uid+'-getx11.sh')
  gdis_exe = os.path.join(thisdir, 'gdis')
  startX11 = os.path.join(thisdir, 'startX11.scpt')
#  X11 = os.path.join('/Applications/Utilities', 'X11.app')
  xinitrc = os.path.join(home,'.xinitrc')

  # Output temporary pango.modules file
  newfile = file(pangomodules_file_name,'w')
  oldfile = file(os.path.join(thisdir, 'etc/pango/pango.modules'))
  for line in oldfile:
    newfile.write(line.replace('${CWD}',thisdir))
  oldfile.close()
  newfile.close()

  # Output temporary gtk.immodules file
  newfile = file(gtkimmodules_file_name,'w')
  oldfile = file(os.path.join(thisdir, 'etc/gtk-2.0/gtk.immodules'))
  for line in oldfile:
    newfile.write(line.replace('${CWD}',thisdir))
  oldfile.close()
  newfile.close()
  os.environ['GTK_PIXBUF_MODULE_FILE'] = gtkimmodules_file_name

  # Output temporary pango.rc file
  pangorc_file = file(pangorc_file_name,'w')
  pangorc_file.write('[Pango]\n')
  pangorc_file.write('ModuleFiles = "'+pangomodules_file_name+'"\n')
  pangorc_file.write('\n')
  pangorc_file.write('[PangoX]\n')
  pangorc_file.write('AliasFiles = "'+pangoxaliases_file_name+'"\n')
  pangorc_file.close()
  os.environ['PANGO_RC_FILE'] = pangorc_file_name

  # Output temporary gdk.pixbuf-loaders file
  pixbuf_file = file(pixbuf_file_name,'w')
  pixbuf_file.write('\"%s\"\n' % (os.path.join(thisdir,'../Frameworks/gtk-2.0/2.4.0/loaders/libpixbufloader-xpm.so'),))
  pixbuf_file.write('\"xpm\" 0 \"gtk20\" \"The XPM image format\"\n')
  pixbuf_file.write('\"image/x-xpixmap\" \"\"\n')
  pixbuf_file.write('\"xpm\" \"\"\n')
  pixbuf_file.write('\"/* XPM */\" \"\" 100\n\n')
  pixbuf_file.close()
  os.environ['GDK_PIXBUF_MODULE_FILE'] = pixbuf_file_name

  user = os.getenv('LOGNAME')
  if user == None:
    user = str(os.getenv('USER'))
  if user == None:
    user = pwd.getpwuid(uid)[0]
  if user == None:
    error_file.write('No user id found.\n')
    sys.exit()
  error_file.write('user: '+str(user)+'\n')

  # See if X11 is running if the DISPLAY variable isn't set.
  display = os.getenv('DISPLAY')
  if display == None:
    display = getdisplay()
    if not display == None:
      error_file.write('Using DISPLAY from existing X11: %s\n' % (str(display),))
  else:
    error_file.write('Using DISPLAY from environment: %s\n' % (str(display),))

  # Start X11 and get the display.
  if display == None:

    # Have to make a ~/.xinitrc file otherwise we will get an xterm appearing.
    if not os.access(xinitrc,os.F_OK):
      xinitin = file('/usr/X11R6/lib/X11/xinit/xinitrc')
      xinitout = file(xinitrc,'w')
      for s in xinitin:
        xinitout.write(s.replace('xterm','#xterm'))
      xinitout.close()
      xinitin.close()

    # Start X11
#    error_file.write('command: %s\n' % ('osascript ' + startX11,))
#    status = os.spawnlp(os.P_WAIT,'osascript','osascript',startX11)
#    status = os.spawnlp(os.P_WAIT,'open',"-a X11")
    status, output = commands.getstatusoutput('open -a X11')
    error_file.write('command: %s\n' % ('open -a X11',))
    error_file.write('output: %s\n' % (output,))
    error_file.write('status: %d\n' % (status,))

    # Give Window manager sufficient time to start
    i = 0
    found = False
    while (i<30 and not found):
      time.sleep(1)

      # Look for display owned by current user.
      display = getdisplay()
      if display==None:
        display = "bla"
#       display = ":0.0"
      else:
        found = True
        error_file.write('Started X11 and setting DISPLAY to: %s\n' % (str(display),))
        break

    if not found:
      error_file.write('DISPLAY not found\n')
      sys.exit()

  os.putenv('DISPLAY',display)

  # start gdis
  error_file.write('command: %s\n' % ('\"' + gdis_exe + '\"' + ' ' + string.join(sys.argv[2:])),)
  flags = ['gdis']
  flags.append(sys.argv[2:])
  #status = os.spawnv(os.P_WAIT,gdis_exe,sys.argv[2:])
  status, output = commands.getstatusoutput('\"' + gdis_exe + '\"' + ' ' + string.join(sys.argv[2:]))
  error_file.write('output: %s\n' % (output,))
  error_file.write('status: %d\n' % (status,))
  error_file.close()

