#!/usr/bin/env python

import gtk
import os
import sys

# Internationalization
import locale
import gettext
import gtk.glade
gettext.bindtextdomain("gtkkeyboardsetup", "/usr/share/locale")
gettext.textdomain("gtkkeyboardsetup")
gettext.install("gtkkeyboardsetup", "/usr/share/locale", unicode=1)
gtk.glade.bindtextdomain("gtkkeyboardsetup", "/usr/share/locale")
gtk.glade.textdomain("gtkkeyboardsetup")

keymapdir = '/usr/share/kbd/keymaps/i386/'

def getkeymap():
	keymap = 'us'
	f = file('/etc/rc.d/rc.keymap')
	while True:
		line = f.readline().lstrip(' ')
		if len(line) == 0:
			break
		if line.startswith('/usr/bin/loadkeys'):
			keymap = line.replace('\n', '').lstrip('/usr/bin/loadkeys ').rstrip('.map').replace('-u ', '')
	f.close()
	return keymap

def getkeybtype(keymap):
	keybtype = 'qwerty'
	currentkeymap = getkeymap()
	for i in availablekeymaps():
		if i[1] == currentkeymap:
			keybtype = i[0]
			break
	return keybtype

def getnumlock():
	numlock = False
	if os.access('/etc/rc.d/rc.numlock', os.X_OK):
		numlock = True
	return numlock

def scimavailable():
	scim = False
	if os.access('/usr/bin/scim', os.X_OK):
		if os.path.exists('/etc/profile.d/scim.sh'):
			scim = True
	return scim

def getscim():
	scim = False
	if scimavailable() == True:
		if os.access('/etc/profile.d/scim.sh', os.X_OK):
			scim = True
	return scim

def setkeymap(keymap):
	os.system('keyboardsetup -k '+keymap+' &')

def setnumlock(numlock):
	if numlock == True:
		state = 'on'
	else:
		state = 'off'
	os.system('keyboardsetup -n '+state)

def setscim(scim):
	if scim == True:
		state = 'on'
	else:
		state = 'off'
	os.system('keyboardsetup -s '+state)

def availablekeybtypes():
	searchlist = ['azerty', 'dvorak', 'olpc', 'qwerty', 'qwertz']
	keybtypes = []
	for i in searchlist:
		if os.path.isdir(keymapdir+i):
			keybtypes.append(i)
	return keybtypes

def availablekeymaps():
	registered = []
	keymaps = []
	keymapfile = file('/usr/share/salixtools/keymaps')
	while True:
		line = keymapfile.readline()
		if len(line) == 0:
			break
		if not line.startswith('#'):
			registered.append(line.partition('|')[0])
	keymapfile.close()
	for type in availablekeybtypes():
		for filename in os.listdir(keymapdir+type):
			if filename.endswith('.map.gz'):
				map = filename.replace('.map.gz', '')
				if map in registered:
					keymaps.append([type, map])
				#else:
				#	print "WARNING: {0} keymap is not specified in keymaps list.".format(map)
	keymaps.sort()
	return keymaps

def updatedkeymaplist(keybtype):
	keymaplist = []
	for i in availablekeymaps():
		if i[0] == keybtype:
			keymaplist.append([i[1]])
	return keymaplist

class GTKKeyboardSetup:
	def on_button_ok_clicked(self, widget, data=None):
		selectedkeymap = self.keymaplist.get_selection()
		self.keymapliststore, iter = selectedkeymap.get_selected()
		keymap = self.keymapliststore.get_value(iter, 0)
		if not keymap == getkeymap():
			setkeymap(keymap)
		if not self.numlock.get_active() == getnumlock():
			setnumlock(self.numlock.get_active())
		if not self.scim.get_active() == getscim():
			setscim(self.scim.get_active())
		gtk.main_quit()

	def on_button_cancel_clicked(self, widget, data=None):
		gtk.main_quit()
	
	def on_keybtypelist_cursor_changed(self, widget, data=None):
		pos = self.keybtypelist.get_cursor()[0][0]
		selectedkeybtype = availablekeybtypes()[pos]
		currentkeymap = getkeymap()
		count = 0
		set = False
		self.keymapliststore.clear()
		for i in updatedkeymaplist(selectedkeybtype):
			self.keymapliststore.append(i)
			if i[0] == currentkeymap:
				set = True
				self.keymaplist.set_cursor(count)
				self.keymaplist.scroll_to_cell(count)
			count += 1
		if set == False:
			self.keymaplist.set_cursor(0)

	def gtk_main_quit(self, widget, data=None):
		gtk.main_quit()

	def __init__(self):
		builder = gtk.Builder()
		if os.path.exists('gtkkeyboardsetup.glade'):
			builder.add_from_file('gtkkeyboardsetup.glade')
		elif os.path.exists('/usr/share/salixtools/gtkkeyboardsetup/gtkkeyboardsetup.glade'):
			builder.add_from_file('/usr/share/salixtools/gtkkeyboardsetup/gtkkeyboardsetup.glade')
		self.window = builder.get_object('gtkkeyboardsetup')

		builder.connect_signals(self)
		self.keybtypelist = builder.get_object('keybtypelist')
		self.keybtypecolumn = builder.get_object('keybtypecolumn')
		self.keybtypecolumn.set_title(_('Keyboard type'))
		self.keybtypeliststore = builder.get_object('keybtypeliststore')
		self.keymaplist = builder.get_object('keymaplist')
		self.keymapcolumn = builder.get_object('keymapcolumn')
		self.keymapcolumn.set_title(_('Keyboard map'))
		self.keymapliststore = builder.get_object('keymapliststore')
		self.numlock = builder.get_object('numlockcheckbutton')
		self.scim = builder.get_object('scimcheckbutton')

		currentkeymap = getkeymap()
		currentkeybtype = getkeybtype(currentkeymap)
		count = 0
		self.keybtypeliststore.clear()
		for i in availablekeybtypes():
			self.keybtypeliststore.append([i])
			if i == currentkeybtype:
				self.keybtypelist.set_cursor(count)
			count += 1

		if scimavailable() == True:
			self.scim.set_active(getscim())
		else:
			self.scim.set_sensitive(False)
			self.scim.set_active(False)

		self.numlock.set_active(getnumlock())

if __name__ == "__main__":
	app = GTKKeyboardSetup()
	app.window.show()
	gtk.main()
