diff --git a/bin/mb-kb b/bin/mb-kb index 0533927..b07d837 100755 --- a/bin/mb-kb +++ b/bin/mb-kb @@ -3,149 +3,161 @@ # This script reads the keybinds configuration file ("$HOME/.config/openbox/rc.xml") # and writes them to a text file ("$HOME/.config/openbox/kbinds.txt"). -# The script is used by mb-kb-pipemenu to pipe the output to the Openbox menu, or to display keybinds in a separate window +# The script is used by mb-kb-pipemenu to pipe the output to the Openbox menu, +# or to display keybinds in a separate window. # # Based on a script by wlourf 07/03/2010 -# +# http://u-scripts.blogspot.com/2010/03/how-to-display-openboxs-shortcuts.html # -# The original script parsed the keyboard and mouse commands from -# rc.xml, and passed them to Conkys to display on screen -# -# April 2015 -# : This script outputs the keyboard keybinds to terminal or, with -# a "--gui" argument will display the output in a text window as well -# -# Written by damo for BunsenLabs Linux, April 2015 -# -# Ported to Manjaro by napcok March 2016 -# -######################################################################## -# -# ****If Openbox xml version changes then the xml root will need -# changing as well (line 58)******** -# -######################################################################## -import sys,os +# Written by damo for BunsenLabs Linux, April 2015 +# Ported to Manjaro by napcok March 2016 +# Fix (multi-action keybinds): prefer Execute over first action — musqz + +import sys +import os import datetime -import subprocess try: from lxml import etree except ImportError: import xml.etree.ElementTree as etree -# path and name of the rc.xml and saved keybinds files rc_fpath = os.environ["HOME"] + "/.config/openbox/rc.xml" kb_fpath = os.environ["HOME"] + "/.config/openbox/kbinds.txt" -arrShortcut=[] -gui=False +arrShortcut = [] +gui = False + def cmdargs(): - """get command arguments""" - if len(sys.argv) > 1: + if len(sys.argv) > 1: if sys.argv[1] == "--gui": - gui=True - return gui + return True else: - msg = "\n\n\tUSAGE: to display keybinds in a text window use 'mb-kb --gui &>/dev/null'\n\n" - msg = msg + "\tRunning the script without args will send output to the terminal\n\n" + msg = "\n\n\tUSAGE: to display keybinds in a text window use 'mb-kb --gui &>/dev/null'\n\n" + msg += "\tRunning the script without args will send output to the terminal\n\n" print(msg) sys.exit() + return False + def keyboard(): - """read keyboard shorcuts""" - # Parse xml - strRoot="{http://openbox.org/3.4/rc}" + strRoot = "{http://openbox.org/3.4/rc}" tree = etree.parse(rc_fpath) root = tree.getroot() - for k in root.findall(strRoot+"keyboard/" + strRoot + "keybind"): + for k in root.findall(strRoot + "keyboard/" + strRoot + "keybind"): key = k.get("key") - action_element = k.find(strRoot+"action") - strTxt="" - strType="o " # flag for pipemenu: Openbox window command - if action_element!=None: - arrShortcut.append((key,"","")) - if action_element.get("name")=="Execute": - name_element=action_element.find(strRoot + "name") - command_element=action_element.find(strRoot + "command") - exec_element=action_element.find(strRoot + "execute") - strType="x " # flag for pipemenu: Run command - if name_element != None: - strTxt=name_element.text - elif command_element != None: - strTxt=command_element.text - elif exec_element != None: - strTxt=exec_element.text - elif action_element.get("name")=="ShowMenu": - menu_element=action_element.find(strRoot + "menu") - if menu_element != None: strTxt=menu_element.text - else: - action_name=action_element.get("name") - if action_name!=None: - strTxt=action_name - arrShortcut[len(arrShortcut)-1]=(strType,key,strTxt) + # Collect ALL actions for this keybind (fixes multi-action entries like + # Unmaximize + Execute where the old k.find() only saw the first one). + actions = k.findall(strRoot + "action") + if not actions: + continue -def output_keybinds(arrShortcut,gui): - """loop through array, and format output then write to file""" - for i in range(0,len(arrShortcut)): - exe=str(arrShortcut[i][0]) - keybinding=str(arrShortcut[i][1]) - execute=str(arrShortcut[i][2]) - if gui: #format output for text window - if len(execute)>80 : - execute=execute[:75]+"....." - line = "{:2}".format(i) + "\t" + "{:<16}".format(keybinding)\ - + "\t" + execute - else: #format text for pipemenu + # Priority: Execute > MoveResizeTo > first action + # This ensures tiling keybinds (Unmaximize + MoveResizeTo) show geometry + # instead of the preceding window-state action. + action_element = next( + (a for a in actions if a.get("name") == "Execute"), + next( + (a for a in actions if a.get("name") == "MoveResizeTo"), + actions[0] + ) + ) + + strTxt = "" + strType = "o " + arrShortcut.append((key, "", "")) + + if action_element.get("name") == "Execute": + name_element = action_element.find(strRoot + "name") + command_element = action_element.find(strRoot + "command") + exec_element = action_element.find(strRoot + "execute") + strType = "x " + if name_element is not None: + strTxt = name_element.text + elif command_element is not None: + strTxt = command_element.text + elif exec_element is not None: + strTxt = exec_element.text + elif action_element.get("name") == "MoveResizeTo": + parts = [] + for tag in ("x", "y", "width", "height"): + el = action_element.find(strRoot + tag) + if el is None: + el = action_element.find(tag) # fallback: no namespace + if el is not None and el.text: + parts.append(tag + ":" + el.text.strip()) + strTxt = "MoveResizeTo " + " ".join(parts) if parts else "MoveResizeTo" + elif action_element.get("name") == "ShowMenu": + menu_element = action_element.find(strRoot + "menu") + if menu_element is not None: + strTxt = menu_element.text + else: + action_name = action_element.get("name") + if action_name is not None: + strTxt = action_name + + arrShortcut[len(arrShortcut) - 1] = (strType, key, strTxt) + + +def output_keybinds(arrShortcut, gui): + for i in range(len(arrShortcut)): + exe = str(arrShortcut[i][0]) + keybinding = str(arrShortcut[i][1]) + execute = str(arrShortcut[i][2]) + if gui: + if len(execute) > 80: + execute = execute[:75] + "....." + line = "{:2}".format(i) + "\t" + "{:<16}".format(keybinding) \ + + "\t" + execute + else: line = exe + "{:<16}".format(keybinding) + "\t" + execute print(line) write_file(line) -def check_rcfile(fpath,mode): - """Check if rc.xml exists, and is accessible""" + +def check_rcfile(fpath, mode): try: - f = open(fpath,mode) - except IOError as e: + open(fpath, mode).close() + except IOError: return False return True + def write_file(line): - """Text file to store keybinds""" - f = open(kb_fpath,'a') - f.write(line + "\n") - f.close() + with open(kb_fpath, 'a') as f: + f.write(line + "\n") + def check_txtfile(kb_fpath): - """Create Text file to store keybinds""" try: - f = open(kb_fpath,'w') - except IOError as e: + open(kb_fpath, 'w').close() + except IOError: return False return True + if __name__ == "__main__": - gui=cmdargs() + gui = cmdargs() check_txtfile(kb_fpath) - if gui: # output formatted keybinds text in text window + + if gui: write_file(str(datetime.date.today()) + "\trc.xml KEYBINDS") write_file("-------------------------------\n") - if check_rcfile(rc_fpath,"r"): + if check_rcfile(rc_fpath, "r"): keyboard() - output_keybinds(arrShortcut,gui) + output_keybinds(arrShortcut, gui) else: - msg = "\nCan't open rc.xml for parsing\n\ - Check the filepath given: " + rc_fpath + "\n" - print(msg) + print("\nCan't open rc.xml for parsing\n\tCheck the filepath: " + rc_fpath + "\n") sys.exit(1) - if gui: # output formatted keybinds text in text window - dlg = "yad --text-info --title='Openbox Keybinds' " - dlg = dlg + "--window-icon=distributor-logo-mabox " - dlg = dlg + "--filename=$HOME/.config/openbox/kbinds.txt " - dlg = dlg + "--width=700 --height=700 --fontname=Monospace " - dlg = dlg + "--button=Close" + if gui: + dlg = "yad --text-info --title='Mabox Openbox Keybinds' " + dlg += "--window-icon=distributor-logo-mabox --image=/usr/share/icons/mabox_trans_64.png " + dlg += "--text '\nKey bindings are confugured in your ~/.config/openbox/rc.xml file. docs\n\t\t\t\tS - Shift key\n\t\t\t\tC - Control key\n\t\t\t\tA - Alt key\n\t\t\t\tW - Super key (usually bound to the Windows key)' " + dlg += "--filename=$HOME/.config/openbox/kbinds.txt " + dlg += "--width=640 --height=560 --fontname=Monospace " + dlg += "--button='Edit rc.xml:geany " + rc_fpath + "' --button='Reload Openbox configuration:openbox --reconfigure' --button=Close" os.system(dlg) - diff --git a/icons/hicolor/128x128/apps/mabox-logo-3d.png b/icons/hicolor/128x128/apps/mabox-logo-3d.png new file mode 100644 index 0000000..8221bec Binary files /dev/null and b/icons/hicolor/128x128/apps/mabox-logo-3d.png differ diff --git a/icons/hicolor/128x128/apps/mabox-logo-circle.png b/icons/hicolor/128x128/apps/mabox-logo-circle.png new file mode 100644 index 0000000..7fbfb18 Binary files /dev/null and b/icons/hicolor/128x128/apps/mabox-logo-circle.png differ diff --git a/icons/hicolor/128x128/apps/mabox-logo-square.png b/icons/hicolor/128x128/apps/mabox-logo-square.png new file mode 100644 index 0000000..3198821 Binary files /dev/null and b/icons/hicolor/128x128/apps/mabox-logo-square.png differ diff --git a/icons/hicolor/16x16/apps/mabox-logo-3d.png b/icons/hicolor/16x16/apps/mabox-logo-3d.png new file mode 100644 index 0000000..93a4c44 Binary files /dev/null and b/icons/hicolor/16x16/apps/mabox-logo-3d.png differ diff --git a/icons/hicolor/16x16/apps/mabox-logo-circle.png b/icons/hicolor/16x16/apps/mabox-logo-circle.png new file mode 100644 index 0000000..5ed5b06 Binary files /dev/null and b/icons/hicolor/16x16/apps/mabox-logo-circle.png differ diff --git a/icons/hicolor/16x16/apps/mabox-logo-square.png b/icons/hicolor/16x16/apps/mabox-logo-square.png new file mode 100644 index 0000000..228810a Binary files /dev/null and b/icons/hicolor/16x16/apps/mabox-logo-square.png differ diff --git a/icons/hicolor/22x22/apps/mabox-logo-3d.png b/icons/hicolor/22x22/apps/mabox-logo-3d.png new file mode 100644 index 0000000..a62851a Binary files /dev/null and b/icons/hicolor/22x22/apps/mabox-logo-3d.png differ diff --git a/icons/hicolor/22x22/apps/mabox-logo-circle.png b/icons/hicolor/22x22/apps/mabox-logo-circle.png new file mode 100644 index 0000000..2392ae3 Binary files /dev/null and b/icons/hicolor/22x22/apps/mabox-logo-circle.png differ diff --git a/icons/hicolor/22x22/apps/mabox-logo-square.png b/icons/hicolor/22x22/apps/mabox-logo-square.png new file mode 100644 index 0000000..272541e Binary files /dev/null and b/icons/hicolor/22x22/apps/mabox-logo-square.png differ diff --git a/icons/hicolor/24x24/apps/mabox-logo-3d.png b/icons/hicolor/24x24/apps/mabox-logo-3d.png new file mode 100644 index 0000000..efb4ffc Binary files /dev/null and b/icons/hicolor/24x24/apps/mabox-logo-3d.png differ diff --git a/icons/hicolor/24x24/apps/mabox-logo-circle.png b/icons/hicolor/24x24/apps/mabox-logo-circle.png new file mode 100644 index 0000000..40b6382 Binary files /dev/null and b/icons/hicolor/24x24/apps/mabox-logo-circle.png differ diff --git a/icons/hicolor/24x24/apps/mabox-logo-square.png b/icons/hicolor/24x24/apps/mabox-logo-square.png new file mode 100644 index 0000000..f21f4ad Binary files /dev/null and b/icons/hicolor/24x24/apps/mabox-logo-square.png differ diff --git a/icons/hicolor/32x32/apps/mabox-logo-3d.png b/icons/hicolor/32x32/apps/mabox-logo-3d.png new file mode 100644 index 0000000..b474b6c Binary files /dev/null and b/icons/hicolor/32x32/apps/mabox-logo-3d.png differ diff --git a/icons/hicolor/32x32/apps/mabox-logo-circle.png b/icons/hicolor/32x32/apps/mabox-logo-circle.png new file mode 100644 index 0000000..dd8d0f6 Binary files /dev/null and b/icons/hicolor/32x32/apps/mabox-logo-circle.png differ diff --git a/icons/hicolor/32x32/apps/mabox-logo-square.png b/icons/hicolor/32x32/apps/mabox-logo-square.png new file mode 100644 index 0000000..5e27924 Binary files /dev/null and b/icons/hicolor/32x32/apps/mabox-logo-square.png differ diff --git a/icons/hicolor/48x48/apps/mabox-logo-3d.png b/icons/hicolor/48x48/apps/mabox-logo-3d.png new file mode 100644 index 0000000..79a9a6a Binary files /dev/null and b/icons/hicolor/48x48/apps/mabox-logo-3d.png differ diff --git a/icons/hicolor/48x48/apps/mabox-logo-circle.png b/icons/hicolor/48x48/apps/mabox-logo-circle.png new file mode 100644 index 0000000..69cdd33 Binary files /dev/null and b/icons/hicolor/48x48/apps/mabox-logo-circle.png differ diff --git a/icons/hicolor/48x48/apps/mabox-logo-square.png b/icons/hicolor/48x48/apps/mabox-logo-square.png new file mode 100644 index 0000000..9cffebe Binary files /dev/null and b/icons/hicolor/48x48/apps/mabox-logo-square.png differ diff --git a/icons/hicolor/64x64/apps/mabox-logo-3d.png b/icons/hicolor/64x64/apps/mabox-logo-3d.png new file mode 100644 index 0000000..c1a1a25 Binary files /dev/null and b/icons/hicolor/64x64/apps/mabox-logo-3d.png differ diff --git a/icons/hicolor/64x64/apps/mabox-logo-circle.png b/icons/hicolor/64x64/apps/mabox-logo-circle.png new file mode 100644 index 0000000..843b018 Binary files /dev/null and b/icons/hicolor/64x64/apps/mabox-logo-circle.png differ diff --git a/icons/hicolor/64x64/apps/mabox-logo-square.png b/icons/hicolor/64x64/apps/mabox-logo-square.png new file mode 100644 index 0000000..9efe8df Binary files /dev/null and b/icons/hicolor/64x64/apps/mabox-logo-square.png differ diff --git a/icons/hicolor/96x96/apps/mabox-logo-3d.png b/icons/hicolor/96x96/apps/mabox-logo-3d.png new file mode 100644 index 0000000..236b89f Binary files /dev/null and b/icons/hicolor/96x96/apps/mabox-logo-3d.png differ diff --git a/icons/hicolor/96x96/apps/mabox-logo-circle.png b/icons/hicolor/96x96/apps/mabox-logo-circle.png new file mode 100644 index 0000000..afd1400 Binary files /dev/null and b/icons/hicolor/96x96/apps/mabox-logo-circle.png differ diff --git a/icons/hicolor/96x96/apps/mabox-logo-square.png b/icons/hicolor/96x96/apps/mabox-logo-square.png new file mode 100644 index 0000000..3896bbe Binary files /dev/null and b/icons/hicolor/96x96/apps/mabox-logo-square.png differ diff --git a/icons/hicolor/scalable/apps/mabox-logo-3d.svg b/icons/hicolor/scalable/apps/mabox-logo-3d.svg new file mode 100644 index 0000000..109a860 --- /dev/null +++ b/icons/hicolor/scalable/apps/mabox-logo-3d.svg @@ -0,0 +1,4 @@ + + + + diff --git a/icons/hicolor/scalable/apps/mabox-logo-circle.svg b/icons/hicolor/scalable/apps/mabox-logo-circle.svg new file mode 100644 index 0000000..33b18df --- /dev/null +++ b/icons/hicolor/scalable/apps/mabox-logo-circle.svg @@ -0,0 +1,4 @@ + + + + diff --git a/icons/hicolor/scalable/apps/mabox-logo-square.svg b/icons/hicolor/scalable/apps/mabox-logo-square.svg new file mode 100644 index 0000000..1040652 --- /dev/null +++ b/icons/hicolor/scalable/apps/mabox-logo-square.svg @@ -0,0 +1,4 @@ + + + +