if !exists('&imstatusfunc') || !has('gui_running')
  finish
endif

" Initialize after fork.
autocmd GuiEnter * call s:Init()
autocmd GuiEnter * set imstatusfunc=ImStatusFunc imactivatefunc=ImActivateFunc

function! s:Init()
  python <<EOF
import ibus

im_bus = None
im_ic = None

# FIXME: How to ensure to get input context of Vim.
def im_init():
  global im_bus, im_ic
  if im_bus is None:
    im_bus = ibus.Bus()
  if im_bus is None:
    return False
  if im_ic is None:
    try:
      im_ic = ibus.InputContext(im_bus, im_bus.current_input_contxt())
    except:
      # Occasionally fail to connect.  Re-try then.
      # dbus.exception.DBusException: org.freedesktop.DBus.Error.failed: No focused input context
      pass
  if im_ic is None:
    return False
  return True

def im_is_active():
  if not im_init():
    return 0
  if im_ic.is_enabled():
    return 1
  else:
    return 0

def im_enable():
  if not im_init():
    return
  im_ic.enable()

def im_disable():
  if not im_init():
    return
  im_ic.disable()
EOF
endfunction

function! ImStatusFunc()
  return pyeval('im_is_active()')
endfunction

function! ImActivateFunc(active)
  if a:active
    python im_enable()
  else
    python im_disable()
  endif
endfunction

