parcellite-1.2.1/0000755000175000017500000000000013041603201011727 5ustar hlehleparcellite-1.2.1/extract_strings.sh0000755000175000017500000000301713041603201015512 0ustar hlehle#!/bin/bash PO=po/parcellite.pot D=$(date +"%Y-%m-%d %H:%M%z") if [ -e $PO ]; then echo "Overwrite $PO?" read YN if [ "$YN" != "y" ]; then echo "User Abort" exit 1 fi fi if [ -n "$1" ]; then # assume we were passed in a revision number PV="$1" else if [ -e Makefile ]; then PV=$( grep PACKAGE_VER Makefile|sed 's!.*= *!!') else PV="PACKAGE VERSION" echo "********WARNING $PV cannot be set until configure is run************" fi fi echo "#Generated by extract_strings">$PO #echo "msgid \"\"" >>$PO #echo "msgstr \"\"" >> $PO echo "\"Project-Id-Version: $PV\n\"" >> $PO echo "\"Report-Msgid-Bugs-To: \n\"" >> $PO echo "\"POT-Creation-Date: $D\n\"" >> $PO echo "\"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n\"" >> $PO echo "\"Last-Translator: FULL NAME \n\"" >> $PO echo "\"Language-Team: LANGUAGE \n\"" >> $PO echo "\"MIME-Version: 1.0\n\"" >> $PO echo "\"Content-Type: text/plain; charset=CHARSET\n\"" >> $PO echo "\"Content-Transfer-Encoding: 8bit\n\"" >> $PO echo "">>$PO # extraction from preferences.c sed 's!\.desc!\n\.desc!;s!\.tip!\n\.tip!' src/preferences.c|grep '"' |grep "\.desc\|\.tip\|label\|dialog\|combo\|tooltip" |sed 's!.*"\(.*\)".*!\1!;s!^ *!!' > $PO.tmp for f in main utils; do grep "_(" src/$f.c|sed 's!.*_("\(.*\)".*!\1!' >> $PO.tmp done #grab license grep -A 10 license src/main.c|grep ' "'|sed 's! *!!;s!"!!g'|tr -d '\n' >> $PO.tmp # Leave markups s!<.>!!;s!<..>!!; cat $PO.tmp|sort|uniq|sed 's!^!msgid "!;s!$!"\nmsgstr ""\n!'>>$PO #rm $PO.tmp echo "Output in $PO" parcellite-1.2.1/po/0000755000175000017500000000000013041603201012345 5ustar hlehleparcellite-1.2.1/po/zh_CN.po0000644000175000017500000001426613041603201013717 0ustar hlehle# Simplified Chinese translation of parcellite # Copyright (C) 2008 Xyhthyx # This file is distributed under the same license as the parcellite package. # Lyman Li , 2008. # # msgid "" msgstr "" "Project-Id-Version: Parcellite\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-18 12:09-0400\n" "PO-Revision-Date: 2008-11-10 11:46+0900\n" "Last-Translator: Lyman Li \n" "Language-Team: CHINESE\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Chinese\n" "X-Poedit-Country: CHINA\n" #: ../src/main.c:166 msgid "Executing action..." msgstr "动作执行中…" #: ../src/main.c:172 ../src/main.c:704 ../data/parcellite.desktop.in.h:1 #: ../data/parcellite-startup.desktop.in.h:1 msgid "Clipboard Manager" msgstr "剪切板管理器" #: ../src/main.c:195 msgid "Could not create thread for executed action\n" msgstr "无法为动作执行创建线程\n" #. Create the dialog #: ../src/main.c:225 msgid "Editing Clipboard" msgstr "编辑剪切板" #: ../src/main.c:284 msgid "Clear the history?" msgstr "清除历史记录?" #: ../src/main.c:336 msgid "Lightweight GTK+ clipboard manager." msgstr "轻量级 GTK+ 剪切板管理器。" #: ../src/main.c:423 msgid "None" msgstr "" #. File contained no actions so adding empty #. File did not open so adding empty #. Nothing in history so adding empty #: ../src/main.c:444 ../src/main.c:473 ../src/main.c:588 msgid "Empty" msgstr "空" #. Edit actions #: ../src/main.c:480 msgid "_Edit actions" msgstr "编辑动作(_E)" #. Edit clipboard #: ../src/main.c:504 msgid "_Edit Clipboard" msgstr "编辑剪切板(_E)" #: ../src/utils.c:38 ../src/utils.c:45 #, c-format msgid "Couldn't create directory: %s\n" msgstr "无法创建目录: %s\n" #: ../src/utils.c:84 msgid "Run as daemon" msgstr "作为守护进程运行" #: ../src/utils.c:91 msgid "Do not use status icon (Ctrl-Alt-P for menu)" msgstr "不使用状态图标(Ctrl-Alt-P 调出菜单)" #: ../src/utils.c:98 msgid "Print clipboard contents" msgstr "打印剪切板内容" #: ../src/utils.c:105 #, fuzzy msgid "Print primary contents" msgstr "打印剪切板内容" #: ../src/utils.c:117 #, fuzzy msgid "" "Clipboard CLI usage examples:\n" "\n" " echo \"copied to clipboard\" | parcellite\n" " parcellite \"copied to clipboard\"\n" " echo \"copied to clipboard\" | parcellite -c" msgstr "" "剪切板命令行使用范例:\n" "\n" " echo \"复制到剪切板\" | parcellite\n" " parcellite \"复制到剪切板\"\n" " echo \"复制到剪切板\" | parcellite -o" #: ../src/utils.c:123 msgid "" "Written by Gilberto \"Xyhthyx\" Miralla.\n" "Report bugs to ." msgstr "" "Gilberto \"Xyhthyx\" Miralla 开发\n" "问题反馈 " #. Create the dialog #: ../src/preferences.c:375 msgid "Preferences" msgstr "设定" #: ../src/preferences.c:390 msgid "Behavior" msgstr "行为" #: ../src/preferences.c:398 msgid "Clipboards" msgstr "剪切板" #: ../src/preferences.c:405 msgid "Use _Copy (Ctrl-C)" msgstr "使用 _Copy (Ctrl-C)" #: ../src/preferences.c:407 msgid "Use _Primary (Selection)" msgstr "使用 _Primary (Selection)" #: ../src/preferences.c:409 msgid "S_ynchronize clipboards" msgstr "" #: ../src/preferences.c:417 msgid "History" msgstr "历史记录" #: ../src/preferences.c:424 msgid "_Save history" msgstr "保存历史记录(_S)" #: ../src/preferences.c:425 msgid "Save and restore history between sessions" msgstr "保存历史记录并在会话间恢复" #: ../src/preferences.c:429 msgid "Items in history:" msgstr "历史记录条目数:" #: ../src/preferences.c:442 msgid "Miscellaneous" msgstr "其他" #: ../src/preferences.c:449 msgid "Capture _hyperlinks only" msgstr "仅捕获链接(_H)" #: ../src/preferences.c:451 msgid "C_onfirm before clearing history" msgstr "清除历史纪录时确认(_C)" #: ../src/preferences.c:458 msgid "Display" msgstr "外观" #: ../src/preferences.c:466 msgid "Items" msgstr "条目" #: ../src/preferences.c:473 msgid "Show in a _single line" msgstr "显示为一行(_S)" #: ../src/preferences.c:475 msgid "Show in _reverse order" msgstr "逆序显示(_R)" #: ../src/preferences.c:479 msgid "Character length of items:" msgstr "条目显示的文字长度:" #: ../src/preferences.c:492 msgid "Omitting" msgstr "省略" #: ../src/preferences.c:501 msgid "Omit items in the:" msgstr "省略显示条目的:" #: ../src/preferences.c:505 msgid "Beginning" msgstr "起始" #: ../src/preferences.c:506 msgid "Middle" msgstr "中间" #: ../src/preferences.c:507 msgid "End" msgstr "结尾" #: ../src/preferences.c:514 msgid "Actions" msgstr "动作" #. Build the actions label #: ../src/preferences.c:519 msgid "Control-click Parcellite's tray icon to use actions" msgstr "按住 Ctrl 并点击 Parcellite 的任务栏图标使用动作" #: ../src/preferences.c:539 msgid "Action" msgstr "动作" #: ../src/preferences.c:546 msgid "Command" msgstr "命令" #: ../src/preferences.c:561 msgid "Add..." msgstr "追加…" #: ../src/preferences.c:565 msgid "Remove" msgstr "删除" #: ../src/preferences.c:582 #, fuzzy msgid "Hotkeys" msgstr "热键" #: ../src/preferences.c:590 msgid "Hotkeys" msgstr "热键" #: ../src/preferences.c:599 msgid "History key combination:" msgstr "历史纪录按键组合:" #: ../src/preferences.c:607 msgid "Actions key combination:" msgstr "动作按键组合:" #: ../src/preferences.c:615 msgid "Menu key combination:" msgstr "菜单按键组合:" #: ../data/parcellite.desktop.in.h:2 ../data/parcellite-startup.desktop.in.h:2 msgid "Parcellite" msgstr "Parcellite" #~ msgid "Clipboard" #~ msgstr "剪切板" #~ msgid "Save changes" #~ msgstr "保存更改" #~ msgid "Discard changes" #~ msgstr "放弃更改" #~ msgid "Extras" #~ msgstr "其他" #~ msgid "" #~ "Add a new action\n" #~ "\"%s\" in a command is replaced with the clipboard contents" #~ msgstr "" #~ "添加新动作\n" #~ "命令中的 \"%s\" 将由剪切板内容代替" #~ msgid "Move selected action up" #~ msgstr "上移选中的动作" #~ msgid "Move selected action down" #~ msgstr "下移选中的动作" parcellite-1.2.1/po/insert-header.sin0000644000175000017500000000124013041603201015607 0ustar hlehle# Sed script that inserts the file called HEADER before the header entry. # # At each occurrence of a line starting with "msgid ", we execute the following # commands. At the first occurrence, insert the file. At the following # occurrences, do nothing. The distinction between the first and the following # occurrences is achieved by looking at the hold space. /^msgid /{ x # Test if the hold space is empty. s/m/m/ ta # Yes it was empty. First occurrence. Read the file. r HEADER # Output the file's contents by reading the next line. But don't lose the # current line while doing this. g N bb :a # The hold space was nonempty. Following occurrences. Do nothing. x :b } parcellite-1.2.1/po/es.po0000644000175000017500000003242413041603201013321 0ustar hlehle# Spanish translation of parcellite # Copyright (C) 2008 Xyhthyx # This file is distributed under the same license as the parcellite package. # # # Gilberto "Xyhthyx" Miralla , 2008. # jcsl , 2014. msgid "" msgstr "" "Project-Id-Version: 1.1.7\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2014-03-23 11:09+0100\n" "PO-Revision-Date: 2014-03-23 13:50+0100\n" "Last-Translator: jcsl \n" "Language-Team: Spanish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: es\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Lokalize 1.5\n" msgid "Action" msgstr "Acción" msgid "Actions" msgstr "Acciones" msgid "Actions key combination:" msgstr "Combinación de teclas para Acciones:" msgid "Add..." msgstr "Añadir..." msgid "Alternate Non-printing Display" msgstr "Usar alternativa para caracteres no imprimibles" msgid "Auto Paste" msgstr "Pegar automáticamente" msgid "Clipboards" msgstr "Portapapeles" msgid "Beginning" msgstr "Inicio" msgid "Behavior" msgstr "Comportamiento" msgid "History" msgstr "Historial" msgid "Hotkeys" msgstr "Combinaciones de teclas" msgid "Items" msgstr "Ítems" msgid "Miscellaneous" msgstr "Miscelánea" msgid "None" msgstr "Ninguna" msgid "Omitting" msgstr "Elipsis" msgid "X" msgstr "X" msgid "Y" msgstr "Y" msgid "Capture hyperlinks only" msgstr "Capturar solo los hipervínculos" msgid "Case Sensitive Search" msgstr "Búsqueda distinguiendo mayúsculas de minúsculas" msgid "Character length of items" msgstr "Longitud en caracteres de los ítems" msgid "_Clear" msgstr "_Borrar" msgid "Clear the history?" msgstr "¿Borrar el historial?" msgid "" "Clipboard CLI usage examples:\n\n echo \"copied to clipboard\" | " "parcellite\n parcellite \"copied to clipboard\"\n echo \"copied to " "clipboard\" | parcellite -c" msgstr "" "Ejemplos de uso del portapapeles en la terminal (CLI):\n\n echo \"copiado al " "portapapeles\" | parcellite\n parcellite \"copiado al portapapeles\"\n echo " "\"copiado al portapapeles\" | parcellite -c" msgid "Clipboard Manager" msgstr "Gestor del portapapeles" msgid "Command" msgstr "Orden" msgid "Confirm before clearing history" msgstr "Confirmar antes de borrar el historial" msgid "Control-click Parcellite's tray icon to use actions," msgstr "" "Control-clic sobre el icono de Parcellite en la bandeja del sistema para usar " "acciones," msgid "" "Copyright (C) 2007, 2008 Gilberto \"Xyhthyx\" Miralla\nCopyright (C) " "2010-2013 Doug Springer" msgstr "" "Copyright (C) 2007, 2008 Gilberto \"Xyhthyx\" Miralla\nCopyright (C) " "2010-2013 Doug Springer" msgid "Couldn't create directory: %s\n" msgstr "No se pudo crear el directorio: %s\n" msgid "Current entry on top" msgstr "Elemento actual en la parte superior" msgid "DebugUpdate" msgstr "DebugUpdate" msgid "Display" msgstr "Visualización" msgid "Display Version info" msgstr "Mostrar información de la versión" msgid "Do not use status icon (Ctrl-Alt-P for menu)" msgstr "No usar icono de estado (Ctrl-Alt-P para el menú)" msgid "Dummy desc" msgstr "Descripción vacía" msgid "Dummy tip" msgstr "Consejo vacío" msgid "_Edit actions" msgstr "_Editar acciones" msgid "_Edit Clipboard" msgstr "_Editar el portapapeles" msgid "Editing Clipboard" msgstr "Editando el portapapeles" msgid "Empty" msgstr "Vacío" msgid "End" msgstr "Final" msgid "Executing action..." msgstr "Ejecutando acción..." msgid "" "Gilberto \"Xyhthyx\" Miralla \nDoug Springer <" "gpib@rickyrockrat.net>" msgstr "" "Gilberto \"Xyhthyx\" Miralla \nDoug Springer <" "gpib@rickyrockrat.net>" msgid "_History" msgstr "_Historial" msgid "History key combination:" msgstr "Combinación de teclas para el historial" msgid ">>$HOME/ptest" msgstr ">>$HOME/ptest" msgid "Hotkeys" msgstr "Accesos rápidos de teclado" msgid "" "If checked, does a search-as-you-type. Turns red if not found. Goes to top " "(Alt-E) line when no chars are entered for search" msgstr "" "Si se marca, se busca mientras se escribe. Se muestra en rojo si no se " "encuentra. Vuelve a la primera línea (Alt-E) cuando no se introduce nada que " "buscar." msgid "If checked, does case sensitive search" msgstr "Si se marca, busca distinguiendo mayúsculas de minúsculas" msgid "If checked, edit the history item clicked on." msgstr "Si se marca, se edita el ítem del historial sobre el que se hace clic." msgid "" "If checked, enables checking multiple concurrent user logic. Use if several " "different users are logged in at the same time." msgstr "" "Si se usa, habilita el chequeo de operaciones de múltiples usuarios " "concurrentemente. Úselo si varios usuarios distintos inician sesión al mismo " "tiempo." msgid "" "If checked, enables debug prints on clipboard update logic. This only takes " "effect when enabled at start up, and may be disabled at compile time." msgstr "" "Si se marca, habilita la impresión de mensajes de depuración para operaciones " "de actualización del portapapeles. Solo tiene efecto si se habilita durante " "el inicio, y puede inhabilitarse durante la compilación." msgid "If checked, enables the persistent history." msgstr "Si se marca, habilita el historial persistente." msgid "" "If checked, places current clipboard entry at top of list. If not checked, " "history does not get sorted." msgstr "" "Si se marca, coloca la entrada actual del portapapeles al principio de la " "lista. Si no se marca, el historial no se ordena." msgid "If checked, puts the persistent history at the top of the history list." msgstr "" "Si se marca, coloca el historial persistente al principio de la lista del " "historial." msgid "If checked, puts the persistent history in a new list." msgstr "Si se marca, coloca el historial persistente en una lista nueva." msgid "If checked, the current entry will be on the bottom instead of the top." msgstr "" "Si se marca, la entrada actual se sitúa al final de la lista en vez de al " "principio." msgid "If checked, Use the clipboard, which is Ctrl-C, Ctrl-V" msgstr "Si se marca, se usa el portapapeles, que es Ctrl-C, Ctrl-V" msgid "" "If checked, Use the primary clipboard (mouse highlight-copy, middle mouse " "button paste)" msgstr "" "Si se marca, se usa el portapapeles primario (seleccionar con el ratón copia, " "botón central del ratón pega)" msgid "If checked, use X, Y to position the history list" msgstr "Si se marca, se usa X, Y para posicionar la lista del historial" msgid "" "If checked, will display tabs with Right arrow (utf8,\\2192), newlines with " "pharagrph(\\204b), and spaces with square-u(\\2423)." msgstr "" "Si se marca, se muestran los tabuladores con Right arrow (utf8,\\2192), las " "nuevas lineas con pharagrph (\\204b), y los espacios con square-u (\\2423)." msgid "If checked, will emit the history entry via the keyboard entry." msgstr "" "Si se marca, se emite la entrada del historial por medio de la entrada de " "teclado." msgid "" "If checked, will ignore any clipboard additions that contain only whitespace." msgstr "" "Si se marca, se ignora cualquier adición que solo contenga espacios, " "tabuladores y saltos de línea" msgid "" "If checked, will keep both clipboards with the same content. If primary is " "pasted, then copy will have the same data." msgstr "" "Si se marca, se mantienen ambos portapapeles con el mismo contenido. Si se " "pega en el primario, entonces Copiar tendrá el mismo dato." msgid "If checked, will replace newlines with spaces." msgstr "Si se marca, sustituirá los saltos de línea con espacios." msgid "If checked, will restore clipboard entry on application exit." msgstr "" "Si se marca, se restablecerá la entrada del portapapeles al salir de la " "aplicación." msgid "If checked, will trim whitespace from beginning and end of entry." msgstr "" "Si se marca, se eliminan espacios, tabuladores y saltos de línea al principio " "y al final de la entrada." msgid "If checked, will use Ctrl-V paste." msgstr "Si se marca, se usará Ctrl-V para pegar." msgid "If checked, will use middle mouse to paste." msgstr "Si se marca, se usará el botón central del ratón para pegar." msgid "If checked, will use xdotool to paste wherever the mouse is." msgstr "" "Si se marca, se usará xdotool para pegar dondequiera que esté el ratón." msgid "Ignore Whitespace Only" msgstr "Ignorar si solo hay espacios en blanco" msgid "Items in history" msgstr "Ítems en el historial" msgid "Key" msgstr "Tecla" msgid "Keyboard Input" msgstr "Entrada por teclado" msgid "Lightweight GTK+ clipboard manager." msgstr "Gestor ligero del portapapeles escrito usando GTK+" msgid "Max Data Size(MB)" msgstr "Tamaño máximo de los datos (MB)" msgid "Maximum data size of entire history list" msgstr "Tamaño máximo de los datos de la lista completa del historial" msgid "Maximum number of clipboard entries to keep" msgstr "Máximo número de ítems a mantener en el historial" msgid "Menu key combination" msgstr "Combinación de teclas para el menú" msgid "Middle" msgstr "Medio" msgid "Mouse" msgstr "Ratón" msgid "Multiuser" msgstr "Multiusuario" msgid "Omit items in the:" msgstr "Usar elipsis en los ítems en el:" msgid "Paste All Entry Delimiter" msgstr "Pegar todos los delimitadores de los ítems" msgid "Persistent As Separate List" msgstr "Lista separada para lo persistente" msgid "Persistent History" msgstr "Historial persistente" msgid "Persistent history key:" msgstr "Tecla para historial persistente:" msgid "Persistent On Top" msgstr "Mostrar lo persistente primero" msgid "Position history" msgstr "Posición del historial" msgid "Position in pixels from the top of the screen" msgstr "Posición en píxeles desde la parte superior de la pantalla" msgid "Preferences" msgstr "Preferencias" msgid "Print clipboard contents" msgstr "Imprimir el contenido del portapapeles" msgid "Print primary contents" msgstr "Imprimir los contenidos principales" msgid "Remove" msgstr "Eliminar" msgid "Restore Empty" msgstr "Restaurar vacío" msgid "Right Click Edit" msgstr "Editar con clic derecho" msgid "Run as daemon" msgstr "Ejecutar como demonio" msgid "Save history" msgstr "Guardar historial" msgid "" "Save History as a text file. Prepends xHIST_0000 to each entry. x is either " "P(persistent) or N (normal)" msgstr "" "Guardar historial como archivo de texto. Antepone xHIST_0000 a cada entrada. " "x es o bien P(persistente) o bien N (normal)" msgid "Save history to a file." msgstr "Guardar historial en un fichero" msgid "Search As You Type" msgstr "Buscar mientras se escribe" msgid "Show in a single line" msgstr "Mostrar en una sola línea" msgid "Show in reverse order" msgstr "Mostrar en orden inverso" msgid "> " msgstr "> " msgid "S_ynchronize clipboards" msgstr "S_incronizar los portapapeles" msgid "This is the Action Name. \nDO NOT put commands here." msgstr "Este es el Nombre de la acción. \nNO ponga órdenes aquí." msgid "" "This program is free software; you can redistribute it and/or modify\nit " "under the terms of the GNU General Public License as published by\nthe Free " "Software Foundation; either version 3 of the License, or\n(at your option) " "any later version.\n\nThis program is distributed in the hope that it will be " "useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty " "of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\nGNU " "General Public License for more details.\n\nYou should have received a copy " "of the GNU General Public License\nalong with this program. If not, see <" "http://www.gnu.org/licenses/>.;" msgstr "" "Este programa es software libre; puede redistribuirlo y/o modificarlo\nbajo " "los términos de la Licencia Pública General GNU publicada por\nla Free " "Software Foundation; tanto la versión 3 de la Licencia, or\n(a su elección) " "cualquier versión posterior.\n\nEste programa se distribuye con la esperanza " "de que sea útil,\npero SIN NINGUNA GARANTÍA; incluso sin la garantía " "implícita de\nCOMERCIALIZACIÓN o IDONEIDAD PARA UN PROPÓSITO PARTICULAR. Vea " "la\nLicencia Pública General de GNU para más detalles.\n\nDebería haber " "recibido una copia de la Licencia Pública General de GNU\njunto con este " "programa. Si no es así, consulte .;" msgid "" "This string will be inserted between each line of history for paste all." msgstr "" "Estos caracteres se insertarán entre cada línea del historial para Pegar todo." msgid "Trim Newlines" msgstr "Eliminar los saltos de línea" msgid "Trim Whitespace" msgstr "Eliminar los espacios en blanco" msgid "Use Alt-E to edit, Alt-C to clear" msgstr "Use Alt-E para editar, Alt-C para borrar" msgid "Use _Copy (Ctrl-C)" msgstr "Usar _Copiar (Ctrl-C)" msgid "" "Use %% if you want a literal %. See the man page for gnuC printf (man 2 " "printf) for more information." msgstr "" "Use %% si quiere un literal %. Vea la página man de gnuC printf (man 2 " "printf) para obtener más información." msgid "Use _Primary (Selection)" msgstr "Usar _Primario (Selección)" msgid "" "Written by Gilberto \"Xyhthyx\" Miralla and Doug Springer.\nReport bugs to <" "gpib@rickyrockrat.net>." msgstr "" "Escrito por Gilberto \"Xyhthyx\" Miralla y Doug Springer.\nComunicar fallos a " "." parcellite-1.2.1/po/zh_TW.po0000644000175000017500000002024613041603201013744 0ustar hlehle# Traditional Chinese translation of parcellite. # Copyright (C) 2008 Xyhthyx # Copyright (C) 2010-2013 Doug Springer # This file is distributed under the same license as the parcellite package. # Vincent Coiffier , 2009. # Benjamin Danon , 2009-2013. # msgid "" msgstr "" "Project-Id-Version: 1.1.7\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-12-29 15:00-0000\n" "Last-Translator: Wenjie Huang \n" "Language-Team: CHINESE\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" msgid "Clipboards" msgstr "剪貼簿" msgid "History" msgstr "歷史紀錄" msgid "Hotkeys" msgstr "熱鍵" msgid "Items" msgstr "項目" msgid "Miscellaneous" msgstr "其他" msgid "None" msgstr "" msgid "Omitting" msgstr "略去" msgid "Action" msgstr "動作" msgid "Actions" msgstr "動作" msgid "Actions key combination:" msgstr "動作按鍵組合:" msgid "Add..." msgstr "增加…" msgid "Alternate Non-printing Display" msgstr "顯示不可列印字元" msgid "Auto Paste" msgstr "自動貼上" msgid "Beginning" msgstr "起始" msgid "Behavior" msgstr "行為" msgid "Capture hyperlinks only" msgstr "僅抓取超連結" msgid "Case Sensitive Search" msgstr "大小寫符合之搜尋" msgid "Character length of items:" msgstr "項目顯示字數" msgid "Clear the history?" msgstr "清除歷史紀錄?" msgid "Clipboard Manager" msgstr "剪貼簿管理器" msgid "Command" msgstr "命令" msgid "Confirm before clearing history" msgstr "清空歷史紀錄時確認" msgid "Control-click Parcellite's tray icon to use actions" msgstr "按住 Ctrl 並點擊 Parcellite 的任務列圖示以使用動作" msgid "Could not create thread for executed action\n" msgstr "無法為此動作建立線程\n" msgid "Couldn't create directory: %s\n" msgstr "無法建立目錄: %s\n" msgid "Current entry on top" msgstr "當前項目置頂" msgid "Display" msgstr "顯示" msgid "Display Version info" msgstr "顯示版本資訊" msgid "Do not use status icon (Ctrl-Alt-P for menu)" msgstr "不使用狀態列圖示(Ctrl-Alt-P 呼叫選單)" msgid "Dummy desc" msgstr "" msgid "Dummy tip" msgstr "" msgid "_Edit actions" msgstr "編輯動作" msgid "_Edit Clipboard" msgstr "編輯剪貼簿" msgid "Editing Clipboard" msgstr "編輯剪貼簿" msgid "Empty" msgstr "空" msgid "End" msgstr "結尾" msgid "Executing action..." msgstr "執行動作…" msgid "_History" msgstr "歷史紀錄" msgid "History key combination:" msgstr "歷史紀錄按鍵組合:" msgid "Hotkeys" msgstr "熱鍵" msgid "If checked, does a search-as-you-type. Turns red if not found. Goes to top (Alt-E) line when no chars are entered for search" msgstr "" msgid "If checked, does case sensitive search" msgstr "" msgid "If checked, edit the history item clicked on." msgstr "" msgid "If checked, enables checking multiple concurrent user logic. Use if several different users are logged in at the same time." msgstr "" msgid "If checked, enables debug prints on clipboard update logic. This only takes effect when enabled at start up, and may be disabled at compile time." msgstr "" msgid "If checked, enables the persistent history." msgstr "" msgid "If checked, places current clipboard entry at top of list. If not checked, history does not get sorted." msgstr "" msgid "If checked, puts the persistent history at the top of the history list." msgstr "" msgid "If checked, puts the persistent history in a new list." msgstr "" msgid "If checked, the current entry will be on the bottom instead of the top." msgstr "" msgid "If checked, Use the clipboard, which is Ctrl-C, Ctrl-V" msgstr "" msgid "If checked, Use the primary clipboard (mouse highlight-copy, middle mouse button paste)" msgstr "" msgid "If checked, use X, Y to position the history list" msgstr "" msgid "If checked, will display tabs with Right arrow (utf8,\\2192), newlines with pharagrph(\\204b), and spaces with square-u(\\2423)." msgstr "" msgid "If checked, will emit the history entry via the keyboard entry." msgstr "" msgid "If checked, will ignore any clipboard additions that contain only whitespace." msgstr "" msgid "If checked, will keep both clipboards with the same content. If primary is pasted, then copy will have the same data." msgstr "" msgid "If checked, will replace newlines with spaces." msgstr "" msgid "If checked, will restore clipboard entry on application exit." msgstr "" msgid "If checked, will trim whitespace from beginning and end of entry." msgstr "" msgid "If checked, will use Ctrl-V paste." msgstr "" msgid "If checked, will use middle mouse to paste." msgstr "" msgid "If checked, will use xdotool to paste wherever the mouse is." msgstr "" msgid "Ignore Whitespace Only" msgstr "忽略空白" msgid "Items in history" msgstr "歷史紀錄數目" msgid "Key" msgstr "鍵盤" msgid "Keyboard Input" msgstr "鍵盤輸入" msgid "Lightweight GTK+ clipboard manager." msgstr "輕量級 GTK+ 剪貼簿管理器。" msgid "Max Data Size(MB)" msgstr "使用空間上限(MB)" msgid "Maximum data size of entire history list" msgstr "全部歷史紀錄的使用空間上限" msgid "Maximum number of clipboard entries to keep" msgstr "剪貼簿項目允許的最大數量" msgid "Menu key combination" msgstr "選單按鍵組合:" msgid "Middle" msgstr "中間" msgid "Mouse" msgstr "滑鼠" msgid "Multiuser" msgstr "多使用者" msgid "Omit items in the:" msgstr "顯示項目時略去:" msgid "Paste All Entry Delimiter" msgstr "貼上所有項目時的分隔符號" msgid "Persistent As Separate List" msgstr "固定為獨立列表" msgid "Persistent History" msgstr "固定歷史紀錄" msgid "Persistent On Top" msgstr "固定置頂" msgid "Persistent history key:" msgstr "固定歷史紀錄:" msgid "Position history" msgstr "歷史紀錄位置" msgid "Position in pixels from the top of the screen" msgstr "" msgid "Preferences" msgstr "設定" msgid "Print clipboard contents" msgstr "列印剪貼簿内容" msgid "Print primary contents" msgstr "列印 primary 内容" msgid "Remove" msgstr "删除" msgid "Restore Empty" msgstr "回復為空" msgid "Run as daemon" msgstr "以 daemon 執行" msgid "S_ynchronize clipboards" msgstr "將兩種剪貼簿同步(_Y)" msgid "Save history" msgstr "儲存歷史紀錄" msgid "Save History as a text file. Prepends xHIST_0000 to each entry. x is either P(persistent) or N (normal)" msgstr "" msgid "Save history to a file." msgstr "將歷史紀錄儲存為一個檔案" msgid "Search As You Type" msgstr "輸入時立即搜尋" msgid "Show in a single line" msgstr "顯示於一行" msgid "Show in reverse order" msgstr "降冪顯示" msgid "This is the Action Name. \nDO NOT put commands here." msgstr "" msgid "This program is free software; you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation; either version 3 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program. If not, see .;" msgstr "" msgid "This string will be inserted between each line of history for paste all." msgstr "" msgid "Trim Newlines" msgstr "刪除最後空白行" msgid "Trim Whitespace" msgstr "刪除空白" msgid "Use Alt-E to edit, Alt-C to clear" msgstr "使用 Alt-E 編輯、 Alt-C 清除" msgid "Use _Copy (Ctrl-C)" msgstr "使用 _Copy (Ctrl-C)" msgid "Use %% if you want a literal %. See the man page for gnuC printf (man 2 printf) for more information." msgstr "" msgid "Use _Primary (Selection)" msgstr "使用 _Primary (Selection)" msgid "Written by Gilberto \"Xyhthyx\" Miralla and Doug Springer.\nReport bugs to ." msgstr "由 Gilberto \"Xyhthyx\" Miralla 開發\n回報問題給 " parcellite-1.2.1/po/ja.po0000644000175000017500000001550613041603201013306 0ustar hlehle# Japanese translation of parcellite # Copyright (C) 2008 Xyhthyx # This file is distributed under the same license as the parcellite package. # Jiro Kawada , 2008. # # msgid "" msgstr "" "Project-Id-Version: Parcellite\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-18 12:08-0400\n" "PO-Revision-Date: 2009-03-14 11:08+0900\n" "Last-Translator: jiro kawada \n" "Language-Team: JAPANESE\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Japanese\n" "X-Poedit-Country: JAPAN\n" #: ../src/main.c:166 msgid "Executing action..." msgstr "アクション実行中..." #: ../src/main.c:172 ../src/main.c:704 ../data/parcellite.desktop.in.h:1 #: ../data/parcellite-startup.desktop.in.h:1 msgid "Clipboard Manager" msgstr "クリップボード・マネージャ" #: ../src/main.c:195 msgid "Could not create thread for executed action\n" msgstr "実行されたアクションのためのスレッドが作成できませんでした。\n" #. Create the dialog #: ../src/main.c:225 msgid "Editing Clipboard" msgstr "クリップボード編集中" #: ../src/main.c:284 msgid "Clear the history?" msgstr "履歴を消去しますか?" #: ../src/main.c:336 msgid "Lightweight GTK+ clipboard manager." msgstr "軽量な GTK+ クリップボード・マネージャ" #: ../src/main.c:423 msgid "None" msgstr "なし" #. File contained no actions so adding empty #. File did not open so adding empty #. Nothing in history so adding empty #: ../src/main.c:444 ../src/main.c:473 ../src/main.c:588 msgid "Empty" msgstr "空" #. Edit actions #: ../src/main.c:480 msgid "_Edit actions" msgstr "アクション編集(_E)" #. Edit clipboard #: ../src/main.c:504 msgid "_Edit Clipboard" msgstr "クリップボード編集(_E)" #: ../src/utils.c:38 ../src/utils.c:45 #, c-format msgid "Couldn't create directory: %s\n" msgstr "ディレクトリの作成ができませんでした。: %s\n" #: ../src/utils.c:84 msgid "Run as daemon" msgstr "デーモンとして実行" #: ../src/utils.c:91 msgid "Do not use status icon (Ctrl-Alt-P for menu)" msgstr "ステータスアイコンを使用しない(Ctrl-Alt-P でメニュー)" #: ../src/utils.c:98 msgid "Print clipboard contents" msgstr "クリップボード内容を出力" #: ../src/utils.c:105 msgid "Print primary contents" msgstr "プライマリ内容を出力" #: ../src/utils.c:117 msgid "" "Clipboard CLI usage examples:\n" "\n" " echo \"copied to clipboard\" | parcellite\n" " parcellite \"copied to clipboard\"\n" " echo \"copied to clipboard\" | parcellite -c" msgstr "" "クリップボードの CLI の使用例:\n" "\n" " echo \"クリップボードにコピー\" | parcellite\n" " parcellite \"クリップボードにコピー\"\n" " echo \"クリップボードにコピー\" | parcellite -c" #: ../src/utils.c:123 msgid "" "Written by Gilberto \"Xyhthyx\" Miralla.\n" "Report bugs to ." msgstr "" "Gilberto \"Xyhthyx\" Miralla による制作\n" "バグ報告はこちらに " #. Create the dialog #: ../src/preferences.c:375 msgid "Preferences" msgstr "設定" #: ../src/preferences.c:390 msgid "Behavior" msgstr "動作" #: ../src/preferences.c:398 msgid "Clipboards" msgstr "クリップボード" #: ../src/preferences.c:405 msgid "Use _Copy (Ctrl-C)" msgstr "コピー(Ctrl-C)を使用(_C)" #: ../src/preferences.c:407 msgid "Use _Primary (Selection)" msgstr "プライマリ・セレクション(選択)を使用(_P)" #: ../src/preferences.c:409 msgid "S_ynchronize clipboards" msgstr "クリップボード同士を同期(_Y)" #: ../src/preferences.c:417 msgid "History" msgstr "履歴" #: ../src/preferences.c:424 msgid "_Save history" msgstr "履歴を保存(_S)" #: ../src/preferences.c:425 msgid "Save and restore history between sessions" msgstr "セッション間の履歴を保存して復元" #: ../src/preferences.c:429 msgid "Items in history:" msgstr "履歴アイテム数:" #: ../src/preferences.c:442 msgid "Miscellaneous" msgstr "その他" #: ../src/preferences.c:449 msgid "Capture _hyperlinks only" msgstr "ハイパーリンクのみを取り込み(_H)" #: ../src/preferences.c:451 msgid "C_onfirm before clearing history" msgstr "履歴を消去する前に確認を取る(_O)" #: ../src/preferences.c:458 msgid "Display" msgstr "表示" #: ../src/preferences.c:466 msgid "Items" msgstr "アイテム" #: ../src/preferences.c:473 msgid "Show in a _single line" msgstr "1行で表示(_S)" #: ../src/preferences.c:475 msgid "Show in _reverse order" msgstr "逆順に表示(_R)" #: ../src/preferences.c:479 msgid "Character length of items:" msgstr "アイテムの表示文字数:" #: ../src/preferences.c:492 msgid "Omitting" msgstr "省略" #: ../src/preferences.c:501 msgid "Omit items in the:" msgstr "アイテムの省略表示:" #: ../src/preferences.c:505 msgid "Beginning" msgstr "文頭" #: ../src/preferences.c:506 msgid "Middle" msgstr "文中" #: ../src/preferences.c:507 msgid "End" msgstr "文末" #: ../src/preferences.c:514 msgid "Actions" msgstr "アクション" #. Build the actions label #: ../src/preferences.c:519 msgid "Control-click Parcellite's tray icon to use actions" msgstr "アクションの使用は Ctrl + Parcellite トレイアイコンのクリック" #: ../src/preferences.c:539 msgid "Action" msgstr "アクション" #: ../src/preferences.c:546 msgid "Command" msgstr "コマンド" #: ../src/preferences.c:561 msgid "Add..." msgstr "追加..." #: ../src/preferences.c:565 msgid "Remove" msgstr "削除" #: ../src/preferences.c:582 msgid "Hotkeys" msgstr "ホットキー" #: ../src/preferences.c:590 msgid "Hotkeys" msgstr "ホットキー" #: ../src/preferences.c:599 msgid "History key combination:" msgstr "履歴キーの組み合せ:" #: ../src/preferences.c:607 msgid "Actions key combination:" msgstr "アクションキーの組み合せ:" #: ../src/preferences.c:615 msgid "Menu key combination:" msgstr "メニューキーの組み合せ:" #: ../data/parcellite.desktop.in.h:2 ../data/parcellite-startup.desktop.in.h:2 msgid "Parcellite" msgstr "Parcellite" #~ msgid "Clipboard" #~ msgstr "クリップボード" #~ msgid "Save changes" #~ msgstr "変更保存" #~ msgid "Discard changes" #~ msgstr "変更破棄" #~ msgid "Extras" #~ msgstr "その他" #~ msgid "" #~ "Add a new action\n" #~ "\"%s\" in a command is replaced with the clipboard contents" #~ msgstr "" #~ "新しいアクションを追加\n" #~ "コマンドの \"%s\" は、クリップボードの内容と置き換えられます。" #~ msgid "Move selected action up" #~ msgstr "選択アクションを上に移動" #~ msgid "Move selected action down" #~ msgstr "選択アクションを下に移動" parcellite-1.2.1/po/tr.po0000644000175000017500000001725313041603201013342 0ustar hlehle# Turkish translation of parcellite # Copyright (C) 2008 Xyhthyx # This file is distributed under the same license as the parcellite package. # Hedef Türkçe , 2008. # # msgid "" msgstr "" "Project-Id-Version: Parcellite 0.8\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-18 12:08-0400\n" "PO-Revision-Date: 2008-09-09 02:05+0200\n" "Last-Translator: Hasan Yılmaz \n" "Language-Team: Turkish\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Poedit-Language: Turkish\n" "X-Poedit-Country: TURKEY\n" "X-Poedit-SourceCharset: utf-8\n" #: ../src/main.c:166 msgid "Executing action..." msgstr "Eylem yürütülüyor..." #: ../src/main.c:172 ../src/main.c:704 ../data/parcellite.desktop.in.h:1 #: ../data/parcellite-startup.desktop.in.h:1 msgid "Clipboard Manager" msgstr "Pano Yöneticisi" #: ../src/main.c:195 msgid "Could not create thread for executed action\n" msgstr "Çalıştırılan eylem için iş parçacıkları yaratmayın\n" #. Create the dialog #: ../src/main.c:225 msgid "Editing Clipboard" msgstr "Pano Düzenleme" #: ../src/main.c:284 msgid "Clear the history?" msgstr "Geçmiş temizlensin mi?" #: ../src/main.c:336 msgid "Lightweight GTK+ clipboard manager." msgstr "Hafif GTK+ pano yöneticisi." #: ../src/main.c:423 msgid "None" msgstr "Hiçbiri" #. File contained no actions so adding empty #. File did not open so adding empty #. Nothing in history so adding empty #: ../src/main.c:444 ../src/main.c:473 ../src/main.c:588 msgid "Empty" msgstr "Boş" #. Edit actions #: ../src/main.c:480 msgid "_Edit actions" msgstr "Eylemleri _düzenle" #. Edit clipboard #: ../src/main.c:504 msgid "_Edit Clipboard" msgstr "Panoyu _düzenle" #: ../src/utils.c:38 ../src/utils.c:45 #, c-format msgid "Couldn't create directory: %s\n" msgstr "Dizin yaratılamıyor: %s\n" #: ../src/utils.c:84 msgid "Run as daemon" msgstr "Artalan işlem olarak çalıştır" #: ../src/utils.c:91 msgid "Do not use status icon (Ctrl-Alt-P for menu)" msgstr "Durum simgesini kullanma (menü için Ctrl-Alt-P)" #: ../src/utils.c:98 msgid "Print clipboard contents" msgstr "Pano içeriğini yazdır" #: ../src/utils.c:105 #, fuzzy msgid "Print primary contents" msgstr "Pano içeriğini yazdır" #: ../src/utils.c:117 #, fuzzy msgid "" "Clipboard CLI usage examples:\n" "\n" " echo \"copied to clipboard\" | parcellite\n" " parcellite \"copied to clipboard\"\n" " echo \"copied to clipboard\" | parcellite -c" msgstr "" "Pano CLI kullanım örnekleme:\n" "\n" " echo \"panoya kopyalandı\" | parcellite\n" " parcellite \"panoya kopyalandı\"\n" " echo \"panoya kopyalandı\" | parcellite -o" #: ../src/utils.c:123 #, fuzzy msgid "" "Written by Gilberto \"Xyhthyx\" Miralla.\n" "Report bugs to ." msgstr "" "Kodlayan Xyhthyx.\n" "Yanlışların gönderileceği adres ." #. Create the dialog #: ../src/preferences.c:375 msgid "Preferences" msgstr "Yeğlenenler" #: ../src/preferences.c:390 #, fuzzy msgid "Behavior" msgstr "Davranış" #: ../src/preferences.c:398 #, fuzzy msgid "Clipboards" msgstr "Pano" #: ../src/preferences.c:405 msgid "Use _Copy (Ctrl-C)" msgstr "" #: ../src/preferences.c:407 msgid "Use _Primary (Selection)" msgstr "" #: ../src/preferences.c:409 msgid "S_ynchronize clipboards" msgstr "" #: ../src/preferences.c:417 msgid "History" msgstr "Geçmiş" #: ../src/preferences.c:424 msgid "_Save history" msgstr "Geçmişi _kaydet" #: ../src/preferences.c:425 #, fuzzy msgid "Save and restore history between sessions" msgstr "Oturumlar arasında geçmişi sakla ve geri yükle" #: ../src/preferences.c:429 #, fuzzy msgid "Items in history:" msgstr "Geçmişte tutulacak öğe sayısı:" #: ../src/preferences.c:442 #, fuzzy msgid "Miscellaneous" msgstr "Görüntüle" #: ../src/preferences.c:449 #, fuzzy msgid "Capture _hyperlinks only" msgstr "Sadece linkleri _yakala" #: ../src/preferences.c:451 #, fuzzy msgid "C_onfirm before clearing history" msgstr "Geçmişi silmeden önce doğrula" #: ../src/preferences.c:458 #, fuzzy msgid "Display" msgstr "Görüntüle" #: ../src/preferences.c:466 #, fuzzy msgid "Items" msgstr "Geçiş Tuşları" #: ../src/preferences.c:473 #, fuzzy msgid "Show in a _single line" msgstr "Öğeleri tek satırda göster" #: ../src/preferences.c:475 #, fuzzy msgid "Show in _reverse order" msgstr "Geçmiş öğeleri ters dizili olarak göster" #: ../src/preferences.c:479 msgid "Character length of items:" msgstr "" #: ../src/preferences.c:492 #, fuzzy msgid "Omitting" msgstr "Geçmiş" #: ../src/preferences.c:501 #, fuzzy msgid "Omit items in the:" msgstr "Uzun öğelerin gösterilmeyeceği yer:" #: ../src/preferences.c:505 msgid "Beginning" msgstr "Başlangıç" #: ../src/preferences.c:506 msgid "Middle" msgstr "Orta" #: ../src/preferences.c:507 msgid "End" msgstr "Bitiş" #: ../src/preferences.c:514 msgid "Actions" msgstr "Eylemler" #. Build the actions label #: ../src/preferences.c:519 msgid "Control-click Parcellite's tray icon to use actions" msgstr "" "Eylemleri kullanabilmek için Parcellite'nin tepsi simgesine Ctrl ile tıklayın" #: ../src/preferences.c:539 msgid "Action" msgstr "Eylem" #: ../src/preferences.c:546 msgid "Command" msgstr "Komut" #: ../src/preferences.c:561 msgid "Add..." msgstr "" #: ../src/preferences.c:565 msgid "Remove" msgstr "" #: ../src/preferences.c:582 #, fuzzy msgid "Hotkeys" msgstr "Geçiş Tuşları" #: ../src/preferences.c:590 msgid "Hotkeys" msgstr "Geçiş Tuşları" #: ../src/preferences.c:599 msgid "History key combination:" msgstr "" #: ../src/preferences.c:607 msgid "Actions key combination:" msgstr "" #: ../src/preferences.c:615 msgid "Menu key combination:" msgstr "" #: ../data/parcellite.desktop.in.h:2 ../data/parcellite-startup.desktop.in.h:2 msgid "Parcellite" msgstr "" #~ msgid "Clipboard" #~ msgstr "Pano" #~ msgid "Save changes" #~ msgstr "Değişiklikleri kaydet" #, fuzzy #~ msgid "Discard changes" #~ msgstr "Değişiklikleri kaydet" #, fuzzy #~ msgid "" #~ "Add a new action\n" #~ "\"%s\" in a command is replaced with the clipboard contents" #~ msgstr "\"%s\" pano içeriği ile değiştirilecek" #, fuzzy #~ msgid "Move selected action up" #~ msgstr "Seçileni yukarı taşı" #, fuzzy #~ msgid "Move selected action down" #~ msgstr "Seçileni aşağı taşı" #~ msgid "Close" #~ msgstr "Kapat" #~ msgid "New Action" #~ msgstr "Yeni eylem" #~ msgid "Name:" #~ msgstr "Ad:" #~ msgid "Name your action" #~ msgstr "Eylemi adlandır" #~ msgid "Command:" #~ msgstr "Komut:" #~ msgid "Edit Action" #~ msgstr "Eylemi Düzenle" #~ msgid "General" #~ msgstr "Genel" #~ msgid "Length in characters of history items:" #~ msgstr "Geçmişteki öğelerin karakter uzunlukları:" #~ msgid "History menu global hotkey:" #~ msgstr "Geçmiş menüsü genel geçiş tuşu:" #~ msgid "Actions menu global hotkey:" #~ msgstr "Eylemler menüsü genel geçiş tuşu:" #, fuzzy #~ msgid "Parcellite menu global hotkey:" #~ msgstr "Geçmiş menüsü genel geçiş tuşu:" #~ msgid "C_onfirm clear" #~ msgstr "Silmeyi _doğrula" #~ msgid "_Reverse history" #~ msgstr "Geçmişi _ters çevir" #~ msgid "Single _line mode" #~ msgstr "_Tek satır kipi" #~ msgid "Ignore all non-hyperlink text" #~ msgstr "Link olmayan tüm metni yok say" #~ msgid "New" #~ msgstr "Yeni" #~ msgid "New action" #~ msgstr "Yeni eylem" #~ msgid "Edit" #~ msgstr "Düzenle" #~ msgid "Edit selected" #~ msgstr "Seçileni düzenle" #~ msgid "Delete" #~ msgstr "Sil" #~ msgid "Delete selected" #~ msgstr "Seçileni sil" parcellite-1.2.1/po/Makefile.in.in0000644000175000017500000001536513041603201015031 0ustar hlehle# Makefile for program source directory in GNU NLS utilities package. # Copyright (C) 1995, 1996, 1997 by Ulrich Drepper # Copyright (C) 2004-2008 Rodney Dawes # # This file may be copied and used freely without restrictions. It may # be used in projects which are not available under a GNU Public License, # but which still want to provide support for the GNU gettext functionality. # # - Modified by Owen Taylor to use GETTEXT_PACKAGE # instead of PACKAGE and to look for po2tbl in ./ not in intl/ # # - Modified by jacob berkman to install # Makefile.in.in and po2tbl.sed.in for use with glib-gettextize # # - Modified by Rodney Dawes for use with intltool # # We have the following line for use by intltoolize: # INTLTOOL_MAKEFILE GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ PACKAGE = @PACKAGE@ VERSION = @VERSION@ SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ top_builddir = @top_builddir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ datadir = @datadir@ datarootdir = @datarootdir@ libdir = @libdir@ DATADIRNAME = @DATADIRNAME@ itlocaledir = $(prefix)/$(DATADIRNAME)/locale subdir = po install_sh = @install_sh@ # Automake >= 1.8 provides @mkdir_p@. # Until it can be supposed, use the safe fallback: mkdir_p = $(install_sh) -d INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ GMSGFMT = @GMSGFMT@ MSGFMT = @MSGFMT@ XGETTEXT = @XGETTEXT@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ MSGMERGE = INTLTOOL_EXTRACT=$(INTLTOOL_EXTRACT) srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --dist GENPOT = INTLTOOL_EXTRACT=$(INTLTOOL_EXTRACT) srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --pot ALL_LINGUAS = @ALL_LINGUAS@ PO_LINGUAS=$(shell if test -r $(srcdir)/LINGUAS; then grep -v "^\#" $(srcdir)/LINGUAS; else echo "$(ALL_LINGUAS)"; fi) USER_LINGUAS=$(shell if test -n "$(LINGUAS)"; then LLINGUAS="$(LINGUAS)"; ALINGUAS="$(ALL_LINGUAS)"; for lang in $$LLINGUAS; do if test -n "`grep '^$$lang$$' $(srcdir)/LINGUAS 2>/dev/null`" -o -n "`echo $$ALINGUAS|tr ' ' '\n'|grep '^$$lang$$'`"; then printf "$$lang "; fi; done; fi) USE_LINGUAS=$(shell if test -n "$(USER_LINGUAS)" -o -n "$(LINGUAS)"; then LLINGUAS="$(USER_LINGUAS)"; else if test -n "$(PO_LINGUAS)"; then LLINGUAS="$(PO_LINGUAS)"; else LLINGUAS="$(ALL_LINGUAS)"; fi; fi; for lang in $$LLINGUAS; do printf "$$lang "; done) POFILES=$(shell LINGUAS="$(PO_LINGUAS)"; for lang in $$LINGUAS; do printf "$$lang.po "; done) DISTFILES = Makefile.in.in POTFILES.in $(POFILES) EXTRA_DISTFILES = ChangeLog POTFILES.skip Makevars LINGUAS POTFILES = \ # This comment gets stripped out CATALOGS=$(shell LINGUAS="$(USE_LINGUAS)"; for lang in $$LINGUAS; do printf "$$lang.gmo "; done) .SUFFIXES: .SUFFIXES: .po .pox .gmo .mo .msg .cat .po.pox: $(MAKE) $(GETTEXT_PACKAGE).pot $(MSGMERGE) $< $(GETTEXT_PACKAGE).pot -o $*.pox .po.mo: $(MSGFMT) -o $@ $< .po.gmo: file=`echo $* | sed 's,.*/,,'`.gmo \ && rm -f $$file && $(GMSGFMT) -o $$file $< .po.cat: sed -f ../intl/po2msg.sed < $< > $*.msg \ && rm -f $@ && gencat $@ $*.msg all: all-@USE_NLS@ all-yes: $(CATALOGS) all-no: $(GETTEXT_PACKAGE).pot: $(POTFILES) $(GENPOT) install: install-data install-data: install-data-@USE_NLS@ install-data-no: all install-data-yes: all linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ dir=$(DESTDIR)$(itlocaledir)/$$lang/LC_MESSAGES; \ $(mkdir_p) $$dir; \ if test -r $$lang.gmo; then \ $(INSTALL_DATA) $$lang.gmo $$dir/$(GETTEXT_PACKAGE).mo; \ echo "installing $$lang.gmo as $$dir/$(GETTEXT_PACKAGE).mo"; \ else \ $(INSTALL_DATA) $(srcdir)/$$lang.gmo $$dir/$(GETTEXT_PACKAGE).mo; \ echo "installing $(srcdir)/$$lang.gmo as" \ "$$dir/$(GETTEXT_PACKAGE).mo"; \ fi; \ if test -r $$lang.gmo.m; then \ $(INSTALL_DATA) $$lang.gmo.m $$dir/$(GETTEXT_PACKAGE).mo.m; \ echo "installing $$lang.gmo.m as $$dir/$(GETTEXT_PACKAGE).mo.m"; \ else \ if test -r $(srcdir)/$$lang.gmo.m ; then \ $(INSTALL_DATA) $(srcdir)/$$lang.gmo.m \ $$dir/$(GETTEXT_PACKAGE).mo.m; \ echo "installing $(srcdir)/$$lang.gmo.m as" \ "$$dir/$(GETTEXT_PACKAGE).mo.m"; \ else \ true; \ fi; \ fi; \ done # Empty stubs to satisfy archaic automake needs dvi info tags TAGS ID: # Define this as empty until I found a useful application. install-exec installcheck: uninstall: linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ rm -f $(DESTDIR)$(itlocaledir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo; \ rm -f $(DESTDIR)$(itlocaledir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo.m; \ done check: all $(GETTEXT_PACKAGE).pot rm -f missing notexist srcdir=$(srcdir) $(INTLTOOL_UPDATE) -m if [ -r missing -o -r notexist ]; then \ exit 1; \ fi mostlyclean: rm -f *.pox $(GETTEXT_PACKAGE).pot *.old.po cat-id-tbl.tmp rm -f .intltool-merge-cache clean: mostlyclean distclean: clean rm -f Makefile Makefile.in POTFILES stamp-it rm -f *.mo *.msg *.cat *.cat.m *.gmo maintainer-clean: distclean @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." rm -f Makefile.in.in distdir = ../$(PACKAGE)-$(VERSION)/$(subdir) dist distdir: $(DISTFILES) dists="$(DISTFILES)"; \ extra_dists="$(EXTRA_DISTFILES)"; \ for file in $$extra_dists; do \ test -f $(srcdir)/$$file && dists="$$dists $(srcdir)/$$file"; \ done; \ for file in $$dists; do \ test -f $$file || file="$(srcdir)/$$file"; \ ln $$file $(distdir) 2> /dev/null \ || cp -p $$file $(distdir); \ done update-po: Makefile $(MAKE) $(GETTEXT_PACKAGE).pot tmpdir=`pwd`; \ linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ echo "$$lang:"; \ result="`$(MSGMERGE) -o $$tmpdir/$$lang.new.po $$lang`"; \ if $$result; then \ if cmp $(srcdir)/$$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ rm -f $$tmpdir/$$lang.new.po; \ else \ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ :; \ else \ echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ rm -f $$tmpdir/$$lang.new.po; \ exit 1; \ fi; \ fi; \ else \ echo "msgmerge for $$lang.gmo failed!"; \ rm -f $$tmpdir/$$lang.new.po; \ fi; \ done Makefile POTFILES: stamp-it @if test ! -f $@; then \ rm -f stamp-it; \ $(MAKE) stamp-it; \ fi stamp-it: Makefile.in.in $(top_builddir)/config.status POTFILES.in cd $(top_builddir) \ && CONFIG_FILES=$(subdir)/Makefile.in CONFIG_HEADERS= CONFIG_LINKS= \ $(SHELL) ./config.status # Tell versions [3.59,3.63) of GNU make not to export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: parcellite-1.2.1/po/pl.po0000644000175000017500000001335513041603201013327 0ustar hlehle# Polish translation for parcellite. # Copyright (C) 2009 Free Software Foundation, Inc. # This file is distributed under the same license as the parcellite package. # Tomasz Rusek , 2009. # msgid "" msgstr "" "Project-Id-Version: Parcellite\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-05-06 19:46-0400\n" "PO-Revision-Date: 2009-03-29 16:48+0100\n" "Last-Translator: Tomasz Rusek \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../src/main.c:184 msgid "Executing action..." msgstr "Wykonuję akcję..." #: ../src/main.c:190 ../src/main.c:739 ../data/parcellite.desktop.in.h:1 #: ../data/parcellite-startup.desktop.in.h:1 msgid "Clipboard Manager" msgstr "Schowek" #: ../src/main.c:213 msgid "Could not create thread for executed action\n" msgstr "Nie można stworzyć wątku dla wykonywanej akcji\n" #. Create the dialog #: ../src/main.c:243 msgid "Editing Clipboard" msgstr "Edytuj zawartość schowka" #: ../src/main.c:302 msgid "Clear the history?" msgstr "Wyczyścić historię?" #: ../src/main.c:370 msgid "Lightweight GTK+ clipboard manager." msgstr "Lekki menedżer schowka w GTK+." #: ../src/main.c:457 msgid "None" msgstr "Żadne" #. File contained no actions so adding empty #. File did not open so adding empty #. Nothing in history so adding empty #: ../src/main.c:478 ../src/main.c:507 ../src/main.c:623 msgid "Empty" msgstr "pusty" #. Edit actions #: ../src/main.c:514 msgid "_Edit actions" msgstr "_Edytuj akcje" #. Edit clipboard #: ../src/main.c:538 msgid "_Edit Clipboard" msgstr "_Edytuj schowek " #: ../src/utils.c:38 ../src/utils.c:45 #, c-format msgid "Couldn't create directory: %s\n" msgstr "Nie można stworzyć katalogu: %s\n" #: ../src/utils.c:84 msgid "Run as daemon" msgstr "Uruchom jako demon" #: ../src/utils.c:91 msgid "Do not use status icon (Ctrl-Alt-P for menu)" msgstr "Nie używaj ikony statusu (Ctrl+Alt+P dla menu)" #: ../src/utils.c:98 msgid "Print clipboard contents" msgstr "Drukuj zawartość schowka" #: ../src/utils.c:105 msgid "Print primary contents" msgstr "Drukuj zaznaczenie" #: ../src/utils.c:117 msgid "" "Clipboard CLI usage examples:\n" "\n" " echo \"copied to clipboard\" | parcellite\n" " parcellite \"copied to clipboard\"\n" " echo \"copied to clipboard\" | parcellite -c" msgstr "" "Przykład użycia w trybie tekstowym (CLI):\n" "\n" " echo \"kopiuj do schowka\" | parcellite\n" " parcellite \"kopiuj do schowka\"\n" " echo \"kopiuj do schowka\" | parcellite -c" #: ../src/utils.c:123 msgid "" "Written by Gilberto \"Xyhthyx\" Miralla.\n" "Report bugs to ." msgstr "" "Stworzony przez Gilberto \"Xyhthyx\" Miralla.\n" "W razie wystąpienia błędów proszę pisać na ." #. Create the dialog #: ../src/preferences.c:375 msgid "Preferences" msgstr "Preferencje" #: ../src/preferences.c:390 msgid "Behavior" msgstr "Zachowanie" #: ../src/preferences.c:398 msgid "Clipboards" msgstr "Schowki" #: ../src/preferences.c:405 msgid "Use _Copy (Ctrl-C)" msgstr "Użyj do skopiowanego tekstu (Ctrl-C)" #: ../src/preferences.c:407 msgid "Use _Primary (Selection)" msgstr "Użyj do zaznaczonego tekstu" #: ../src/preferences.c:409 msgid "S_ynchronize clipboards" msgstr "S_ynchronizuj schowki" #: ../src/preferences.c:417 msgid "History" msgstr "Historia" #: ../src/preferences.c:424 msgid "_Save history" msgstr "Zapi_sz historię" #: ../src/preferences.c:425 msgid "Save and restore history between sessions" msgstr "Przywracaj historię po zamknięciu sesji" #: ../src/preferences.c:429 msgid "Items in history:" msgstr "Pozycje w historii:" #: ../src/preferences.c:442 msgid "Miscellaneous" msgstr "Różne" #: ../src/preferences.c:449 msgid "Capture _hyperlinks only" msgstr "Kopiuj tylko _hiperlinki" #: ../src/preferences.c:451 msgid "C_onfirm before clearing history" msgstr "Potwierdź usunię_cie historii" #: ../src/preferences.c:458 msgid "Display" msgstr "Wyświetlanie" #: ../src/preferences.c:466 msgid "Items" msgstr "Pozycje w schowku" #: ../src/preferences.c:473 msgid "Show in a _single line" msgstr "Jako pojedyncza linia" #: ../src/preferences.c:475 msgid "Show in _reverse order" msgstr "Odw_róć kolejność" #: ../src/preferences.c:479 msgid "Character length of items:" msgstr "Długość w znakach:" #: ../src/preferences.c:492 msgid "Omitting" msgstr "Pomijanie" #: ../src/preferences.c:501 msgid "Omit items in the:" msgstr "Omiń pozycje:" #: ../src/preferences.c:505 msgid "Beginning" msgstr "Początek" #: ../src/preferences.c:506 msgid "Middle" msgstr "Środek" #: ../src/preferences.c:507 msgid "End" msgstr "Koniec" #: ../src/preferences.c:514 msgid "Actions" msgstr "Akcje" #. Build the actions label #: ../src/preferences.c:519 msgid "Control-click Parcellite's tray icon to use actions" msgstr "Kliknij na ikonę Parcellite trzymając Ctrl, aby użyć akcji " #: ../src/preferences.c:539 msgid "Action" msgstr "Akcja" #: ../src/preferences.c:546 msgid "Command" msgstr "Komenda" #: ../src/preferences.c:561 msgid "Add..." msgstr "Dodaj..." #: ../src/preferences.c:565 msgid "Remove" msgstr "Usuń" #: ../src/preferences.c:582 msgid "Hotkeys" msgstr "Skróty klawiszowe" #: ../src/preferences.c:590 msgid "Hotkeys" msgstr "Skróty klawiszowe" #: ../src/preferences.c:599 msgid "History key combination:" msgstr "Kombinacja klawiszy historii:" #: ../src/preferences.c:607 msgid "Actions key combination:" msgstr "Kombinacja klawiszy akcji:" #: ../src/preferences.c:615 msgid "Menu key combination:" msgstr "Kombinacja klawiszy menu:" #: ../data/parcellite.desktop.in.h:2 ../data/parcellite-startup.desktop.in.h:2 msgid "Parcellite" msgstr "Parcellite" parcellite-1.2.1/po/ru.po0000644000175000017500000004160213041603201013336 0ustar hlehle# Russian translation of parcellite. # Copyright (C) 2008 Xyhthyx # This file is distributed under the same license as the parcellite package. # # Alexander Kazancev # Victor Ryzhykh , 2015. # Alexey Loginov , 2015. # msgid "" msgstr "" "Project-Id-Version: Parcellite\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: \n" "PO-Revision-Date: 2015-07-03 11:55+0300\n" "Last-Translator: AlexL \n" "Language-Team: Russian\n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Language: ru\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: Poedit 1.6.9\n" msgid "Action" msgstr "Действие" msgid "Actions" msgstr "Действия" msgid "Actions key combination:" msgstr "Вызов меню Действия" msgid "Add..." msgstr "Добавить..." msgid "Alternate Non-printing Display" msgstr "Показывать непечатающиеся символы" msgid "Auto Paste" msgstr "Автовставка" msgid "Clipboards" msgstr "Буферы обмена" msgid "Beginning" msgstr "Начало" msgid "Behavior" msgstr "Поведение" msgid "History" msgstr "История" msgid "Hotkeys" msgstr "Горячие клавиши" msgid "Items" msgstr "Элементы" msgid "Miscellaneous" msgstr "Разное" msgid "None" msgstr "Нет" msgid "Omitting" msgstr "Исключения" msgid "X" msgstr "X" msgid "Y" msgstr "Y" msgid "Capture hyperlinks only" msgstr "Захватывать только гиперссылки" msgid "Case Sensitive Search" msgstr "Поиск с учетом регистра" msgid "Character length of items" msgstr "Число символов в элементе" msgid "_Clear" msgstr "_Очистить" msgid "Clear the history?" msgstr "Очистить историю?" msgid "" "Clipboard CLI usage examples:\n" "\n" " echo \"copied to clipboard\" | parcellite\n" " parcellite \"copied to clipboard\"\n" " echo \"copied to clipboard\" | parcellite -c" msgstr "" "Примеры использования:\n" "\n" " echo \"copied to clipboard\" | parcellite\n" " parcellite \"copied to clipboard\"\n" " echo \"copied to clipboard\" | parcellite -c" msgid "Clipboard Manager" msgstr "Менеджер буфера обмена" msgid "Command" msgstr "Команда" msgid "Confirm before clearing history" msgstr "Подтверждение перед очисткой истории" msgid "Control-click Parcellite's tray icon to use actions," msgstr "CTRL+клик по иконке Parcellite в трее для выполнения действий" msgid "" "Copyright (C) 2007, 2008 Gilberto \"Xyhthyx\" Miralla\n" "Copyright (C) 2010-2013 Doug Springer" msgstr "" "Copyright (C) 2007, 2008 Gilberto \"Xyhthyx\" Miralla\n" "Copyright (C) 2010-2013 Doug Springer" msgid "Couldn't create directory: %s\n" msgstr "Не удается создать каталог: %s\n" msgid "Current entry on top" msgstr "Текущая запись вверху" msgid "DebugUpdate" msgstr "DebugUpdate" msgid "Display" msgstr "Отображение" msgid "Display Version info" msgstr "Показать версию" msgid "Do not use status icon (Ctrl-Alt-P for menu)" msgstr "Не показывать иконку в трее (Ctrl-Alt-P для меню)" msgid "Dummy desc" msgstr "Ложное описание" msgid "Dummy tip" msgstr "Ложная подсказка" msgid "_Edit actions" msgstr "_Изменить действия" msgid "_Edit Clipboard" msgstr "_Изменить буфер обмена" msgid "Editing Clipboard" msgstr "Редактирование буфера обмена" msgid "Empty" msgstr "Пусто" msgid "End" msgstr "Конце" msgid "Executing action..." msgstr "Выполнить действие..." msgid "" "Gilberto \"Xyhthyx\" Miralla \n" "Doug Springer " msgstr "" "Gilberto \"Xyhthyx\" Miralla \n" "Doug Springer " msgid "_History" msgstr "_История" msgid "History key combination:" msgstr "Вызов истории " msgid ">>$HOME/ptest" msgstr ">>$HOME/ptest" msgid "Hotkeys" msgstr "Сочетания клавиш" msgid "" "If checked, does a search-as-you-type. Turns red if not found. Goes to top " "(Alt-E) line when no chars are entered for search" msgstr "" "Если отмечено, поиск будет идти по мере набора. Если нет совпадений, " "становится красным. Переходит к верхней строке (Alt-E) если не введены буквы " "для поиска" msgid "If checked, does case sensitive search" msgstr "Если выбрано, поиск с учетом регистра" msgid "If checked, edit the history item clicked on." msgstr "Если выбрано, разрешено редактирование истории" msgid "" "If checked, enables checking multiple concurrent user logic. Use if several " "different users are logged in at the same time." msgstr "" "Если выбрано, включается многопользовательский режим. Используется если " "одновременно запущены программы от разных пользователей" msgid "" "If checked, enables debug prints on clipboard update logic. This only takes " "effect when enabled at start up, and may be disabled at compile time." msgstr "" "Если выбрано, включает режим отладки. Отладка будет включена при перезапуске " "программы, но возможно она отключена при компиляции" msgid "If checked, enables the persistent history." msgstr "Если выбрано, включается хранение истории" msgid "" "If checked, places current clipboard entry at top of list. If not checked, " "history does not get sorted." msgstr "" "Если выбрано, текущий буфер обмена показывается вверху списка. Если не " "выбрано, сортировка списка истории не производится" msgid "If checked, puts the persistent history at the top of the history list." msgstr "Если выбрано, помещать записи истории вверху списка" msgid "If checked, puts the persistent history in a new list." msgstr "Если выбрано, помещать записи истории в новый список" msgid "If checked, the current entry will be on the bottom instead of the top." msgstr "Если выбрано, текущая запись будет внизу а не в верху." msgid "If checked, Use the clipboard, which is Ctrl-C, Ctrl-V" msgstr "Если выбрано, использовать буфер обмена по Ctrl-C, Ctrl-V" msgid "" "If checked, Use the primary clipboard (mouse highlight-copy, middle mouse " "button paste)" msgstr "" "Если выбрано, использовать буфер обмена консоли (выделение мышью - " "копировать, средняя кнопка - вставить)" msgid "If checked, use X, Y to position the history list" msgstr "Если выбрано, показывать список истории по координатам X и Y" msgid "" "If checked, will display tabs with Right arrow (utf8,\\2192), newlines with " "pharagrph(\\204b), and spaces with square-u(\\2423)." msgstr "" "Если выбрано, будут отображены вкладки со стрелкой вправо (utf8,\\2192), " "ввод строки с параграфом(\\204b), и пробелы с square-u(\\2423)." msgid "If checked, will emit the history entry via the keyboard entry." msgstr "" "Если выбрано, будет создавать запись в истории посредством ввода с " "клавиатуры." msgid "" "If checked, will ignore any clipboard additions that contain only whitespace." msgstr "" "Если выбрано, будут игнорироваться любые добавления в буфер обмена, которые " "содержат только пробелы." msgid "" "If checked, will keep both clipboards with the same content. If primary is " "pasted, then copy will have the same data." msgstr "" "Если выбрано, будет поддерживать в обоих буферах один контент. Если первый " "вставлен, тогда копия будет содержать те же данные." msgid "If checked, will replace newlines with spaces." msgstr "Если выбрано, ввод строки будет заменён пробелом." msgid "If checked, will restore clipboard entry on application exit." msgstr "" "Если выбрано, сохраняется состояние буфера обмена при выходе из приложения." msgid "If checked, will trim whitespace from beginning and end of entry." msgstr "Если выбрано, будут удалены пробелы в начале и в конце строки." msgid "If checked, will use Ctrl-V paste." msgstr "Если выбрано, используется Ctrl-V для вставки" msgid "If checked, will use middle mouse to paste." msgstr "Если выбрано, используется средняя кнопка мыши для вставки" msgid "" "If checked, will use xdotool to paste wherever the mouse is.\n" "NOTE! Package xdotool MUST BE INSTALLED for this to work." msgstr "" "Если выбрано, будет использован xdotool для вставки в место положения мыши.\n" "ПРИМЕЧАНИЕ! Должен быть установлен пакет xdotool, чтобы это работало." msgid "Ignore Whitespace Only" msgstr "Игнорировать только пробелы" msgid "Items in history" msgstr "Элементов в истории" msgid "Key" msgstr "Клавиша" msgid "Keyboard Input" msgstr "Клавиатурный ввод" msgid "Lightweight GTK+ clipboard manager." msgstr "Менеджер буфера обмена на основе GTK+" msgid "Max Data Size(KB)" msgstr "Макс. размер данных(Kб)" msgid "Maximum data size of entire history list" msgstr "Макс. размер для каждого списка истории" msgid "Maximum data size of one item" msgstr "Максимальный размер данных одного элемента" msgid "Maximum number of clipboard entries to keep" msgstr "Макс. хранимое число записей буфера обмена" msgid "Max Item Size(KB)" msgstr "Макс. размер элемента(Кб)" msgid "Menu key combination" msgstr "Вызов основного меню" msgid "Middle" msgstr "Середине" msgid "Mouse" msgstr "Мышь" msgid "Multiuser" msgstr "Многопользовательский режим" msgid "Name of Parcellite icon. If this is mis-typed, icon will not appear." msgstr "" "Название иконки Parcellite. Если вы неправильно ввели, то иконка не появится." msgid "Omit items in the:" msgstr "Исключить элементы в:" msgid "Parcellite Icon Name" msgstr "Название значка" msgid "Paste All Entry Delimiter" msgstr "Вставить разделитель всех записей" msgid "Persistent As Separate List" msgstr "Постоянная как отдельный список" msgid "Persistent History" msgstr "Постоянная история" msgid "Persistent history key:" msgstr "Вызов постоянной истории" msgid "Persistent On Top" msgstr "Постоянная вверху" msgid "Position history" msgstr "Позиция истории" msgid "Position in pixels from the top of the screen" msgstr "Позиция в пикселах от верха экрана" msgid "Preferences" msgstr "Настройки" msgid "Print clipboard contents" msgstr "Печать содержимого буфера обмена" msgid "Print primary contents" msgstr "Печать содержимого буфера консоли" msgid "Remove" msgstr "Удалить" msgid "Restore Empty" msgstr "Сохранять буфер при закрытии приложения" msgid "Right Click Edit" msgstr "Правый клик - редактировать" msgid "Run as daemon" msgstr "Запускать как службу" msgid "Save history" msgstr "Сохранять историю" msgid "" "Save History as a text file. Prepends xHIST_0000 to each entry. x is either " "P(persistent) or N (normal)" msgstr "" "Хранить историю как простой текст. Разделитель xHIST_0000 для каждой записи. " "Где х это типа записи P(постоянная) или N (нормальная)" msgid "Save history to a file." msgstr "Сохранять историю в файл." msgid "Search As You Type" msgstr "Искать по мере ввода" msgid "Show in a single line" msgstr "Показывать в одной строке." msgid "Show in reverse order" msgstr "Показывать в обратном порядке" msgid "> " msgstr "> " msgid "S_ynchronize clipboards" msgstr "Синхронизация буферов обмена" msgid "" "This is the Action Name. \n" "DO NOT put commands here." msgstr "" "Это поле названия Действия. \n" "НЕ ПИШИТЕ здесь текст команды. " msgid "" "This program is free software; you can redistribute it and/or modify\n" "it under the terms of the GNU General Public License as published by\n" "the Free Software Foundation; either version 3 of the License, or\n" "(at your option) any later version.\n" "\n" "This program is distributed in the hope that it will be useful,\n" "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" "GNU General Public License for more details.\n" "\n" "You should have received a copy of the GNU General Public License\n" "along with this program. If not, see .;" msgstr "" "Это программа является свободным программным обеспечением\n" "вы можете распространять и/или изменять её согласно условиям\n" "Общей Публичной Лицензии GNU, которая опубликована Фондом \n" "Свободного ПО; или версией 3 лицензии, или более поздней версией\n" "(на ваш выбор).\n" "Эта программа распространяется в надежде, что будет полезной,\n" "но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии\n" "пригодности для определённой цели. См. подробности в Общей публичной\n" "лицензии.\n" "\n" "Вы должны получить копию Общей публичной лицензии\n" "с этой программой. Если нет, см. .;" msgid "" "This string will be inserted between each line of history for paste all." msgstr "Эта строка будет вставлена между каждой записью истории" msgid "Trim Newlines" msgstr "Удалить ввод строки" msgid "Trim Whitespace" msgstr "Удалить пробелы" msgid "Use Alt-E to edit, Alt-C to clear" msgstr "Alt-E - редактировать, Alt-C - очистить" msgid "Use _Copy (Ctrl-C)" msgstr "Использовать _Копировать (Ctrl-C)" msgid "" "Use %% if you want a literal %. See the man page for gnuC printf (man 2 " "printf) for more information." msgstr "" "Используйте %% для символа %. См. справку по команде printf (man 2 printf) " "для подробной информации" msgid "Use _Primary (Selection)" msgstr "_Использовать буфер выделения" msgid "" "Written by Gilberto \"Xyhthyx\" Miralla and Doug Springer.\n" "Report bugs to ." msgstr "" "Программа написана Gilberto \"Xyhthyx\" Miralla и Doug Springer.\n" "Отправляйте ошибки на ." msgid "xdotool Not Installed" msgstr "xdotool не установлен" parcellite-1.2.1/po/en@quot.header0000644000175000017500000000226313041603201015135 0ustar hlehle# All this catalog "translates" are quotation characters. # The msgids must be ASCII and therefore cannot contain real quotation # characters, only substitutes like grave accent (0x60), apostrophe (0x27) # and double quote (0x22). These substitutes look strange; see # http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html # # This catalog translates grave accent (0x60) and apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019). # It also translates pairs of apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019) # and pairs of quotation mark (0x22) to # left double quotation mark (U+201C) and right double quotation mark (U+201D). # # When output to an UTF-8 terminal, the quotation characters appear perfectly. # When output to an ISO-8859-1 terminal, the single quotation marks are # transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to # grave/acute accent (by libiconv), and the double quotation marks are # transliterated to 0x22. # When output to an ASCII terminal, the single quotation marks are # transliterated to apostrophes, and the double quotation marks are # transliterated to 0x22. # parcellite-1.2.1/po/da.po0000644000175000017500000001351013041603201013271 0ustar hlehle# Danish translation of parcellite # Copyright (C) 2008 Xyhthyx # This file is distributed under the same license as the parcellite package. # Kim Jensen , 2009. # msgid "" msgstr "" "Project-Id-Version: Parcellite 0.9.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-12-26 09:07-0500\n" "PO-Revision-Date: 2009-11-20 18:28+0100\n" "Last-Translator: Kim Jensen \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Danish\n" "X-Poedit-Country: DENMARK\n" #: ../src/main.c:184 msgid "Executing action..." msgstr "Udfører handling..." #: ../src/main.c:190 ../src/main.c:748 ../data/parcellite.desktop.in.h:1 #: ../data/parcellite-startup.desktop.in.h:1 msgid "Clipboard Manager" msgstr "Udklipsholder" #: ../src/main.c:213 msgid "Could not create thread for executed action\n" msgstr "Kunne ikke oprette tråd for udført handling\n" #. Create the dialog #: ../src/main.c:243 msgid "Editing Clipboard" msgstr "Rediger udklipsholder" #: ../src/main.c:302 msgid "Clear the history?" msgstr "Tøm historikken?" #: ../src/main.c:370 msgid "Lightweight GTK+ clipboard manager." msgstr "Letvægts GTK+ udklipsholder-håndtering" #: ../src/main.c:457 msgid "None" msgstr "Ingen" #. File contained no actions so adding empty #. File did not open so adding empty #. Nothing in history so adding empty #: ../src/main.c:478 ../src/main.c:507 ../src/main.c:632 msgid "Empty" msgstr "Tom" #. Edit actions #: ../src/main.c:514 msgid "_Edit actions" msgstr "R_ediger handlinger" #. Edit clipboard #: ../src/main.c:538 msgid "_Edit Clipboard" msgstr "R_ediger udklipsholder" #: ../src/utils.c:38 ../src/utils.c:45 #, c-format msgid "Couldn't create directory: %s\n" msgstr "Kunne ikke oprette mappen: %s\n" #: ../src/utils.c:84 msgid "Run as daemon" msgstr "Kør som tjeneste" #: ../src/utils.c:91 msgid "Do not use status icon (Ctrl-Alt-P for menu)" msgstr "Vis ikke statusikon (Ctrl-Alt-P for menu)" #: ../src/utils.c:98 msgid "Print clipboard contents" msgstr "Udskriv udklipsholderens indhold" #: ../src/utils.c:105 msgid "Print primary contents" msgstr "Udskriv udklipsholderens indhold" #: ../src/utils.c:117 msgid "" "Clipboard CLI usage examples:\n" "\n" " echo \"copied to clipboard\" | parcellite\n" " parcellite \"copied to clipboard\"\n" " echo \"copied to clipboard\" | parcellite -c" msgstr "" "Eksempler ved brug af udklipsholder i CLI:\n" "\n" " echo \"kopieret til udklipsholderen\" | parcellite\n" " parcellite \"kopieret til udklipsholderen\"\n" " echo \"kopieret til udklipsholderen\" | parcellite -o" #: ../src/utils.c:123 msgid "" "Written by Gilberto \"Xyhthyx\" Miralla.\n" "Report bugs to ." msgstr "" "Skrevet af Gilberto \"Xyhthyx\" Miralla.\n" "Rapporter fejl til ." #. Create the dialog #: ../src/preferences.c:395 msgid "Preferences" msgstr "Indstillinger" #: ../src/preferences.c:414 msgid "Behavior" msgstr "Adfærd" #: ../src/preferences.c:422 msgid "Clipboards" msgstr "Udklipsholder" #: ../src/preferences.c:429 msgid "Use _Copy (Ctrl-C)" msgstr "Brug _kopier (Ctrl-C)" #: ../src/preferences.c:432 msgid "Use _Primary (Selection)" msgstr "Brug _primær (Markering)" #: ../src/preferences.c:435 msgid "S_ynchronize clipboards" msgstr "S_ynkroniser udklipsholder" #: ../src/preferences.c:443 msgid "History" msgstr "Historik" #: ../src/preferences.c:450 msgid "_Save history" msgstr "Gem hi_storik" #: ../src/preferences.c:451 msgid "Save and restore history between sessions" msgstr "Gem og gendan historik imellem sessioner" #: ../src/preferences.c:455 msgid "Items in history:" msgstr "Elementer i historik:" #: ../src/preferences.c:468 msgid "Miscellaneous" msgstr "Diverse" #: ../src/preferences.c:475 msgid "Capture _hyperlinks only" msgstr "Indfang kun _henvisning" #: ../src/preferences.c:477 msgid "C_onfirm before clearing history" msgstr "Bekræft før rydning af hist_orik" #: ../src/preferences.c:484 msgid "Display" msgstr "Vis" #: ../src/preferences.c:492 msgid "Items" msgstr "Elementer" #: ../src/preferences.c:499 msgid "Show in a _single line" msgstr "Vi_s på en enkelt linje" #: ../src/preferences.c:501 msgid "Show in _reverse order" msgstr "Vis i omvendt _rækkefølge" #: ../src/preferences.c:505 msgid "Character length of items:" msgstr "Tegnlængde på elementer:" #: ../src/preferences.c:518 msgid "Omitting" msgstr "Udeladelse" #: ../src/preferences.c:527 msgid "Omit items in the:" msgstr "Udelad elementer i:" #: ../src/preferences.c:531 msgid "Beginning" msgstr "Begyndelsen" #: ../src/preferences.c:532 msgid "Middle" msgstr "Midten" #: ../src/preferences.c:533 msgid "End" msgstr "Slutningen" #: ../src/preferences.c:540 msgid "Actions" msgstr "Handlinger" #. Build the actions label #: ../src/preferences.c:545 msgid "Control-click Parcellite's tray icon to use actions" msgstr "Hold Ctrl og klik Parcellites ikon for at bruge handlinger" #: ../src/preferences.c:565 msgid "Action" msgstr "Handling" #: ../src/preferences.c:572 msgid "Command" msgstr "Kommando" #: ../src/preferences.c:587 msgid "Add..." msgstr "Tilføj" #: ../src/preferences.c:591 msgid "Remove" msgstr "Fjern" #: ../src/preferences.c:608 msgid "Hotkeys" msgstr "Tastaturgenveje" #: ../src/preferences.c:616 msgid "Hotkeys" msgstr "Tastaturgenveje" #: ../src/preferences.c:625 msgid "History key combination:" msgstr "Historik tastekombination" #: ../src/preferences.c:633 msgid "Actions key combination:" msgstr "Handling tastekombination" #: ../src/preferences.c:641 msgid "Menu key combination:" msgstr "Menu tastekombination" #: ../data/parcellite.desktop.in.h:2 ../data/parcellite-startup.desktop.in.h:2 msgid "Parcellite" msgstr "Parcellite" parcellite-1.2.1/po/cs.po0000644000175000017500000001650613041603201013322 0ustar hlehle# Czech translation of parcellite. # Copyright (C) 2008 Xyhthyx # This file is distributed under the same license as the parcellite package. # Miloš Koutný , 2009. # # msgid "" msgstr "" "Project-Id-Version: Parcellite\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-12-26 10:35-0500\n" "PO-Revision-Date: 2009-03-16 00:53+0100\n" "Last-Translator: Miloš Koutný \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../src/main.c:186 msgid "Executing action..." msgstr "Spustit akci..." #: ../src/main.c:192 ../src/main.c:750 ../data/parcellite.desktop.in.h:1 #: ../data/parcellite-startup.desktop.in.h:1 msgid "Clipboard Manager" msgstr "Správce schránky" #: ../src/main.c:215 msgid "Could not create thread for executed action\n" msgstr "Nepodařilo se vytvořit vlákno pro spuštěnou akci\n" #. Create the dialog #: ../src/main.c:245 msgid "Editing Clipboard" msgstr "Upravuji schránku" #: ../src/main.c:304 msgid "Clear the history?" msgstr "Vymazat historii?" #: ../src/main.c:372 msgid "Lightweight GTK+ clipboard manager." msgstr "Odlehčený GTK+ správce schránky." #: ../src/main.c:459 msgid "None" msgstr "Žádný" #. File contained no actions so adding empty #. File did not open so adding empty #. Nothing in history so adding empty #: ../src/main.c:480 ../src/main.c:509 ../src/main.c:634 msgid "Empty" msgstr "Prázdný" #. Edit actions #: ../src/main.c:516 msgid "_Edit actions" msgstr "Akce _Editace" #. Edit clipboard #: ../src/main.c:540 msgid "_Edit Clipboard" msgstr "_Editovat schránku" #: ../src/utils.c:38 ../src/utils.c:45 #, c-format msgid "Couldn't create directory: %s\n" msgstr "Nelze vytvořit adresář: %s\n" #: ../src/utils.c:84 msgid "Run as daemon" msgstr "Start jako démon" #: ../src/utils.c:91 msgid "Do not use status icon (Ctrl-Alt-P for menu)" msgstr "Nepoužívat stavovou ikonu (Ctrl+Alt+P pro menu)" #: ../src/utils.c:98 msgid "Print clipboard contents" msgstr "Tisknout obsah schránky" #: ../src/utils.c:105 msgid "Print primary contents" msgstr "Tisknout primární obsah" #: ../src/utils.c:117 msgid "" "Clipboard CLI usage examples:\n" "\n" " echo \"copied to clipboard\" | parcellite\n" " parcellite \"copied to clipboard\"\n" " echo \"copied to clipboard\" | parcellite -c" msgstr "" "Schránka CLI (příkazová řádka) - příklad užití:\n" "\n" " echo \"Kopie od schránky\" | parcellite\n" " parcellite \"Kopie do schránky\"\n" " echo \"Kopie do schránky\" | parcellite -o" #: ../src/utils.c:123 msgid "" "Written by Gilberto \"Xyhthyx\" Miralla.\n" "Report bugs to ." msgstr "" "Napsáno Gilberto \"Xyhthyx\" Miralla.\n" "Reportování chyb na ." #. Create the dialog #: ../src/preferences.c:395 msgid "Preferences" msgstr "Nastavení" #: ../src/preferences.c:414 msgid "Behavior" msgstr "Chování" #: ../src/preferences.c:422 msgid "Clipboards" msgstr "Schránka" #: ../src/preferences.c:429 msgid "Use _Copy (Ctrl-C)" msgstr "Kopírování (Ctrl-C)" #: ../src/preferences.c:432 msgid "Use _Primary (Selection)" msgstr "Užít primární (výběr)" #: ../src/preferences.c:435 msgid "S_ynchronize clipboards" msgstr "S_ynchronisieren schránky" #: ../src/preferences.c:443 msgid "History" msgstr "Historie" #: ../src/preferences.c:450 msgid "_Save history" msgstr "Uložit Hi_storii" #: ../src/preferences.c:451 msgid "Save and restore history between sessions" msgstr "Uložit a obnovit historii mezi sezeními" #: ../src/preferences.c:455 msgid "Items in history:" msgstr "Položky v historii:" #: ../src/preferences.c:468 msgid "Miscellaneous" msgstr "Příslušenství" #: ../src/preferences.c:475 msgid "Capture _hyperlinks only" msgstr "Zachycovat pouze hyper-linkové odkazy" #: ../src/preferences.c:477 msgid "C_onfirm before clearing history" msgstr "P_otvrzení před smazáním historie" #: ../src/preferences.c:484 msgid "Display" msgstr "Zobrazení" #: ../src/preferences.c:492 msgid "Items" msgstr "Položky" #: ../src/preferences.c:499 msgid "Show in a _single line" msgstr "Zobrazit v jednom (_single) řádku" #: ../src/preferences.c:501 msgid "Show in _reverse order" msgstr "Zob_razit v opačném pořadí" #: ../src/preferences.c:505 msgid "Character length of items:" msgstr "Znaková délka položek" #: ../src/preferences.c:518 msgid "Omitting" msgstr "Opomenout" #: ../src/preferences.c:527 msgid "Omit items in the:" msgstr "Opomenout položku v:" #: ../src/preferences.c:531 msgid "Beginning" msgstr "Začátek" #: ../src/preferences.c:532 msgid "Middle" msgstr "Střed" #: ../src/preferences.c:533 msgid "End" msgstr "Konec" #: ../src/preferences.c:540 msgid "Actions" msgstr "Akce" #. Build the actions label #: ../src/preferences.c:545 msgid "Control-click Parcellite's tray icon to use actions" msgstr "Ctrl+klik na ikoně Parcellite v liště k akcím" #: ../src/preferences.c:565 msgid "Action" msgstr "Akce" #: ../src/preferences.c:572 msgid "Command" msgstr "Příkaz" #: ../src/preferences.c:587 msgid "Add..." msgstr "Přidat..." #: ../src/preferences.c:591 msgid "Remove" msgstr "Odstranit" #: ../src/preferences.c:608 msgid "Hotkeys" msgstr "Klávesové zkratky" #: ../src/preferences.c:616 msgid "Hotkeys" msgstr "Klávesové zkratky" #: ../src/preferences.c:625 msgid "History key combination:" msgstr "Historie klávesových kombinací:" #: ../src/preferences.c:633 msgid "Actions key combination:" msgstr "Akční klávesy kombinace:" #: ../src/preferences.c:641 msgid "Menu key combination:" msgstr "Menu klávesové kombinace:" #: ../data/parcellite.desktop.in.h:2 ../data/parcellite-startup.desktop.in.h:2 msgid "Parcellite" msgstr "Parcellite" #~ msgid "Clipboard" #~ msgstr "Schránka" #~ msgid "Save changes" #~ msgstr "Uložit změny" #~ msgid "Discard changes" #~ msgstr "Zahodit změny" #~ msgid "Extras" #~ msgstr "Extras" #, fuzzy #~ msgid "" #~ "Add a new action\n" #~ "\"%s\" in a command is replaced with the clipboard contents" #~ msgstr "\"%s\" v příkazu je na nahrazen obsahem ze schránky" #, fuzzy #~ msgid "Move selected action up" #~ msgstr "Posunout vybranou akci nahoru" #, fuzzy #~ msgid "Move selected action down" #~ msgstr "Posunout vybranou akci dolu" #~ msgid "Close" #~ msgstr "Zavřít" #~ msgid "New Action" #~ msgstr "Nová Akce" #~ msgid "Name:" #~ msgstr "Název:" #~ msgid "Name your action" #~ msgstr "Název Vaší akce" #~ msgid "Command:" #~ msgstr "Příkaz:" #~ msgid "Edit Action" #~ msgstr "Editovat Akci" #~ msgid "General" #~ msgstr "Obecně" #~ msgid "Length in characters of history items:" #~ msgstr "Délka historie (ve znacích):" #~ msgid "History menu global hotkey:" #~ msgstr "Historie menu - globalní zkratka:" #~ msgid "Actions menu global hotkey:" #~ msgstr "Akční menu - globalní zkratka:" #~ msgid "Single _line mode" #~ msgstr "Jednořádkový mód" #~ msgid "Ignore all non-hyperlink text" #~ msgstr "Ignorovat všechny ne-hypelinkové texty" #~ msgid "New" #~ msgstr "Nový" #~ msgid "New action" #~ msgstr "Nová akce" #~ msgid "Edit" #~ msgstr "Edit" #~ msgid "Edit selected" #~ msgstr "Editovat výběr" #~ msgid "Delete" #~ msgstr "Smaž" #~ msgid "Delete selected" #~ msgstr "Smaž výběr" parcellite-1.2.1/po/fr.po0000644000175000017500000003064713041603201013326 0ustar hlehle# French translation of parcellite. # Copyright (C) 2008 Xyhthyx # Copyright (C) 2010-2013 Doug Springer # This file is distributed under the same license as the parcellite package. # Vincent Coiffier , 2009. # Benjamin Danon , 2009-2013. # msgid "" msgstr "" "Project-Id-Version: 1.1.6\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-08-04 13:04-0600\n" "PO-Revision-Date: 2013-08-04 21:30+0100\n" "Last-Translator: Benjamin Danon \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" msgid "Action" msgstr "Action" msgid "Actions" msgstr "Actions" msgid "Actions key combination:" msgstr "Actions :" msgid "Add..." msgstr "Ajouter…" msgid "Alternate Non-printing Display" msgstr "Affichage des caractères non imprimables" msgid "Auto Paste" msgstr "Collage automatique" msgid "Clipboards" msgstr "Presse-papiers" msgid "Beginning" msgstr "Début" msgid "Behavior" msgstr "Comportement" msgid "History" msgstr "Historique" msgid "Hotkeys" msgstr "Raccourcis claviers" msgid "Items" msgstr "Enregistrements du presse-papier" msgid "Miscellaneous" msgstr "Divers" msgid "None" msgstr "Aucun" msgid "Omitting" msgstr "Coupure des enregistrements" msgid "X" msgstr "X" msgid "Y" msgstr "Y" msgid "Capture hyperlinks only" msgstr "Capturer uniquement les hyperliens" msgid "Case Sensitive Search" msgstr "Recherche sensible à la casse" msgid "Character length of items" msgstr "Nombre de caractères par enregistrement :" msgid "_Clear" msgstr "_Effacer l’historique" msgid "Clear the history?" msgstr "Effacer l’historique ?" msgid "Clipboard CLI usage examples:\n\n echo \"copied to clipboard\" | parcellite\n parcellite \"copied to clipboard\"\n echo \"copied to clipboard\" | parcellite -c" msgstr "Exemples d’utilisation de lignes de commandes interprétées pour le presse-papier :\n\n echo \"copié dans le presse-papier\" | parcellite\n parcellite \"copié dans le presse-papier\"\n echo \"copié dans le presse-papier\" | parcellite -c" msgid "Clipboard Manager" msgstr "Gestionnaire de presse-papier" msgid "Command" msgstr "Commande" msgid "Confirm before clearing history" msgstr "Confirmer avant d’effacer l’historique" msgid "Control-click Parcellite's tray icon to use actions" msgstr "Maintenir la touche Ctrl et cliquer sur l'icône de notification de Parcellite pour utiliser les actions" msgid "Copyright (C) 2007, 2008 Gilberto \"Xyhthyx\" Miralla\nCopyright (C) 2010-2013 Doug Springer" msgstr "Copyright (C) 2007, 2008 Gilberto \"Xyhthyx\" Miralla\nCopyright (C) 2010-2013 Doug Springer" msgid "Couldn't create directory: %s\n" msgstr "Impossible de créer le répertoire : %s\n" msgid "Current entry on top" msgstr "Enregistrement sélectionné en haut de liste" msgid "DebugUpdate" msgstr "Informations de débogage" msgid "Display" msgstr "Affichage" msgid "Display Version info" msgstr "Affiche les informations de version" msgid "Do not use status icon (Ctrl-Alt-P for menu)" msgstr "N’affiche pas l’icône de notification (Ctrl+Alt+P pour le menu)" msgid "Dummy desc" msgstr "Description factice" msgid "Dummy tip" msgstr "Conseil factice" msgid "_Edit actions" msgstr "_Modifier les actions" msgid "_Edit Clipboard" msgstr "_Modifier le presse-papier" msgid "Editing Clipboard" msgstr "Modification du presse-papier" msgid "Empty" msgstr "Vide" msgid "End" msgstr "Fin" msgid "Executing action..." msgstr "Exécution de l’action…" msgid "Gilberto \"Xyhthyx\" Miralla \nDoug Springer " msgstr "Gilberto \"Xyhthyx\" Miralla \nDoug Springer " msgid "_History" msgstr "_Historique" msgid "History key combination:" msgstr "Historique :" msgid "Hotkeys" msgstr "Raccourcis claviers" msgid "If checked, does a search-as-you-type. Turns red if not found. Goes to top (Alt-E) line when no chars are entered for search" msgstr "Effectue une recherche dans les enregistrements à la saisie. Devient rouge si rien ne correspond. Sélectionne le premier enregistrement (Alt+E) si aucun caractère n’est saisie." msgid "If checked, does case sensitive search" msgstr "Effectue une recherche sensible à la casse" msgid "If checked, enables checking multiple concurrent user logic. Use if several different users are logged in at the same time." msgstr "Active la vérification de la logique d’utilisateurs simultanés multiples. À utiliser si plusieurs utilisateurs différents sont identifiés en même temps." msgid "If checked, enables debug prints on clipboard update logic. This only takes effect when enabled at start up, and may be disabled at compile time." msgstr "Active l’affichage des informations de débogage lors de la mise à jour du presse-papier. Cela ne prend effet que lorsqu’il est activé au démarrage, et peut-être désactivé lors de la compilation." msgid "If checked, enables the persistent history." msgstr "Active la persistance de l’historique." msgid "If checked, places current clipboard entry at top of list. If not checked, history does not get sorted." msgstr "Place l’enregistrement sélectionné en haut de la liste. Sinon, l’historique n’est pas trié." msgid "If checked, puts the persistent history at the top of the history list." msgstr "Place l’historique persistant en haut de la liste de l’historique." msgid "If checked, puts the persistent history in a new list." msgstr "Place l’historique persistant dans une nouvelle liste." msgid "If checked, the current entry will be on the bottom instead of the top." msgstr "L’enregistrement sélectionné sera en bas de la liste au lieu d’en haut." msgid "If checked, Use the clipboard, which is Ctrl-C, Ctrl-V" msgstr "Utilise le presse-papier, avec Ctrl+C et Ctrl+V" msgid "If checked, Use the primary clipboard (mouse highlight-copy, middle mouse button paste)" msgstr "Utilise le presse-papier pour la sélection du curseur (sélection du curseur pour copier, bouton du milieu de la souris pour coller)" msgid "If checked, use X, Y to position the history list" msgstr "Utilise X et Y pour positionner la liste de l’historique" msgid "If checked, will display tabs with Right arrow (utf8,\\2192), newlines with pharagrph(\\204b), and spaces with square-u(\\2423)." msgstr "Affiche les tabulations avec le caractère →, les nouvelles lignes avec le caractère ⁋, et les espaces avec le caractère ␣." msgid "If checked, will emit the history entry via the keyboard entry." msgstr "Colle l’enregistrement via la saisie au clavier." msgid "If checked, will ignore any clipboard additions that contain only whitespace." msgstr "Ignore les enregistrements contenant uniquement des espaces." msgid "If checked, will keep both clipboards with the same content. If primary is pasted, then copy will have the same data." msgstr "Conserver les presse-papiers avec le même contenu. Si la sélection du curseur est collé, alors le presse-papier aura le même contenu." msgid "If checked, will replace newlines with spaces." msgstr "Remplace les nouvelles lignes par des espaces." msgid "If checked, will restore clipboard entry on application exit." msgstr "Restaure le presse-papier après fermeture de l’application." msgid "If checked, will trim whitespace from beginning and end of entry." msgstr "Supprime les espaces au début et à la fin de l’enregistrement." msgid "If checked, will use Ctrl-V paste." msgstr "Utiliser Ctrl+V pour coller." msgid "If checked, will use middle mouse to paste." msgstr "Utiliser le bouton du milieu de la souris pour coller." msgid "If checked, will use xdotool to paste wherever the mouse is." msgstr "Utiliser xdotool pour coller sans tenir compte de la position de la souris." msgid "Ignore Whitespace Only" msgstr "Ignorer les espaces seuls" msgid "Items in history" msgstr "Nombre d’enregistrements dans l'historique :" msgid "Key" msgstr "Raccourci clavier" msgid "Keyboard Input" msgstr "Saisie au clavier" msgid "Lightweight GTK+ clipboard manager." msgstr "Gestionnaire de presse-papier léger (GTK+)." msgid "Max Data Size(MB)" msgstr "Taille maximum de données en Mo" msgid "Maximum data size of entire history list" msgstr "Taille maximum de la liste de l’historique" msgid "Maximun number of cliboard entries to keep" msgstr "Nombre maximum d’enregistrements à conserver" msgid "Menu key combination" msgstr "Menu :" msgid "Middle" msgstr "Milieu" msgid "Mouse" msgstr "Souris" msgid "Multiuser" msgstr "Multi-utilisateurs" msgid "Omit items in the:" msgstr "Partie de l’enregistrement à couper :" msgid "Paste All Entry Delimiter" msgstr "Délimiteur d’enregistrements" msgid "Persistent As Separate List" msgstr "Persistant dans une liste séparée" msgid "Persistent History" msgstr "Historique persistant" msgid "Persistent history key:" msgstr "Historique persistant :" msgid "Persistent On Top" msgstr "Historique persistant en haut de liste" msgid "Position history" msgstr "Position de l’historique" msgid "Position in pixels from the top of the screen" msgstr "Position en pixels à partir du bord en haut à gauche de l’écran" msgid "Preferences" msgstr "Préférences" msgid "Print clipboard contents" msgstr "Affiche le contenu du presse-papier" msgid "Print primary contents" msgstr "Affiche le contenu de la sélection du curseur" msgid "Remove" msgstr "Supprimer" msgid "Restore Empty" msgstr "Restaurer l’historique vide" msgid "Run as daemon" msgstr "Démarre en tant que service" msgid "Save history" msgstr "Sauvegarder l'historique" msgid "Save History as a text file. Prepends xHIST_0000 to each entry. x is either P(persistent) or N (normal)" msgstr "Sauvegarder l’historique dans un fichier. Ajoutre xHIST_000 à chaque enregistrement. x est soit P (persistant) ou N (normal)" msgid "Save history to a file." msgstr "Sauvegarder l’historique dans un fichier." msgid "Search As You Type" msgstr "Recherche à la saisie" msgid "Show in a single line" msgstr "Afficher sur une _seule ligne" msgid "Show in reverse order" msgstr "Afficher dans l’ordre inverse" msgid "S_ynchronize clipboards" msgstr "S_ynchroniser les presse-papiers" msgid "This is the Action Name. \nDO NOT put commands here." msgstr "Ceci est le nom de l’action. \nNE PAS mettre de commandes ici." msgid "This program is free software; you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation; either version 3 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program. If not, see .;" msgstr "This program is free software; you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation; either version 3 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program. If not, see .;" msgid "This string will be inserted between each line of history for paste all." msgstr "Cette chaîne de caractères sera insérée entre chaque ligne de l’historique lors du collage de tous les enregistrements ensembles." msgid "Trim Newlines" msgstr "Rogner les nouvelles lignes" msgid "Trim Whitespace" msgstr "Rogner les espaces" msgid "Use Alt-E to edit, Alt-C to clear" msgstr "Utiliser Alt+E pour modifier, Alt+C pour effacer" msgid "Use _Copy (Ctrl-C)" msgstr "Utiliser la _copie (Ctrl+C)" msgid "Use _Primary (Selection)" msgstr "Utiliser la _sélection du curseur" msgid "Written by Gilberto \"Xyhthyx\" Miralla and Doug Springer.\nReport bugs to ." msgstr "Écrit par Gilberto \"Xyhthyx\" Miralla et Doug Springer.\nSignaler les anomalies à ." parcellite-1.2.1/po/ca.po0000644000175000017500000002037613041603201013300 0ustar hlehlemsgid "" msgstr "" "Project-Id-Version: Parcellite\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2011-05-29 10:16+0200\n" "PO-Revision-Date: 2011-05-29 11:11+0100\n" "Last-Translator: Benjamí Fuertes \n" "Language-Team: Catalan\n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../src/main.c:242 #: ../src/main.c:277 msgid "Executing action..." msgstr "Executant acció..." #: ../src/main.c:249 #: ../src/main.c:264 #: ../src/main.c:1429 #: ../data/parcellite.desktop.in.h:1 #: ../data/parcellite-startup.desktop.in.h:1 msgid "Clipboard Manager" msgstr "Gestor del porta-retalls" #. Create the dialog #: ../src/main.c:334 msgid "Editing Clipboard" msgstr "Editant el porta-retalls" #: ../src/main.c:384 msgid "Clear the history?" msgstr "¿Esborrar l'historial?" #: ../src/main.c:451 msgid "Lightweight GTK+ clipboard manager." msgstr "Gestor lleuger del porta-retalls per a GTK+." #: ../src/main.c:545 msgid "None" msgstr "Cap" #. File contained no actions so adding empty #. File did not open so adding empty #. Nothing in history so adding empty #: ../src/main.c:567 #: ../src/main.c:600 #: ../src/main.c:1282 msgid "Empty" msgstr "Buit" #. Edit actions #: ../src/main.c:607 msgid "_Edit actions" msgstr "_Edita accions" #. Edit clipboard #: ../src/main.c:1291 msgid "Use Alt-E to edit, Alt-C to clear" msgstr "Alt-E per editar, Alt-C per esborrar" #: ../src/main.c:1296 msgid "_Edit Clipboard" msgstr "_Edita el porta-retalls" #: ../src/main.c:1301 msgid "_Clear" msgstr "Es_borrar" #: ../src/utils.c:75 #: ../src/utils.c:82 #, c-format msgid "Couldn't create directory: %s\n" msgstr "No s'ha pogut crear el directori: %s\n" #: ../src/utils.c:119 msgid "Run as daemon" msgstr "Executar com a procés dimoni" #: ../src/utils.c:126 msgid "Do not use status icon (Ctrl-Alt-P for menu)" msgstr "No utilitzar l'icona d'estat (Ctrl-Alt-P per el menú)" #: ../src/utils.c:133 msgid "Print clipboard contents" msgstr "Imprimeix el contingut del porta-retalls" #: ../src/utils.c:140 msgid "Print primary contents" msgstr "Imprimeix el contingut de la selecció primària" #: ../src/utils.c:152 msgid "" "Clipboard CLI usage examples:\n" "\n" " echo \"copied to clipboard\" | parcellite\n" " parcellite \"copied to clipboard\"\n" " echo \"copied to clipboard\" | parcellite -c" msgstr "" "Exemples del porta-retalls per la consola:\n" "\n" " echo \"copiat al porta-retalls\" | parcellite\n" " parcellite \"copiat al porta-retalls\"\n" " echo \"copiat al porta-retalls\" | parcellite -o" #: ../src/utils.c:158 msgid "" "Written by Gilberto \"Xyhthyx\" Miralla.\n" "Report bugs to ." msgstr "" "Escrit per Gilberto \"Xyhthyx\" Miralla.\n" "Informar d'errors a ." #. Create the dialog #: ../src/preferences.c:439 msgid "Preferences" msgstr "Preferències" #: ../src/preferences.c:458 msgid "Behavior" msgstr "Comportament" #: ../src/preferences.c:466 msgid "Clipboards" msgstr "Porta-retalls" #: ../src/preferences.c:473 msgid "Use _Copy (Ctrl-C)" msgstr "Utilitza c_opiar (Ctrl-C)" #: ../src/preferences.c:476 msgid "Use _Primary (Selection)" msgstr "Utilitza la se_lecció primària" #: ../src/preferences.c:479 msgid "S_ynchronize clipboards" msgstr "_Sincronitza els porta-retalls" #: ../src/preferences.c:487 msgid "History" msgstr "Historial" #: ../src/preferences.c:494 msgid "_Save history" msgstr "Desa l'_historial" #: ../src/preferences.c:495 msgid "Save and restore history between sessions" msgstr "Desa i recupera l'historial entre sessions" #: ../src/preferences.c:500 msgid "_Position history" msgstr "_Posició de l'historial" #: ../src/preferences.c:501 msgid "Set the location where history appears. If unchecked, appears where the mouse is." msgstr "Posició on mostrar l'historial. Desactivar per mostrar l'historial on sigui ratolí." #: ../src/preferences.c:505 msgid "X" msgstr "X" #: ../src/preferences.c:510 msgid "Y" msgstr "Y" #: ../src/preferences.c:519 msgid "Items in history:" msgstr "Elements a l'historial:" #: ../src/preferences.c:530 msgid "Max Data Size (MB)" msgstr "Tamany màxim de dades en MiB" #: ../src/preferences.c:535 msgid "Set Maximum amount of data to copy for each entry in MBytes. 0 is no limit." msgstr "Estableix el tamany màxim de dades per cada entrada en mebibytes. 0 per il·limitat." #: ../src/preferences.c:540 msgid "Miscellaneous" msgstr "Miscel·lània" #. *type checkbox #: ../src/preferences.c:548 msgid "Search As You _Type" msgstr "Cerca _mentre es tecleja" #: ../src/preferences.c:549 msgid "If checked, does a search-as-you-type. Turns red if not found. Goes to top (Alt-E) line when no chars are entered for search" msgstr "Si està activat, cerca mentre es tecleja. Canvia a vermell si no hi ha coincidències. Va a la primera línia (Alt-E) si no hi han caràcters per cercar." #. *case checkbox #: ../src/preferences.c:553 msgid "_Case Sensitive Search" msgstr "Di_ferència entre majúscules i minúscules al cercar" #: ../src/preferences.c:554 msgid "If checked, does case sensitive search" msgstr "Si està activat, diferència entre majúscules i minúscules al cercar" #. * ignore_whiteonly checkbox #: ../src/preferences.c:558 msgid "_Ignore Whitespace Only" msgstr "_Ignora el text en blanc" #: ../src/preferences.c:559 msgid "If checked, will ignore any clipboard additions that contain only whitespace." msgstr "Si està activat, s'ignoraran les entrades només continguin espais en blanc." #. * trim_wspace_begend checkbox #: ../src/preferences.c:562 msgid "_Trim Whitespace" msgstr "_Elimina espais en blanc" #: ../src/preferences.c:563 msgid "If checked, will trim whitespace from beginning and end of entry." msgstr "Si està activat, elimina els espais en blanc al principi i al final de l'entrada." #. * trim_newline checkbox #: ../src/preferences.c:566 msgid "_Trim Newlines" msgstr "_Elimina salts de línia" #: ../src/preferences.c:567 msgid "If checked, will replace newlines with spaces." msgstr "Si està activat, es substitueixen els salts de línia per espais en blanc." #: ../src/preferences.c:570 msgid "Capture _hyperlinks only" msgstr "C_aptura només els enllaços" #: ../src/preferences.c:572 msgid "C_onfirm before clearing history" msgstr "Co_nfirma abans d'esborrar l'historial" #: ../src/preferences.c:579 msgid "Display" msgstr "Mostra" #: ../src/preferences.c:587 msgid "Items" msgstr "Elements" #: ../src/preferences.c:594 msgid "Show in a _single line" msgstr "Mo_stra els elements en una sola línea" #: ../src/preferences.c:596 msgid "Show in _reverse order" msgstr "Mostra els elements en _ordre invers" #: ../src/preferences.c:600 msgid "Character length of items:" msgstr "Longitud d'elements en caràcters:" #: ../src/preferences.c:613 msgid "Omitting" msgstr "Ometre" #: ../src/preferences.c:622 msgid "Omit items in the:" msgstr "Omitir elements al:" #: ../src/preferences.c:626 msgid "Beginning" msgstr "Principi" #: ../src/preferences.c:627 msgid "Middle" msgstr "Mitg" #: ../src/preferences.c:628 msgid "End" msgstr "Final" #: ../src/preferences.c:635 msgid "Actions" msgstr "Accions" #. Build the actions label #: ../src/preferences.c:640 msgid "Control-click Parcellite's tray icon to use actions" msgstr "Control-clic a l'icona de Parcellite per utilitzar accions" #: ../src/preferences.c:660 msgid "Action" msgstr "Acció" #: ../src/preferences.c:667 msgid "Command" msgstr "Ordre" #: ../src/preferences.c:682 msgid "Add..." msgstr "Afegir..." #: ../src/preferences.c:686 msgid "Remove" msgstr "Elimina" #: ../src/preferences.c:703 msgid "Hotkeys" msgstr "Tecles ràpides" #: ../src/preferences.c:711 msgid "Hotkeys" msgstr "Tecles ràpides" #: ../src/preferences.c:720 msgid "History key combination:" msgstr "Combinació per l'historial:" #: ../src/preferences.c:728 msgid "Actions key combination:" msgstr "Combinació per les accions:" #: ../src/preferences.c:736 msgid "Menu key combination:" msgstr "Combinació per el menú:" #: ../data/parcellite.desktop.in.h:2 #: ../data/parcellite-startup.desktop.in.h:2 msgid "Parcellite" msgstr "Parcellite" #~ msgid "Could not create thread for executed action\n" #~ msgstr "No s'ha pogut crear el fil per l'acció executada\n" parcellite-1.2.1/po/hu.po0000644000175000017500000001361513041603201013327 0ustar hlehle# Hungarian translation of Parcellite. # Copyright (C) 2008 Xyhthyx # This file is distributed under the same license as the parcellite package. # Németh Tamás , 2008, 2009. # # msgid "" msgstr "" "Project-Id-Version: Parcellite\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-18 12:00-0400\n" "PO-Revision-Date: 2009-03-15 20:26+0100\n" "Last-Translator: Németh Tamás \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../src/main.c:166 msgid "Executing action..." msgstr "Művelet végrehajtása..." #: ../src/main.c:172 ../src/main.c:704 ../data/parcellite.desktop.in.h:1 #: ../data/parcellite-startup.desktop.in.h:1 msgid "Clipboard Manager" msgstr "Vágólapkezelő" #: ../src/main.c:195 msgid "Could not create thread for executed action\n" msgstr "A végrehajtott művelethez nem hozható létre szál\n" #. Create the dialog #: ../src/main.c:225 msgid "Editing Clipboard" msgstr "Vágólap szerkesztése" #: ../src/main.c:284 msgid "Clear the history?" msgstr "Törli az előzményeket?" #: ../src/main.c:336 msgid "Lightweight GTK+ clipboard manager." msgstr "GTK+ alapú, könnyen kezelhető vágólapkezelő." #: ../src/main.c:423 msgid "None" msgstr "Nincs" #. File contained no actions so adding empty #. File did not open so adding empty #. Nothing in history so adding empty #: ../src/main.c:444 ../src/main.c:473 ../src/main.c:588 msgid "Empty" msgstr "Üres" #. Edit actions #: ../src/main.c:480 msgid "_Edit actions" msgstr "_Műveletek szerkesztése" #. Edit clipboard #: ../src/main.c:504 msgid "_Edit Clipboard" msgstr "_Vágólap szerkesztése" #: ../src/utils.c:38 ../src/utils.c:45 #, c-format msgid "Couldn't create directory: %s\n" msgstr "A könyvtár nem hozható létre: %s\n" #: ../src/utils.c:84 msgid "Run as daemon" msgstr "Futtatás démonként" #: ../src/utils.c:91 msgid "Do not use status icon (Ctrl-Alt-P for menu)" msgstr "Ne használjon állapot ikont (Ctrl+Alt+P)" #: ../src/utils.c:98 msgid "Print clipboard contents" msgstr "Vágólap tartalmak nyomtatása" #: ../src/utils.c:105 msgid "Print primary contents" msgstr "Elsődleges tartalmak nyomtatása" #: ../src/utils.c:117 msgid "" "Clipboard CLI usage examples:\n" "\n" " echo \"copied to clipboard\" | parcellite\n" " parcellite \"copied to clipboard\"\n" " echo \"copied to clipboard\" | parcellite -c" msgstr "" "A vágólapkezelő CLI (konzolos) használatára példák:\n" "\n" " echo \"másolás a vágólapra\" | parcellite\n" " parcellite \"másolás a vágólapra\"\n" " echo \"másolás a vágólapra\" | parcellite -c" #: ../src/utils.c:123 msgid "" "Written by Gilberto \"Xyhthyx\" Miralla.\n" "Report bugs to ." msgstr "" "Írta: Gilberto \"Xyhthyx\" Miralla\n" "Hibabejelentő emailcím: " #. Create the dialog #: ../src/preferences.c:375 msgid "Preferences" msgstr "Beállítások" #: ../src/preferences.c:390 msgid "Behavior" msgstr "Viselkedés" #: ../src/preferences.c:398 msgid "Clipboards" msgstr "Vágólapok" #: ../src/preferences.c:405 msgid "Use _Copy (Ctrl-C)" msgstr "_Másol használata (Ctrl+C)" #: ../src/preferences.c:407 msgid "Use _Primary (Selection)" msgstr "_Elsődleges használata (Kiválasztás)" #: ../src/preferences.c:409 msgid "S_ynchronize clipboards" msgstr "Vágólapok s_zinkronizálása" #: ../src/preferences.c:417 msgid "History" msgstr "Előzmény" #: ../src/preferences.c:424 msgid "_Save history" msgstr "Előzmény _mentése" #: ../src/preferences.c:425 msgid "Save and restore history between sessions" msgstr "Előzmények mentése és visszaállítása a munkamenetek között" #: ../src/preferences.c:429 msgid "Items in history:" msgstr "Előzmény elemei:" #: ../src/preferences.c:442 msgid "Miscellaneous" msgstr "Egyebek" #: ../src/preferences.c:449 msgid "Capture _hyperlinks only" msgstr "Csak a _hivatkozások elkapása" #: ../src/preferences.c:451 msgid "C_onfirm before clearing history" msgstr "Előzmény törlésének megerősítése" #: ../src/preferences.c:458 msgid "Display" msgstr "Megjelenítés" #: ../src/preferences.c:466 msgid "Items" msgstr "Elemek" #: ../src/preferences.c:473 msgid "Show in a _single line" msgstr "_Egysoros mód" #: ../src/preferences.c:475 msgid "Show in _reverse order" msgstr "_Fordított sorrend" #: ../src/preferences.c:479 msgid "Character length of items:" msgstr "Elemek karaktereinek száma:" #: ../src/preferences.c:492 msgid "Omitting" msgstr "Kihagyás" #: ../src/preferences.c:501 msgid "Omit items in the:" msgstr "Elemek kihagyása itt:" #: ../src/preferences.c:505 msgid "Beginning" msgstr "Elején" #: ../src/preferences.c:506 msgid "Middle" msgstr "Középen" #: ../src/preferences.c:507 msgid "End" msgstr "Végén" #: ../src/preferences.c:514 msgid "Actions" msgstr "Műveletek" #. Build the actions label #: ../src/preferences.c:519 msgid "Control-click Parcellite's tray icon to use actions" msgstr "Műveletek használatához Ctrl+kattintás a Parcellite állapotikonjára" #: ../src/preferences.c:539 msgid "Action" msgstr "Művelet" #: ../src/preferences.c:546 msgid "Command" msgstr "Parancs" #: ../src/preferences.c:561 msgid "Add..." msgstr "Új..." #: ../src/preferences.c:565 msgid "Remove" msgstr "Eltávolít" #: ../src/preferences.c:582 msgid "Hotkeys" msgstr "Gyorsbillentyűk" #: ../src/preferences.c:590 msgid "Hotkeys" msgstr "Gyorsbillentyűk" #: ../src/preferences.c:599 msgid "History key combination:" msgstr "Előzmény gyorsbillentyű:" #: ../src/preferences.c:607 msgid "Actions key combination:" msgstr "Műveletek gyorsbillentyű:" #: ../src/preferences.c:615 msgid "Menu key combination:" msgstr "Menü gyorsbillentyű:" #: ../data/parcellite.desktop.in.h:2 ../data/parcellite-startup.desktop.in.h:2 msgid "Parcellite" msgstr "Parcellite" parcellite-1.2.1/po/quot.sed0000644000175000017500000000023113041603201014026 0ustar hlehles/"\([^"]*\)"/“\1”/g s/`\([^`']*\)'/‘\1’/g s/ '\([^`']*\)' / ‘\1’ /g s/ '\([^`']*\)'$/ ‘\1’/g s/^'\([^`']*\)' /‘\1’ /g s/“”/""/g parcellite-1.2.1/po/en@boldquot.header0000644000175000017500000000247113041603201015777 0ustar hlehle# All this catalog "translates" are quotation characters. # The msgids must be ASCII and therefore cannot contain real quotation # characters, only substitutes like grave accent (0x60), apostrophe (0x27) # and double quote (0x22). These substitutes look strange; see # http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html # # This catalog translates grave accent (0x60) and apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019). # It also translates pairs of apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019) # and pairs of quotation mark (0x22) to # left double quotation mark (U+201C) and right double quotation mark (U+201D). # # When output to an UTF-8 terminal, the quotation characters appear perfectly. # When output to an ISO-8859-1 terminal, the single quotation marks are # transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to # grave/acute accent (by libiconv), and the double quotation marks are # transliterated to 0x22. # When output to an ASCII terminal, the single quotation marks are # transliterated to apostrophes, and the double quotation marks are # transliterated to 0x22. # # This catalog furthermore displays the text between the quotation marks in # bold face, assuming the VT100/XTerm escape sequences. # parcellite-1.2.1/po/sv.po0000644000175000017500000001337713041603201013350 0ustar hlehle# Swedish translation for parcellite. # Copyright (C) 2009 Free Software Foundation, Inc. # This file is distributed under the same license as the parcellite package. # Daniel Nylander , 2009. # msgid "" msgstr "" "Project-Id-Version: parcellite\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-18 12:12-0400\n" "PO-Revision-Date: 2009-03-04 09:41+0100\n" "Last-Translator: Daniel Nylander \n" "Language-Team: Swedish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../src/main.c:166 msgid "Executing action..." msgstr "Kör åtgärd..." #: ../src/main.c:172 ../src/main.c:704 ../data/parcellite.desktop.in.h:1 #: ../data/parcellite-startup.desktop.in.h:1 msgid "Clipboard Manager" msgstr "Urklippshanterare" #: ../src/main.c:195 msgid "Could not create thread for executed action\n" msgstr "Skapa inte tråd för startad åtgärd\n" #. Create the dialog #: ../src/main.c:225 msgid "Editing Clipboard" msgstr "Redigerar urklipp" #: ../src/main.c:284 msgid "Clear the history?" msgstr "Töm historik?" #: ../src/main.c:336 msgid "Lightweight GTK+ clipboard manager." msgstr "Resurssnål GTK+-urklippshanterare." #: ../src/main.c:423 msgid "None" msgstr "Inget" #. File contained no actions so adding empty #. File did not open so adding empty #. Nothing in history so adding empty #: ../src/main.c:444 ../src/main.c:473 ../src/main.c:588 msgid "Empty" msgstr "Tom" #. Edit actions #: ../src/main.c:480 msgid "_Edit actions" msgstr "R_edigera åtgärder" #. Edit clipboard #: ../src/main.c:504 msgid "_Edit Clipboard" msgstr "R_edigera urklipp" #: ../src/utils.c:38 ../src/utils.c:45 #, c-format msgid "Couldn't create directory: %s\n" msgstr "Kunde inte skapa katalog: %s\n" #: ../src/utils.c:84 msgid "Run as daemon" msgstr "Kör som demon" #: ../src/utils.c:91 msgid "Do not use status icon (Ctrl-Alt-P for menu)" msgstr "Använd inte statusikon (Ctrl-Alt-P för meny)" #: ../src/utils.c:98 msgid "Print clipboard contents" msgstr "Skriv ut urklippets innehåll" #: ../src/utils.c:105 msgid "Print primary contents" msgstr "Skriv ut primärt innehåll" #: ../src/utils.c:117 msgid "" "Clipboard CLI usage examples:\n" "\n" " echo \"copied to clipboard\" | parcellite\n" " parcellite \"copied to clipboard\"\n" " echo \"copied to clipboard\" | parcellite -c" msgstr "" "Användningexempel för kommandorad:\n" "\n" " echo \"kopierad till urklipp\" | parcellite\n" " parcellite \"kopierad till urklipp\"\n" " echo \"kopierad till urklipp\" | parcellite -c" #: ../src/utils.c:123 msgid "" "Written by Gilberto \"Xyhthyx\" Miralla.\n" "Report bugs to ." msgstr "" "Skrivet av Gilberto \"Xyhthyx\" Miralla.\n" "Rapportera fel till ." #. Create the dialog #: ../src/preferences.c:375 msgid "Preferences" msgstr "Inställningar" #: ../src/preferences.c:390 msgid "Behavior" msgstr "Beteende" #: ../src/preferences.c:398 msgid "Clipboards" msgstr "Urklipp" #: ../src/preferences.c:405 msgid "Use _Copy (Ctrl-C)" msgstr "Använd _Kopiera (Ctrl-C)" #: ../src/preferences.c:407 msgid "Use _Primary (Selection)" msgstr "Använd _Primär (Markering)" #: ../src/preferences.c:409 msgid "S_ynchronize clipboards" msgstr "S_ynkronisera urklipp" #: ../src/preferences.c:417 msgid "History" msgstr "Historik" #: ../src/preferences.c:424 msgid "_Save history" msgstr "_Spara historik" #: ../src/preferences.c:425 msgid "Save and restore history between sessions" msgstr "Spara och återställ historik mellan sessioner" #: ../src/preferences.c:429 msgid "Items in history:" msgstr "Objekt i historik:" #: ../src/preferences.c:442 msgid "Miscellaneous" msgstr "Diverse" #: ../src/preferences.c:449 msgid "Capture _hyperlinks only" msgstr "Fånga endast _hyperlänkar" #: ../src/preferences.c:451 msgid "C_onfirm before clearing history" msgstr "B_ekräfta innan historiken töms" #: ../src/preferences.c:458 msgid "Display" msgstr "Visa" #: ../src/preferences.c:466 msgid "Items" msgstr "Objekt" #: ../src/preferences.c:473 msgid "Show in a _single line" msgstr "Visa på en _enda rad" #: ../src/preferences.c:475 msgid "Show in _reverse order" msgstr "Visa i _omvänd ordning" #: ../src/preferences.c:479 msgid "Character length of items:" msgstr "Teckenlängd för objekt:" #: ../src/preferences.c:492 msgid "Omitting" msgstr "Utelämna" #: ../src/preferences.c:501 msgid "Omit items in the:" msgstr "Utelämna objekt i:" #: ../src/preferences.c:505 msgid "Beginning" msgstr "Början" #: ../src/preferences.c:506 msgid "Middle" msgstr "Mitten" #: ../src/preferences.c:507 msgid "End" msgstr "Slutet" #: ../src/preferences.c:514 msgid "Actions" msgstr "Åtgärder" #. Build the actions label #: ../src/preferences.c:519 msgid "Control-click Parcellite's tray icon to use actions" msgstr "Control-klicka på Parcellites aktivitetsikon för att använda åtgärder" #: ../src/preferences.c:539 msgid "Action" msgstr "Åtgärd" #: ../src/preferences.c:546 msgid "Command" msgstr "Kommando" #: ../src/preferences.c:561 msgid "Add..." msgstr "Lägg till..." #: ../src/preferences.c:565 msgid "Remove" msgstr "Ta bort" #: ../src/preferences.c:582 msgid "Hotkeys" msgstr "Snabbtangenter" #: ../src/preferences.c:590 msgid "Hotkeys" msgstr "Snabbtangenter" #: ../src/preferences.c:599 msgid "History key combination:" msgstr "Tangentkombination för historik:" #: ../src/preferences.c:607 msgid "Actions key combination:" msgstr "Tangentkombination för åtgärder:" #: ../src/preferences.c:615 msgid "Menu key combination:" msgstr "Tangentkombination för meny:" #: ../data/parcellite.desktop.in.h:2 ../data/parcellite-startup.desktop.in.h:2 msgid "Parcellite" msgstr "Parcellite" parcellite-1.2.1/po/ro.po0000644000175000017500000001702013041603201013325 0ustar hlehle# Romanian translation of Parcellite. # Copyright (C) 2008 Xyhthyx # This file is distributed under the same license as the parcellite package. # Ovidiu D. Niţan # # msgid "" msgstr "" "Project-Id-Version: Parcellite\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-12-31 16:53-0500\n" "PO-Revision-Date: 2009-07-17 18:58+0200\n" "Last-Translator: Ovidiu D. Niţan \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../src/main.c:186 ../src/main.c:222 msgid "Executing action..." msgstr "Executare acţiune..." #: ../src/main.c:192 ../src/main.c:208 ../src/main.c:776 #: ../data/parcellite.desktop.in.h:1 ../data/parcellite-startup.desktop.in.h:1 msgid "Clipboard Manager" msgstr "Administrator clipboard" #. Create the dialog #: ../src/main.c:271 msgid "Editing Clipboard" msgstr "Editare clipboard" #: ../src/main.c:330 msgid "Clear the history?" msgstr "Doriţi să goliţi istoricul?" #: ../src/main.c:398 msgid "Lightweight GTK+ clipboard manager." msgstr "Mic manager de clipboard." #: ../src/main.c:485 msgid "None" msgstr "Niciunul" #. File contained no actions so adding empty #. File did not open so adding empty #. Nothing in history so adding empty #: ../src/main.c:506 ../src/main.c:535 ../src/main.c:660 msgid "Empty" msgstr "Gol" #. Edit actions #: ../src/main.c:542 msgid "_Edit actions" msgstr "_Editare acţiuni" #. Edit clipboard #: ../src/main.c:566 msgid "_Edit Clipboard" msgstr "_Editare clipboard" #: ../src/utils.c:38 ../src/utils.c:45 #, c-format msgid "Couldn't create directory: %s\n" msgstr "Nu s-a putut creea directorul: %s\n" #: ../src/utils.c:84 msgid "Run as daemon" msgstr "Executare ca daemon" #: ../src/utils.c:91 msgid "Do not use status icon (Ctrl-Alt-P for menu)" msgstr "Nu afişa iconul de status (apăsaţi Ctrl-Alt-P pentru meniu)" #: ../src/utils.c:98 msgid "Print clipboard contents" msgstr "Imprimare conţinut clipboard" #: ../src/utils.c:105 msgid "Print primary contents" msgstr "Imprimare conţinut primar" #: ../src/utils.c:117 msgid "" "Clipboard CLI usage examples:\n" "\n" " echo \"copied to clipboard\" | parcellite\n" " parcellite \"copied to clipboard\"\n" " echo \"copied to clipboard\" | parcellite -c" msgstr "" "Exemple de utilizare în linie de comandă:\n" "\n" " echo \"copiat în clipboard\" | parcellite\n" " parcellite \"copiat în clipboard\"\n" " echo \"copiat în clipboard\" | parcellite -c" #: ../src/utils.c:123 msgid "" "Written by Gilberto \"Xyhthyx\" Miralla.\n" "Report bugs to ." msgstr "" "Scris de Gilberto \"Xyhthyx\" Miralla.\n" "Raportaţi erorile la ." #. Create the dialog #: ../src/preferences.c:395 msgid "Preferences" msgstr "Preferinţe" #: ../src/preferences.c:414 msgid "Behavior" msgstr "Comportament" #: ../src/preferences.c:422 msgid "Clipboards" msgstr "Clipboard-uri" #: ../src/preferences.c:429 msgid "Use _Copy (Ctrl-C)" msgstr "Foloseşte _Copiază (Ctrl-C)" #: ../src/preferences.c:432 msgid "Use _Primary (Selection)" msgstr "Foloseşte selecţia _primară (Selecţie)" #: ../src/preferences.c:435 msgid "S_ynchronize clipboards" msgstr "Sincronizare clipboard-uri" #: ../src/preferences.c:443 msgid "History" msgstr "Istoric" #: ../src/preferences.c:450 msgid "_Save history" msgstr "_Salvează istoricul" #: ../src/preferences.c:451 msgid "Save and restore history between sessions" msgstr "Salvează şi restaurează istoricul între sesiuni" #: ../src/preferences.c:455 msgid "Items in history:" msgstr "Elemente în istoric:" #: ../src/preferences.c:468 msgid "Miscellaneous" msgstr "Diverse" #: ../src/preferences.c:475 msgid "Capture _hyperlinks only" msgstr "Capturează doar _hiperlegăturile" #: ../src/preferences.c:477 msgid "C_onfirm before clearing history" msgstr "Cere c_onfirmare înainte de golirea istoricului" #: ../src/preferences.c:484 msgid "Display" msgstr "Afişare" #: ../src/preferences.c:492 msgid "Items" msgstr "Elemente" #: ../src/preferences.c:499 msgid "Show in a _single line" msgstr "Afişează întro _singură linie" #: ../src/preferences.c:501 msgid "Show in _reverse order" msgstr "Afişează în o_rdine inversă" #: ../src/preferences.c:505 msgid "Character length of items:" msgstr "Lungimea în caractere a elementelor:" #: ../src/preferences.c:518 msgid "Omitting" msgstr "Omitere" #: ../src/preferences.c:527 msgid "Omit items in the:" msgstr "Omitere elemente în:" #: ../src/preferences.c:531 msgid "Beginning" msgstr "Început" #: ../src/preferences.c:532 msgid "Middle" msgstr "Mijloc" #: ../src/preferences.c:533 msgid "End" msgstr "Sfârşit" #: ../src/preferences.c:540 msgid "Actions" msgstr "Acţiuni" #. Build the actions label #: ../src/preferences.c:545 msgid "Control-click Parcellite's tray icon to use actions" msgstr "" "Apăsaţi pe Control şi faceţi click pe iconul Parcellite pentru a utiliza " "acţiunile" #: ../src/preferences.c:565 msgid "Action" msgstr "Acţiuni" #: ../src/preferences.c:572 msgid "Command" msgstr "Comandă" #: ../src/preferences.c:587 msgid "Add..." msgstr "Adăugare..." #: ../src/preferences.c:591 msgid "Remove" msgstr "Ştergere" #: ../src/preferences.c:608 msgid "Hotkeys" msgstr "Scurtături" #: ../src/preferences.c:616 msgid "Hotkeys" msgstr "Scurtături" #: ../src/preferences.c:625 msgid "History key combination:" msgstr "Combinaţie de taste pentru istoric:" #: ../src/preferences.c:633 msgid "Actions key combination:" msgstr "Combinaţie de taste pentru acţiuni:" #: ../src/preferences.c:641 msgid "Menu key combination:" msgstr "Combinaţie de taste pentru meniu:" #: ../data/parcellite.desktop.in.h:2 ../data/parcellite-startup.desktop.in.h:2 msgid "Parcellite" msgstr "Parcellite" #~ msgid "Could not create thread for executed action\n" #~ msgstr "Nu se poate creea un thread pentru acţiunea executată\n" #~ msgid "Clipboard" #~ msgstr "Zwischenablage" #~ msgid "Save changes" #~ msgstr "Änderungen speichern" #~ msgid "Discard changes" #~ msgstr "Änderungen verwerfen" #~ msgid "Extras" #~ msgstr "Extras" #, fuzzy #~ msgid "" #~ "Add a new action\n" #~ "\"%s\" in a command is replaced with the clipboard contents" #~ msgstr "\"%s\" wird mit dem Inhalt der Zwischenablage ersetzt" #, fuzzy #~ msgid "Move selected action up" #~ msgstr "Auswahl nach oben verschieben" #, fuzzy #~ msgid "Move selected action down" #~ msgstr "Auswahl nach unten verschieben" #~ msgid "Close" #~ msgstr "Schließen" #~ msgid "New Action" #~ msgstr "Neue Aktion" #~ msgid "Name:" #~ msgstr "Name:" #~ msgid "Name your action" #~ msgstr "Benennen Sie Ihre Aktion" #~ msgid "Command:" #~ msgstr "Befehl:" #~ msgid "Edit Action" #~ msgstr "Aktion bearbeiten" #~ msgid "General" #~ msgstr "Allgemein" #~ msgid "Length in characters of history items:" #~ msgstr "Maximale Länge der Zeichen pro Eintrag:" #~ msgid "History menu global hotkey:" #~ msgstr "Globale Tastenkombination für Verlaufsmenü:" #~ msgid "Actions menu global hotkey:" #~ msgstr "Globale Tastenkombination für Aktionsmenü:" #~ msgid "Single _line mode" #~ msgstr "Zei_lenmodus" #~ msgid "Ignore all non-hyperlink text" #~ msgstr "Ignoriere nicht verlinkten Text" #~ msgid "New" #~ msgstr "Neu" #~ msgid "New action" #~ msgstr "Neue Aktion" #~ msgid "Edit" #~ msgstr "Bearbeiten" #~ msgid "Edit selected" #~ msgstr "Auswahl bearbeiten" #~ msgid "Delete" #~ msgstr "Löschen" #~ msgid "Delete selected" #~ msgstr "Auswahl löschen" parcellite-1.2.1/po/boldquot.sed0000644000175000017500000000033113041603201014670 0ustar hlehles/"\([^"]*\)"/“\1”/g s/`\([^`']*\)'/‘\1’/g s/ '\([^`']*\)' / ‘\1’ /g s/ '\([^`']*\)'$/ ‘\1’/g s/^'\([^`']*\)' /‘\1’ /g s/“”/""/g s/“/“/g s/”/”/g s/‘/‘/g s/’/’/g parcellite-1.2.1/po/pl_PL.po0000644000175000017500000001343713041603201013723 0ustar hlehle# Polish translation of parcellite # Copyright (C) 2008 Xyhthyx # This file is distributed under the same license as the parcellite package. # pankamyk , 2008. # # msgid "" msgstr "" "Project-Id-Version: Parcellite\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-18 12:08-0400\n" "PO-Revision-Date: \n" "Last-Translator: pankamyk \n" "Language-Team: none \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Polish\n" "X-Poedit-Country: POLAND\n" #: ../src/main.c:166 msgid "Executing action..." msgstr "Wykonywanie zadania..." #: ../src/main.c:172 ../src/main.c:704 ../data/parcellite.desktop.in.h:1 #: ../data/parcellite-startup.desktop.in.h:1 msgid "Clipboard Manager" msgstr "Menadżer schowka" #: ../src/main.c:195 msgid "Could not create thread for executed action\n" msgstr "Nie można wykonać tego zadania!\n" #. Create the dialog #: ../src/main.c:225 msgid "Editing Clipboard" msgstr "Edytor schowka" #: ../src/main.c:284 msgid "Clear the history?" msgstr "Usunąć historie wpisów?" #: ../src/main.c:336 msgid "Lightweight GTK+ clipboard manager." msgstr "Prosty i szybki menadżer schowka." #: ../src/main.c:423 msgid "None" msgstr "żaden" #. File contained no actions so adding empty #. File did not open so adding empty #. Nothing in history so adding empty #: ../src/main.c:444 ../src/main.c:473 ../src/main.c:588 msgid "Empty" msgstr "pusty" #. Edit actions #: ../src/main.c:480 msgid "_Edit actions" msgstr "_Edycja zadania" #. Edit clipboard #: ../src/main.c:504 msgid "_Edit Clipboard" msgstr "_Edycja zawartości schowka" #: ../src/utils.c:38 ../src/utils.c:45 #, c-format msgid "Couldn't create directory: %s\n" msgstr "Nie można utworzyć katalogu \"%s\"\n" #: ../src/utils.c:84 msgid "Run as daemon" msgstr "Uruchom jako deamon" #: ../src/utils.c:91 msgid "Do not use status icon (Ctrl-Alt-P for menu)" msgstr "Ukrywanie ikony programu. Domyślnie Ctrl+Alt+P pokazuje menu" #: ../src/utils.c:98 msgid "Print clipboard contents" msgstr "Drukowanie zawartości schowka" #: ../src/utils.c:105 #, fuzzy msgid "Print primary contents" msgstr "Drukowanie zawartości schowka" #: ../src/utils.c:117 msgid "" "Clipboard CLI usage examples:\n" "\n" " echo \"copied to clipboard\" | parcellite\n" " parcellite \"copied to clipboard\"\n" " echo \"copied to clipboard\" | parcellite -c" msgstr "" #: ../src/utils.c:123 msgid "" "Written by Gilberto \"Xyhthyx\" Miralla.\n" "Report bugs to ." msgstr "" "Autor: Gilberto \"Xyhthyx\" Miralla.\n" "Zauważone błędy proszę zgłaszać na adres xyhthyx@gmail.com" #. Create the dialog #: ../src/preferences.c:375 msgid "Preferences" msgstr "Ustawienia" #: ../src/preferences.c:390 msgid "Behavior" msgstr "Zachowanie" #: ../src/preferences.c:398 msgid "Clipboards" msgstr "Dodawane do schowka" #: ../src/preferences.c:405 msgid "Use _Copy (Ctrl-C)" msgstr "Tekst kopiowany przy użyciu _Ctrl+C" #: ../src/preferences.c:407 msgid "Use _Primary (Selection)" msgstr "Tekst zaznaczony kursorem" #: ../src/preferences.c:409 msgid "S_ynchronize clipboards" msgstr "" #: ../src/preferences.c:417 msgid "History" msgstr "Historia" #: ../src/preferences.c:424 msgid "_Save history" msgstr "Zapi_sywanie historii wpisów" #: ../src/preferences.c:425 msgid "Save and restore history between sessions" msgstr "Zapisywanie historii dla każdej sesji" #: ../src/preferences.c:429 msgid "Items in history:" msgstr "Liczba zapamiętanych wpisów:" #: ../src/preferences.c:442 msgid "Miscellaneous" msgstr "Różne" #: ../src/preferences.c:449 msgid "Capture _hyperlinks only" msgstr "Przec_hwytywanie tylko linków" #: ../src/preferences.c:451 msgid "C_onfirm before clearing history" msgstr "P_otwierdzanie usuwania historii wpisów" #: ../src/preferences.c:458 msgid "Display" msgstr "Wygląd" #: ../src/preferences.c:466 msgid "Items" msgstr "Wygląd wpisów" #: ../src/preferences.c:473 msgid "Show in a _single line" msgstr "Pojedyncza linia" #: ../src/preferences.c:475 msgid "Show in _reverse order" msgstr "Odw_rócenie kolejności" #: ../src/preferences.c:479 msgid "Character length of items:" msgstr "Liczba znaków dla wpisu:" #: ../src/preferences.c:492 msgid "Omitting" msgstr "Streszczanie wpisu" #: ../src/preferences.c:501 msgid "Omit items in the:" msgstr "Wyświetlanie wpisu w menu:" #: ../src/preferences.c:505 msgid "Beginning" msgstr "Początek" #: ../src/preferences.c:506 msgid "Middle" msgstr "Początek i koniec" #: ../src/preferences.c:507 msgid "End" msgstr "Koniec" #: ../src/preferences.c:514 msgid "Actions" msgstr "Zadania" #. Build the actions label #: ../src/preferences.c:519 msgid "Control-click Parcellite's tray icon to use actions" msgstr "" #: ../src/preferences.c:539 msgid "Action" msgstr "Zadanie" #: ../src/preferences.c:546 msgid "Command" msgstr "Polecenie" #: ../src/preferences.c:561 msgid "Add..." msgstr "Dodaj..." #: ../src/preferences.c:565 msgid "Remove" msgstr "Usuń" #: ../src/preferences.c:582 #, fuzzy msgid "Hotkeys" msgstr "Skróty klawiatury" #: ../src/preferences.c:590 msgid "Hotkeys" msgstr "Skróty klawiatury" #: ../src/preferences.c:599 msgid "History key combination:" msgstr "Pokaż historie:" #: ../src/preferences.c:607 msgid "Actions key combination:" msgstr "Pokaż zadania:" #: ../src/preferences.c:615 msgid "Menu key combination:" msgstr "Pokaż menu:" #: ../data/parcellite.desktop.in.h:2 ../data/parcellite-startup.desktop.in.h:2 msgid "Parcellite" msgstr "Parcellite" #~ msgid "Clipboard" #~ msgstr "Schowek" #~ msgid "Save changes" #~ msgstr "Zapisz" #~ msgid "Discard changes" #~ msgstr "Anuluj" #~ msgid "Extras" #~ msgstr "Dodatki" parcellite-1.2.1/po/de.po0000644000175000017500000001735013041603201013303 0ustar hlehle# German translation of parcellite. # Copyright (C) 2008 Xyhthyx # This file is distributed under the same license as the parcellite package. # Eckhard M. Jäger , 2008. # Michael Stempin , 2008. # Christoph Wickert , 2009-2013 # # msgid "" msgstr "" "Project-Id-Version: Parcellite\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-01-01 12:21-0500\n" "PO-Revision-Date: 2013-01-27 15:26+0100\n" "Last-Translator: Christoph Wickert \n" "Language-Team: \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../src/main.c:186 #: ../src/main.c:222 msgid "Executing action..." msgstr "Aktion ausführen…" #: ../src/main.c:192 #: ../src/main.c:208 #: ../src/main.c:785 #: ../data/parcellite.desktop.in.h:1 #: ../data/parcellite-startup.desktop.in.h:1 msgid "Clipboard Manager" msgstr "Verwaltung der Zwischenablage" #. Create the dialog #: ../src/main.c:271 msgid "Editing Clipboard" msgstr "Zwischenablage bearbeiten" #: ../src/main.c:330 msgid "Clear the history?" msgstr "Verlauf leeren?" #: ../src/main.c:398 msgid "Lightweight GTK+ clipboard manager." msgstr "Ein schlanker GTK+-Manager für die Zwischenablage." #: ../src/main.c:494 msgid "None" msgstr "Nichts" #. File contained no actions so adding empty #. File did not open so adding empty #. Nothing in history so adding empty #: ../src/main.c:515 #: ../src/main.c:544 #: ../src/main.c:669 msgid "Empty" msgstr "Leer" #. Edit actions #: ../src/main.c:551 msgid "_Edit actions" msgstr "Aktion_en bearbeiten" #. Edit clipboard #: ../src/main.c:575 msgid "_Edit Clipboard" msgstr "Zwisch_enablage bearbeiten" #: ../src/utils.c:38 #: ../src/utils.c:45 #, c-format msgid "Couldn't create directory: %s\n" msgstr "Verzeichnis konnte nicht angelegt werden: %s\n" #: ../src/utils.c:84 msgid "Run as daemon" msgstr "Als Dienst ausführen" #: ../src/utils.c:91 msgid "Do not use status icon (Ctrl-Alt-P for menu)" msgstr "Statussymbol nicht benutzen (Strg+Alt+P für Menü)" #: ../src/utils.c:98 msgid "Print clipboard contents" msgstr "Inhalt der Zwischenablage drucken" #: ../src/utils.c:105 msgid "Print primary contents" msgstr "Inhalt der primären Zwischenablage drucken" #: ../src/utils.c:117 msgid "" "Clipboard CLI usage examples:\n" "\n" " echo \"copied to clipboard\" | parcellite\n" " parcellite \"copied to clipboard\"\n" " echo \"copied to clipboard\" | parcellite -c" msgstr "" "Beispiel für die Nutzung der CLI-Zwischenablage:\n" "\n" " echo \"In Zwischenablage kopiert\" | parcellite\n" " parcellite \"In Zwischenablage kopiert\"\n" " echo \"In Zwischenablage kopiert\" | parcellite -c" #: ../src/utils.c:123 msgid "" "Written by Gilberto \"Xyhthyx\" Miralla.\n" "Report bugs to ." msgstr "" "Entwickelt von Gilberto \"Xyhthyx\" Miralla.\n" "Melden Sie Fehler bitte an ." #. Create the dialog #: ../src/preferences.c:395 msgid "Preferences" msgstr "Einstellungen" #: ../src/preferences.c:414 msgid "Behavior" msgstr "Verhalten" #: ../src/preferences.c:422 msgid "Clipboards" msgstr "Zwischenablagen" #: ../src/preferences.c:429 msgid "Use _Copy (Ctrl-C)" msgstr "Kopieren benutzen (Ctrl-C)" #: ../src/preferences.c:432 msgid "Use _Primary (Selection)" msgstr "_Primäre Zwischenablage benutzen (Auswahl)" #: ../src/preferences.c:435 msgid "S_ynchronize clipboards" msgstr "Zwischenablagen s_ynchronisieren" #: ../src/preferences.c:443 msgid "History" msgstr "Verlauf" #: ../src/preferences.c:450 msgid "_Save history" msgstr "Verlauf _speichern" #: ../src/preferences.c:451 msgid "Save and restore history between sessions" msgstr "Verlauf zwischen Sitzungen speichern und wiederherstellen" #: ../src/preferences.c:455 msgid "Items in history:" msgstr "Einträge im Verlauf:" #: ../src/preferences.c:468 msgid "Miscellaneous" msgstr "Verschiedenes" #: ../src/preferences.c:475 msgid "Capture _hyperlinks only" msgstr "Nur Hyperlinks erfassen" #: ../src/preferences.c:477 msgid "C_onfirm before clearing history" msgstr "_Leeren des Verlaufes bestätigen" #: ../src/preferences.c:484 msgid "Display" msgstr "Ansicht" #: ../src/preferences.c:492 msgid "Items" msgstr "Einträge" #: ../src/preferences.c:499 msgid "Show in a _single line" msgstr "Als _einzelne Zeile anzeigen" #: ../src/preferences.c:501 msgid "Show in _reverse order" msgstr "In umgekeh_rter Reihenfolge anzeigen" #: ../src/preferences.c:505 msgid "Character length of items:" msgstr "Länge der Einträge im Verlauf" #: ../src/preferences.c:518 msgid "Omitting" msgstr "Kürzen" #: ../src/preferences.c:527 msgid "Omit items in the:" msgstr "Einträge kürzen:" #: ../src/preferences.c:531 msgid "Beginning" msgstr "Am Anfang" #: ../src/preferences.c:532 msgid "Middle" msgstr "In der Mitte" #: ../src/preferences.c:533 msgid "End" msgstr "Am Ende" #: ../src/preferences.c:540 msgid "Actions" msgstr "Aktionen" #. Build the actions label #: ../src/preferences.c:545 msgid "Control-click Parcellite's tray icon to use actions" msgstr "STRG+Mausklick auf das Parcellite-Symbol um Aktionen auszuführen" #: ../src/preferences.c:565 msgid "Action" msgstr "Aktion" #: ../src/preferences.c:572 msgid "Command" msgstr "Befehl" #: ../src/preferences.c:587 msgid "Add..." msgstr "Hinzufügen…" #: ../src/preferences.c:591 msgid "Remove" msgstr "Entfernen" #: ../src/preferences.c:608 msgid "Hotkeys" msgstr "Tastenkombinationen" #: ../src/preferences.c:616 msgid "Hotkeys" msgstr "Tastenkombinationen" #: ../src/preferences.c:625 msgid "History key combination:" msgstr "Tastenkombination für den Verlauf" #: ../src/preferences.c:633 msgid "Actions key combination:" msgstr "Tastenkombination für Aktionen" #: ../src/preferences.c:641 msgid "Menu key combination:" msgstr "Tastenkombination für das Menü" #: ../data/parcellite.desktop.in.h:2 #: ../data/parcellite-startup.desktop.in.h:2 msgid "Parcellite" msgstr "Parcellite" #~ msgid "Could not create thread for executed action\n" #~ msgstr "Thread für ausgeführte Aktion konnte nicht erzeugt werden\n" #~ msgid "Clipboard" #~ msgstr "Zwischenablage" #~ msgid "Save changes" #~ msgstr "Änderungen speichern" #~ msgid "Discard changes" #~ msgstr "Änderungen verwerfen" #~ msgid "Extras" #~ msgstr "Extras" #, fuzzy #~ msgid "" #~ "Add a new action\n" #~ "\"%s\" in a command is replaced with the clipboard contents" #~ msgstr "\"%s\" wird mit dem Inhalt der Zwischenablage ersetzt" #, fuzzy #~ msgid "Move selected action up" #~ msgstr "Auswahl nach oben verschieben" #, fuzzy #~ msgid "Move selected action down" #~ msgstr "Auswahl nach unten verschieben" #~ msgid "Close" #~ msgstr "Schließen" #~ msgid "New Action" #~ msgstr "Neue Aktion" #~ msgid "Name:" #~ msgstr "Name:" #~ msgid "Name your action" #~ msgstr "Benennen Sie Ihre Aktion" #~ msgid "Command:" #~ msgstr "Befehl:" #~ msgid "Edit Action" #~ msgstr "Aktion bearbeiten" #~ msgid "General" #~ msgstr "Allgemein" #~ msgid "Length in characters of history items:" #~ msgstr "Maximale Länge der Zeichen pro Eintrag:" #~ msgid "History menu global hotkey:" #~ msgstr "Globale Tastenkombination für Verlaufsmenü:" #~ msgid "Actions menu global hotkey:" #~ msgstr "Globale Tastenkombination für Aktionsmenü:" #~ msgid "Single _line mode" #~ msgstr "Zei_lenmodus" #~ msgid "Ignore all non-hyperlink text" #~ msgstr "Ignoriere nicht verlinkten Text" #~ msgid "New" #~ msgstr "Neu" #~ msgid "New action" #~ msgstr "Neue Aktion" #~ msgid "Edit" #~ msgstr "Bearbeiten" #~ msgid "Edit selected" #~ msgstr "Auswahl bearbeiten" #~ msgid "Delete" #~ msgstr "Löschen" #~ msgid "Delete selected" #~ msgstr "Auswahl löschen" parcellite-1.2.1/po/nb.po0000644000175000017500000001404113041603201013304 0ustar hlehle# Norwegian translation of parcellite. # Copyright (C) 2008 Xyhthyx # This file is distributed under the same license as the parcellite package. # Øyvind Sæther , 2009. msgid "" msgstr "" "Project-Id-Version: parcellite\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-03-08 10:32-0400\n" "PO-Revision-Date: 2009-01-17 11:33+0100\n" "Last-Translator: yvind Sther \n" "Language-Team: Norwegian Bokml \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Lokalize 0.3\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../src/main.c:166 msgid "Executing action..." msgstr "Utfrer handling..." #: ../src/main.c:172 ../src/main.c:704 ../data/parcellite.desktop.in.h:1 #: ../data/parcellite-startup.desktop.in.h:1 msgid "Clipboard Manager" msgstr "Utklippstavleverkty" #: ../src/main.c:195 msgid "Could not create thread for executed action\n" msgstr "Kunne ikke lage trd fr utfrt handling\n" #. Create the dialog #: ../src/main.c:225 msgid "Editing Clipboard" msgstr "Redigerer Utklippstavlen" #: ../src/main.c:284 msgid "Clear the history?" msgstr "Tm historikken?" #: ../src/main.c:336 msgid "Lightweight GTK+ clipboard manager." msgstr "Lettvekts GTK+ utklippstavlebehandler" #: ../src/main.c:423 msgid "None" msgstr "Ingen" #. File contained no actions so adding empty #. File did not open so adding empty #. Nothing in history so adding empty #: ../src/main.c:444 ../src/main.c:473 ../src/main.c:588 msgid "Empty" msgstr "Tom " #. Edit actions #: ../src/main.c:480 msgid "_Edit actions" msgstr "_Rediger handlinger" #. Edit clipboard #: ../src/main.c:504 msgid "_Edit Clipboard" msgstr "_Rediger utklippstavlen" #: ../src/utils.c:38 ../src/utils.c:45 #, c-format msgid "Couldn't create directory: %s\n" msgstr "Kunne ikke opprette mappe: %s\n" #: ../src/utils.c:84 msgid "Run as daemon" msgstr "Kjr i bakgrunnen" #: ../src/utils.c:91 msgid "Do not use status icon (Ctrl-Alt-P for menu)" msgstr "Ikke vis statusikon (Ctrl-Alt-P for menyen)" #: ../src/utils.c:98 msgid "Print clipboard contents" msgstr "Skriv ut utklippstavlens innhold" #: ../src/utils.c:105 #, fuzzy msgid "Print primary contents" msgstr "Skriv ut utklippstavlens innhold" #: ../src/utils.c:117 #, fuzzy msgid "" "Clipboard CLI usage examples:\n" "\n" " echo \"copied to clipboard\" | parcellite\n" " parcellite \"copied to clipboard\"\n" " echo \"copied to clipboard\" | parcellite -c" msgstr "" "Eksempler ved bruk av utklippstavlen i CLI:\n" "\n" " echo \"kopiert til utklippstavlen\" | parcellite\n" " parcellite \"kopiert til utklippstavlen\"\n" " echo \"kopiert til utklippstavlen\" | parcellite -o" #: ../src/utils.c:123 msgid "" "Written by Gilberto \"Xyhthyx\" Miralla.\n" "Report bugs to ." msgstr "" "Skrevet av Gilberto \"Xyhthyx\" Miralla.\n" "Rapporter feil til ." #. Create the dialog #: ../src/preferences.c:375 msgid "Preferences" msgstr "Tilpass Parcellite " #: ../src/preferences.c:390 msgid "Behavior" msgstr "Oppfrsel" #: ../src/preferences.c:398 msgid "Clipboards" msgstr "Utklippstavler" #: ../src/preferences.c:405 msgid "Use _Copy (Ctrl-C)" msgstr "Bruk _Kopier (Ctrl-C)" #: ../src/preferences.c:407 msgid "Use _Primary (Selection)" msgstr "Bruk _Primr (Utvalg)" #: ../src/preferences.c:409 msgid "S_ynchronize clipboards" msgstr "" #: ../src/preferences.c:417 msgid "History" msgstr "Historikk" #: ../src/preferences.c:424 msgid "_Save history" msgstr "_Lagre historikk" #: ../src/preferences.c:425 msgid "Save and restore history between sessions" msgstr "Lagre og gjenopprett mellom sesjoner" #: ../src/preferences.c:429 msgid "Items in history:" msgstr "Elementer i historikken:" #: ../src/preferences.c:442 msgid "Miscellaneous" msgstr "Diverse" #: ../src/preferences.c:449 msgid "Capture _hyperlinks only" msgstr "Bare fang _hyperlenker" #: ../src/preferences.c:451 msgid "C_onfirm before clearing history" msgstr "Bekreft fr tmming av hist_orikk" #: ../src/preferences.c:458 msgid "Display" msgstr "Vis" #: ../src/preferences.c:466 msgid "Items" msgstr "Elementer" #: ../src/preferences.c:473 msgid "Show in a _single line" msgstr "Vi_s i en enkelt linje" #: ../src/preferences.c:475 msgid "Show in _reverse order" msgstr "Vis i _omvendt rekkeflge" #: ../src/preferences.c:479 msgid "Character length of items:" msgstr "Tegnlengde p elementer:" #: ../src/preferences.c:492 msgid "Omitting" msgstr "Unngelser" #: ../src/preferences.c:501 msgid "Omit items in the:" msgstr "Unng elementer i:" #: ../src/preferences.c:505 msgid "Beginning" msgstr "Begynnelse" #: ../src/preferences.c:506 msgid "Middle" msgstr "Midtpunkt" #: ../src/preferences.c:507 msgid "End" msgstr "Slutt" #: ../src/preferences.c:514 msgid "Actions" msgstr "Handlinger" #. Build the actions label #: ../src/preferences.c:519 msgid "Control-click Parcellite's tray icon to use actions" msgstr "Hold Ctrl og klikk Parcellites ikon for bruke handlinger" #: ../src/preferences.c:539 msgid "Action" msgstr "Handling" #: ../src/preferences.c:546 msgid "Command" msgstr "Kommando" #: ../src/preferences.c:561 msgid "Add..." msgstr "Legg til..." #: ../src/preferences.c:565 msgid "Remove" msgstr "Fjern" #: ../src/preferences.c:582 #, fuzzy msgid "Hotkeys" msgstr "Hurtigtaster" #: ../src/preferences.c:590 msgid "Hotkeys" msgstr "Hurtigtaster" #: ../src/preferences.c:599 msgid "History key combination:" msgstr "Snarevei for historikk:" #: ../src/preferences.c:607 msgid "Actions key combination:" msgstr "Snarevei for handlinger:" #: ../src/preferences.c:615 msgid "Menu key combination:" msgstr "Snarevei for meny:" #: ../data/parcellite.desktop.in.h:2 ../data/parcellite-startup.desktop.in.h:2 msgid "Parcellite" msgstr "Parcellite" #~ msgid "Clipboard" #~ msgstr "Utklippstavle" #~ msgid "Save changes" #~ msgstr "Lagre endringer" #~ msgid "Discard changes" #~ msgstr "Forkast endringer" #~ msgid "Extras" #~ msgstr "Ekstra" parcellite-1.2.1/po/parcellite.pot0000644000175000017500000001652613041603201015227 0ustar hlehle#Generated by extract_strings "Project-Id-Version: 1.2.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-01-23 23:16-0700\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" msgid "" msgstr "" msgid "Action" msgstr "" msgid "Actions" msgstr "" msgid "Actions key combination:" msgstr "" msgid "Add..." msgstr "" msgid "Alternate Non-printing Display" msgstr "" msgid "Auto Paste" msgstr "" msgid "Clipboards" msgstr "" msgid "Beginning" msgstr "" msgid "Behavior" msgstr "" msgid "History" msgstr "" msgid "Hotkeys" msgstr "" msgid "Items" msgstr "" msgid "Miscellaneous" msgstr "" msgid "None" msgstr "" msgid "Omitting" msgstr "" msgid "X" msgstr "" msgid "Y" msgstr "" msgid "Capture hyperlinks only" msgstr "" msgid "Case Sensitive Search" msgstr "" msgid "Character length of items" msgstr "" msgid "_Clear" msgstr "" msgid "Clear the history?" msgstr "" msgid "Clipboard CLI usage examples:\n\n echo \"copied to clipboard\" | parcellite\n parcellite \"copied to clipboard\"\n echo \"copied to clipboard\" | parcellite -c" msgstr "" msgid "Clipboard Manager" msgstr "" msgid "Command" msgstr "" msgid "Confirm before clearing history" msgstr "" msgid "Control-click Parcellite's tray icon to use actions," msgstr "" msgid "Copyright (C) 2007, 2008 Gilberto \"Xyhthyx\" Miralla\nCopyright (C) 2010-2013 Doug Springer" msgstr "" msgid "Couldn't create directory: %s\n" msgstr "" msgid "Current entry on top" msgstr "" msgid "DebugUpdate" msgstr "" msgid "Display" msgstr "" msgid "Display Version info" msgstr "" msgid "Do not use status icon (Ctrl-Alt-P for menu)" msgstr "" msgid "Dummy desc" msgstr "" msgid "Dummy tip" msgstr "" msgid "_Edit actions" msgstr "" msgid "_Edit Clipboard" msgstr "" msgid "Editing Clipboard" msgstr "" msgid "Empty" msgstr "" msgid "End" msgstr "" msgid "Executing action..." msgstr "" msgid "Gilberto \"Xyhthyx\" Miralla \nDoug Springer " msgstr "" msgid "_History" msgstr "" msgid "History key combination:" msgstr "" msgid ">>$HOME/ptest" msgstr "" msgid "Hotkeys" msgstr "" msgid "If checked, does a search-as-you-type. Turns red if not found. Goes to top (Alt-E) line when no chars are entered for search" msgstr "" msgid "If checked, does case sensitive search" msgstr "" msgid "If checked, edit the history item clicked on." msgstr "" msgid "If checked, enables checking multiple concurrent user logic. Use if several different users are logged in at the same time." msgstr "" msgid "If checked, enables debug prints on clipboard update logic. This only takes effect when enabled at start up, and may be disabled at compile time." msgstr "" msgid "If checked, enables the persistent history." msgstr "" msgid "If checked, places current clipboard entry at top of list. If not checked, history does not get sorted." msgstr "" msgid "If checked, puts the persistent history at the top of the history list." msgstr "" msgid "If checked, puts the persistent history in a new list." msgstr "" msgid "If checked, the current entry will be on the bottom instead of the top." msgstr "" msgid "If checked, Use the clipboard, which is Ctrl-C, Ctrl-V" msgstr "" msgid "If checked, Use the primary clipboard (mouse highlight-copy, middle mouse button paste)" msgstr "" msgid "If checked, use X, Y to position the history list" msgstr "" msgid "If checked, will display tabs with Right arrow (utf8,\\2192), newlines with pharagrph(\\204b), and spaces with square-u(\\2423)." msgstr "" msgid "If checked, will emit the history entry via the keyboard entry." msgstr "" msgid "If checked, will ignore any clipboard additions that contain only whitespace." msgstr "" msgid "If checked, will keep both clipboards with the same content. If primary is pasted, then copy will have the same data." msgstr "" msgid "If checked, will replace newlines with spaces." msgstr "" msgid "If checked, will restore clipboard entry on application exit." msgstr "" msgid "If checked, will trim whitespace from beginning and end of entry." msgstr "" msgid "If checked, will use Ctrl-V paste." msgstr "" msgid "If checked, will use middle mouse to paste." msgstr "" msgid "If checked, will use xdotool to paste wherever the mouse is.\nNOTE! Package xdotool MUST BE INSTALLED for this to work." msgstr "" msgid "Ignore Whitespace Only" msgstr "" msgid "Items in history" msgstr "" msgid "Key" msgstr "" msgid "Keyboard Input" msgstr "" msgid "Lightweight GTK+ clipboard manager." msgstr "" msgid "Max Data Size(KB)" msgstr "" msgid "Maximum data size of entire history list" msgstr "" msgid "Maximum data size of one item" msgstr "" msgid "Maximum number of clipboard entries to keep" msgstr "" msgid "Max Item Size(KB)" msgstr "" msgid "Menu key combination" msgstr "" msgid "Middle" msgstr "" msgid "Mouse" msgstr "" msgid "Multiuser" msgstr "" msgid "Name of Parcellite icon. If this is mis-typed, icon will not appear." msgstr "" msgid "Omit items in the:" msgstr "" msgid "Parcellite Icon Name" msgstr "" msgid "Paste All Entry Delimiter" msgstr "" msgid "Persistent As Separate List" msgstr "" msgid "Persistent History" msgstr "" msgid "Persistent history key:" msgstr "" msgid "Persistent On Top" msgstr "" msgid "Position history" msgstr "" msgid "Position in pixels from the top of the screen" msgstr "" msgid "Preferences" msgstr "" msgid "Print clipboard contents" msgstr "" msgid "Print primary contents" msgstr "" msgid "Remove" msgstr "" msgid "Restore Empty" msgstr "" msgid "Right Click Edit" msgstr "" msgid "Save history" msgstr "" msgid "Save History as a text file. Prepends xHIST_0000 to each entry. x is either P(persistent) or N (normal)" msgstr "" msgid "Save history to a file." msgstr "" msgid "Search As You Type" msgstr "" msgid "Show in a single line" msgstr "" msgid "Show in reverse order" msgstr "" msgid "> " msgstr "" msgid "S_ynchronize clipboards" msgstr "" msgid "This is the Action Name. \nDO NOT put commands here." msgstr "" msgid "This program is free software; you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation; either version 3 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program. If not, see .;" msgstr "" msgid "This string will be inserted between each line of history for paste all." msgstr "" msgid "Trim Newlines" msgstr "" msgid "Trim Whitespace" msgstr "" msgid "Use Alt-E to edit, Alt-C to clear" msgstr "" msgid "Use _Copy (Ctrl-C)" msgstr "" msgid "Use %% if you want a literal %. See the man page for gnuC printf (man 2 printf) for more information." msgstr "" msgid "Use _Primary (Selection)" msgstr "" msgid "Written by Gilberto \"Xyhthyx\" Miralla and Doug Springer.\nReport bugs to ." msgstr "" msgid "xdotool Not Installed" msgstr "" parcellite-1.2.1/po/Rules-quot0000644000175000017500000000337613041603201014361 0ustar hlehle# Special Makefile rules for English message catalogs with quotation marks. DISTFILES.common.extra1 = quot.sed boldquot.sed en@quot.header en@boldquot.header insert-header.sin Rules-quot .SUFFIXES: .insert-header .po-update-en en@quot.po-create: $(MAKE) en@quot.po-update en@boldquot.po-create: $(MAKE) en@boldquot.po-update en@quot.po-update: en@quot.po-update-en en@boldquot.po-update: en@boldquot.po-update-en .insert-header.po-update-en: @lang=`echo $@ | sed -e 's/\.po-update-en$$//'`; \ if test "$(PACKAGE)" = "gettext"; then PATH=`pwd`/../src:$$PATH; GETTEXTLIBDIR=`cd $(top_srcdir)/src && pwd`; export GETTEXTLIBDIR; fi; \ tmpdir=`pwd`; \ echo "$$lang:"; \ ll=`echo $$lang | sed -e 's/@.*//'`; \ LC_ALL=C; export LC_ALL; \ cd $(srcdir); \ if $(MSGINIT) -i $(DOMAIN).pot --no-translator -l $$ll -o - 2>/dev/null | sed -f $$tmpdir/$$lang.insert-header | $(MSGCONV) -t UTF-8 | $(MSGFILTER) sed -f `echo $$lang | sed -e 's/.*@//'`.sed 2>/dev/null > $$tmpdir/$$lang.new.po; then \ if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ rm -f $$tmpdir/$$lang.new.po; \ else \ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ :; \ else \ echo "creation of $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ exit 1; \ fi; \ fi; \ else \ echo "creation of $$lang.po failed!" 1>&2; \ rm -f $$tmpdir/$$lang.new.po; \ fi en@quot.insert-header: insert-header.sin sed -e '/^#/d' -e 's/HEADER/en@quot.header/g' $(srcdir)/insert-header.sin > en@quot.insert-header en@boldquot.insert-header: insert-header.sin sed -e '/^#/d' -e 's/HEADER/en@boldquot.header/g' $(srcdir)/insert-header.sin > en@boldquot.insert-header mostlyclean: mostlyclean-quot mostlyclean-quot: rm -f *.insert-header parcellite-1.2.1/po/POTFILES.skip0000644000175000017500000000000113041603201014451 0ustar hlehle parcellite-1.2.1/po/pt_BR.po0000644000175000017500000002512513041603201013720 0ustar hlehle# translation of pt_BR.po to Português do Brasil # Português do Brasil translation of parcellite. # Copyright (C) 2008 Gilberto "Xyhthyx" Miralla # This file is distributed under the same license as the parcellite package. # # # Phantom X , 2008, 2009, 2013. msgid "" msgstr "" "Project-Id-Version: pt_BR\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-07-31 09:56-0600\n" "PO-Revision-Date: 2013-07-31 19:29-0300\n" "Last-Translator: Phantom X \n" "Language-Team: Brazilian Portuguese <>\n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Lokalize 1.5\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" msgid "Action" msgstr "Ação" msgid "Actions" msgstr "Ações" msgid "Actions key combination:" msgstr "Combinação de teclas de Ações:" msgid "Add..." msgstr "Adicionar..." msgid "Alternate Non-printing Display" msgstr "Exibição sem impressão alternativa" msgid "Auto Paste" msgstr "Auto Colar" msgid "Beginning" msgstr "Início" msgid "Behavior" msgstr "Comportamento" msgid "None" msgstr "Nenhum" msgid "Capture hyperlinks only" msgstr "Capturar somente _hyperlinks" msgid "Case Sensitive Search" msgstr "Busca com Caso Sensitivo" msgid "_Clear" msgstr "_Limpar" msgid "Clear the history?" msgstr "Limpar o histórico?" msgid "Clipboard CLI usage examples:\n\n echo \"copied to clipboard\" | parcellite\n parcellite \"copied to clipboard\"\n echo \"copied to clipboard\" | parcellite -c" msgstr "Exemplo de uso da Área de Transferência no terminal:\n\n echo \"copiado para a área de transferência\" | parcellite\n parcellite \"copiado para a área de transferência\"\n echo \"copiado para a área de transferência\" | parcellite -c" msgid "Clipboard Manager" msgstr "Gerenciador de Área de Transferência" msgid "Clipboards" msgstr "Áreas de Transferência " msgid "Command" msgstr "Comando" msgid "Confirm before clearing history" msgstr "Confirmar antes de limpar o histórico" msgid "Control-click Parcellite's tray icon to use actions" msgstr "Control-clique no ícone da bandeja do Parcellite para usar ações" msgid "" "Copyright (C) 2007, 2008 Gilberto \"Xyhthyx\" Miralla\nCopyright (C) 2010-2013 " "Doug Springer" msgstr "" msgid "Couldn't create directory: %s\n" msgstr "Impossível criar diretório: %s\n" msgid "Current entry on top" msgstr "Entrada atual no topo" msgid "DebugUpdate" msgstr "" msgid "Display" msgstr "Exibir" msgid "Display Version info" msgstr "Exibir info de versão" msgid "Do not use status icon (Ctrl-Alt-P for menu)" msgstr "Não usar ícone de status (Ctrl-Alt-P para o menu)" msgid "_Edit actions" msgstr "_Editar ações" msgid "_Edit Clipboard" msgstr "_Editar Área de Transferência" msgid "Editing Clipboard" msgstr "Editando a Área de Transferência" msgid "Empty" msgstr "Vazio" msgid "End" msgstr "Fim" msgid "Executing action..." msgstr "Executando ação..." msgid "" "Gilberto \"Xyhthyx\" Miralla Doug Springer " "" msgstr "" msgid "History" msgstr "Histórico" msgid "_History" msgstr "_Histórico" msgid "History key combination:" msgstr "Combinação de teclas do Histórico:" msgid "Hotkeys" msgstr "Atalhos" msgid "" "If checked, does a search-as-you-type. Turns red if not found. Goes to top " "(Alt-E) line when no chars are entered for search" msgstr "" "Se ativo, faz busca-ao-digitar. Fica vermelho se não encontrado. Vai a linha " "do topo (Alt-E) se nada for inserido para buscar." msgid "If checked, does case sensitive search" msgstr "Se ativo, faz busca com caso sensitivo" msgid "" "If checked, enables checking multiple concurrent user logic. Use if several " "different users are logged in at the same time." msgstr "" "Se ativo, habilita verificação de múltiplos usuários simultâneos. Use se " "vários " "usuários diferentes estão autenticados ao mesmo tempo." msgid "" "If checked, enables debug prints on clipboard update logic. This only takes " "effect when enabled at start up, and may be disabled at compile time." msgstr "" "Se ativo, habilita exibições de debug na lógica de área de transferência. " "Somente " "tem efeito quando ativado no início e pode ser desativado em tempo de " "compilação." msgid "If checked, enables the persistent history." msgstr "Se ativo, habilita o histórico persistente." msgid "" "If checked, places current clipboard entry at top of list. If not checked, " "history does not get sorted." msgstr "" "Se ativo, coloca a entrada de área de transferência atual no topo da lista. " "Se não, " "histórico não é organizado." msgid "If checked, puts the persistent history at the top of the history list." msgstr "" "Se ativo, coloca o histórico persistente no topo da lista de histórico." msgid "If checked, puts the persistent history in a new list." msgstr "Se ativo, coloca o histórico permanente em um nova lista." msgid "If checked, the current entry will be on the bottom instead of the top." msgstr "Se ativo, a entrada atual ficará no fundo em vez do topo." msgid "If checked, Use the clipboard, which is Ctrl-C, Ctrl-V" msgstr "Se ativo, usa a área de transferência, com Ctrl-C, Ctrl-V" msgid "" "If checked, Use the primary clipboard (mouse highlight-copy, middle mouse " "button paste)" msgstr "" "Se ativo, usa a área de transferência primária (realce com mouse-cópia, botão " "do meio cola)" msgid "If checked, use X, Y to position the history list" msgstr "Se ativo, usa X, Y para posicionar a lista de histórico" msgid "" "If checked, will display tabs with Right arrow (utf8,\\2192), newlines with " "pharagrph(\\204b), and spaces with square-u(\\2423)." msgstr "" "Se ativo, exibirá abas com a seta direita (utf8,\\2192), novas linhas com " "parágrafo(\\204b), e espaços com square-u(\\2423)." msgid "If checked, will emit the history entry via the keyboard entry." msgstr "Se ativo, emitirá a entrada do histórico via entrada de teclado." msgid "" "If checked, will ignore any clipboard additions that contain only whitespace." msgstr "" "Se ativo, ignorará qualquer adição à área de transferência que contiver " "somente espaço em branco." msgid "" "If checked, will keep both clipboards with the same content. If primary is " "pasted, then copy will have the same data." msgstr "" "Se ativo, manterá ambas áreas de transferência como o mesmo conteúdo. Se a " "primária for colada, então a cópia terá os mesmos dados." msgid "If checked, will replace newlines with spaces." msgstr "Se ativo, substituirá novas linhas por espaços." msgid "If checked, will restore clipboard entry on application exit." msgstr "" "Se ativo, recuperará a entrada da área de transferência na saída da aplicação." msgid "If checked, will trim whitespace from beginning and end of entry." msgstr "Se ativo, eliminará espaços em branco no início e fim da entrada." msgid "If checked, will use Ctrl-V paste." msgstr "Se ativo, usará Ctrl-v para colar." msgid "If checked, will use middle mouse to paste." msgstr "Se ativo, usará botão do meio do mouse para colar." msgid "If checked, will use xdotool to paste wherever the mouse is." msgstr "Se ativo, usará xdotool para colar onde o mouse estiver." msgid "Ignore Whitespace Only" msgstr "Ignora somente espaços em branco" msgid "Items" msgstr "" msgid "Items in history" msgstr "Itens no histórico" msgid "Key" msgstr "Tecla" msgid "Keyboard Input" msgstr "Entrada de teclado" msgid "Lightweight GTK+ clipboard manager." msgstr "Gerenciador de Área de Transferência em GTK+ leve." msgid "Max Data Size(MB)" msgstr "Tamanho máximo de dados (MB)" msgid "Maximum data size of entire history list" msgstr "Tamanho máximo de dados da lista inteira de histórico" msgid "Maximun number of cliboard entries to keep" msgstr "Número máximo de entradas na área de transferência para manter" msgid "Menu key combination" msgstr "Combinação de teclas do Menu" msgid "Middle" msgstr "Centro" msgid "Miscellaneous" msgstr "Vários" msgid "Mouse" msgstr "" msgid "Multiuser" msgstr "Multiusuário" msgid "Omit items in the:" msgstr "Omitir itens no:" msgid "Omitting" msgstr "Omitindo" msgid "Paste All Entry Delimiter" msgstr "Delimitador de entrada de colagem total" msgid "Persistent As Separate List" msgstr "Persistente como lista separada" msgid "Persistent History" msgstr "Histórico persistente" msgid "Persistent history key:" msgstr "Tecla de histórico persistente:" msgid "Persistent On Top" msgstr "Persistente no topo" msgid "Position history" msgstr "Posição do no histórico" msgid "Position in pixels from the top of the screen" msgstr "Posição em pixels a partir do topo da tela" msgid "Preferences" msgstr "Preferências" msgid "Print clipboard contents" msgstr "Imprimir conteúdo da área de transferência" msgid "Print primary contents" msgstr "Imprimir conteúdo primário" msgid "Remove" msgstr "Remover" msgid "Restore Empty" msgstr "Recuperar vazio" msgid "Run as daemon" msgstr "Executar como daemon" msgid "Save history" msgstr "Salvar histórico" msgid "" "Save History as a text file. Prepends xHIST_0000 to each entry. x is either " "P(persistent) or N (normal)" msgstr "" "Salvar histórico como um arquivo de texto. Precede xHIST_0000 em cada " "entrada. x pode " "ser P (persistente ou N (normal)" msgid "Save history to a file." msgstr "Salvar histórico em um arquivo." msgid "Search As You Type" msgstr "Buscar ao digitar" msgid "Show in a single line" msgstr "Exibir em uma única linha" msgid "Show in reverse order" msgstr "Exibir em ordem reversa" msgid "Character length of items" msgstr "Quantidade de caracteres dos itens" msgid "S_ynchronize clipboards" msgstr "S_incronizar áreas de transferência" msgid "This is the Action Name. \nDO NOT put commands here." msgstr "Isto é o Nome de Ação, \nNÃO coloque comandos aqui." msgid "" "This string will be inserted between each line of history for paste all." msgstr "" "Esta expressão será inserida entre cada linha do histórico para colagem total." msgid "Trim Newlines" msgstr "_Eliminar novas linhas" msgid "Trim Whitespace" msgstr "_Eliminar espaço em branco" msgid "Use Alt-E to edit, Alt-C to clear" msgstr "Alt-E para editar, Alt-C para limpar" msgid "Use _Copy (Ctrl-C)" msgstr "Usar _Cópia (Ctrl-C)" msgid "Use _Primary (Selection)" msgstr "Usar Seleção _Primária" msgid "Written by Gilberto \"Xyhthyx\" Miralla and Doug Springer.\nReport bugs to ." msgstr "" "Escrito por Gilberto \"Xyhthyx\" Miralla e Doug Springer.\nReportar bugs para ." msgid "X" msgstr "" msgid "Y" msgstr "" parcellite-1.2.1/po/remove-potcdate.sin0000644000175000017500000000066013041603201016160 0ustar hlehle# Sed script that remove the POT-Creation-Date line in the header entry # from a POT file. # # The distinction between the first and the following occurrences of the # pattern is achieved by looking at the hold space. /^"POT-Creation-Date: .*"$/{ x # Test if the hold space is empty. s/P/P/ ta # Yes it was empty. First occurrence. Remove the line. g d bb :a # The hold space was nonempty. Following occurrences. Do nothing. x :b } parcellite-1.2.1/po/POTFILES.in0000644000175000017500000000014713041603201014124 0ustar hlehlesrc/main.c src/utils.c src/preferences.c data/parcellite.desktop.in data/parcellite-startup.desktop.in parcellite-1.2.1/po/it.po0000644000175000017500000001355013041603201013325 0ustar hlehle# Italian translation of parcellite. # Copyright (C) 2008 Gilberto "Xyhthyx" Miralla # This file is distributed under the same license as the parcellite package. # Davide Truffa , 2008. # # msgid "" msgstr "" "Project-Id-Version: Parcellite\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-05-06 19:43-0400\n" "PO-Revision-Date: 2009-03-31 15:34+0100\n" "Last-Translator: Davide Truffa \n" "Language-Team: Italian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../src/main.c:184 msgid "Executing action..." msgstr "Sto eseguendo l'azione..." #: ../src/main.c:190 ../src/main.c:739 ../data/parcellite.desktop.in.h:1 #: ../data/parcellite-startup.desktop.in.h:1 msgid "Clipboard Manager" msgstr "Gestore degli appunti" #: ../src/main.c:213 msgid "Could not create thread for executed action\n" msgstr "Impossibile creare il processo per l'azione eseguita\n" #. Create the dialog #: ../src/main.c:243 msgid "Editing Clipboard" msgstr "Modifica Appunti" #: ../src/main.c:302 msgid "Clear the history?" msgstr "Cancellare la cronologia?" #: ../src/main.c:370 msgid "Lightweight GTK+ clipboard manager." msgstr "Gestore degli Appunti leggero in GTK+" #: ../src/main.c:457 msgid "None" msgstr "Nessuno" #. File contained no actions so adding empty #. File did not open so adding empty #. Nothing in history so adding empty #: ../src/main.c:478 ../src/main.c:507 ../src/main.c:623 msgid "Empty" msgstr "Vuoto" #. Edit actions #: ../src/main.c:514 msgid "_Edit actions" msgstr "_Modifica azioni" #. Edit clipboard #: ../src/main.c:538 msgid "_Edit Clipboard" msgstr "_Modifica Appunti" #: ../src/utils.c:38 ../src/utils.c:45 #, c-format msgid "Couldn't create directory: %s\n" msgstr "Impossibile creare la directory: %s\n" #: ../src/utils.c:84 msgid "Run as daemon" msgstr "Esegui come demone" #: ../src/utils.c:91 msgid "Do not use status icon (Ctrl-Alt-P for menu)" msgstr "Non usare l'icona di stato (Ctrl-Alt-P per il menù)" #: ../src/utils.c:98 msgid "Print clipboard contents" msgstr "Stampa contenuto degli appunti" #: ../src/utils.c:105 msgid "Print primary contents" msgstr "Stampa contenuto della selezione primaria" #: ../src/utils.c:117 msgid "" "Clipboard CLI usage examples:\n" "\n" " echo \"copied to clipboard\" | parcellite\n" " parcellite \"copied to clipboard\"\n" " echo \"copied to clipboard\" | parcellite -c" msgstr "" "Esempi d'uso degli Appunti da terminale:\n" "\n" " echo \"copiato negli appunti\" | parcellite\n" " parcellite \"copiato negli appunti\"\n" " echo \"copiato negli appunti\" | parcellite -o" #: ../src/utils.c:123 msgid "" "Written by Gilberto \"Xyhthyx\" Miralla.\n" "Report bugs to ." msgstr "" "Scritto da Gilberto \"Xyhthyx\" Miralla.\n" "Segnala i bug a ." #. Create the dialog #: ../src/preferences.c:375 msgid "Preferences" msgstr "Preferenze" #: ../src/preferences.c:390 msgid "Behavior" msgstr "Comportamento" #: ../src/preferences.c:398 msgid "Clipboards" msgstr "Appunti" #: ../src/preferences.c:405 msgid "Use _Copy (Ctrl-C)" msgstr "Usa _Copia (Ctrl-C)" #: ../src/preferences.c:407 msgid "Use _Primary (Selection)" msgstr "Usa Selezione _Primaria" #: ../src/preferences.c:409 msgid "S_ynchronize clipboards" msgstr "S_incronizza clipboard" #: ../src/preferences.c:417 msgid "History" msgstr "Cronologia" #: ../src/preferences.c:424 msgid "_Save history" msgstr "_Salva cronologia" #: ../src/preferences.c:425 msgid "Save and restore history between sessions" msgstr "Salva e ripristina cronologia fra le sessioni" #: ../src/preferences.c:429 msgid "Items in history:" msgstr "Elementi nella cronologia:" #: ../src/preferences.c:442 msgid "Miscellaneous" msgstr "Varie" #: ../src/preferences.c:449 msgid "Capture _hyperlinks only" msgstr "Cattura solo _Hyperlink" #: ../src/preferences.c:451 msgid "C_onfirm before clearing history" msgstr "C_onferma prima di cancellare la cronologia" #: ../src/preferences.c:458 msgid "Display" msgstr "Visualizza" #: ../src/preferences.c:466 msgid "Items" msgstr "Elementi" #: ../src/preferences.c:473 msgid "Show in a _single line" msgstr "Mostra su una _singola riga" #: ../src/preferences.c:475 msgid "Show in _reverse order" msgstr "Mostra in ordine _inverso" #: ../src/preferences.c:479 msgid "Character length of items:" msgstr "Lunghezza degli elementi (caratteri):" #: ../src/preferences.c:492 msgid "Omitting" msgstr "Omettere" #: ../src/preferences.c:501 msgid "Omit items in the:" msgstr "Ometti elementi nella seguente posizione:" #: ../src/preferences.c:505 msgid "Beginning" msgstr "Inizio" #: ../src/preferences.c:506 msgid "Middle" msgstr "Centro" #: ../src/preferences.c:507 msgid "End" msgstr "Fine" #: ../src/preferences.c:514 msgid "Actions" msgstr "Azioni" #. Build the actions label #: ../src/preferences.c:519 msgid "Control-click Parcellite's tray icon to use actions" msgstr "Control-click sull'icona della tray per usare le azioni" #: ../src/preferences.c:539 msgid "Action" msgstr "Azione" #: ../src/preferences.c:546 msgid "Command" msgstr "Comando" #: ../src/preferences.c:561 msgid "Add..." msgstr "Aggiungi..." #: ../src/preferences.c:565 msgid "Remove" msgstr "Rimuovi" #: ../src/preferences.c:582 msgid "Hotkeys" msgstr "Scorciatoie da tastiera" #: ../src/preferences.c:590 msgid "Hotkeys" msgstr "Scorciatoie da tastiera" #: ../src/preferences.c:599 msgid "History key combination:" msgstr "Combinazione tasti Cronologia:" #: ../src/preferences.c:607 msgid "Actions key combination:" msgstr "Combinazione tasti Azioni:" #: ../src/preferences.c:615 msgid "Menu key combination:" msgstr "Combinazione tasti Menù:" #: ../data/parcellite.desktop.in.h:2 ../data/parcellite-startup.desktop.in.h:2 msgid "Parcellite" msgstr "Parcellite" parcellite-1.2.1/install-sh0000755000175000017500000002202113041603201013730 0ustar hlehle#!/bin/sh # install - install a program, script, or datafile scriptversion=2005-05-14.22 # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. It can only install one file at a time, a restriction # shared with many OS's install programs. # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit="${DOITPROG-}" # put in absolute paths if you don't have them in your path; or use env. vars. mvprog="${MVPROG-mv}" cpprog="${CPPROG-cp}" chmodprog="${CHMODPROG-chmod}" chownprog="${CHOWNPROG-chown}" chgrpprog="${CHGRPPROG-chgrp}" stripprog="${STRIPPROG-strip}" rmprog="${RMPROG-rm}" mkdirprog="${MKDIRPROG-mkdir}" chmodcmd="$chmodprog 0755" chowncmd= chgrpcmd= stripcmd= rmcmd="$rmprog -f" mvcmd="$mvprog" src= dst= dir_arg= dstarg= no_target_directory= usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: -c (ignored) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. --help display this help and exit. --version display version info and exit. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test -n "$1"; do case $1 in -c) shift continue;; -d) dir_arg=true shift continue;; -g) chgrpcmd="$chgrpprog $2" shift shift continue;; --help) echo "$usage"; exit $?;; -m) chmodcmd="$chmodprog $2" shift shift continue;; -o) chowncmd="$chownprog $2" shift shift continue;; -s) stripcmd=$stripprog shift continue;; -t) dstarg=$2 shift shift continue;; -T) no_target_directory=true shift continue;; --version) echo "$0 $scriptversion"; exit $?;; *) # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. test -n "$dir_arg$dstarg" && break # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dstarg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dstarg" shift # fnord fi shift # arg dstarg=$arg done break;; esac done if test -z "$1"; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call `install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi for src do # Protect names starting with `-'. case $src in -*) src=./$src ;; esac if test -n "$dir_arg"; then dst=$src src= if test -d "$dst"; then mkdircmd=: chmodcmd= else mkdircmd=$mkdirprog fi else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dstarg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dstarg # Protect names starting with `-'. case $dst in -*) dst=./$dst ;; esac # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dstarg: Is a directory" >&2 exit 1 fi dst=$dst/`basename "$src"` fi fi # This sed command emulates the dirname command. dstdir=`echo "$dst" | sed -e 's,/*$,,;s,[^/]*$,,;s,/*$,,;s,^$,.,'` # Make sure that the destination directory exists. # Skip lots of stat calls in the usual case. if test ! -d "$dstdir"; then defaultIFS=' ' IFS="${IFS-$defaultIFS}" oIFS=$IFS # Some sh's can't handle IFS=/ for some reason. IFS='%' set x `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'` shift IFS=$oIFS pathcomp= while test $# -ne 0 ; do pathcomp=$pathcomp$1 shift if test ! -d "$pathcomp"; then $mkdirprog "$pathcomp" # mkdir can fail with a `File exist' error in case several # install-sh are creating the directory concurrently. This # is OK. test -d "$pathcomp" || exit fi pathcomp=$pathcomp/ done fi if test -n "$dir_arg"; then $doit $mkdircmd "$dst" \ && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \ && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \ && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \ && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; } else dstfile=`basename "$dst"` # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 trap '(exit $?); exit' 1 2 13 15 # Copy the file name to the temp name. $doit $cpprog "$src" "$dsttmp" && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \ && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \ && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \ && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } && # Now rename the file to the real destination. { $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \ || { # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { if test -f "$dstdir/$dstfile"; then $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \ || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \ || { echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2 (exit 1); exit 1 } else : fi } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dstdir/$dstfile" } } fi || { (exit 1); exit 1; } done # The final little trick to "correctly" pass the exit status to the exit trap. { (exit 0); exit 0 } # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: parcellite-1.2.1/depcomp0000755000175000017500000003710013041603201013305 0ustar hlehle#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2005-07-09.11 # Copyright (C) 1999, 2000, 2003, 2004, 2005 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try \`$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by `PROGRAMS ARGS'. object Object file output by `PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputing dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ## The second -e expression handles DOS-style file names with drive letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the `deleted header file' problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. tr ' ' ' ' < "$tmpdepfile" | ## Some versions of gcc put a space before the `:'. On the theory ## that the space means something, we add a space to the output as ## well. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like `#:fec' to the end of the # dependency line. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ tr ' ' ' ' >> $depfile echo >> $depfile # The second pass generates a dummy entry for each header file. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> $depfile else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts `$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. stripped=`echo "$object" | sed 's/\(.*\)\..*$/\1/'` tmpdepfile="$stripped.u" if test "$libtool" = yes; then "$@" -Wc,-M else "$@" -M fi stat=$? if test -f "$tmpdepfile"; then : else stripped=`echo "$stripped" | sed 's,^.*/,,'` tmpdepfile="$stripped.u" fi if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi if test -f "$tmpdepfile"; then outname="$stripped.o" # Each line is of the form `foo.o: dependent.h'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile" sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; icc) # Intel's C compiler understands `-MD -MF file'. However on # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c # ICC 7.0 will fill foo.d with something like # foo.o: sub/foo.c # foo.o: sub/foo.h # which is wrong. We want: # sub/foo.o: sub/foo.c # sub/foo.o: sub/foo.h # sub/foo.c: # sub/foo.h: # ICC 7.1 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using \ : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in `foo.d' instead, so we check for that too. # Subdirectories are respected. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then # With Tru64 cc, shared objects can also be used to make a # static library. This mecanism is used in libtool 1.4 series to # handle both shared and static libraries in a single compilation. # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. # # With libtool 1.5 this exception was removed, and libtool now # generates 2 separate objects for the 2 libraries. These two # compilations output dependencies in in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 tmpdepfile2=$dir$base.o.d # libtool 1.5 tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.o.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d tmpdepfile4=$dir$base.d "$@" -MD fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" # That's a tab and a space in the []. sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for `:' # in the target name. This is to cope with DOS-style filenames: # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. "$@" $dashmflag | sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" tr ' ' ' ' < "$tmpdepfile" | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # X makedepend shift cleared=no for arg in "$@"; do case $cleared in no) set ""; shift cleared=yes ;; esac case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix="`echo $object | sed 's/^.*\././'`" touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" sed '1,2d' "$tmpdepfile" | tr ' ' ' ' | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o, # because we must use -o when running libtool. "$@" || exit $? IFS=" " for arg do case "$arg" in "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" echo " " >> "$depfile" . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: parcellite-1.2.1/configure.ac0000644000175000017500000001121213041603201014212 0ustar hlehle# ------------------------------------------------------------------------------- # Autoconf/automake. # ------------------------------------------------------------------------------- AC_PREREQ([2.5]) AC_INIT([parcellite], m4_esyscmd([./scmversion.sh | tr -d '\n']), [gpib@rickyrockrat.net]) # AC_INIT([parcellite], [lollygag], [gpib@rickyrockrat.com]) AM_INIT_AUTOMAKE([AC_PACKAGE_TARNAME()], [AC_PACKAGE_VERSION()]) AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_SRCDIR([src/main.c]) AM_CONFIG_HEADER([config.h]) # ------------------------------------------------------------------------------- # Gettext. # ------------------------------------------------------------------------------- GETTEXT_PACKAGE=parcellite AC_SUBST(GETTEXT_PACKAGE) AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE", [gettext package]) ALL_LINGUAS="ca cs da de es fr hu it ja nb pl pl_PL pt_BR ro ru sv tr zh_CN" AM_GLIB_GNU_GETTEXT() AC_PROG_INTLTOOL([0.23]) parcellitelocaledir='${prefix}/${DATADIRNAME}/locale' AC_SUBST(parcellitelocaledir) AM_GNU_GETTEXT([external]) # ------------------------------------------------------------------------------- # Main settings. # ------------------------------------------------------------------------------- # prefix=/usr # ------------------------------------------------------------------------------- # Checks for programs. # ------------------------------------------------------------------------------- AC_PROG_CC() AC_PROG_INSTALL() AC_PROG_MAKE_SET() AC_CHECK_FUNCS([memset]) PKG_PROG_PKG_CONFIG(0.20) # ------------------------------------------------------------------------------- # Application indicator. # ------------------------------------------------------------------------------- APPINDICATOR_REQUIRED_VERSION=0.2.4 APPIND_LIB=appindicator-0.1 AC_ARG_ENABLE([appindicator], AS_HELP_STRING([--enable-appindicator[=@<:@no/yes@:>@]],[Build support for application indicators]), [enable_appindicator=$enableval], [enable_appindicator="yes"]) have_appindicator=no if test "x$enable_appindicator" = "xyes" ; then # PKG_CHECK_MODULES completly broken on my system. echo -n "checking for $APPIND_LIB... " if `$PKG_CONFIG --exists $APPIND_LIB` ; then if `$PKG_CONFIG --atleast-version=$APPINDICATOR_REQUIRED_VERSION $APPIND_LIB` ; then have_appindicator=yes PKG_CHECK_MODULES([APPINDICATOR], [$APPIND_LIB]) echo "yes" else echo "no" fi else echo "no" fi # PKG_CHECK_MODULES(APPINDICATOR,[appindicator-0.1>=9.9.9],[have_appindicator=yes],[have_appindicator=no]) fi #echo "have_appindicator=$have_appindicator" #echo "pkgcfg=$PKG_CONFIG" AM_CONDITIONAL(HAVE_APPINDICATOR, test x$enable_appindicator = xyes) if test "x$have_appindicator" = "xyes" ; then AC_DEFINE(HAVE_APPINDICATOR, 1, [ Have appindicator]) AC_SUBST(APPINDICATOR_CFLAGS) AC_SUBST(APPINDICATOR_LIBS) fi AC_SUBST(X11_LIBS, -lX11) # ------------------------------------------------------------------------------- # Checks for libraries. # ------------------------------------------------------------------------------- # AC_CHECK_LIB(pthread, pthread_create) pkg_modules="gtk+-2.0 >= 2.10.0" PKG_CHECK_MODULES([GTK], [$pkg_modules]) #keep pkg-config from being called GTK_LIBS=`$PKG_CONFIG --libs gtk+-2.0|sed 's/.* \(-lgtk-[[^ ]]*\) .*/\1/'` gtk_libs=`echo "$GTK_LIBS"|sed 's/-l//'` #gtk_libs=`$PKG_CONFIG --libs gtk+-2.0|sed 's/.* -l\(gtk-[[^ ]]*\) .*/\1/'` #echo "gtk_libs = '$gtk_libs'" AC_CHECK_LIB([$gtk_libs],gtk_status_icon_new,[],AC_MSG_ERROR(Requirement not met: gtk >= 2.10.0)) #AM_PATH_GTK_2_0(2.10.0, [], AC_MSG_ERROR(Requirement not met: gtk >= 2.10.0)) #AM_PATH_GLIB_2_0(2.14.0, [], AC_MSG_ERROR(Requirement not met: glib >= 2.14.0)) #GTK_CFLAGS=`$PKG_CONFIG $pkg_config_args --cflags` #GTK_LIBS=`$PKG_CONFIG $pkg_config_args --libs|sed 's!.*\(-lgtk-[^ ]*\) .*!\1!'` # ------------------------------------------------------------------------------- # Checks for header files. # ------------------------------------------------------------------------------- AC_CHECK_HEADERS([stdlib.h string.h pthread.h libintl.h]) # ------------------------------------------------------------------------------- # Checks for typedefs, structures, and compiler characteristics. # ------------------------------------------------------------------------------- AC_C_CONST() AC_C_INLINE() AC_TYPE_SIZE_T() AC_PATH_X() # ------------------------------------------------------------------------------- # Checks for library functions. # ------------------------------------------------------------------------------- AC_TYPE_SIGNAL() AC_CONFIG_FILES([Makefile doc/Makefile src/Makefile data/Makefile]) AC_OUTPUT([po/Makefile.in]) parcellite-1.2.1/deb/0000755000175000017500000000000013041603201012461 5ustar hlehleparcellite-1.2.1/deb/control0000644000175000017500000000172113041603201014065 0ustar hlehleSource: parcellite Section: misc Priority: optional Maintainer: Doug Springer Build-Depends: debhelper (>= 5.0.51~), autotools-dev, intltool, libgtk2.0-dev, pkg-config, dh-make Standards-Version: 3.8.4 Homepage: http://parcellite.sourceforge.net/ #Vcs-Git: git://git.debian.org/collab-maint/parcellite.git #Vcs-Browser: http://git.debian.org/?p=collab-maint/parcellite.git;a=summary Package: parcellite Architecture: ADD_ARCH_HERE Depends: libc6 (>= 2.2), libglib2.0-0 (>= 2.14.0), libgtk2.0-0 (>= 2.10.0), libx11-6 (>= 0) Description: lightweight GTK+ clipboard manager Parcellite is a stripped down, basic-features-only clipboard manager with a small memory footprint for those who like simplicity. . Features: . * Keeps a clipboard history. * Various view options to display items the way you like it. * Daemon mode; guard your clipboard contents when you close applications. * Perform custom commands using clipboard contents. parcellite-1.2.1/deb/copyright0000644000175000017500000000220213041603201014410 0ustar hlehleThis work was packaged for Debian by: Doug Springer on Tue, 08 Mar 2011 10:21:05 -0700 It was downloaded from: http://parcellite.sourceforge.net/ Upstream Author(s): Doug Springer Copyright: Copyright (C) 2010-2013 Doug Springer Copyright (C) 2007, 2008 Gilberto "Xyhthyx" Miralla License: This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . The Debian packaging is: Copyright (C) 2011 Doug Springer and is licensed under the GPL version 3, see "/usr/share/common-licenses/GPL-3". parcellite-1.2.1/NEWS0000644000175000017500000000006413041603201012426 0ustar hlehleProject website: http://parcellite.sourceforge.net/ parcellite-1.2.1/intltool-merge0000755000175000017500000011474113041603201014626 0ustar hlehle#!/usr/bin/perl -w # -*- Mode: perl; indent-tabs-mode: nil; c-basic-offset: 4 -*- # # The Intltool Message Merger # # Copyright (C) 2000, 2003 Free Software Foundation. # Copyright (C) 2000, 2001 Eazel, Inc # # Intltool is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # version 2 published by the Free Software Foundation. # # Intltool is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # # Authors: Maciej Stachowiak # Kenneth Christiansen # Darin Adler # # Proper XML UTF-8'ification written by Cyrille Chepelov # ## Release information my $PROGRAM = "intltool-merge"; my $PACKAGE = "intltool"; my $VERSION = "0.37.1"; ## Loaded modules use strict; use Getopt::Long; use Text::Wrap; use File::Basename; my $must_end_tag = -1; my $last_depth = -1; my $translation_depth = -1; my @tag_stack = (); my @entered_tag = (); my @translation_strings = (); my $leading_space = ""; ## Scalars used by the option stuff my $HELP_ARG = 0; my $VERSION_ARG = 0; my $BA_STYLE_ARG = 0; my $XML_STYLE_ARG = 0; my $KEYS_STYLE_ARG = 0; my $DESKTOP_STYLE_ARG = 0; my $SCHEMAS_STYLE_ARG = 0; my $RFC822DEB_STYLE_ARG = 0; my $QUOTED_STYLE_ARG = 0; my $QUOTEDXML_STYLE_ARG = 0; my $QUIET_ARG = 0; my $PASS_THROUGH_ARG = 0; my $UTF8_ARG = 0; my $MULTIPLE_OUTPUT = 0; my $cache_file; ## Handle options GetOptions ( "help" => \$HELP_ARG, "version" => \$VERSION_ARG, "quiet|q" => \$QUIET_ARG, "oaf-style|o" => \$BA_STYLE_ARG, ## for compatibility "ba-style|b" => \$BA_STYLE_ARG, "xml-style|x" => \$XML_STYLE_ARG, "keys-style|k" => \$KEYS_STYLE_ARG, "desktop-style|d" => \$DESKTOP_STYLE_ARG, "schemas-style|s" => \$SCHEMAS_STYLE_ARG, "rfc822deb-style|r" => \$RFC822DEB_STYLE_ARG, "quoted-style" => \$QUOTED_STYLE_ARG, "quotedxml-style" => \$QUOTEDXML_STYLE_ARG, "pass-through|p" => \$PASS_THROUGH_ARG, "utf8|u" => \$UTF8_ARG, "multiple-output|m" => \$MULTIPLE_OUTPUT, "cache|c=s" => \$cache_file ) or &error; my $PO_DIR; my $FILE; my $OUTFILE; my %po_files_by_lang = (); my %translations = (); my $iconv = $ENV{"ICONV"} || "iconv"; my $devnull = ($^O eq 'MSWin32' ? 'NUL:' : '/dev/null'); sub isProgramInPath { my ($file) = @_; # If either a file exists, or when run it returns 0 exit status return 1 if ((-x $file) or (system("$file -l >$devnull") == 0)); return 0; } if (! isProgramInPath ("$iconv")) { print STDERR " *** iconv is not found on this system!\n". " *** Without it, intltool-merge can not convert encodings.\n"; exit; } # Use this instead of \w for XML files to handle more possible characters. my $w = "[-A-Za-z0-9._:]"; # XML quoted string contents my $q = "[^\\\"]*"; ## Check for options. if ($VERSION_ARG) { &print_version; } elsif ($HELP_ARG) { &print_help; } elsif ($BA_STYLE_ARG && @ARGV > 2) { &utf8_sanity_check; &preparation; &print_message; &ba_merge_translations; &finalize; } elsif ($XML_STYLE_ARG && @ARGV > 2) { &utf8_sanity_check; &preparation; &print_message; &xml_merge_output; &finalize; } elsif ($KEYS_STYLE_ARG && @ARGV > 2) { &utf8_sanity_check; &preparation; &print_message; &keys_merge_translations; &finalize; } elsif ($DESKTOP_STYLE_ARG && @ARGV > 2) { &utf8_sanity_check; &preparation; &print_message; &desktop_merge_translations; &finalize; } elsif ($SCHEMAS_STYLE_ARG && @ARGV > 2) { &utf8_sanity_check; &preparation; &print_message; &schemas_merge_translations; &finalize; } elsif ($RFC822DEB_STYLE_ARG && @ARGV > 2) { &preparation; &print_message; &rfc822deb_merge_translations; &finalize; } elsif (($QUOTED_STYLE_ARG || $QUOTEDXML_STYLE_ARG) && @ARGV > 2) { &utf8_sanity_check; &preparation; &print_message; "ed_merge_translations($QUOTEDXML_STYLE_ARG); &finalize; } else { &print_help; } exit; ## Sub for printing release information sub print_version { print <<_EOF_; ${PROGRAM} (${PACKAGE}) ${VERSION} Written by Maciej Stachowiak, Darin Adler and Kenneth Christiansen. Copyright (C) 2000-2003 Free Software Foundation, Inc. Copyright (C) 2000-2001 Eazel, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. _EOF_ exit; } ## Sub for printing usage information sub print_help { print <<_EOF_; Usage: ${PROGRAM} [OPTION]... PO_DIRECTORY FILENAME OUTPUT_FILE Generates an output file that includes some localized attributes from an untranslated source file. Mandatory options: (exactly one must be specified) -b, --ba-style includes translations in the bonobo-activation style -d, --desktop-style includes translations in the desktop style -k, --keys-style includes translations in the keys style -s, --schemas-style includes translations in the schemas style -r, --rfc822deb-style includes translations in the RFC822 style --quoted-style includes translations in the quoted string style --quotedxml-style includes translations in the quoted xml string style -x, --xml-style includes translations in the standard xml style Other options: -u, --utf8 convert all strings to UTF-8 before merging (default for everything except RFC822 style) -p, --pass-through deprecated, does nothing and issues a warning -m, --multiple-output output one localized file per locale, instead of a single file containing all localized elements -c, --cache=FILE specify cache file name (usually \$top_builddir/po/.intltool-merge-cache) -q, --quiet suppress most messages --help display this help and exit --version output version information and exit Report bugs to http://bugzilla.gnome.org/ (product name "$PACKAGE") or send email to . _EOF_ exit; } ## Sub for printing error messages sub print_error { print STDERR "Try `${PROGRAM} --help' for more information.\n"; exit; } sub print_message { print "Merging translations into $OUTFILE.\n" unless $QUIET_ARG; } sub preparation { $PO_DIR = $ARGV[0]; $FILE = $ARGV[1]; $OUTFILE = $ARGV[2]; &gather_po_files; &get_translation_database; } # General-purpose code for looking up translations in .po files sub po_file2lang { my ($tmp) = @_; $tmp =~ s/^.*\/(.*)\.po$/$1/; return $tmp; } sub gather_po_files { if (my $linguas = $ENV{"LINGUAS"}) { for my $lang (split / /, $linguas) { my $po_file = $PO_DIR . "/" . $lang . ".po"; if (-e $po_file) { $po_files_by_lang{$lang} = $po_file; } } } else { if (open LINGUAS_FILE, "$PO_DIR/LINGUAS") { while () { next if /^#/; for my $lang (split) { chomp ($lang); my $po_file = $PO_DIR . "/" . $lang . ".po"; if (-e $po_file) { $po_files_by_lang{$lang} = $po_file; } } } close LINGUAS_FILE; } else { for my $po_file (glob "$PO_DIR/*.po") { $po_files_by_lang{po_file2lang($po_file)} = $po_file; } } } } sub get_local_charset { my ($encoding) = @_; my $alias_file = $ENV{"G_CHARSET_ALIAS"} || "/usr/local/lib/charset.alias"; # seek character encoding aliases in charset.alias (glib) if (open CHARSET_ALIAS, $alias_file) { while () { next if /^\#/; return $1 if (/^\s*([-._a-zA-Z0-9]+)\s+$encoding\b/i) } close CHARSET_ALIAS; } # if not found, return input string return $encoding; } sub get_po_encoding { my ($in_po_file) = @_; my $encoding = ""; open IN_PO_FILE, $in_po_file or die; while () { ## example: "Content-Type: text/plain; charset=ISO-8859-1\n" if (/Content-Type\:.*charset=([-a-zA-Z0-9]+)\\n/) { $encoding = $1; last; } } close IN_PO_FILE; if (!$encoding) { print STDERR "Warning: no encoding found in $in_po_file. Assuming ISO-8859-1\n" unless $QUIET_ARG; $encoding = "ISO-8859-1"; } system ("$iconv -f $encoding -t UTF-8 <$devnull 2>$devnull"); if ($?) { $encoding = get_local_charset($encoding); } return $encoding } sub utf8_sanity_check { print STDERR "Warning: option --pass-through has been removed.\n" if $PASS_THROUGH_ARG; $UTF8_ARG = 1; } sub get_translation_database { if ($cache_file) { &get_cached_translation_database; } else { &create_translation_database; } } sub get_newest_po_age { my $newest_age; foreach my $file (values %po_files_by_lang) { my $file_age = -M $file; $newest_age = $file_age if !$newest_age || $file_age < $newest_age; } $newest_age = 0 if !$newest_age; return $newest_age; } sub create_cache { print "Generating and caching the translation database\n" unless $QUIET_ARG; &create_translation_database; open CACHE, ">$cache_file" || die; print CACHE join "\x01", %translations; close CACHE; } sub load_cache { print "Found cached translation database\n" unless $QUIET_ARG; my $contents; open CACHE, "<$cache_file" || die; { local $/; $contents = ; } close CACHE; %translations = split "\x01", $contents; } sub get_cached_translation_database { my $cache_file_age = -M $cache_file; if (defined $cache_file_age) { if ($cache_file_age <= &get_newest_po_age) { &load_cache; return; } print "Found too-old cached translation database\n" unless $QUIET_ARG; } &create_cache; } sub create_translation_database { for my $lang (keys %po_files_by_lang) { my $po_file = $po_files_by_lang{$lang}; if ($UTF8_ARG) { my $encoding = get_po_encoding ($po_file); if (lc $encoding eq "utf-8") { open PO_FILE, "<$po_file"; } else { print "NOTICE: $po_file is not in UTF-8 but $encoding, converting...\n" unless $QUIET_ARG;; open PO_FILE, "$iconv -f $encoding -t UTF-8 $po_file|"; } } else { open PO_FILE, "<$po_file"; } my $nextfuzzy = 0; my $inmsgid = 0; my $inmsgstr = 0; my $msgid = ""; my $msgstr = ""; while () { $nextfuzzy = 1 if /^#, fuzzy/; if (/^msgid "((\\.|[^\\]+)*)"/ ) { $translations{$lang, $msgid} = $msgstr if $inmsgstr && $msgid && $msgstr; $msgid = ""; $msgstr = ""; if ($nextfuzzy) { $inmsgid = 0; } else { $msgid = unescape_po_string($1); $inmsgid = 1; } $inmsgstr = 0; $nextfuzzy = 0; } if (/^msgstr "((\\.|[^\\]+)*)"/) { $msgstr = unescape_po_string($1); $inmsgstr = 1; $inmsgid = 0; } if (/^"((\\.|[^\\]+)*)"/) { $msgid .= unescape_po_string($1) if $inmsgid; $msgstr .= unescape_po_string($1) if $inmsgstr; } } $translations{$lang, $msgid} = $msgstr if $inmsgstr && $msgid && $msgstr; } } sub finalize { } sub unescape_one_sequence { my ($sequence) = @_; return "\\" if $sequence eq "\\\\"; return "\"" if $sequence eq "\\\""; return "\n" if $sequence eq "\\n"; return "\r" if $sequence eq "\\r"; return "\t" if $sequence eq "\\t"; return "\b" if $sequence eq "\\b"; return "\f" if $sequence eq "\\f"; return "\a" if $sequence eq "\\a"; return chr(11) if $sequence eq "\\v"; # vertical tab, see ascii(7) return chr(hex($1)) if ($sequence =~ /\\x([0-9a-fA-F]{2})/); return chr(oct($1)) if ($sequence =~ /\\([0-7]{3})/); # FIXME: Is \0 supported as well? Kenneth and Rodney don't want it, see bug #48489 return $sequence; } sub unescape_po_string { my ($string) = @_; $string =~ s/(\\x[0-9a-fA-F]{2}|\\[0-7]{3}|\\.)/unescape_one_sequence($1)/eg; return $string; } sub entity_decode { local ($_) = @_; s/'/'/g; # ' s/"/"/g; # " s/<//g; s/&/&/g; return $_; } # entity_encode: (string) # # Encode the given string to XML format (encode '<' etc). sub entity_encode { my ($pre_encoded) = @_; my @list_of_chars = unpack ('C*', $pre_encoded); # with UTF-8 we only encode minimalistic return join ('', map (&entity_encode_int_minimalist, @list_of_chars)); } sub entity_encode_int_minimalist { return """ if $_ == 34; return "&" if $_ == 38; return "'" if $_ == 39; return "<" if $_ == 60; return ">" if $_ == 62; return chr $_; } sub entity_encoded_translation { my ($lang, $string) = @_; my $translation = $translations{$lang, $string}; return $string if !$translation; return entity_encode ($translation); } ## XML (bonobo-activation specific) merge code sub ba_merge_translations { my $source; { local $/; # slurp mode open INPUT, "<$FILE" or die "can't open $FILE: $!"; $source = ; close INPUT; } open OUTPUT, ">$OUTFILE" or die "can't open $OUTFILE: $!"; # Binmode so that selftest works ok if using a native Win32 Perl... binmode (OUTPUT) if $^O eq 'MSWin32'; while ($source =~ s|^(.*?)([ \t]*<\s*$w+\s+($w+\s*=\s*"$q"\s*)+/?>)([ \t]*\n)?||s) { print OUTPUT $1; my $node = $2 . "\n"; my @strings = (); $_ = $node; while (s/(\s)_($w+\s*=\s*"($q)")/$1$2/s) { push @strings, entity_decode($3); } print OUTPUT; my %langs; for my $string (@strings) { for my $lang (keys %po_files_by_lang) { $langs{$lang} = 1 if $translations{$lang, $string}; } } for my $lang (sort keys %langs) { $_ = $node; s/(\sname\s*=\s*)"($q)"/$1"$2-$lang"/s; s/(\s)_($w+\s*=\s*")($q)"/$1 . $2 . entity_encoded_translation($lang, $3) . '"'/seg; print OUTPUT; } } print OUTPUT $source; close OUTPUT; } ## XML (non-bonobo-activation) merge code # Process tag attributes # Only parameter is a HASH containing attributes -> values mapping sub getAttributeString { my $sub = shift; my $do_translate = shift || 0; my $language = shift || ""; my $result = ""; my $translate = shift; foreach my $e (reverse(sort(keys %{ $sub }))) { my $key = $e; my $string = $sub->{$e}; my $quote = '"'; $string =~ s/^[\s]+//; $string =~ s/[\s]+$//; if ($string =~ /^'.*'$/) { $quote = "'"; } $string =~ s/^['"]//g; $string =~ s/['"]$//g; if ($do_translate && $key =~ /^_/) { $key =~ s|^_||g; if ($language) { # Handle translation my $decode_string = entity_decode($string); my $translation = $translations{$language, $decode_string}; if ($translation) { $translation = entity_encode($translation); $string = $translation; } $$translate = 2; } else { $$translate = 2 if ($translate && (!$$translate)); # watch not to "overwrite" $translate } } $result .= " $key=$quote$string$quote"; } return $result; } # Returns a translatable string from XML node, it works on contents of every node in XML::Parser tree sub getXMLstring { my $ref = shift; my $spacepreserve = shift || 0; my @list = @{ $ref }; my $result = ""; my $count = scalar(@list); my $attrs = $list[0]; my $index = 1; $spacepreserve = 1 if ((exists $attrs->{"xml:space"}) && ($attrs->{"xml:space"} =~ /^["']?preserve["']?$/)); $spacepreserve = 0 if ((exists $attrs->{"xml:space"}) && ($attrs->{"xml:space"} =~ /^["']?default["']?$/)); while ($index < $count) { my $type = $list[$index]; my $content = $list[$index+1]; if (! $type ) { # We've got CDATA if ($content) { # lets strip the whitespace here, and *ONLY* here $content =~ s/\s+/ /gs if (!$spacepreserve); $result .= $content; } } elsif ( "$type" ne "1" ) { # We've got another element $result .= "<$type"; $result .= getAttributeString(@{$content}[0], 0); # no nested translatable elements if ($content) { my $subresult = getXMLstring($content, $spacepreserve); if ($subresult) { $result .= ">".$subresult . ""; } else { $result .= "/>"; } } else { $result .= "/>"; } } $index += 2; } return $result; } # Translate list of nodes if necessary sub translate_subnodes { my $fh = shift; my $content = shift; my $language = shift || ""; my $singlelang = shift || 0; my $spacepreserve = shift || 0; my @nodes = @{ $content }; my $count = scalar(@nodes); my $index = 0; while ($index < $count) { my $type = $nodes[$index]; my $rest = $nodes[$index+1]; if ($singlelang) { my $oldMO = $MULTIPLE_OUTPUT; $MULTIPLE_OUTPUT = 1; traverse($fh, $type, $rest, $language, $spacepreserve); $MULTIPLE_OUTPUT = $oldMO; } else { traverse($fh, $type, $rest, $language, $spacepreserve); } $index += 2; } } sub isWellFormedXmlFragment { my $ret = eval 'require XML::Parser'; if(!$ret) { die "You must have XML::Parser installed to run $0\n\n"; } my $fragment = shift; return 0 if (!$fragment); $fragment = "$fragment"; my $xp = new XML::Parser(Style => 'Tree'); my $tree = 0; eval { $tree = $xp->parse($fragment); }; return $tree; } sub traverse { my $fh = shift; my $nodename = shift; my $content = shift; my $language = shift || ""; my $spacepreserve = shift || 0; if (!$nodename) { if ($content =~ /^[\s]*$/) { $leading_space .= $content; } print $fh $content; } else { # element my @all = @{ $content }; my $attrs = shift @all; my $translate = 0; my $outattr = getAttributeString($attrs, 1, $language, \$translate); if ($nodename =~ /^_/) { $translate = 1; $nodename =~ s/^_//; } my $lookup = ''; $spacepreserve = 0 if ((exists $attrs->{"xml:space"}) && ($attrs->{"xml:space"} =~ /^["']?default["']?$/)); $spacepreserve = 1 if ((exists $attrs->{"xml:space"}) && ($attrs->{"xml:space"} =~ /^["']?preserve["']?$/)); print $fh "<$nodename", $outattr; if ($translate) { $lookup = getXMLstring($content, $spacepreserve); if (!$spacepreserve) { $lookup =~ s/^\s+//s; $lookup =~ s/\s+$//s; } if ($lookup || $translate == 2) { my $translation = $translations{$language, $lookup} if isWellFormedXmlFragment($translations{$language, $lookup}); if ($MULTIPLE_OUTPUT && ($translation || $translate == 2)) { $translation = $lookup if (!$translation); print $fh " xml:lang=\"", $language, "\"" if $language; print $fh ">"; if ($translate == 2) { translate_subnodes($fh, \@all, $language, 1, $spacepreserve); } else { print $fh $translation; } print $fh ""; return; # this means there will be no same translation with xml:lang="$language"... # if we want them both, just remove this "return" } else { print $fh ">"; if ($translate == 2) { translate_subnodes($fh, \@all, $language, 1, $spacepreserve); } else { print $fh $lookup; } print $fh ""; } } else { print $fh "/>"; } for my $lang (sort keys %po_files_by_lang) { if ($MULTIPLE_OUTPUT && $lang ne "$language") { next; } if ($lang) { # Handle translation # my $translate = 0; my $localattrs = getAttributeString($attrs, 1, $lang, \$translate); my $translation = $translations{$lang, $lookup} if isWellFormedXmlFragment($translations{$lang, $lookup}); if ($translate && !$translation) { $translation = $lookup; } if ($translation || $translate) { print $fh "\n"; $leading_space =~ s/.*\n//g; print $fh $leading_space; print $fh "<", $nodename, " xml:lang=\"", $lang, "\"", $localattrs, ">"; if ($translate == 2) { translate_subnodes($fh, \@all, $lang, 1, $spacepreserve); } else { print $fh $translation; } print $fh ""; } } } } else { my $count = scalar(@all); if ($count > 0) { print $fh ">"; my $index = 0; while ($index < $count) { my $type = $all[$index]; my $rest = $all[$index+1]; traverse($fh, $type, $rest, $language, $spacepreserve); $index += 2; } print $fh ""; } else { print $fh "/>"; } } } } sub intltool_tree_comment { my $expat = shift; my $data = shift; my $clist = $expat->{Curlist}; my $pos = $#$clist; push @$clist, 1 => $data; } sub intltool_tree_cdatastart { my $expat = shift; my $clist = $expat->{Curlist}; my $pos = $#$clist; push @$clist, 0 => $expat->original_string(); } sub intltool_tree_cdataend { my $expat = shift; my $clist = $expat->{Curlist}; my $pos = $#$clist; $clist->[$pos] .= $expat->original_string(); } sub intltool_tree_char { my $expat = shift; my $text = shift; my $clist = $expat->{Curlist}; my $pos = $#$clist; # Use original_string so that we retain escaped entities # in CDATA sections. # if ($pos > 0 and $clist->[$pos - 1] eq '0') { $clist->[$pos] .= $expat->original_string(); } else { push @$clist, 0 => $expat->original_string(); } } sub intltool_tree_start { my $expat = shift; my $tag = shift; my @origlist = (); # Use original_string so that we retain escaped entities # in attribute values. We must convert the string to an # @origlist array to conform to the structure of the Tree # Style. # my @original_array = split /\x/, $expat->original_string(); my $source = $expat->original_string(); # Remove leading tag. # $source =~ s|^\s*<\s*(\S+)||s; # Grab attribute key/value pairs and push onto @origlist array. # while ($source) { if ($source =~ /^\s*([\w:-]+)\s*[=]\s*["]/) { $source =~ s|^\s*([\w:-]+)\s*[=]\s*["]([^"]*)["]||s; push @origlist, $1; push @origlist, '"' . $2 . '"'; } elsif ($source =~ /^\s*([\w:-]+)\s*[=]\s*[']/) { $source =~ s|^\s*([\w:-]+)\s*[=]\s*[']([^']*)[']||s; push @origlist, $1; push @origlist, "'" . $2 . "'"; } else { last; } } my $ol = [ { @origlist } ]; push @{ $expat->{Lists} }, $expat->{Curlist}; push @{ $expat->{Curlist} }, $tag => $ol; $expat->{Curlist} = $ol; } sub readXml { my $filename = shift || return; if(!-f $filename) { die "ERROR Cannot find filename: $filename\n"; } my $ret = eval 'require XML::Parser'; if(!$ret) { die "You must have XML::Parser installed to run $0\n\n"; } my $xp = new XML::Parser(Style => 'Tree'); $xp->setHandlers(Char => \&intltool_tree_char); $xp->setHandlers(Start => \&intltool_tree_start); $xp->setHandlers(CdataStart => \&intltool_tree_cdatastart); $xp->setHandlers(CdataEnd => \&intltool_tree_cdataend); my $tree = $xp->parsefile($filename); # Hello thereHowdydo # would be: # [foo, [{}, head, [{id => "a"}, 0, "Hello ", em, [{}, 0, "there"]], bar, [{}, # 0, "Howdy", ref, [{}]], 0, "do" ] ] return $tree; } sub print_header { my $infile = shift; my $fh = shift; my $source; if(!-f $infile) { die "ERROR Cannot find filename: $infile\n"; } print $fh qq{\n}; { local $/; open DOCINPUT, "<${FILE}" or die; $source = ; close DOCINPUT; } if ($source =~ /()/s) { print $fh "$1\n"; } elsif ($source =~ /(]*>)/s) { print $fh "$1\n"; } } sub parseTree { my $fh = shift; my $ref = shift; my $language = shift || ""; my $name = shift @{ $ref }; my $cont = shift @{ $ref }; while (!$name || "$name" eq "1") { $name = shift @{ $ref }; $cont = shift @{ $ref }; } my $spacepreserve = 0; my $attrs = @{$cont}[0]; $spacepreserve = 1 if ((exists $attrs->{"xml:space"}) && ($attrs->{"xml:space"} =~ /^["']?preserve["']?$/)); traverse($fh, $name, $cont, $language, $spacepreserve); } sub xml_merge_output { my $source; if ($MULTIPLE_OUTPUT) { for my $lang (sort keys %po_files_by_lang) { if ( ! -d $lang ) { mkdir $lang or -d $lang or die "Cannot create subdirectory $lang: $!\n"; } open OUTPUT, ">$lang/$OUTFILE" or die "Cannot open $lang/$OUTFILE: $!\n"; binmode (OUTPUT) if $^O eq 'MSWin32'; my $tree = readXml($FILE); print_header($FILE, \*OUTPUT); parseTree(\*OUTPUT, $tree, $lang); close OUTPUT; print "CREATED $lang/$OUTFILE\n" unless $QUIET_ARG; } if ( ! -d "C" ) { mkdir "C" or -d "C" or die "Cannot create subdirectory C: $!\n"; } open OUTPUT, ">C/$OUTFILE" or die "Cannot open C/$OUTFILE: $!\n"; binmode (OUTPUT) if $^O eq 'MSWin32'; my $tree = readXml($FILE); print_header($FILE, \*OUTPUT); parseTree(\*OUTPUT, $tree); close OUTPUT; print "CREATED C/$OUTFILE\n" unless $QUIET_ARG; } else { open OUTPUT, ">$OUTFILE" or die "Cannot open $OUTFILE: $!\n"; binmode (OUTPUT) if $^O eq 'MSWin32'; my $tree = readXml($FILE); print_header($FILE, \*OUTPUT); parseTree(\*OUTPUT, $tree); close OUTPUT; print "CREATED $OUTFILE\n" unless $QUIET_ARG; } } sub keys_merge_translation { my ($lang) = @_; if ( ! -d $lang && $MULTIPLE_OUTPUT) { mkdir $lang or -d $lang or die "Cannot create subdirectory $lang: $!\n"; } open INPUT, "<${FILE}" or die "Cannot open ${FILE}: $!\n"; open OUTPUT, ">$lang/$OUTFILE" or die "Cannot open $lang/$OUTFILE: $!\n"; binmode (OUTPUT) if $^O eq 'MSWin32'; while () { if (s/^(\s*)_(\w+=(.*))/$1$2/) { my $string = $3; if (!$MULTIPLE_OUTPUT) { print OUTPUT; my $non_translated_line = $_; for my $lang (sort keys %po_files_by_lang) { my $translation = $translations{$lang, $string}; next if !$translation; $_ = $non_translated_line; s/(\w+)=.*/[$lang]$1=$translation/; print OUTPUT; } } else { my $non_translated_line = $_; my $translation = $translations{$lang, $string}; $translation = $string if !$translation; $_ = $non_translated_line; s/(\w+)=.*/$1=$translation/; print OUTPUT; } } else { print OUTPUT; } } close OUTPUT; close INPUT; print "CREATED $lang/$OUTFILE\n" unless $QUIET_ARG; } sub keys_merge_translations { if ($MULTIPLE_OUTPUT) { for my $lang (sort keys %po_files_by_lang) { keys_merge_translation ($lang); } keys_merge_translation ("C"); } else { keys_merge_translation ("."); } } sub desktop_merge_translations { open INPUT, "<${FILE}" or die; open OUTPUT, ">${OUTFILE}" or die; binmode (OUTPUT) if $^O eq 'MSWin32'; while () { if (s/^(\s*)_(\w+=(.*))/$1$2/) { my $string = $3; print OUTPUT; my $non_translated_line = $_; for my $lang (sort keys %po_files_by_lang) { my $translation = $translations{$lang, $string}; next if !$translation; $_ = $non_translated_line; s/(\w+)=.*/${1}[$lang]=$translation/; print OUTPUT; } } else { print OUTPUT; } } close OUTPUT; close INPUT; } sub schemas_merge_translations { my $source; { local $/; # slurp mode open INPUT, "<$FILE" or die "can't open $FILE: $!"; $source = ; close INPUT; } open OUTPUT, ">$OUTFILE" or die; binmode (OUTPUT) if $^O eq 'MSWin32'; # FIXME: support attribute translations # Empty nodes never need translation, so unmark all of them. # For example, <_foo/> is just replaced by . $source =~ s|<\s*_($w+)\s*/>|<$1/>|g; while ($source =~ s/ (.*?) (\s+)((\s*) (\s*(?:\s*)?(.*?)\s*<\/default>)?(\s*) (\s*(?:\s*)?(.*?)\s*<\/short>)?(\s*) (\s*(?:\s*)?(.*?)\s*<\/long>)?(\s*) <\/locale>) //sx) { print OUTPUT $1; my $locale_start_spaces = $2 ? $2 : ''; my $default_spaces = $4 ? $4 : ''; my $short_spaces = $7 ? $7 : ''; my $long_spaces = $10 ? $10 : ''; my $locale_end_spaces = $13 ? $13 : ''; my $c_default_block = $3 ? $3 : ''; my $default_string = $6 ? $6 : ''; my $short_string = $9 ? $9 : ''; my $long_string = $12 ? $12 : ''; print OUTPUT "$locale_start_spaces$c_default_block"; $default_string =~ s/\s+/ /g; $default_string = entity_decode($default_string); $short_string =~ s/\s+/ /g; $short_string = entity_decode($short_string); $long_string =~ s/\s+/ /g; $long_string = entity_decode($long_string); for my $lang (sort keys %po_files_by_lang) { my $default_translation = $translations{$lang, $default_string}; my $short_translation = $translations{$lang, $short_string}; my $long_translation = $translations{$lang, $long_string}; next if (!$default_translation && !$short_translation && !$long_translation); print OUTPUT "\n$locale_start_spaces"; print OUTPUT "$default_spaces"; if ($default_translation) { $default_translation = entity_encode($default_translation); print OUTPUT "$default_translation"; } print OUTPUT "$short_spaces"; if ($short_translation) { $short_translation = entity_encode($short_translation); print OUTPUT "$short_translation"; } print OUTPUT "$long_spaces"; if ($long_translation) { $long_translation = entity_encode($long_translation); print OUTPUT "$long_translation"; } print OUTPUT "$locale_end_spaces"; } } print OUTPUT $source; close OUTPUT; } sub rfc822deb_merge_translations { my %encodings = (); for my $lang (keys %po_files_by_lang) { $encodings{$lang} = ($UTF8_ARG ? 'UTF-8' : get_po_encoding($po_files_by_lang{$lang})); } my $source; $Text::Wrap::huge = 'overflow'; $Text::Wrap::break = qr/\n|\s(?=\S)/; { local $/; # slurp mode open INPUT, "<$FILE" or die "can't open $FILE: $!"; $source = ; close INPUT; } open OUTPUT, ">${OUTFILE}" or die; binmode (OUTPUT) if $^O eq 'MSWin32'; while ($source =~ /(^|\n+)(_*)([^:\s]+)(:[ \t]*)(.*?)(?=\n[\S\n]|$)/sg) { my $sep = $1; my $non_translated_line = $3.$4; my $string = $5; my $underscore = length($2); next if $underscore eq 0 && $non_translated_line =~ /^#/; # Remove [] dummy strings my $stripped = $string; $stripped =~ s/\[\s[^\[\]]*\],/,/g if $underscore eq 2; $stripped =~ s/\[\s[^\[\]]*\]$//; $non_translated_line .= $stripped; print OUTPUT $sep.$non_translated_line; if ($underscore) { my @str_list = rfc822deb_split($underscore, $string); for my $lang (sort keys %po_files_by_lang) { my $is_translated = 1; my $str_translated = ''; my $first = 1; for my $str (@str_list) { my $translation = $translations{$lang, $str}; if (!$translation) { $is_translated = 0; last; } # $translation may also contain [] dummy # strings, mostly to indicate an empty string $translation =~ s/\[\s[^\[\]]*\]$//; if ($first) { if ($underscore eq 2) { $str_translated .= $translation; } else { $str_translated .= Text::Tabs::expand($translation) . "\n"; } } else { if ($underscore eq 2) { $str_translated .= ', ' . $translation; } else { $str_translated .= Text::Tabs::expand( Text::Wrap::wrap(' ', ' ', $translation)) . "\n .\n"; } } $first = 0; # To fix some problems with Text::Wrap::wrap $str_translated =~ s/(\n )+\n/\n .\n/g; } next unless $is_translated; $str_translated =~ s/\n \.\n$//; $str_translated =~ s/\s+$//; $_ = $non_translated_line; s/^(\w+):\s*.*/$sep${1}-$lang.$encodings{$lang}: $str_translated/s; print OUTPUT; } } } print OUTPUT "\n"; close OUTPUT; close INPUT; } sub rfc822deb_split { # Debian defines a special way to deal with rfc822-style files: # when a value contain newlines, it consists of # 1. a short form (first line) # 2. a long description, all lines begin with a space, # and paragraphs are separated by a single dot on a line # This routine returns an array of all paragraphs, and reformat # them. # When first argument is 2, the string is a comma separated list of # values. my $type = shift; my $text = shift; $text =~ s/^[ \t]//mg; return (split(/, */, $text, 0)) if $type ne 1; return ($text) if $text !~ /\n/; $text =~ s/([^\n]*)\n//; my @list = ($1); my $str = ''; for my $line (split (/\n/, $text)) { chomp $line; if ($line =~ /^\.\s*$/) { # New paragraph $str =~ s/\s*$//; push(@list, $str); $str = ''; } elsif ($line =~ /^\s/) { # Line which must not be reformatted $str .= "\n" if length ($str) && $str !~ /\n$/; $line =~ s/\s+$//; $str .= $line."\n"; } else { # Continuation line, remove newline $str .= " " if length ($str) && $str !~ /\n$/; $str .= $line; } } $str =~ s/\s*$//; push(@list, $str) if length ($str); return @list; } sub quoted_translation { my ($xml_mode, $lang, $string) = @_; $string = entity_decode($string) if $xml_mode; $string =~ s/\\\"/\"/g; my $translation = $translations{$lang, $string}; $translation = $string if !$translation; $translation = entity_encode($translation) if $xml_mode; $translation =~ s/\"/\\\"/g; return $translation } sub quoted_merge_translations { my ($xml_mode) = @_; if (!$MULTIPLE_OUTPUT) { print "Quoted only supports Multiple Output.\n"; exit(1); } for my $lang (sort keys %po_files_by_lang) { if ( ! -d $lang ) { mkdir $lang or -d $lang or die "Cannot create subdirectory $lang: $!\n"; } open INPUT, "<${FILE}" or die; open OUTPUT, ">$lang/$OUTFILE" or die "Cannot open $lang/$OUTFILE: $!\n"; binmode (OUTPUT) if $^O eq 'MSWin32'; while () { s/\"(([^\"]|\\\")*[^\\\"])\"/"\"" . "ed_translation($xml_mode, $lang, $1) . "\""/ge; print OUTPUT; } close OUTPUT; close INPUT; } } parcellite-1.2.1/AUTHORS0000644000175000017500000000012513041603201012775 0ustar hlehleGilberto "Xyhthyx" Miralla Doug Springer parcellite-1.2.1/scmversion.sh0000755000175000017500000000177213041603201014465 0ustar hlehle#!/bin/sh LOG="scmversion.log" TMP=_scmversion_test echo "$0">$LOG if [ -n "$1" ]; then echo "Immediate Mode">>$LOG IM=1 else IM=0 fi which svnversion > $TMP which git >> $TMP if [ $? -ne 0 ] ;then echo "svn" else CWD=$(pwd) #path supplied? D=$(dirname $0) if [ "." = "$D" ]; then PPATH="$CWD" #no else PPATH="$D" fi cd "$PPATH" # are we lndired? LINK=$(readlink configure.ac) if [ -n "$LINK" ]; then #link FULLPATH=$(dirname "$LINK") else FULLPATH="$CWD" fi cd "$FULLPATH" echo "Using $FULLPATH">>"$CWD/$LOG" if [ -e .svn ]; then SVER=$(svn info .|grep -i "revision"|sed 's!.*: !!'|tr -d ' ') SVER="svn-$SVER" elif [ -e .git ]; then SVER="git-$(git log -n1 --pretty=format:%h)" fi echo -n "$SVER" cd $CWD if [ "$IM" = "1" ]; then sed -i "s#\(.*VERSION \).*#\1\"$SVER\"#" config.h echo "Make sure to do scm update in source scm to update local scm info, then run again." rm src/main.o echo "Removed src/main.o. Recompile." fi fi parcellite-1.2.1/intltool-extract0000755000175000017500000005564613041603201015211 0ustar hlehle#!/usr/bin/perl -w # -*- Mode: perl; indent-tabs-mode: nil; c-basic-offset: 4 -*- # # The Intltool Message Extractor # # Copyright (C) 2000-2001, 2003 Free Software Foundation. # # Intltool is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2 of the # License, or (at your option) any later version. # # Intltool is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # # Authors: Kenneth Christiansen # Darin Adler # ## Release information my $PROGRAM = "intltool-extract"; my $PACKAGE = "intltool"; my $VERSION = "0.37.1"; ## Loaded modules use strict; use File::Basename; use Getopt::Long; ## Scalars used by the option stuff my $TYPE_ARG = "0"; my $LOCAL_ARG = "0"; my $HELP_ARG = "0"; my $VERSION_ARG = "0"; my $UPDATE_ARG = "0"; my $QUIET_ARG = "0"; my $SRCDIR_ARG = "."; my $FILE; my $OUTFILE; my $gettext_type = ""; my $input; my %messages = (); my %loc = (); my %count = (); my %comments = (); my $strcount = 0; my $XMLCOMMENT = ""; ## Use this instead of \w for XML files to handle more possible characters. my $w = "[-A-Za-z0-9._:]"; ## Always print first $| = 1; ## Handle options GetOptions ( "type=s" => \$TYPE_ARG, "local|l" => \$LOCAL_ARG, "help|h" => \$HELP_ARG, "version|v" => \$VERSION_ARG, "update" => \$UPDATE_ARG, "quiet|q" => \$QUIET_ARG, "srcdir=s" => \$SRCDIR_ARG, ) or &error; &split_on_argument; ## Check for options. ## This section will check for the different options. sub split_on_argument { if ($VERSION_ARG) { &version; } elsif ($HELP_ARG) { &help; } elsif ($LOCAL_ARG) { &place_local; &extract; } elsif ($UPDATE_ARG) { &place_normal; &extract; } elsif (@ARGV > 0) { &place_normal; &message; &extract; } else { &help; } } sub place_normal { $FILE = $ARGV[0]; $OUTFILE = "$FILE.h"; my $dirname = dirname ($OUTFILE); if (! -d "$dirname" && $dirname ne "") { system ("mkdir -p $dirname"); } } sub place_local { $FILE = $ARGV[0]; $OUTFILE = fileparse($FILE, ()); if (!-e "tmp/") { system("mkdir tmp/"); } $OUTFILE = "./tmp/$OUTFILE.h" } sub determine_type { if ($TYPE_ARG =~ /^gettext\/(.*)/) { $gettext_type=$1 } } ## Sub for printing release information sub version{ print <<_EOF_; ${PROGRAM} (${PACKAGE}) $VERSION Copyright (C) 2000, 2003 Free Software Foundation, Inc. Written by Kenneth Christiansen, 2000. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. _EOF_ exit; } ## Sub for printing usage information sub help { print <<_EOF_; Usage: ${PROGRAM} [OPTION]... [FILENAME] Generates a header file from an XML source file. It grabs all strings between <_translatable_node> and its end tag in XML files. Read manpage (man ${PROGRAM}) for more info. --type=TYPE Specify the file type of FILENAME. Currently supports: "gettext/glade", "gettext/ini", "gettext/keys" "gettext/rfc822deb", "gettext/schemas", "gettext/scheme", "gettext/xml", "gettext/quoted", "gettext/quotedxml" -l, --local Writes output into current working directory (conflicts with --update) --update Writes output into the same directory the source file reside (conflicts with --local) --srcdir Root of the source tree -v, --version Output version information and exit -h, --help Display this help and exit -q, --quiet Quiet mode Report bugs to http://bugzilla.gnome.org/ (product name "$PACKAGE") or send email to . _EOF_ exit; } ## Sub for printing error messages sub error{ print STDERR "Try `${PROGRAM} --help' for more information.\n"; exit; } sub message { print "Generating C format header file for translation.\n" unless $QUIET_ARG; } sub extract { &determine_type; &convert; open OUT, ">$OUTFILE"; binmode (OUT) if $^O eq 'MSWin32'; &msg_write; close OUT; print "Wrote $OUTFILE\n" unless $QUIET_ARG; } sub convert { ## Reading the file { local (*IN); local $/; #slurp mode open (IN, "<$SRCDIR_ARG/$FILE") || die "can't open $SRCDIR_ARG/$FILE: $!"; $input = ; } &type_ini if $gettext_type eq "ini"; &type_keys if $gettext_type eq "keys"; &type_xml if $gettext_type eq "xml"; &type_glade if $gettext_type eq "glade"; &type_scheme if $gettext_type eq "scheme"; &type_schemas if $gettext_type eq "schemas"; &type_rfc822deb if $gettext_type eq "rfc822deb"; &type_quoted if $gettext_type eq "quoted"; &type_quotedxml if $gettext_type eq "quotedxml"; } sub entity_decode_minimal { local ($_) = @_; s/'/'/g; # ' s/"/"/g; # " s/&/&/g; return $_; } sub entity_decode { local ($_) = @_; s/'/'/g; # ' s/"/"/g; # " s/<//g; s/&/&/g; return $_; } sub escape_char { return '\"' if $_ eq '"'; return '\n' if $_ eq "\n"; return '\\\\' if $_ eq '\\'; return $_; } sub escape { my ($string) = @_; return join "", map &escape_char, split //, $string; } sub type_ini { ### For generic translatable desktop files ### while ($input =~ /^(#(.+)\n)?^_.*=(.*)$/mg) { if (defined($2)) { $comments{$3} = $2; } $messages{$3} = []; } } sub type_keys { ### For generic translatable mime/keys files ### while ($input =~ /^\s*_\w+=(.*)$/mg) { $messages{$1} = []; } } sub type_xml { ### For generic translatable XML files ### my $tree = readXml($input); parseTree(0, $tree); } sub print_var { my $var = shift; my $vartype = ref $var; if ($vartype =~ /ARRAY/) { my @arr = @{$var}; print "[ "; foreach my $el (@arr) { print_var($el); print ", "; } print "] "; } elsif ($vartype =~ /HASH/) { my %hash = %{$var}; print "{ "; foreach my $key (keys %hash) { print "$key => "; print_var($hash{$key}); print ", "; } print "} "; } else { print $var; } } # Same syntax as getAttributeString in intltool-merge.in.in, similar logic (look for ## differences comment) sub getAttributeString { my $sub = shift; my $do_translate = shift || 1; my $language = shift || ""; my $translate = shift; my $result = ""; foreach my $e (reverse(sort(keys %{ $sub }))) { my $key = $e; my $string = $sub->{$e}; my $quote = '"'; $string =~ s/^[\s]+//; $string =~ s/[\s]+$//; if ($string =~ /^'.*'$/) { $quote = "'"; } $string =~ s/^['"]//g; $string =~ s/['"]$//g; ## differences from intltool-merge.in.in if ($key =~ /^_/) { $comments{entity_decode($string)} = $XMLCOMMENT if $XMLCOMMENT; $messages{entity_decode($string)} = []; $$translate = 2; } ## differences end here from intltool-merge.in.in $result .= " $key=$quote$string$quote"; } return $result; } # Verbatim copy from intltool-merge.in.in sub getXMLstring { my $ref = shift; my $spacepreserve = shift || 0; my @list = @{ $ref }; my $result = ""; my $count = scalar(@list); my $attrs = $list[0]; my $index = 1; $spacepreserve = 1 if ((exists $attrs->{"xml:space"}) && ($attrs->{"xml:space"} =~ /^["']?preserve["']?$/)); $spacepreserve = 0 if ((exists $attrs->{"xml:space"}) && ($attrs->{"xml:space"} =~ /^["']?default["']?$/)); while ($index < $count) { my $type = $list[$index]; my $content = $list[$index+1]; if (! $type ) { # We've got CDATA if ($content) { # lets strip the whitespace here, and *ONLY* here $content =~ s/\s+/ /gs if (!$spacepreserve); $result .= $content; } } elsif ( "$type" ne "1" ) { # We've got another element $result .= "<$type"; $result .= getAttributeString(@{$content}[0], 0); # no nested translatable elements if ($content) { my $subresult = getXMLstring($content, $spacepreserve); if ($subresult) { $result .= ">".$subresult . ""; } else { $result .= "/>"; } } else { $result .= "/>"; } } $index += 2; } return $result; } # Verbatim copy from intltool-merge.in.in, except for MULTIPLE_OUTPUT handling removed # Translate list of nodes if necessary sub translate_subnodes { my $fh = shift; my $content = shift; my $language = shift || ""; my $singlelang = shift || 0; my $spacepreserve = shift || 0; my @nodes = @{ $content }; my $count = scalar(@nodes); my $index = 0; while ($index < $count) { my $type = $nodes[$index]; my $rest = $nodes[$index+1]; traverse($fh, $type, $rest, $language, $spacepreserve); $index += 2; } } # Based on traverse() in intltool-merge.in.in sub traverse { my $fh = shift; # unused, to allow us to sync code between -merge and -extract my $nodename = shift; my $content = shift; my $language = shift || ""; my $spacepreserve = shift || 0; if ($nodename && "$nodename" eq "1") { $XMLCOMMENT = $content; } elsif ($nodename) { # element my @all = @{ $content }; my $attrs = shift @all; my $translate = 0; my $outattr = getAttributeString($attrs, 1, $language, \$translate); if ($nodename =~ /^_/) { $translate = 1; $nodename =~ s/^_//; } my $lookup = ''; $spacepreserve = 0 if ((exists $attrs->{"xml:space"}) && ($attrs->{"xml:space"} =~ /^["']?default["']?$/)); $spacepreserve = 1 if ((exists $attrs->{"xml:space"}) && ($attrs->{"xml:space"} =~ /^["']?preserve["']?$/)); if ($translate) { $lookup = getXMLstring($content, $spacepreserve); if (!$spacepreserve) { $lookup =~ s/^\s+//s; $lookup =~ s/\s+$//s; } if ($lookup && $translate != 2) { $comments{$lookup} = $XMLCOMMENT if $XMLCOMMENT; $messages{$lookup} = []; } elsif ($translate == 2) { translate_subnodes($fh, \@all, $language, 1, $spacepreserve); } } else { $XMLCOMMENT = ""; my $count = scalar(@all); if ($count > 0) { my $index = 0; while ($index < $count) { my $type = $all[$index]; my $rest = $all[$index+1]; traverse($fh, $type, $rest, $language, $spacepreserve); $index += 2; } } } $XMLCOMMENT = ""; } } # Verbatim copy from intltool-merge.in.in, $fh for compatibility sub parseTree { my $fh = shift; my $ref = shift; my $language = shift || ""; my $name = shift @{ $ref }; my $cont = shift @{ $ref }; while (!$name || "$name" eq "1") { $name = shift @{ $ref }; $cont = shift @{ $ref }; } my $spacepreserve = 0; my $attrs = @{$cont}[0]; $spacepreserve = 1 if ((exists $attrs->{"xml:space"}) && ($attrs->{"xml:space"} =~ /^["']?preserve["']?$/)); traverse($fh, $name, $cont, $language, $spacepreserve); } # Verbatim copy from intltool-merge.in.in sub intltool_tree_comment { my $expat = shift; my $data = $expat->original_string(); my $clist = $expat->{Curlist}; my $pos = $#$clist; $data =~ s/^$//s; push @$clist, 1 => $data; } # Verbatim copy from intltool-merge.in.in sub intltool_tree_cdatastart { my $expat = shift; my $clist = $expat->{Curlist}; my $pos = $#$clist; push @$clist, 0 => $expat->original_string(); } # Verbatim copy from intltool-merge.in.in sub intltool_tree_cdataend { my $expat = shift; my $clist = $expat->{Curlist}; my $pos = $#$clist; $clist->[$pos] .= $expat->original_string(); } # Verbatim copy from intltool-merge.in.in sub intltool_tree_char { my $expat = shift; my $text = shift; my $clist = $expat->{Curlist}; my $pos = $#$clist; # Use original_string so that we retain escaped entities # in CDATA sections. # if ($pos > 0 and $clist->[$pos - 1] eq '0') { $clist->[$pos] .= $expat->original_string(); } else { push @$clist, 0 => $expat->original_string(); } } # Verbatim copy from intltool-merge.in.in sub intltool_tree_start { my $expat = shift; my $tag = shift; my @origlist = (); # Use original_string so that we retain escaped entities # in attribute values. We must convert the string to an # @origlist array to conform to the structure of the Tree # Style. # my @original_array = split /\x/, $expat->original_string(); my $source = $expat->original_string(); # Remove leading tag. # $source =~ s|^\s*<\s*(\S+)||s; # Grab attribute key/value pairs and push onto @origlist array. # while ($source) { if ($source =~ /^\s*([\w:-]+)\s*[=]\s*["]/) { $source =~ s|^\s*([\w:-]+)\s*[=]\s*["]([^"]*)["]||s; push @origlist, $1; push @origlist, '"' . $2 . '"'; } elsif ($source =~ /^\s*([\w:-]+)\s*[=]\s*[']/) { $source =~ s|^\s*([\w:-]+)\s*[=]\s*[']([^']*)[']||s; push @origlist, $1; push @origlist, "'" . $2 . "'"; } else { last; } } my $ol = [ { @origlist } ]; push @{ $expat->{Lists} }, $expat->{Curlist}; push @{ $expat->{Curlist} }, $tag => $ol; $expat->{Curlist} = $ol; } # Copied from intltool-merge.in.in and added comment handler. sub readXml { my $xmldoc = shift || return; my $ret = eval 'require XML::Parser'; if(!$ret) { die "You must have XML::Parser installed to run $0\n\n"; } my $xp = new XML::Parser(Style => 'Tree'); $xp->setHandlers(Char => \&intltool_tree_char); $xp->setHandlers(Start => \&intltool_tree_start); $xp->setHandlers(CdataStart => \&intltool_tree_cdatastart); $xp->setHandlers(CdataEnd => \&intltool_tree_cdataend); ## differences from intltool-merge.in.in $xp->setHandlers(Comment => \&intltool_tree_comment); ## differences end here from intltool-merge.in.in my $tree = $xp->parse($xmldoc); #print_var($tree); # Hello thereHowdydo # would be: # [foo, [{}, 1, "comment", head, [{id => "a"}, 0, "Hello ", em, [{}, 0, "there"]], bar, # [{}, 0, "Howdy", ref, [{}]], 0, "do" ] ] return $tree; } sub type_schemas { ### For schemas XML files ### # FIXME: We should handle escaped < (less than) while ($input =~ / \s* (\s*(?:\s*)?(.*?)\s*<\/default>\s*)? (\s*(?:\s*)?(.*?)\s*<\/short>\s*)? (\s*(?:\s*)?(.*?)\s*<\/long>\s*)? <\/locale> /sgx) { my @totranslate = ($3,$6,$9); my @eachcomment = ($2,$5,$8); foreach (@totranslate) { my $currentcomment = shift @eachcomment; next if !$_; s/\s+/ /g; $messages{entity_decode_minimal($_)} = []; $comments{entity_decode_minimal($_)} = $currentcomment if (defined($currentcomment)); } } } sub type_rfc822deb { ### For rfc822-style Debian configuration files ### my $lineno = 1; my $type = ''; while ($input =~ /\G(.*?)(^|\n)(_+)([^:]+):[ \t]*(.*?)(?=\n\S|$)/sg) { my ($pre, $newline, $underscore, $tag, $text) = ($1, $2, $3, $4, $5); while ($pre =~ m/\n/g) { $lineno ++; } $lineno += length($newline); my @str_list = rfc822deb_split(length($underscore), $text); for my $str (@str_list) { $strcount++; $messages{$str} = []; $loc{$str} = $lineno; $count{$str} = $strcount; my $usercomment = ''; while($pre =~ s/(^|\n)#([^\n]*)$//s) { $usercomment = "\n" . $2 . $usercomment; } $comments{$str} = $tag . $usercomment; } $lineno += ($text =~ s/\n//g); } } sub rfc822deb_split { # Debian defines a special way to deal with rfc822-style files: # when a value contain newlines, it consists of # 1. a short form (first line) # 2. a long description, all lines begin with a space, # and paragraphs are separated by a single dot on a line # This routine returns an array of all paragraphs, and reformat # them. # When first argument is 2, the string is a comma separated list of # values. my $type = shift; my $text = shift; $text =~ s/^[ \t]//mg; return (split(/, */, $text, 0)) if $type ne 1; return ($text) if $text !~ /\n/; $text =~ s/([^\n]*)\n//; my @list = ($1); my $str = ''; for my $line (split (/\n/, $text)) { chomp $line; if ($line =~ /^\.\s*$/) { # New paragraph $str =~ s/\s*$//; push(@list, $str); $str = ''; } elsif ($line =~ /^\s/) { # Line which must not be reformatted $str .= "\n" if length ($str) && $str !~ /\n$/; $line =~ s/\s+$//; $str .= $line."\n"; } else { # Continuation line, remove newline $str .= " " if length ($str) && $str !~ /\n$/; $str .= $line; } } $str =~ s/\s*$//; push(@list, $str) if length ($str); return @list; } sub type_quoted { while ($input =~ /\"(([^\"]|\\\")*[^\\\"])\"/g) { my $message = $1; my $before = $`; $message =~ s/\\\"/\"/g; $before =~ s/[^\n]//g; $messages{$message} = []; $loc{$message} = length ($before) + 2; } } sub type_quotedxml { while ($input =~ /\"(([^\"]|\\\")*[^\\\"])\"/g) { my $message = $1; my $before = $`; $message =~ s/\\\"/\"/g; $message = entity_decode($message); $before =~ s/[^\n]//g; $messages{$message} = []; $loc{$message} = length ($before) + 2; } } sub type_glade { ### For translatable Glade XML files ### my $tags = "label|title|text|format|copyright|comments|preview_text|tooltip|message"; while ($input =~ /<($tags)>([^<]+)<\/($tags)>/sg) { # Glade sometimes uses tags that normally mark translatable things for # little bits of non-translatable content. We work around this by not # translating strings that only includes something like label4 or window1. $messages{entity_decode($2)} = [] unless $2 =~ /^(window|label|dialog)[0-9]+$/; } while ($input =~ /(..[^<]*)<\/items>/sg) { for my $item (split (/\n/, $1)) { $messages{entity_decode($item)} = []; } } ## handle new glade files while ($input =~ /<(property|atkproperty)\s+[^>]*translatable\s*=\s*"yes"(?:\s+[^>]*comments\s*=\s*"([^"]*)")?[^>]*>([^<]+)<\/\1>/sg) { $messages{entity_decode($3)} = [] unless $3 =~ /^(window|label)[0-9]+$/; if (defined($2) and !($3 =~ /^(window|label)[0-9]+$/)) { $comments{entity_decode($3)} = entity_decode($2) ; } } while ($input =~ /]*)"\s+description="([^>]+)"\/>/sg) { $messages{entity_decode_minimal($2)} = []; } } sub type_scheme { my ($line, $i, $state, $str, $trcomment, $char); for $line (split(/\n/, $input)) { $i = 0; $state = 0; # 0 - nothing, 1 - string, 2 - translatable string while ($i < length($line)) { if (substr($line,$i,1) eq "\"") { if ($state == 2) { $comments{$str} = $trcomment if ($trcomment); $messages{$str} = []; $str = ''; $state = 0; $trcomment = ""; } elsif ($state == 1) { $str = ''; $state = 0; $trcomment = ""; } else { $state = 1; $str = ''; if ($i>0 && substr($line,$i-1,1) eq '_') { $state = 2; } } } elsif (!$state) { if (substr($line,$i,1) eq ";") { $trcomment = substr($line,$i+1); $trcomment =~ s/^;*\s*//; $i = length($line); } elsif ($trcomment && substr($line,$i,1) !~ /\s|\(|\)|_/) { $trcomment = ""; } } else { if (substr($line,$i,1) eq "\\") { $char = substr($line,$i+1,1); if ($char ne "\"" && $char ne "\\") { $str = $str . "\\"; } $i++; } $str = $str . substr($line,$i,1); } $i++; } } } sub msg_write { my @msgids; if (%count) { @msgids = sort { $count{$a} <=> $count{$b} } keys %count; } else { @msgids = sort keys %messages; } for my $message (@msgids) { my $offsetlines = 1; $offsetlines++ if $message =~ /%/; if (defined ($comments{$message})) { while ($comments{$message} =~ m/\n/g) { $offsetlines++; } } print OUT "# ".($loc{$message} - $offsetlines). " \"$FILE\"\n" if defined $loc{$message}; print OUT "/* ".$comments{$message}." */\n" if defined $comments{$message}; print OUT "/* xgettext:no-c-format */\n" if $message =~ /%/; my @lines = split (/\n/, $message, -1); for (my $n = 0; $n < @lines; $n++) { if ($n == 0) { print OUT "char *s = N_(\""; } else { print OUT " \""; } print OUT escape($lines[$n]); if ($n < @lines - 1) { print OUT "\\n\"\n"; } else { print OUT "\");\n"; } } } } parcellite-1.2.1/ABOUT-NLS0000644000175000017500000022532613041603201013170 0ustar hlehle1 Notes on the Free Translation Project *************************************** Free software is going international! The Free Translation Project is a way to get maintainers of free software, translators, and users all together, so that free software will gradually become able to speak many languages. A few packages already provide translations for their messages. If you found this `ABOUT-NLS' file inside a distribution, you may assume that the distributed package does use GNU `gettext' internally, itself available at your nearest GNU archive site. But you do _not_ need to install GNU `gettext' prior to configuring, installing or using this package with messages translated. Installers will find here some useful hints. These notes also explain how users should proceed for getting the programs to use the available translations. They tell how people wanting to contribute and work on translations can contact the appropriate team. When reporting bugs in the `intl/' directory or bugs which may be related to internationalization, you should tell about the version of `gettext' which is used. The information can be found in the `intl/VERSION' file, in internationalized packages. 1.1 Quick configuration advice ============================== If you want to exploit the full power of internationalization, you should configure it using ./configure --with-included-gettext to force usage of internationalizing routines provided within this package, despite the existence of internationalizing capabilities in the operating system where this package is being installed. So far, only the `gettext' implementation in the GNU C library version 2 provides as many features (such as locale alias, message inheritance, automatic charset conversion or plural form handling) as the implementation here. It is also not possible to offer this additional functionality on top of a `catgets' implementation. Future versions of GNU `gettext' will very likely convey even more functionality. So it might be a good idea to change to GNU `gettext' as soon as possible. So you need _not_ provide this option if you are using GNU libc 2 or you have installed a recent copy of the GNU gettext package with the included `libintl'. 1.2 INSTALL Matters =================== Some packages are "localizable" when properly installed; the programs they contain can be made to speak your own native language. Most such packages use GNU `gettext'. Other packages have their own ways to internationalization, predating GNU `gettext'. By default, this package will be installed to allow translation of messages. It will automatically detect whether the system already provides the GNU `gettext' functions. If not, the included GNU `gettext' library will be used. This library is wholly contained within this package, usually in the `intl/' subdirectory, so prior installation of the GNU `gettext' package is _not_ required. Installers may use special options at configuration time for changing the default behaviour. The commands: ./configure --with-included-gettext ./configure --disable-nls will, respectively, bypass any pre-existing `gettext' to use the internationalizing routines provided within this package, or else, _totally_ disable translation of messages. When you already have GNU `gettext' installed on your system and run configure without an option for your new package, `configure' will probably detect the previously built and installed `libintl.a' file and will decide to use this. This might not be desirable. You should use the more recent version of the GNU `gettext' library. I.e. if the file `intl/VERSION' shows that the library which comes with this package is more recent, you should use ./configure --with-included-gettext to prevent auto-detection. The configuration process will not test for the `catgets' function and therefore it will not be used. The reason is that even an emulation of `gettext' on top of `catgets' could not provide all the extensions of the GNU `gettext' library. Internationalized packages usually have many `po/LL.po' files, where LL gives an ISO 639 two-letter code identifying the language. Unless translations have been forbidden at `configure' time by using the `--disable-nls' switch, all available translations are installed together with the package. However, the environment variable `LINGUAS' may be set, prior to configuration, to limit the installed set. `LINGUAS' should then contain a space separated list of two-letter codes, stating which languages are allowed. 1.3 Using This Package ====================== As a user, if your language has been installed for this package, you only have to set the `LANG' environment variable to the appropriate `LL_CC' combination. If you happen to have the `LC_ALL' or some other `LC_xxx' environment variables set, you should unset them before setting `LANG', otherwise the setting of `LANG' will not have the desired effect. Here `LL' is an ISO 639 two-letter language code, and `CC' is an ISO 3166 two-letter country code. For example, let's suppose that you speak German and live in Germany. At the shell prompt, merely execute `setenv LANG de_DE' (in `csh'), `export LANG; LANG=de_DE' (in `sh') or `export LANG=de_DE' (in `bash'). This can be done from your `.login' or `.profile' file, once and for all. You might think that the country code specification is redundant. But in fact, some languages have dialects in different countries. For example, `de_AT' is used for Austria, and `pt_BR' for Brazil. The country code serves to distinguish the dialects. The locale naming convention of `LL_CC', with `LL' denoting the language and `CC' denoting the country, is the one use on systems based on GNU libc. On other systems, some variations of this scheme are used, such as `LL' or `LL_CC.ENCODING'. You can get the list of locales supported by your system for your language by running the command `locale -a | grep '^LL''. Not all programs have translations for all languages. By default, an English message is shown in place of a nonexistent translation. If you understand other languages, you can set up a priority list of languages. This is done through a different environment variable, called `LANGUAGE'. GNU `gettext' gives preference to `LANGUAGE' over `LANG' for the purpose of message handling, but you still need to have `LANG' set to the primary language; this is required by other parts of the system libraries. For example, some Swedish users who would rather read translations in German than English for when Swedish is not available, set `LANGUAGE' to `sv:de' while leaving `LANG' to `sv_SE'. Special advice for Norwegian users: The language code for Norwegian bokma*l changed from `no' to `nb' recently (in 2003). During the transition period, while some message catalogs for this language are installed under `nb' and some older ones under `no', it's recommended for Norwegian users to set `LANGUAGE' to `nb:no' so that both newer and older translations are used. In the `LANGUAGE' environment variable, but not in the `LANG' environment variable, `LL_CC' combinations can be abbreviated as `LL' to denote the language's main dialect. For example, `de' is equivalent to `de_DE' (German as spoken in Germany), and `pt' to `pt_PT' (Portuguese as spoken in Portugal) in this context. 1.4 Translating Teams ===================== For the Free Translation Project to be a success, we need interested people who like their own language and write it well, and who are also able to synergize with other translators speaking the same language. Each translation team has its own mailing list. The up-to-date list of teams can be found at the Free Translation Project's homepage, `http://translationproject.org/', in the "Teams" area. If you'd like to volunteer to _work_ at translating messages, you should become a member of the translating team for your own language. The subscribing address is _not_ the same as the list itself, it has `-request' appended. For example, speakers of Swedish can send a message to `sv-request@li.org', having this message body: subscribe Keep in mind that team members are expected to participate _actively_ in translations, or at solving translational difficulties, rather than merely lurking around. If your team does not exist yet and you want to start one, or if you are unsure about what to do or how to get started, please write to `coordinator@translationproject.org' to reach the coordinator for all translator teams. The English team is special. It works at improving and uniformizing the terminology in use. Proven linguistic skills are praised more than programming skills, here. 1.5 Available Packages ====================== Languages are not equally supported in all packages. The following matrix shows the current state of internationalization, as of November 2007. The matrix shows, in regard of each package, for which languages PO files have been submitted to translation coordination, with a translation percentage of at least 50%. Ready PO files af am ar az be bg bs ca cs cy da de el en en_GB eo +----------------------------------------------------+ Compendium | [] [] [] [] | a2ps | [] [] [] [] [] | aegis | () | ant-phone | () | anubis | [] | ap-utils | | aspell | [] [] [] [] [] | bash | [] | bfd | | bibshelf | [] | binutils | | bison | [] [] | bison-runtime | [] | bluez-pin | [] [] [] [] [] | cflow | [] | clisp | [] [] [] | console-tools | [] [] | coreutils | [] [] [] [] | cpio | | cpplib | [] [] [] | cryptonit | [] | dialog | | diffutils | [] [] [] [] [] [] | doodle | [] | e2fsprogs | [] [] | enscript | [] [] [] [] | fetchmail | [] [] () [] [] | findutils | [] | findutils_stable | [] [] [] | flex | [] [] [] | fslint | | gas | | gawk | [] [] [] | gcal | [] | gcc | [] | gettext-examples | [] [] [] [] [] | gettext-runtime | [] [] [] [] [] | gettext-tools | [] [] | gip | [] | gliv | [] [] | glunarclock | [] | gmult | [] [] | gnubiff | () | gnucash | [] [] () () [] | gnuedu | | gnulib | [] | gnunet | | gnunet-gtk | | gnutls | [] | gpe-aerial | [] [] | gpe-beam | [] [] | gpe-calendar | | gpe-clock | [] [] | gpe-conf | [] [] | gpe-contacts | | gpe-edit | [] | gpe-filemanager | | gpe-go | [] | gpe-login | [] [] | gpe-ownerinfo | [] [] | gpe-package | | gpe-sketchbook | [] [] | gpe-su | [] [] | gpe-taskmanager | [] [] | gpe-timesheet | [] | gpe-today | [] [] | gpe-todo | | gphoto2 | [] [] [] [] | gprof | [] [] | gpsdrive | | gramadoir | [] [] | grep | [] [] | gretl | () | gsasl | | gss | | gst-plugins-bad | [] [] | gst-plugins-base | [] [] | gst-plugins-good | [] [] [] | gst-plugins-ugly | [] [] | gstreamer | [] [] [] [] [] [] [] | gtick | () | gtkam | [] [] [] [] | gtkorphan | [] [] | gtkspell | [] [] [] [] | gutenprint | [] | hello | [] [] [] [] [] | herrie | [] | hylafax | | idutils | [] [] | indent | [] [] [] [] | iso_15924 | | iso_3166 | [] [] [] [] [] [] [] [] [] [] [] | iso_3166_2 | | iso_4217 | [] [] [] | iso_639 | [] [] [] [] | jpilot | [] | jtag | | jwhois | | kbd | [] [] [] [] | keytouch | [] [] | keytouch-editor | [] | keytouch-keyboa... | [] | latrine | () | ld | [] | leafpad | [] [] [] [] [] | libc | [] [] [] [] | libexif | [] | libextractor | [] | libgpewidget | [] [] [] | libgpg-error | [] | libgphoto2 | [] [] | libgphoto2_port | [] [] | libgsasl | | libiconv | [] [] | libidn | [] [] [] | lifelines | [] () | lilypond | [] | lingoteach | | lprng | | lynx | [] [] [] [] | m4 | [] [] [] [] | mailfromd | | mailutils | [] | make | [] [] | man-db | [] [] [] | minicom | [] [] [] | nano | [] [] [] | opcodes | [] | parted | [] [] | pilot-qof | | popt | [] [] [] | psmisc | [] | pwdutils | | qof | | radius | [] | recode | [] [] [] [] [] [] | rpm | [] | screem | | scrollkeeper | [] [] [] [] [] [] [] [] | sed | [] [] [] | shared-mime-info | [] [] [] [] () [] [] [] | sharutils | [] [] [] [] [] [] | shishi | | skencil | [] () | solfege | | soundtracker | [] [] | sp | [] | system-tools-ba... | [] [] [] [] [] [] [] [] [] | tar | [] [] | texinfo | [] [] [] | tin | () () | tuxpaint | [] [] [] [] [] [] | unicode-han-tra... | | unicode-transla... | | util-linux | [] [] [] [] | util-linux-ng | [] [] [] [] | vorbis-tools | [] | wastesedge | () | wdiff | [] [] [] [] | wget | [] [] [] | xchat | [] [] [] [] [] [] [] | xkeyboard-config | [] | xpad | [] [] [] | +----------------------------------------------------+ af am ar az be bg bs ca cs cy da de el en en_GB eo 6 0 2 1 8 26 2 40 48 2 56 88 15 1 15 18 es et eu fa fi fr ga gl gu he hi hr hu id is it +--------------------------------------------------+ Compendium | [] [] [] [] [] | a2ps | [] [] [] () | aegis | | ant-phone | [] | anubis | [] | ap-utils | [] [] | aspell | [] [] [] | bash | [] | bfd | [] [] | bibshelf | [] [] [] | binutils | [] [] [] | bison | [] [] [] [] [] [] | bison-runtime | [] [] [] [] [] | bluez-pin | [] [] [] [] [] | cflow | [] | clisp | [] [] | console-tools | | coreutils | [] [] [] [] [] [] | cpio | [] [] [] | cpplib | [] [] | cryptonit | [] | dialog | [] [] [] | diffutils | [] [] [] [] [] [] [] [] [] | doodle | [] [] | e2fsprogs | [] [] [] | enscript | [] [] [] | fetchmail | [] | findutils | [] [] [] | findutils_stable | [] [] [] [] | flex | [] [] [] | fslint | | gas | [] [] | gawk | [] [] [] [] () | gcal | [] [] | gcc | [] | gettext-examples | [] [] [] [] [] [] [] | gettext-runtime | [] [] [] [] [] [] | gettext-tools | [] [] [] [] | gip | [] [] [] [] | gliv | () | glunarclock | [] [] [] | gmult | [] [] [] | gnubiff | () () | gnucash | () () () | gnuedu | [] | gnulib | [] [] [] | gnunet | | gnunet-gtk | | gnutls | | gpe-aerial | [] [] | gpe-beam | [] [] | gpe-calendar | | gpe-clock | [] [] [] [] | gpe-conf | [] | gpe-contacts | [] [] | gpe-edit | [] [] [] [] | gpe-filemanager | [] | gpe-go | [] [] [] | gpe-login | [] [] [] | gpe-ownerinfo | [] [] [] [] [] | gpe-package | [] | gpe-sketchbook | [] [] | gpe-su | [] [] [] [] | gpe-taskmanager | [] [] [] | gpe-timesheet | [] [] [] [] | gpe-today | [] [] [] [] | gpe-todo | [] | gphoto2 | [] [] [] [] [] | gprof | [] [] [] [] [] | gpsdrive | [] | gramadoir | [] [] | grep | [] [] [] | gretl | [] [] [] () | gsasl | [] [] | gss | [] [] | gst-plugins-bad | [] [] [] [] | gst-plugins-base | [] [] [] [] | gst-plugins-good | [] [] [] [] [] | gst-plugins-ugly | [] [] [] [] | gstreamer | [] [] [] | gtick | [] [] [] | gtkam | [] [] [] [] | gtkorphan | [] [] | gtkspell | [] [] [] [] [] [] [] | gutenprint | [] | hello | [] [] [] [] [] [] [] [] [] [] [] [] [] | herrie | [] | hylafax | | idutils | [] [] [] [] [] | indent | [] [] [] [] [] [] [] [] [] [] | iso_15924 | [] | iso_3166 | [] [] [] [] [] [] [] [] [] [] [] [] [] | iso_3166_2 | [] | iso_4217 | [] [] [] [] [] [] | iso_639 | [] [] [] [] [] [] | jpilot | [] [] | jtag | [] | jwhois | [] [] [] [] [] | kbd | [] [] | keytouch | [] [] [] | keytouch-editor | [] | keytouch-keyboa... | [] [] | latrine | [] [] | ld | [] [] [] [] | leafpad | [] [] [] [] [] [] | libc | [] [] [] [] [] | libexif | [] | libextractor | [] | libgpewidget | [] [] [] [] [] | libgpg-error | [] | libgphoto2 | [] [] [] | libgphoto2_port | [] [] | libgsasl | [] [] | libiconv | [] [] [] | libidn | [] [] | lifelines | () | lilypond | [] [] [] | lingoteach | [] [] [] | lprng | | lynx | [] [] [] | m4 | [] [] [] [] | mailfromd | | mailutils | [] [] | make | [] [] [] [] [] [] [] [] | man-db | [] | minicom | [] [] [] [] | nano | [] [] [] [] [] [] [] | opcodes | [] [] [] [] | parted | [] [] [] | pilot-qof | | popt | [] [] [] [] | psmisc | [] [] | pwdutils | | qof | [] | radius | [] [] | recode | [] [] [] [] [] [] [] [] | rpm | [] [] | screem | | scrollkeeper | [] [] [] | sed | [] [] [] [] [] | shared-mime-info | [] [] [] [] [] [] | sharutils | [] [] [] [] [] [] [] [] | shishi | [] | skencil | [] [] | solfege | [] | soundtracker | [] [] [] | sp | [] | system-tools-ba... | [] [] [] [] [] [] [] [] [] | tar | [] [] [] [] [] | texinfo | [] [] [] | tin | [] () | tuxpaint | [] [] | unicode-han-tra... | | unicode-transla... | [] [] | util-linux | [] [] [] [] [] [] [] | util-linux-ng | [] [] [] [] [] [] [] | vorbis-tools | | wastesedge | () | wdiff | [] [] [] [] [] [] [] [] | wget | [] [] [] [] [] [] [] [] | xchat | [] [] [] [] [] [] [] | xkeyboard-config | [] [] [] [] | xpad | [] [] [] | +--------------------------------------------------+ es et eu fa fi fr ga gl gu he hi hr hu id is it 85 22 14 2 48 101 61 12 2 8 2 6 53 29 1 52 ja ka ko ku ky lg lt lv mk mn ms mt nb ne nl nn +--------------------------------------------------+ Compendium | [] | a2ps | () [] [] | aegis | () | ant-phone | [] | anubis | [] [] [] | ap-utils | [] | aspell | [] [] | bash | [] | bfd | | bibshelf | [] | binutils | | bison | [] [] [] | bison-runtime | [] [] [] | bluez-pin | [] [] [] | cflow | | clisp | [] | console-tools | | coreutils | [] | cpio | [] | cpplib | [] | cryptonit | [] | dialog | [] [] | diffutils | [] [] [] | doodle | | e2fsprogs | [] | enscript | [] | fetchmail | [] [] | findutils | [] | findutils_stable | [] | flex | [] [] | fslint | | gas | | gawk | [] [] | gcal | | gcc | | gettext-examples | [] [] [] | gettext-runtime | [] [] [] | gettext-tools | [] [] | gip | [] [] | gliv | [] | glunarclock | [] [] | gmult | [] [] [] | gnubiff | | gnucash | () () () | gnuedu | | gnulib | [] [] | gnunet | | gnunet-gtk | | gnutls | [] | gpe-aerial | [] | gpe-beam | [] | gpe-calendar | [] | gpe-clock | [] [] [] | gpe-conf | [] [] [] | gpe-contacts | [] | gpe-edit | [] [] [] | gpe-filemanager | [] [] | gpe-go | [] [] [] | gpe-login | [] [] [] | gpe-ownerinfo | [] [] | gpe-package | [] [] | gpe-sketchbook | [] [] | gpe-su | [] [] [] | gpe-taskmanager | [] [] [] [] | gpe-timesheet | [] | gpe-today | [] [] | gpe-todo | [] | gphoto2 | [] [] | gprof | [] | gpsdrive | [] | gramadoir | () | grep | [] [] | gretl | | gsasl | [] | gss | | gst-plugins-bad | [] | gst-plugins-base | [] | gst-plugins-good | [] | gst-plugins-ugly | [] | gstreamer | [] | gtick | [] | gtkam | [] [] | gtkorphan | [] | gtkspell | [] [] | gutenprint | [] | hello | [] [] [] [] [] [] [] | herrie | [] | hylafax | | idutils | [] | indent | [] [] | iso_15924 | [] | iso_3166 | [] [] [] [] [] [] [] [] | iso_3166_2 | [] | iso_4217 | [] [] [] | iso_639 | [] [] [] [] | jpilot | () () | jtag | | jwhois | [] | kbd | [] | keytouch | [] | keytouch-editor | [] | keytouch-keyboa... | | latrine | [] | ld | | leafpad | [] [] | libc | [] [] [] | libexif | | libextractor | | libgpewidget | [] | libgpg-error | | libgphoto2 | [] | libgphoto2_port | [] | libgsasl | [] | libiconv | [] | libidn | [] [] | lifelines | [] | lilypond | [] | lingoteach | [] | lprng | | lynx | [] [] | m4 | [] [] | mailfromd | | mailutils | | make | [] [] [] | man-db | | minicom | [] | nano | [] [] [] | opcodes | [] | parted | [] [] | pilot-qof | | popt | [] [] [] | psmisc | [] [] [] | pwdutils | | qof | | radius | | recode | [] | rpm | [] [] | screem | [] | scrollkeeper | [] [] [] [] | sed | [] [] | shared-mime-info | [] [] [] [] [] [] [] | sharutils | [] [] | shishi | | skencil | | solfege | () () | soundtracker | | sp | () | system-tools-ba... | [] [] [] [] | tar | [] [] [] | texinfo | [] [] | tin | | tuxpaint | () [] [] | unicode-han-tra... | | unicode-transla... | | util-linux | [] [] | util-linux-ng | [] [] | vorbis-tools | | wastesedge | [] | wdiff | [] [] | wget | [] [] | xchat | [] [] [] [] | xkeyboard-config | [] [] [] | xpad | [] [] [] | +--------------------------------------------------+ ja ka ko ku ky lg lt lv mk mn ms mt nb ne nl nn 51 2 25 3 2 0 6 0 2 2 20 0 11 1 103 6 or pa pl pt pt_BR rm ro ru rw sk sl sq sr sv ta +--------------------------------------------------+ Compendium | [] [] [] [] [] | a2ps | () [] [] [] [] [] [] | aegis | () () | ant-phone | [] [] | anubis | [] [] [] | ap-utils | () | aspell | [] [] [] | bash | [] [] | bfd | | bibshelf | [] | binutils | [] [] | bison | [] [] [] [] [] | bison-runtime | [] [] [] [] [] | bluez-pin | [] [] [] [] [] [] [] [] [] | cflow | [] | clisp | [] | console-tools | [] | coreutils | [] [] [] [] | cpio | [] [] [] | cpplib | [] | cryptonit | [] [] | dialog | [] | diffutils | [] [] [] [] [] [] | doodle | [] [] | e2fsprogs | [] [] | enscript | [] [] [] [] [] | fetchmail | [] [] [] | findutils | [] [] [] | findutils_stable | [] [] [] [] [] [] | flex | [] [] [] [] [] | fslint | [] | gas | | gawk | [] [] [] [] | gcal | [] | gcc | [] [] | gettext-examples | [] [] [] [] [] [] [] [] | gettext-runtime | [] [] [] [] [] [] [] [] | gettext-tools | [] [] [] [] [] [] [] | gip | [] [] [] [] | gliv | [] [] [] [] [] [] | glunarclock | [] [] [] [] [] [] | gmult | [] [] [] [] | gnubiff | () [] | gnucash | () [] | gnuedu | | gnulib | [] [] [] | gnunet | | gnunet-gtk | [] | gnutls | [] [] | gpe-aerial | [] [] [] [] [] [] [] | gpe-beam | [] [] [] [] [] [] [] | gpe-calendar | [] [] [] [] | gpe-clock | [] [] [] [] [] [] [] [] | gpe-conf | [] [] [] [] [] [] [] | gpe-contacts | [] [] [] [] [] | gpe-edit | [] [] [] [] [] [] [] [] [] | gpe-filemanager | [] [] | gpe-go | [] [] [] [] [] [] [] [] | gpe-login | [] [] [] [] [] [] [] [] | gpe-ownerinfo | [] [] [] [] [] [] [] [] | gpe-package | [] [] | gpe-sketchbook | [] [] [] [] [] [] [] [] | gpe-su | [] [] [] [] [] [] [] [] | gpe-taskmanager | [] [] [] [] [] [] [] [] | gpe-timesheet | [] [] [] [] [] [] [] [] | gpe-today | [] [] [] [] [] [] [] [] | gpe-todo | [] [] [] [] | gphoto2 | [] [] [] [] [] [] | gprof | [] [] [] | gpsdrive | [] [] | gramadoir | [] [] | grep | [] [] [] [] | gretl | [] [] [] | gsasl | [] [] [] | gss | [] [] [] [] | gst-plugins-bad | [] [] [] | gst-plugins-base | [] [] | gst-plugins-good | [] [] | gst-plugins-ugly | [] [] [] | gstreamer | [] [] [] [] | gtick | [] | gtkam | [] [] [] [] [] | gtkorphan | [] | gtkspell | [] [] [] [] [] [] [] [] | gutenprint | [] | hello | [] [] [] [] [] [] [] [] | herrie | [] [] [] | hylafax | | idutils | [] [] [] [] [] | indent | [] [] [] [] [] [] [] | iso_15924 | | iso_3166 | [] [] [] [] [] [] [] [] [] [] [] [] [] | iso_3166_2 | | iso_4217 | [] [] [] [] [] [] [] | iso_639 | [] [] [] [] [] [] [] | jpilot | | jtag | [] | jwhois | [] [] [] [] | kbd | [] [] [] | keytouch | [] | keytouch-editor | [] | keytouch-keyboa... | [] | latrine | | ld | [] | leafpad | [] [] [] [] [] [] | libc | [] [] [] [] | libexif | [] [] | libextractor | [] [] | libgpewidget | [] [] [] [] [] [] [] [] | libgpg-error | [] [] [] | libgphoto2 | [] | libgphoto2_port | [] [] [] | libgsasl | [] [] [] [] | libiconv | [] [] [] | libidn | [] [] () | lifelines | [] [] | lilypond | | lingoteach | [] | lprng | [] | lynx | [] [] [] | m4 | [] [] [] [] [] | mailfromd | [] | mailutils | [] [] [] | make | [] [] [] [] | man-db | [] [] [] [] | minicom | [] [] [] [] [] | nano | [] [] [] [] | opcodes | [] [] | parted | [] | pilot-qof | | popt | [] [] [] [] | psmisc | [] [] | pwdutils | [] [] | qof | [] [] | radius | [] [] | recode | [] [] [] [] [] [] [] | rpm | [] [] [] [] | screem | | scrollkeeper | [] [] [] [] [] [] [] | sed | [] [] [] [] [] [] [] [] [] | shared-mime-info | [] [] [] [] [] [] | sharutils | [] [] [] [] | shishi | [] | skencil | [] [] [] | solfege | [] | soundtracker | [] [] | sp | | system-tools-ba... | [] [] [] [] [] [] [] [] [] | tar | [] [] [] [] | texinfo | [] [] [] [] | tin | () | tuxpaint | [] [] [] [] [] [] | unicode-han-tra... | | unicode-transla... | | util-linux | [] [] [] [] | util-linux-ng | [] [] [] [] | vorbis-tools | [] | wastesedge | | wdiff | [] [] [] [] [] [] [] | wget | [] [] [] [] | xchat | [] [] [] [] [] [] [] | xkeyboard-config | [] [] [] | xpad | [] [] [] | +--------------------------------------------------+ or pa pl pt pt_BR rm ro ru rw sk sl sq sr sv ta 0 5 77 31 53 4 58 72 3 45 46 9 45 122 3 tg th tk tr uk ven vi wa xh zh_CN zh_HK zh_TW zu +---------------------------------------------------+ Compendium | [] [] [] [] | 19 a2ps | [] [] [] | 19 aegis | [] | 1 ant-phone | [] [] | 6 anubis | [] [] [] | 11 ap-utils | () [] | 4 aspell | [] [] [] | 16 bash | [] | 6 bfd | | 2 bibshelf | [] | 7 binutils | [] [] [] [] | 9 bison | [] [] [] [] | 20 bison-runtime | [] [] [] [] | 18 bluez-pin | [] [] [] [] [] [] | 28 cflow | [] [] | 5 clisp | | 9 console-tools | [] [] | 5 coreutils | [] [] [] | 18 cpio | [] [] [] [] | 11 cpplib | [] [] [] [] [] | 12 cryptonit | [] | 6 dialog | [] [] [] | 9 diffutils | [] [] [] [] [] | 29 doodle | [] | 6 e2fsprogs | [] [] | 10 enscript | [] [] [] | 16 fetchmail | [] [] | 12 findutils | [] [] [] | 11 findutils_stable | [] [] [] [] | 18 flex | [] [] | 15 fslint | [] | 2 gas | [] | 3 gawk | [] [] [] | 16 gcal | [] | 5 gcc | [] [] [] | 7 gettext-examples | [] [] [] [] [] [] | 29 gettext-runtime | [] [] [] [] [] [] | 28 gettext-tools | [] [] [] [] [] | 20 gip | [] [] | 13 gliv | [] [] | 11 glunarclock | [] [] [] | 15 gmult | [] [] [] [] | 16 gnubiff | [] | 2 gnucash | () [] | 5 gnuedu | [] | 2 gnulib | [] | 10 gnunet | | 0 gnunet-gtk | [] [] | 3 gnutls | | 4 gpe-aerial | [] [] | 14 gpe-beam | [] [] | 14 gpe-calendar | [] [] | 7 gpe-clock | [] [] [] [] | 21 gpe-conf | [] [] [] | 16 gpe-contacts | [] [] | 10 gpe-edit | [] [] [] [] [] | 22 gpe-filemanager | [] [] | 7 gpe-go | [] [] [] [] | 19 gpe-login | [] [] [] [] [] | 21 gpe-ownerinfo | [] [] [] [] | 21 gpe-package | [] | 6 gpe-sketchbook | [] [] | 16 gpe-su | [] [] [] [] | 21 gpe-taskmanager | [] [] [] [] | 21 gpe-timesheet | [] [] [] [] | 18 gpe-today | [] [] [] [] [] | 21 gpe-todo | [] [] | 8 gphoto2 | [] [] [] [] | 21 gprof | [] [] | 13 gpsdrive | [] | 5 gramadoir | [] | 7 grep | [] | 12 gretl | | 6 gsasl | [] [] [] | 9 gss | [] | 7 gst-plugins-bad | [] [] [] | 13 gst-plugins-base | [] [] | 11 gst-plugins-good | [] [] [] [] [] | 16 gst-plugins-ugly | [] [] [] | 13 gstreamer | [] [] [] | 18 gtick | [] [] | 7 gtkam | [] | 16 gtkorphan | [] | 7 gtkspell | [] [] [] [] [] [] | 27 gutenprint | | 4 hello | [] [] [] [] [] | 38 herrie | [] [] | 8 hylafax | | 0 idutils | [] [] | 15 indent | [] [] [] [] [] | 28 iso_15924 | [] [] | 4 iso_3166 | [] [] [] [] [] [] [] [] [] | 54 iso_3166_2 | [] [] | 4 iso_4217 | [] [] [] [] [] | 24 iso_639 | [] [] [] [] [] | 26 jpilot | [] [] [] [] | 7 jtag | [] | 3 jwhois | [] [] [] | 13 kbd | [] [] [] | 13 keytouch | [] | 8 keytouch-editor | [] | 5 keytouch-keyboa... | [] | 5 latrine | [] [] | 5 ld | [] [] [] [] | 10 leafpad | [] [] [] [] [] | 24 libc | [] [] [] | 19 libexif | [] | 5 libextractor | [] | 5 libgpewidget | [] [] [] | 20 libgpg-error | [] | 6 libgphoto2 | [] [] | 9 libgphoto2_port | [] [] [] | 11 libgsasl | [] | 8 libiconv | [] [] | 11 libidn | [] [] | 11 lifelines | | 4 lilypond | [] | 6 lingoteach | [] | 6 lprng | [] | 2 lynx | [] [] [] | 15 m4 | [] [] [] | 18 mailfromd | [] [] | 3 mailutils | [] [] | 8 make | [] [] [] | 20 man-db | [] | 9 minicom | [] | 14 nano | [] [] [] | 20 opcodes | [] [] | 10 parted | [] [] [] | 11 pilot-qof | [] | 1 popt | [] [] [] [] | 18 psmisc | [] [] | 10 pwdutils | [] | 3 qof | [] | 4 radius | [] [] | 7 recode | [] [] [] | 25 rpm | [] [] [] [] | 13 screem | [] | 2 scrollkeeper | [] [] [] [] | 26 sed | [] [] [] [] | 23 shared-mime-info | [] [] [] | 29 sharutils | [] [] [] | 23 shishi | [] | 3 skencil | [] | 7 solfege | [] | 3 soundtracker | [] [] | 9 sp | [] | 3 system-tools-ba... | [] [] [] [] [] [] [] | 38 tar | [] [] [] | 17 texinfo | [] [] [] | 15 tin | | 1 tuxpaint | [] [] [] | 19 unicode-han-tra... | | 0 unicode-transla... | | 2 util-linux | [] [] [] | 20 util-linux-ng | [] [] [] | 20 vorbis-tools | [] [] | 4 wastesedge | | 1 wdiff | [] [] | 23 wget | [] [] [] | 20 xchat | [] [] [] [] | 29 xkeyboard-config | [] [] [] | 14 xpad | [] [] [] | 15 +---------------------------------------------------+ 76 teams tg th tk tr uk ven vi wa xh zh_CN zh_HK zh_TW zu 163 domains 0 3 1 74 51 0 143 21 1 57 7 45 0 2036 Some counters in the preceding matrix are higher than the number of visible blocks let us expect. This is because a few extra PO files are used for implementing regional variants of languages, or language dialects. For a PO file in the matrix above to be effective, the package to which it applies should also have been internationalized and distributed as such by its maintainer. There might be an observable lag between the mere existence a PO file and its wide availability in a distribution. If November 2007 seems to be old, you may fetch a more recent copy of this `ABOUT-NLS' file on most GNU archive sites. The most up-to-date matrix with full percentage details can be found at `http://translationproject.org/extra/matrix.html'. 1.6 Using `gettext' in new packages =================================== If you are writing a freely available program and want to internationalize it you are welcome to use GNU `gettext' in your package. Of course you have to respect the GNU Library General Public License which covers the use of the GNU `gettext' library. This means in particular that even non-free programs can use `libintl' as a shared library, whereas only free software can use `libintl' as a static library or use modified versions of `libintl'. Once the sources are changed appropriately and the setup can handle the use of `gettext' the only thing missing are the translations. The Free Translation Project is also available for packages which are not developed inside the GNU project. Therefore the information given above applies also for every other Free Software Project. Contact `coordinator@translationproject.org' to make the `.pot' files available to the translation teams. parcellite-1.2.1/data/0000755000175000017500000000000013041603201012640 5ustar hlehleparcellite-1.2.1/data/parcellite.desktop.in0000644000175000017500000000042313041603201016763 0ustar hlehle[Desktop Entry] _Name=Parcellite _GenericName=Clipboard Manager _Comment=Lightweight GTK+ clipboard manager Icon=parcellite Exec=parcellite Terminal=false Type=Application Categories=GTK;GNOME;Application;Utility; OnlyShowIn=GNOME;KDE;LXDE;MATE;Razor;ROX;TDE;Unity;XFCE;Old; parcellite-1.2.1/data/parcellite.xpm0000644000175000017500000005367213041603201015527 0ustar hlehle/* XPM */ static char * parcellite_xpm[] = { "60 60 935 2", " c None", ". c #FDFDFD", "+ c #BBCDCC", "@ c #ABC2BD", "# c #A9C2B9", "$ c #A7C2B6", "% c #A5C2B2", "& c #A4C2AF", "* c #A2C2AB", "= c #A0C2A7", "- c #9EC2A3", "; c #9CC2A0", "> c #9BC29C", ", c #ABCCAB", "' c #FCFDFC", ") c #91ADAC", "! c #2D665A", "~ c #286651", "{ c #246648", "] c #1F663F", "^ c #1B6636", "/ c #16662D", "( c #116623", "_ c #0D661A", ": c #086611", "< c #046608", "[ c #006500", "} c #006005", "| c #76A77B", "1 c #E7EDED", "2 c #336A5F", "3 c #8BBC8E", "4 c #D1F5CC", "5 c #CCF3C8", "6 c #C1EFBC", "7 c #B5EBB0", "8 c #A9E8A4", "9 c #9DE498", "0 c #94DD94", "a c #8DD694", "b c #87D193", "c c #7ECB8A", "d c #258B21", "e c #075A17", "f c #E1EBE3", "g c #7FA29B", "h c #337158", "i c #C1F5BB", "j c #E9FFE9", "k c #EAFFEA", "l c #92D979", "m c #045715", "n c #649373", "o c #E1E9E8", "p c #2B6854", "q c #80C581", "r c #B5F5B2", "s c #C3FCC3", "t c #B7F5B2", "u c #298724", "v c #044C20", "w c #DBE5E0", "x c #FFE1D9", "y c #FE8567", "z c #FD6944", "A c #FC6844", "B c #FB6844", "C c #FA6744", "D c #F96744", "E c #F86644", "F c #F76644", "G c #F56644", "H c #F56544", "I c #F46544", "J c #F36444", "K c #71654D", "L c #2E724D", "M c #9FEB9B", "N c #A5F2A5", "O c #67CC58", "P c #034B20", "Q c #504C30", "R c #DE5C44", "S c #DD5C44", "T c #DD5B44", "U c #DB5B44", "V c #DA5B44", "W c #D95B44", "X c #D85A44", "Y c #D75944", "Z c #D65944", "` c #D55944", " . c #D45944", ".. c #DB7767", "+. c #F6DFDB", "@. c #FFF2EF", "#. c #FE4518", "$. c #FC3200", "%. c #FB3E06", "&. c #F93C07", "*. c #F83B07", "=. c #F63A07", "-. c #F53907", ";. c #F33907", ">. c #F23807", ",. c #F13807", "'. c #EF3707", "). c #CE3F13", "!. c #266547", "~. c #6DC26F", "{. c #85E584", "]. c #86E786", "^. c #7EE27C", "/. c #1A7B21", "(. c #023F26", "_. c #B1300D", ":. c #D32C07", "<. c #D12C07", "[. c #D02B07", "}. c #CE2B07", "|. c #CE2A07", "1. c #CC2907", "2. c #CB2907", "3. c #CA2807", "4. c #C82807", "5. c #CA2A06", "6. c #C11B00", "7. c #C63018", "8. c #FBF1EF", "9. c #FFC1B2", "0. c #FE7F25", "a. c #FFBD71", "b. c #FFCD68", "c. c #FFC55C", "d. c #FFC358", "e. c #6C844D", "f. c #2A7445", "g. c #7EDF7C", "h. c #68DD68", "i. c #3DBB37", "j. c #024427", "k. c #53663A", "l. c #FFC760", "m. c #FFBC71", "n. c #F37A25", "o. c #BF1A00", "p. c #EBBAB2", "q. c #FEB7A5", "r. c #FB3100", "s. c #FE8424", "t. c #FFC77F", "u. c #FFC154", "v. c #FF8A00", "w. c #D5830E", "x. c #20673F", "y. c #58BD5D", "z. c #52D452", "A. c #49D349", "B. c #44CF44", "C. c #087419", "D. c #01392D", "E. c #CE7909", "F. c #FF8F07", "G. c #FFCC66", "H. c #F98224", "I. c #BD1900", "J. c #E7ADA5", "K. c #FEB6A5", "L. c #F93100", "M. c #FFBD4E", "N. c #FF8D00", "O. c #62722C", "P. c #24753A", "Q. c #5BD25C", "R. c #2DC633", "S. c #16AB1A", "T. c #003E2B", "U. c #4B4E22", "V. c #BB1800", "W. c #FDB6A5", "X. c #F83000", "Y. c #FFBE4E", "Z. c #FF9000", "`. c #CE860E", " + c #48B84D", ".+ c #28BA3B", "++ c #1AB333", "@+ c #18B030", "#+ c #026D18", "$+ c #003530", "%+ c #C67C0B", "&+ c #BA1800", "*+ c #E6ADA5", "=+ c #F73000", "-+ c #FFBF4E", ";+ c #FF9300", ">+ c #F69107", ",+ c #B98234", "'+ c #99784B", ")+ c #436C3D", "!+ c #1F7631", "~+ c #3EBE3F", "{+ c #018807", "]+ c #008304", "^+ c #003C2C", "/+ c #304537", "(+ c #996B44", "_+ c #B9782E", ":+ c #F78F05", "<+ c #B81700", "[+ c #FCB6A5", "}+ c #F52F00", "|+ c #FF9600", "1+ c #E18E16", "2+ c #255CA1", "3+ c #1762C5", "4+ c #2B6ECD", "5+ c #1A684D", "6+ c #167124", "7+ c #0E7318", "8+ c #066B0E", "9+ c #036B06", "0+ c #006A00", "a+ c #006604", "b+ c #006109", "c+ c #005D0D", "d+ c #005A10", "e+ c #005713", "f+ c #005316", "g+ c #00501A", "h+ c #004D1D", "i+ c #004B1E", "j+ c #004921", "k+ c #004722", "l+ c #004624", "m+ c #004426", "n+ c #004326", "o+ c #004327", "p+ c #00392E", "q+ c #073950", "r+ c #2151BE", "s+ c #113FB3", "t+ c #253C8E", "u+ c #E18914", "v+ c #F88224", "w+ c #B71700", "x+ c #E5ADA5", "y+ c #FBB6A5", "z+ c #F42E00", "A+ c #FE8625", "B+ c #FFC87F", "C+ c #FFC04E", "D+ c #FF9800", "E+ c #576A7C", "F+ c #4986D8", "G+ c #C6DDFE", "H+ c #D6E6FF", "I+ c #A4C6C9", "J+ c #3D8551", "K+ c #308041", "L+ c #2D8039", "M+ c #2A7F33", "N+ c #2A7A37", "O+ c #2A753C", "P+ c #2A7140", "Q+ c #2A6E43", "R+ c #296B46", "S+ c #296749", "T+ c #29644D", "U+ c #296150", "V+ c #295F51", "W+ c #295D54", "X+ c #285B55", "Y+ c #285957", "Z+ c #285759", "`+ c #285659", " @ c #275659", ".@ c #27565A", "+@ c #27555B", "@@ c #2E5B63", "#@ c #91B0CD", "$@ c #BFD8FF", "%@ c #AACAFE", "&@ c #3563CC", "*@ c #59506B", "=@ c #B61600", "-@ c #FBB5A5", ";@ c #F22E00", ">@ c #FE8926", ",@ c #FFC980", "'@ c #FF9B00", ")@ c #225BA2", "!@ c #8EB8F2", "~@ c #FDFEFF", "{@ c #FFFFFF", "]@ c #FEFEFF", "^@ c #FBFDFF", "/@ c #FAFCFF", "(@ c #F9FCFF", "_@ c #F8FBFF", ":@ c #F7FBFF", "<@ c #F6FAFF", "[@ c #F5FAFF", "}@ c #F1F7FF", "|@ c #6D99ED", "1@ c #22388E", "2@ c #B41600", "3@ c #E4ACA5", "4@ c #FAB5A5", "5@ c #F12D00", "6@ c #FE8B27", "7@ c #FFCA80", "8@ c #FFC14E", "9@ c #FF9E00", "0@ c #1E59A5", "a@ c #95BCF4", "b@ c #000000", "c@ c #060606", "d@ c #151515", "e@ c #2B2B2B", "f@ c #5B5B5C", "g@ c #98999A", "h@ c #EDEFF2", "i@ c #F4FAFF", "j@ c #F4F9FF", "k@ c #739FF0", "l@ c #1E3590", "m@ c #B31500", "n@ c #E3ACA5", "o@ c #F02D00", "p@ c #FD8D27", "q@ c #FFCB80", "r@ c #FFC24E", "s@ c #FFA100", "t@ c #1E58A4", "u@ c #97BDF4", "v@ c #0B0B0B", "w@ c #7E8082", "x@ c #F3F7FB", "y@ c #F2F8FF", "z@ c #74A0F0", "A@ c #B11400", "B@ c #EE2C00", "C@ c #FD8F28", "D@ c #FFCC81", "E@ c #FFC34E", "F@ c #FFA400", "G@ c #1E57A3", "H@ c #98BEF3", "I@ c #3F4041", "J@ c #EEF3F8", "K@ c #76A1F0", "L@ c #1E338F", "M@ c #B01400", "N@ c #F9B5A5", "O@ c #ED2C00", "P@ c #FD9129", "Q@ c #FFCD81", "R@ c #FFA700", "S@ c #1E56A2", "T@ c #99BEF3", "U@ c #F4F6F8", "V@ c #DCDEE0", "W@ c #A2A3A5", "X@ c #373738", "Y@ c #5C5E60", "Z@ c #F1F8FF", "`@ c #77A1F0", " # c #1E3594", ".# c #FFB830", "+# c #FFB72C", "@# c #AF1300", "## c #E2ACA5", "$# c #EB2B00", "%# c #FD932A", "&# c #FFCE81", "*# c #FFC452", "=# c #FFAB0F", "-# c #1E55A4", ";# c #9ABFF3", "># c #F7FAFE", ",# c #737577", "'# c #010101", ")# c #C3C8CE", "!# c #EFF7FF", "~# c #78A1F0", "{# c #1E3699", "]# c #AD1300", "^# c #E2ABA5", "/# c #F8B4A5", "(# c #EA2A00", "_# c #FD952A", ":# c #FFCF82", "<# c #FFC555", "[# c #FFAE1E", "}# c #1E54A5", "|# c #9CC0F3", "1# c #404243", "2# c #6B6E71", "3# c #79A2F0", "4# c #1E3599", "5# c #F78224", "6# c #AC1200", "7# c #E1ABA5", "8# c #E82A00", "9# c #FD982B", "0# c #FFD082", "a# c #FFC659", "b# c #FFB22D", "c# c #1E54A6", "d# c #ABAFB3", "e# c #2D2F30", "f# c #ECF6FF", "g# c #6796EE", "h# c #1E3398", "i# c #AA1200", "j# c #F7B4A5", "k# c #E72900", "l# c #FD9A2C", "m# c #FFD183", "n# c #FFC75C", "o# c #FFB63C", "p# c #1E53A7", "q# c #9EC1F3", "r# c #E0E4EA", "s# c #141415", "t# c #E9F3FF", "u# c #E3F2FF", "v# c #E1F0FF", "w# c #427AE8", "x# c #1E3297", "y# c #A91100", "z# c #E0ABA5", "A# c #F7B3A5", "B# c #E52900", "C# c #FC9B2C", "D# c #FFD283", "E# c #FFC860", "F# c #FFBA4B", "G# c #1E53A9", "H# c #9FC2F3", "I# c #EDF3FA", "J# c #040505", "K# c #E2F1FF", "L# c #E0EFFF", "M# c #437CE8", "N# c #A81100", "O# c #F6B3A5", "P# c #E42800", "Q# c #FC9D2E", "R# c #FFD383", "S# c #FFC861", "T# c #FFBC50", "U# c #1E52A8", "V# c #A1C3F3", "W# c #DCE3E9", "X# c #131415", "Y# c #DEEEFF", "Z# c #457DE8", "`# c #1E3097", " $ c #F78525", ".$ c #A61000", "+$ c #DFAAA5", "@$ c #F5B3A5", "#$ c #E22800", "$$ c #FCA02E", "%$ c #FFD483", "&$ c #1E50A7", "*$ c #F0F7FF", "=$ c #A2AAB2", "-$ c #2B2E31", ";$ c #DCEEFF", ">$ c #467DE8", ",$ c #1E2F96", "'$ c #F78726", ")$ c #A40F00", "!$ c #E12700", "~$ c #FCA22F", "{$ c #FFD584", "]$ c #1E4FA6", "^$ c #A3C3F3", "/$ c #EEF7FF", "($ c #E7F3FF", "_$ c #3D4144", ":$ c #636A71", "<$ c #DBEDFF", "[$ c #497EE8", "}$ c #1E2E95", "|$ c #F78827", "1$ c #A30F00", "2$ c #DEAAA5", "3$ c #F4B3A5", "4$ c #E02700", "5$ c #FCA430", "6$ c #FFD684", "7$ c #1E4EA6", "8$ c #A3C4F3", "9$ c #EDF6FF", "0$ c #E6F2FE", "a$ c #6E747A", "b$ c #B2BECC", "c$ c #D9ECFF", "d$ c #4A80E7", "e$ c #1E2C94", "f$ c #F78A27", "g$ c #A10E00", "h$ c #DDAAA5", "i$ c #DE2600", "j$ c #FCA530", "k$ c #FFD785", "l$ c #1E4DA5", "m$ c #A5C5F2", "n$ c #ECF2F9", "o$ c #D0D9E2", "p$ c #969EA6", "q$ c #35383B", "r$ c #50565C", "s$ c #D8EBFF", "t$ c #4C80E7", "u$ c #1E2B93", "v$ c #F68C28", "w$ c #A00E00", "x$ c #F3B2A5", "y$ c #DD2500", "z$ c #FBA732", "A$ c #FFD885", "B$ c #1E4CA4", "C$ c #A6C5F2", "D$ c #33373B", "E$ c #D4E6F6", "F$ c #D6EBFF", "G$ c #4D81E7", "H$ c #F68E29", "I$ c #9F0D00", "J$ c #DCAAA5", "K$ c #DB2500", "L$ c #FBA932", "M$ c #1E4BA3", "N$ c #A7C6F2", "O$ c #080809", "P$ c #6B737B", "Q$ c #D7E8F9", "R$ c #D5EAFF", "S$ c #4F82E7", "T$ c #1E2992", "U$ c #FFCE82", "V$ c #F6902A", "W$ c #9D0D00", "X$ c #DCA9A5", "Y$ c #F2B2A5", "Z$ c #DA2400", "`$ c #FBAB33", " % c #FFDA86", ".% c #1E4AA3", "+% c #A8C6F2", "@% c #121314", "#% c #25282A", "$% c #4F555A", "%% c #858E97", "&% c #D0DFEF", "*% c #D3E9FF", "=% c #5182E7", "-% c #1E2891", ";% c #F5932A", ">% c #9C0C00", ",% c #DBA9A5", "'% c #D82400", ")% c #FBAE34", "!% c #1E49A5", "~% c #AAC7F2", "{% c #EAF4FF", "]% c #E8F4FF", "^% c #E5F2FF", "/% c #E4F1FF", "(% c #D2E8FF", "_% c #5384E7", ":% c #1E2790", "<% c #F5952B", "[% c #9A0B00", "}% c #F1B2A5", "|% c #D72300", "1% c #FBB034", "2% c #FFDB86", "3% c #FFBC51", "4% c #FFC65D", "5% c #ABC7F1", "6% c #D0E8FF", "7% c #5484E6", "8% c #1E2590", "9% c #F5972C", "0% c #990B00", "a% c #F1B1A5", "b% c #D62300", "c% c #FBB235", "d% c #FFDD87", "e% c #FFC962", "f% c #1E49A4", "g% c #ACC8F1", "h% c #CEE7FF", "i% c #5685E6", "j% c #1E248F", "k% c #F5982C", "l% c #980A00", "m% c #DAA9A5", "n% c #D42200", "o% c #FBB436", "p% c #1E47A4", "q% c #A1C0EF", "r% c #CDE6FF", "s% c #5886E6", "t% c #1E238F", "u% c #F59B2E", "v% c #960A00", "w% c #DAA8A5", "x% c #F0B1A5", "y% c #D22100", "z% c #FBB637", "A% c #FFDE88", "B% c #1E46A3", "C% c #8BB2EB", "D% c #F3F9FF", "E% c #CCE5FF", "F% c #5987E6", "G% c #1E228E", "H% c #FFD484", "I% c #F59D2E", "J% c #950900", "K% c #D9A8A5", "L% c #EFB1A5", "M% c #D12100", "N% c #FAB837", "O% c #FFDF88", "P% c #1E45A2", "Q% c #8DB3EB", "R% c #ECF5FF", "S% c #CAE5FF", "T% c #5B88E6", "U% c #1E218E", "V% c #F59F2F", "W% c #930900", "X% c #D02000", "Y% c #FABA38", "Z% c #FFE088", "`% c #1E43A1", " & c #8EB3EB", ".& c #C9E4FF", "+& c #5D89E6", "@& c #1E208D", "#& c #FFD685", "$& c #F5A230", "%& c #920800", "&& c #D8A8A5", "*& c #EEB0A5", "=& c #CE2000", "-& c #FABD39", ";& c #FFE188", ">& c #1E42A1", ",& c #90B4EB", "'& c #C7E3FF", ")& c #5F89E5", "!& c #1E1F8C", "~& c #F5A330", "{& c #900800", "]& c #D7A7A5", "^& c #CD1F00", "/& c #FABF3A", "(& c #FFE289", "_& c #1E41A0", ":& c #91B6EA", "<& c #C6E2FF", "[& c #608BE5", "}& c #1E1D8B", "|& c #F4A532", "1& c #8F0700", "2& c #EDB0A5", "3& c #CB1F00", "4& c #FAC13B", "5& c #FFE389", "6& c #1E419F", "7& c #94B5EA", "8& c #C4E2FF", "9& c #628BE5", "0& c #1E1C8B", "a& c #FFD985", "b& c #F4A632", "c& c #8D0600", "d& c #D6A7A5", "e& c #CA1E00", "f& c #FAC33B", "g& c #FFE48A", "h& c #1E3F9E", "i& c #95B7EA", "j& c #C2E1FF", "k& c #638CE5", "l& c #1E1C8A", "m& c #F4A933", "n& c #8C0600", "o& c #ECB0A5", "p& c #C81D00", "q& c #FAC53C", "r& c #FFE58A", "s& c #1E3E9E", "t& c #97B8EA", "u& c #C1E0FF", "v& c #658DE5", "w& c #1E1A89", "x& c #F4AB34", "y& c #8A0500", "z& c #D5A7A5", "A& c #ECAFA5", "B& c #C71D00", "C& c #FAC73D", "D& c #FFE68A", "E& c #2F489A", "F& c #7FA0DE", "G& c #B6D9FF", "H& c #5677D6", "I& c #302785", "J& c #FFDC87", "K& c #F4AD34", "L& c #890500", "M& c #D5A6A5", "N& c #EBAFA5", "O& c #C61C00", "P& c #F9CA3E", "Q& c #FFE78B", "R& c #8A8082", "S& c #173DAD", "T& c #89A9E2", "U& c #A2C0ED", "V& c #A1BFED", "W& c #9FBEED", "X& c #9DBDED", "Y& c #9BBBED", "Z& c #9ABAED", "`& c #98B8EC", " * c #97B7EC", ".* c #93B5EC", "+* c #93B4EC", "@* c #91B3EC", "#* c #8FB1EC", "$* c #8DB0EC", "%* c #8BAEEB", "&* c #8AADEB", "** c #88ABEB", "=* c #86A9EB", "-* c #85A8EB", ";* c #83A7EB", ">* c #81A5EA", ",* c #7FA4EA", "'* c #7DA2EA", ")* c #7BA2EA", "!* c #7AA0EA", "~* c #789FEA", "{* c #769DEA", "]* c #6082DB", "^* c #10169A", "/* c #8A6E78", "(* c #F4AF35", "_* c #880400", ":* c #D4A6A5", "<* c #C41C00", "[* c #F9CC3F", "}* c #FFE88B", "|* c #FCCA67", "1* c #837B83", "2* c #21399A", "3* c #0023A1", "4* c #0022A0", "5* c #0021A0", "6* c #001F9F", "7* c #001E9E", "8* c #001D9D", "9* c #001B9D", "0* c #001A9C", "a* c #00199B", "b* c #00179A", "c* c #001699", "d* c #001599", "e* c #001398", "f* c #001297", "g* c #001196", "h* c #000F96", "i* c #000E95", "j* c #000D94", "k* c #000B93", "l* c #000A93", "m* c #000992", "n* c #000891", "o* c #000690", "p* c #000590", "q* c #00048F", "r* c #00028E", "s* c #211B88", "t* c #846A79", "u* c #FFDE87", "v* c #F4B136", "w* c #860400", "x* c #EAAFA5", "y* c #C31B00", "z* c #F9CE3F", "A* c #FFE98B", "B* c #F3B337", "C* c #850300", "D* c #D3A6A5", "E* c #F9CF40", "F* c #FFF099", "G* c #FFD171", "H* c #FFCF6E", "I* c #FFE695", "J* c #F3B537", "K* c #830200", "L* c #E9AFA5", "M* c #C01A00", "N* c #F9D141", "O* c #FFF8A7", "P* c #FFFFDE", "Q* c #FFEDA3", "R* c #F3B839", "S* c #820200", "T* c #D3A5A5", "U* c #E9AEA5", "V* c #F8CF3D", "W* c #FFEC45", "X* c #FFEF65", "Y* c #FFEE64", "Z* c #FFED64", "`* c #FFEC64", " = c #FFEB64", ".= c #FFEB63", "+= c #FFEA63", "@= c #FFE963", "#= c #FFE962", "$= c #FFE862", "%= c #FFE762", "&= c #FFE662", "*= c #FFE561", "== c #FFE461", "-= c #FFE361", ";= c #FFE360", ">= c #FFE260", ",= c #FFE160", "'= c #FFE060", ")= c #FFDF5F", "!= c #FFDE5F", "~= c #FFDD5E", "{= c #FFDC5E", "]= c #FFDB5E", "^= c #FFDA5D", "/= c #FFCF39", "(= c #F2B634", "_= c #810100", ":= c #D2A5A5", "<= c #E9B2A9", "[= c #F5C635", "}= c #FFED2F", "|= c #FFEC2E", "1= c #FFEB2E", "2= c #FFEA2D", "3= c #FFE92D", "4= c #FFE82D", "5= c #FFE72D", "6= c #FFE62C", "7= c #FFE52C", "8= c #FFE42B", "9= c #FFE32B", "0= c #FFE22B", "a= c #FFE12A", "b= c #FFE02A", "c= c #FFDF29", "d= c #FFDE29", "e= c #FFDD29", "f= c #FFDC28", "g= c #FFDB28", "h= c #FFDA28", "i= c #FFD927", "j= c #FFD827", "k= c #FFD727", "l= c #FFD626", "m= c #FFD526", "n= c #FFD425", "o= c #FFD325", "p= c #FFD225", "q= c #FFD124", "r= c #FFD024", "s= c #FFCF24", "t= c #FFCE23", "u= c #FFCD23", "v= c #FFCC23", "w= c #FFCB22", "x= c #ECAD2D", "y= c #7F0100", "z= c #D3A9A9", "A= c #F6E1DE", "B= c #BC1D05", "C= c #C63C0E", "D= c #E08727", "E= c #DF8727", "F= c #DE8727", "G= c #DE8627", "H= c #DD8627", "I= c #DC8526", "J= c #DC8426", "K= c #DA8426", "L= c #DA8326", "M= c #D98226", "N= c #D88226", "O= c #D88126", "P= c #D68026", "Q= c #D68025", "R= c #D57F25", "S= c #D57E25", "T= c #D47E25", "U= c #D37D25", "V= c #D27C25", "W= c #D17C25", "X= c #D07B24", "Y= c #D07A24", "Z= c #CF7A24", "`= c #CE7924", " - c #CD7924", ".- c #CC7724", "+- c #CB7624", "@- c #CA7623", "#- c #CA7523", "$- c #C97523", "%- c #C87323", "&- c #C77323", "*- c #96250C", "=- c #810505", "-- c #EFDFDF", ";- c #E7AEA6", ">- c #C1331F", ",- c #8E2020", "'- c #D2A7A7", " ", " ", " . + @ # $ % & * = - ; > , ' ", " ) ! ~ { ] ^ / ( _ : < [ } | ", " 1 2 3 4 5 6 7 8 9 0 a b c d e f ", " g h i j k k k k k k k k k l m n ", " o p q r s s s s s s s s s s t u v w ", " x y z A B C D E F G H I J K L M N N N N N N N N N N N N O P Q R S T U V W X Y Z ` ...+. ", " @.#.$.%.&.*.*.=.-.;.>.,.'.).!.~.{.].].].].].].].].].].].].^./.(._.:.<.[.}.|.1.2.3.4.5.6.7.8. ", " 9.$.0.a.b.c.d.d.d.d.d.d.d.e.f.g.h.h.h.h.h.h.h.h.h.h.h.h.h.h.i.j.k.d.d.d.d.d.d.d.l.b.m.n.o.p. ", " q.r.s.t.u.v.v.v.v.v.v.v.w.x.y.z.A.A.A.A.A.A.A.A.A.A.A.A.A.A.B.C.D.E.v.v.v.v.v.v.F.G.t.H.I.J. ", " K.L.s.t.M.N.N.N.N.N.N.N.O.P.Q.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.S.T.U.N.N.N.N.N.N.N.G.t.H.V.J. ", " W.X.s.t.Y.Z.Z.Z.Z.Z.Z.`.^ +.+++++++++++++++++++++++++++++++++@+#+$+%+Z.Z.Z.Z.Z.Z.G.t.H.&+*+ ", " W.=+s.t.-+;+;+;+>+,+'+)+!+~+{+{+{+{+{+{+{+{+{+{+{+{+{+{+{+{+{+{+]+^+/+(+_+:+;+;+;+G.t.H.<+*+ ", " [+}+s.t.-+|+|+1+2+3+4+5+6+7+8+9+0+a+b+c+d+e+f+g+h+i+j+k+l+m+n+n+o+p+q+r+s+t+u+|+|+G.t.v+w+x+ ", " y+z+A+B+C+D+D+E+F+G+H+I+J+K+L+M+N+O+P+Q+R+S+T+U+V+W+X+Y+Z+`+ @.@+@@@#@$@%@&@*@D+D+G.t.v+=@x+ ", " -@;@>@,@C+'@'@)@!@~@{@{@{@{@{@{@{@{@{@{@{@{@{@{@{@]@~@~@^@^@/@(@_@:@<@[@}@|@1@'@'@G.t.v+2@3@ ", " 4@5@6@7@8@9@9@0@a@{@{@{@{@{@{@b@b@b@b@b@b@b@b@b@c@d@e@f@g@h@(@_@:@<@[@i@j@k@l@9@9@G.t.v+m@n@ ", " 4@o@p@q@r@s@s@t@u@{@{@{@{@{@{@b@b@b@b@b@b@b@b@b@b@b@b@b@b@v@w@x@<@[@i@j@y@z@l@s@s@G.t.v+A@n@ ", " 4@B@C@D@E@F@F@G@H@{@{@{@{@{@{@b@b@b@b@b@b@b@b@b@b@b@b@b@b@b@b@I@J@i@j@y@y@K@L@F@F@G.t.v+M@n@ ", " N@O@P@Q@E@R@R@S@T@{@{@{@{@{@{@b@b@b@b@{@{@]@~@~@U@V@W@X@b@b@b@b@Y@j@y@y@Z@`@ #.#+#G.t.v+@### ", " N@$#%#&#*#=#=#-#;#{@{@{@{@{@{@b@b@b@b@{@]@~@~@^@^@/@(@>#,#b@b@b@'#)#y@Z@!#~#{#G.G.G.t.v+]#^# ", " /#(#_#:#<#[#[#}#|#{@{@{@{@{@{@b@b@b@b@]@~@~@^@^@/@(@_@:@<@1#b@b@b@2#Z@!#!#3#4#G.G.G.t.5#6#7# ", " /#8#9#0#a#b#b#c#|#{@{@{@{@{@{@b@b@b@b@~@~@^@^@/@(@_@:@<@[@d#b@b@b@e#!#!#f#g#h#G.G.G.t.5#i#7# ", " j#k#l#m#n#o#o#p#q#{@{@{@{@{@{@b@b@b@b@~@^@^@/@(@_@:@<@[@i@r#b@b@b@s#t#u#v#w#x#G.G.G.t.5#y#z# ", " A#B#C#D#E#F#F#G#H#{@{@{@{@{@{@b@b@b@b@^@^@/@(@_@:@<@[@i@j@I#b@b@b@J#K#v#L#M#x#G.G.G.B+5#N#z# ", " O#P#Q#R#S#T#T#U#V#{@{@{@{@{@{@b@b@b@b@^@/@(@_@:@<@[@i@j@y@W#b@b@b@X#v#L#Y#Z#`#G.G.G.,@ $.$+$ ", " @$#$$$%$S#T#T#&$V#{@{@{@{@{@]@b@b@b@b@/@(@_@:@<@[@i@j@y@*$=$b@b@b@-$L#Y#;$>$,$G.G.G.7@'$)$+$ ", " @$!$~${$S#T#T#]$^${@{@{@{@]@~@b@b@b@b@(@_@:@<@[@i@j@y@/$($_$b@b@b@:$Y#;$<$[$}$G.G.G.q@|$1$2$ ", " 3$4$5$6$S#T#T#7$8${@{@{@]@~@~@b@b@b@b@_@:@<@[@i@j@y@9$0$a$b@b@b@'#b$;$<$c$d$e$G.G.G.q@f$g$h$ ", " 3$i$j$k$S#T#T#l$m${@{@]@~@~@^@b@b@b@b@:@<@[@i@j@n$o$p$q$b@b@b@b@r$;$<$c$s$t$u$G.G.G.D@v$w$h$ ", " x$y$z$A$S#T#T#B$C${@]@~@~@^@^@b@b@b@b@b@b@b@b@b@b@b@b@b@b@b@b@D$E$<$c$s$F$G$u$G.G.G.&#H$I$J$ ", " x$K$L$A$S#T#T#M$N$]@~@~@^@^@/@b@b@b@b@b@b@b@b@b@b@b@b@b@b@O$P$Q$<$c$s$F$R$S$T$G.G.G.U$V$W$X$ ", " Y$Z$`$ %S#T#T#.%+%~@~@^@^@/@(@b@b@b@b@b@b@b@b@b@J#@%#%$%%%&%;$<$c$s$F$R$*%=%-%G.G.G.0#;%>%,% ", " Y$'%)% %S#T#T#!%~%~@^@^@/@(@_@b@b@b@b@*${%]%($^%/%K#v#L#Y#;$<$c$s$F$R$*%(%_%:%G.G.G.0#<%[%,% ", " }%|%1%2%S#3%4%!%5%^@^@/@(@_@:@b@b@b@b@{%]%($^%/%K#v#L#Y#;$<$c$s$F$R$*%(%6%7%8%G.G.G.m#9%0%,% ", " a%b%c%d%e%S#G.f%g%^@/@(@_@:@[@b@b@b@b@]%($^%/%K#v#L#Y#;$<$c$s$F$R$*%(%6%h%i%j%G.G.G.D#k%l%m% ", " a%n%o%d%G.G.G.p%q%_@_@<@j@}@!#b@b@b@b@($^%/%K#v#L#Y#;$<$c$s$F$R$*%(%6%h%r%s%t%G.G.G.R#u%v%w% ", " x%y%z%A%G.G.G.B%C%[@D%y@*$!#9$b@b@b@b@^%/%K#v#L#Y#;$<$c$s$F$R$*%(%6%h%r%E%F%G%G.G.G.H%I%J%K% ", " L%M%N%O%G.G.G.P%Q%D%y@*$!#9$R%b@b@b@b@/%K#v#L#Y#;$<$c$s$F$R$*%(%6%h%r%E%S%T%U%G.G.G.{$V%W%K% ", " L%X%Y%Z%G.G.G.`% &y@*$!#9$R%{%b@b@b@b@K#v#L#Y#;$<$c$s$F$R$*%(%6%h%r%E%S%.&+&@&G.G.G.#&$&%&&& ", " *&=&-&;&G.G.G.>&,&*$!#9$R%{%]%b@b@b@b@v#L#Y#;$<$c$s$F$R$*%(%6%h%r%E%S%.&'&)&!&G.G.G.k$~&{&]& ", " *&^&/&(&G.G.G._&:&!#9$R%{%]%($b@b@b@b@L#Y#;$<$c$s$F$R$*%(%6%h%r%E%S%.&'&<&[&}&G.G.G.A$|&1&]& ", " 2&3&4&5&G.G.G.6&7&9$R%{%]%($^%b@b@b@b@Y#;$<$c$s$F$R$*%(%6%h%r%E%S%.&'&<&8&9&0&G.G.G.a&b&c&d& ", " 2&e&f&g&G.G.G.h&i&R%{%]%($^%/%b@b@b@b@;$<$c$s$F$R$*%(%6%h%r%E%S%.&'&<&8&j&k&l&G.G.G. %m&n&d& ", " o&p&q&r&G.G.G.s&t&{%]%($^%/%K#b@b@b@b@<$c$s$F$R$*%(%6%h%r%E%S%.&'&<&8&j&u&v&w&G.G.G.2%x&y&z& ", " A&B&C&D&G.G.G.E&F&K#($^%/%K#v#L#Y#;$<$c$s$F$R$*%(%6%h%r%E%S%.&'&<&8&j&u&G&H&I&G.G.G.J&K&L&M& ", " N&O&P&Q&G.G.G.R&S&T&U&V&W&X&Y&Z&`& *.*+*@*#*$*%*&***=*-*;*>*,*'*)*!*~*{*]*^*/*G.G.G.d%(*_*:* ", " N&<*[*}*G.G.G.|*1*2*3*4*5*6*7*8*9*0*a*b*c*d*e*f*g*h*i*j*k*l*m*n*o*p*q*r*s*t*|*G.G.G.u*v*w*:* ", " x*y*z*A*G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.O%B*C*D* ", " x*6.E*F*G*H*H*H*H*H*H*H*H*H*H*H*H*H*H*H*H*H*H*H*H*H*H*H*H*H*H*H*H*H*H*H*H*H*H*H*H*G*I*J*K*D* ", " L*M*N*O*P*P*P*P*P*P*P*P*P*P*P*P*P*P*P*P*P*P*P*P*P*P*P*P*P*P*P*P*P*P*P*P*P*P*P*P*P*P*Q*R*S*T* ", " U*o.V*W*X*X*X*Y*Z*Z*`* = =.=+=@=#=$=%=%=%=&=*=====-=;=>=,=,='='=)=)=!=~=~={={=]=]=^=/=(=_=:= ", " <=I.[=}=|=|=1=2=3=4=5=6=6=7=8=9=0=a=b=b=c=d=e=f=g=h=i=j=k=k=l=m=n=o=p=q=q=r=s=t=u=v=w=x=y=z= ", " A=B=C=D=E=F=G=H=I=J=J=K=L=M=M=N=O=P=Q=R=S=T=T=U=V=V=W=X=Y=Z=`=`= -.-.-+-@-#-$-$-%-%-&-*-=--- ", " ;->-w+=@2@m@A@M@@#]#6#i#y#N#.$)$1$g$w$I$W$>%[%0%l%v%J%W%%&{&1&c&n&y&L&_*w*C*K*S*_=y=,-'- ", " ", " ", " ", " "}; parcellite-1.2.1/data/parcellite-startup.desktop.in0000644000175000017500000000023313041603201020462 0ustar hlehle[Desktop Entry] _Name=Parcellite _Comment=Clipboard Manager Icon=parcellite Exec=parcellite Terminal=false Type=Application X-GNOME-Autostart-enabled=true parcellite-1.2.1/data/Makefile.am0000644000175000017500000000276113041603201014702 0ustar hlehle## Process this file with automake to produce Makefile.in ## ## Copyright (C) 2010 Doug Springer (gpib at rickyrockrat dot net) ## ## This file is part of parcellite. ## Parcellite is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 3 of the License, or ## (at your option) any later version. ## ## Parcellite is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program. If not, see . @INTLTOOL_DESKTOP_RULE@ xdgdatadir=@XDGDATADIR@ app_name=parcellite app_icon_files = \ $(app_name:%=%.png) \ $(app_name:%=%.svg) \ $(app_name:%=%.xpm) desktopdir = $(datadir)/applications desktop_in_file = $(app_name:%=%.desktop.in) desktop_DATA = $(app_name:%=%.desktop) autostartdir = $(sysconfdir)/xdg/autostart autostart_in_file = $(app_name:%=%-startup.desktop.in) autostart_DATA = $(app_name:%=%-startup.desktop) pixmapdir = $(datadir)/pixmaps pixmap_DATA = $(app_icon_files) EXTRA_DIST = \ $(desktop_in_file) \ $(autostart_in_file) \ $(app_icon_files) CLEANFILES = \ $(desktop_DATA) \ $(autostart_DATA) DISTCLEANFILES = \ $(desktop_DATA) \ $(autostart_DATA) parcellite-1.2.1/data/parcellite.png0000644000175000017500000000506313041603201015476 0ustar hlehlePNG  IHDR<<:rsRGBbKGD pHYs  tIME &2l IDAThyl?ovk;^ipB"@B-)j9I MQKU#T*,P 4)UR)JHs@ Tj@$@B8%^k5~cgvwvgYr=i4{3~]%"|'?ȇkekDGјh2hL Is} ,$`GoG6!Mcfq͔C,;lQ,:/ MF13F,Ǔ&$B<g(i#%֯pL?oi`Gٕ<|>:*=Y}/ FݙݾƝ8m>'v7]'NW{w~P ^ mgIL9eQyp}[C!5Y޿>ǜc< Y߇I Z- fऴ3N1M`g݊Kce-Xwϑ!_/_tJvZ(+S>Aa(8%הM^(tft^d᠁Dkk+s8k_CC$R PS o!kZӍ n*ȑ#ڵU+}Zwq;itVnÏIXVs.y$IX⚭.VAk!cmo'\Ewt )ag#a_CdKRrlX"M͎q(I7/妓ʿ)aYx`@t19VJXT SQXv(RS1ni9ڞF T*Ζ(Fv4XS i1nޗ΁OWJU)[*&71ش)m9[6=_$_Pk/U$a-,pt.$)~۶CKc.^S:ȁlD 1T]9-M,@]<wFcCesPU$ƪ7h~Sm$+璇b#6/jx z1(_=B!8vr+tt5,.XCj/6@ Բd5ɿ+7.jѸ8'rQzd) . #dP%~j띮ģN+WPUZ)hh`)&J昖kJ6 :$42=k؜rY8-=2Nl, W5-8Q|Xx%f a⪥xPK%n`DzJ g%,E"$\V*ːp +C\zt`s] X 4B@z9Jj{n6eK>%ڵ oyjxö MO.gPP񨸈U8ޤ/F"3Q f߀TM$ -Ii-=륾.HqmSE@kAL]P^>~CgU˖\$H|a'Z嫏ǹNhKq%,%VXfx&a I3|p$WīާF8:>6;F G!ѽ&(&2U踸[NWAlO{5Wqs^R(b;_z/9}. eo2RXցHA\/p5Osu=ً 1kl6_># -%EynOq7M9wEGOǭ}){/f\V*IENDB`parcellite-1.2.1/data/parcellite.svg0000644000175000017500000071616313041603201015523 0ustar hlehle image/svg+xml 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 moRrhZymSnJt4x2Ey94vBu4oJpWUe6oAlGySqciaiGc5J7TA9EI2iwKGhzD4gsZy9Rwy8/YQIIQ/ BZrK6KNZjfmWE2sBBDH4nLQP3Xu02VzJ3Nq0xh6FLiHHYWEsgIse+SuQA1psXo0xjC8cepFON+mF XFcbOEIWOfGONAn1DPRtCJTzEQtcKpaYrtDRoXOWI5DMeJ+id6NPLtuOZbq7RHQxjVg4nq3HYLOp ScLKJ7TZ15WLBfQ90QktxHBrOMO44rkKKg2HQ4CCRRP0PNoeWoG1HEox7GqhOBa0Zo8VKGZXZJCB ir52sfFDxjCBcrHhQiF5o3pukgI3FExL0MAZN4IrU6IwGJodaiwqT8arYzpCMuRQIdzG6RY8yhGF 8WCJVZzIaXgJWIIRK3QkEu9O8pP5fHY9M5MvlbKlWlp4HhxbIQfkd4uzU+37CxOFYv40/x27ms1W a/mK6qofmrh08NX7HLgHn9C2LaRc5mFGnXA+RvOttq0CRVSN/owyrqqiTimo7an/WKrjo9jrWLaW PZ1R4onlHXz1ztSrP5LfRz7ykR/t/xp/H2n5Pe8R7YlfK1n2iUO/dpTZp09nynyYidOVMh9a+vRI mQ8hfTZFmQ8VfbZAmQ8JfbZMmZ0m0XMfzLNTZstj2/aun2Uwz2V4e+S3T5nOv33KdP7tU6bzb58y nX/7lOnw26dMh98+ZTr/9inT4bdPmQ6/fcp0+O1Tpt1vnzL7v83+PiRrZguC3AeVMh31oe4k+uCd TZsiyBYo9iL+tpcmHwDK7ARBXnTK7ChNXlDK7AJNXkTK7BpZXiDK7CZNXhTK7D5N9j5lnhdN9jJl ni9N6Pe8aZDye94k4d/zJkPD73kTo+H3vInBv+dNhpTf8yYJ/J43DdJ/+zRp99unSbvfPk3a/fZp 0uG3T5MOv32adPjtE6TDb58gXX/7BPkREuHAs6+Vtr8DH/34x17eqQ4OfOz1N37m06+8tEOtH7Tu 3R85/ImdGf5Lnx5/7/1fvD/w+o4M/6XXr73/f/zxN0pjOzL8l16f+fa//as//73Pq+F/fNvbV63/ 9vf/9m++/y+/URo/9tp2t4+t/90Pf/D//vnv/XeFse1un1r/0Y/+7m/+8v/859z+S507OHDgpYbf gfbVpfUf/fAHf03tH//Mp1QHLe/oNl/++Cdfe934vfbJtOpNrev2S3Pnj3+W30l+SZufPX7uyvUZ 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 wc5O9jrn+uf/ABFKfQU= P parcellite-1.2.1/data/parcellite.appdata.xml0000644000175000017500000000307613041603201017125 0ustar hlehle parcellite.desktop CC0-1.0 GPL-3.0+ Parcellit Clipboard History Manager

Parcellite is an application that runs in the background and monitors the clipboard(s), storing each copy in a list that can be chosen as the current entry later.

This uses a hot key to pop up a history list. Clicking on an entry in the list will set that entry as the current clipboard selection. When the list is filled, it will start deleting the oldest entries. There is a persistent list that never goes away in addition to the normal history. Right-clicking on any of the entries in either list will allow you to move it to the other list. There are many settings on how to process text placed in the history (deleting whitespace, newlines, tabs, etc.). The entire history can be saved to a file.

http://parcellite.sourceforge.net/wp-content/uploads/preferences.png http://parcellite.sourceforge.net/wp-content/uploads/preferences-display1.png http://parcellite.sourceforge.net gpib at rickyrockrat dot net Parcellite
parcellite-1.2.1/autogen.sh0000755000175000017500000000222113041603201013725 0ustar hlehle#!/bin/sh echo "gettextize..." GETTEXTIZE="gettextize" ($GETTEXTIZE --version) < /dev/null > /dev/null 2>&1 || { echo "gettextize not found" exit 1 } if test "$GETTEXTIZE"; then echo "Creating $dr/aclocal.m4 ..." test -r aclocal.m4 || touch aclocal.m4 echo "Running $GETTEXTIZE... Ignore non-fatal messages." echo "no" | $GETTEXTIZE --force --copy echo "Making aclocal.m4 writable ..." test -r aclocal.m4 && chmod u+w aclocal.m4 fi echo "intltoolize..." (intltoolize --version) < /dev/null > /dev/null 2>&1 || { echo echo "intltoolize not found" exit 1 } intltoolize --copy --force --automake echo "aclocal..." (aclocal --version) < /dev/null > /dev/null 2>&1 || { echo "aclocal not found" exit 1 } aclocal -I m4 echo "autoheader..." (autoheader --version) < /dev/null > /dev/null 2>&1 || { echo "autoheader not found" exit 1 } autoheader echo "automake..." (automake --version) < /dev/null > /dev/null 2>&1 || { echo "automake not found" exit 1 } automake --add-missing --copy --gnu echo "autoconf..." (autoconf --version) < /dev/null > /dev/null 2>&1 || { echo "autoconf not found" exit 1 } autoconf echo "now run configure" exit 0 parcellite-1.2.1/.gitignore0000644000175000017500000000003013041603201013710 0ustar hlehletsestate.dat nohup.out parcellite-1.2.1/rel.ppa.sh0000755000175000017500000000153113041603201013627 0ustar hlehle#!/bin/bash # Copyright (C) 2011-2013 by rickyrockrat # # This file is part of Parcellite. # # Parcellite is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # Parcellite is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . . ./rel.common set_abs_path cd "$CDIR" set_scm_local check_local 1 ask_version test_tag_co setup_ppa parcellite-1.2.1/doc/0000755000175000017500000000000013041603201012474 5ustar hlehleparcellite-1.2.1/doc/Makefile.am0000644000175000017500000000006113041603201014525 0ustar hlehleman_MANS = parcellite.1 EXTRA_DIST = $(man_MANS) parcellite-1.2.1/doc/parcellite.10000644000175000017500000001137713041603201014713 0ustar hlehle.TH PARCELLITE 1 "August 7 2011" .SH NAME Parcellite \- Lightweight GTK+ Clipboard Manager .SH SYNOPSIS .B parcellite [\fIOPTION\fR] .SH DESCRIPTION \fBParcellite\fR is a lightweight GTK+ clipboard manager. This is a stripped down, basic\-features\-only clipboard manager with a small memory footprint for those who like simplicity. \fBParcellite\fR features a clipboard CLI. Unrecognized options and the contents of your standard input get copied to your clipboard. See \fBCLI EXAMPLES\fR. .B Look at the tool tips by hovering over each item in the prefrences dialog. .SH .B OPTIONS .TP .B \-?\fR, \fB\-\-help Show help options .TP Parcellite by default runs as daemon. In this mode \fBParcellite\fR will keep your clipboard and primary contents safe. It also displays the status Icon (depending on -n) and preferences. .TP .B \-n\fR, \fB\-\-no-icon Do not use status icon .TP .B \-c\fR, \fB\-\-clipboard Print clipboard contents .B \-p\fR, \fB\-\-primary Print primary contents .SH ACTIONS \fBParcellite's\fR actions perform commands using the contents of your clipboard. "\fB%s\fR" in the command is replaced with the clipboard contents. Use double quotes "\fB%s\fR" to expand env variables like $HOME to /home/your_name Use single quotes '%s' to feed your action with env variables without shell expansion. Use %% if you want a literal %. See the man page for gnuC printf (man 2 printf) for more information. .SH CLI EXAMPLES echo "copied to clipboard" | parcellite parcellite "copied to clipboard" echo "copied to clipboard" | parcellite \-c .SH Hotkeys The available hotkey modifiers are , , , , , , .SH Preferences Right-click on the parcellite icon in the systray to access the preferences. .SH Behavior Tab .TP .B Clipboards generally checking all these boxes is appropriate. .TP .B History Check 'Save history' to save history on close. 'Position history' - Set the location where history appears. If unchecked, appears where the mouse is. 'X' - X location in pixels. 0 is top of screen. 'Y' - Y location in pixels. 0 is left of screen. 'Max Data Size (MB)' - Set Maximum amount of data to copy for each entry in MBytes. 0 is no limit. .TP .B Miscellaneous 'Search As You Type' - If checked, does a search-as-you-type. Turns red if not found. Goes to top (Alt-E) line when no chars are entered for search 'Case Sensitive Search' - If checked, does case sensitive search. 'Ignore Whitespace Only' - If checked, will ignore any clipboard additions that contain only whitespace. 'Trim Whitespace' - If checked, will trim whitespace from beginning and end of entry. 'Trim Newlines' - If checked, will replace newlines with spaces. .SH Display Tab .TP 'Show in Single line' does nothing. .TP 'Show in reverse order' reverses the history so the first entry is last and the last is first. .TP 'Persistent History' Adds a list that is permanent and never goes away. .TP 'Persistent As Separate List' Enables the persistent history hotkey, and the persistent history will appear with this key. .TP 'Persistent On Top' If the above option is checked, this has no effect. Otherwise, if this option is checked the Persistent History will appear on the top of the list. Unchecked, it appears on the bottom. .TP 'Paste All Entry Delimiter' Delimiter to denote start of a history entry. .TP 'Alternate Non-printing Display' If checked, displays tabs, newlines, and spaces with alternate characters. .TP 'Omit items' refers to omitting characters that don't fit in the history window width. This is for display only. .TP 'Multiuser' If checked, enables checking for multiple users. .TP 'Parcellite Icon Name' Sets the name of the Parcellite icon. This name is used by gnome, which usually looks in /usr/share/pixmaps. See the Open Desktop Spec for more details. .SH History Dialog Behavior .TP Use the Ctrl or Shift key in conjunction with right-click. .TP If you hold Ctrl, then it toggles the delete on a single item. .TP If you hold Shift while holding down right-click (this is like a right-drag), then it toggles each item as it enters the item. .TP To complete the delete, hit enter. .SH SEE ALSO .PP Website: http://parcellite.sourceforge.net .SH AUTHOR Written by Gilberto "Xyhthyx" Miralla . Gilberto is no longer maintaining the project. 'Rickyrockrat' is his replacement. .SH BUGS Please include your ~/.config/parcellite/parcelliterc file when filing a bug. This will give me your preferences. Please report any bugs to the bug tracker via this web page: http://sourceforge.net/projects/parcellite/support Click on 'Bugs' under 'Project Trackers' to file a bug if you are registered with Source Forge. If not, email rickyrockrat (rickyrockrat at users.sourceforge.net), or click the 'project administers' in the link above. parcellite-1.2.1/TODO0000644000175000017500000000057613041603201012427 0ustar hlehle+ Dialog with listed history contents for searching and removing. + Static entries. + Add auto-update of Wordpress: scp user@shell.sourceforge.net:/home/project-web/parcellite/htdocs/wp-content/uploads/js_cache/tinymce_1a60aaf59360855aa0d7d0c5a41c8ef5.gz + Add visual feedback when using the history search function. + Have Alt-e edit the highlighted text, not currently selected. parcellite-1.2.1/intltool-update.in0000644000175000017500000007442613041603201015420 0ustar hlehle#!@INTLTOOL_PERL@ -w # -*- Mode: perl; indent-tabs-mode: nil; c-basic-offset: 4 -*- # # The Intltool Message Updater # # Copyright (C) 2000-2003 Free Software Foundation. # # Intltool is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # version 2 published by the Free Software Foundation. # # Intltool is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # # Authors: Kenneth Christiansen # Maciej Stachowiak # Darin Adler ## Release information my $PROGRAM = "intltool-update"; my $VERSION = "0.37.1"; my $PACKAGE = "intltool"; ## Loaded modules use strict; use Getopt::Long; use Cwd; use File::Copy; use File::Find; ## Scalars used by the option stuff my $HELP_ARG = 0; my $VERSION_ARG = 0; my $DIST_ARG = 0; my $POT_ARG = 0; my $HEADERS_ARG = 0; my $MAINTAIN_ARG = 0; my $REPORT_ARG = 0; my $VERBOSE = 0; my $GETTEXT_PACKAGE = ""; my $OUTPUT_FILE = ""; my @languages; my %varhash = (); my %po_files_by_lang = (); # Regular expressions to categorize file types. # FIXME: Please check if the following is correct my $xml_support = "xml(?:\\.in)*|". # http://www.w3.org/XML/ (Note: .in is not required) "ui|". # Bonobo specific - User Interface desc. files "lang|". # ? "glade2?(?:\\.in)*|". # Glade specific - User Interface desc. files (Note: .in is not required) "scm(?:\\.in)*|". # ? (Note: .in is not required) "oaf(?:\\.in)+|". # DEPRECATED: Replaces by Bonobo .server files "etspec|". # ? "server(?:\\.in)+|". # Bonobo specific "sheet(?:\\.in)+|". # ? "schemas(?:\\.in)+|". # GConf specific "pong(?:\\.in)+|". # DEPRECATED: PONG is not used [by GNOME] any longer. "kbd(?:\\.in)+|". # GOK specific. "policy(?:\\.in)+"; # PolicyKit files my $ini_support = "icon(?:\\.in)+|". # http://www.freedesktop.org/Standards/icon-theme-spec "desktop(?:\\.in)+|". # http://www.freedesktop.org/Standards/menu-spec "caves(?:\\.in)+|". # GNOME Games specific "directory(?:\\.in)+|". # http://www.freedesktop.org/Standards/menu-spec "soundlist(?:\\.in)+|". # GNOME specific "keys(?:\\.in)+|". # GNOME Mime database specific "theme(?:\\.in)+|". # http://www.freedesktop.org/Standards/icon-theme-spec "service(?:\\.in)+"; # DBus specific my $buildin_gettext_support = "c|y|cs|cc|cpp|c\\+\\+|h|hh|gob|py"; ## Always flush buffer when printing $| = 1; ## Sometimes the source tree will be rooted somewhere else. my $SRCDIR = $ENV{"srcdir"} || "."; my $POTFILES_in; $POTFILES_in = "<$SRCDIR/POTFILES.in"; my $devnull = ($^O eq 'MSWin32' ? 'NUL:' : '/dev/null'); ## Handle options GetOptions ( "help" => \$HELP_ARG, "version" => \$VERSION_ARG, "dist|d" => \$DIST_ARG, "pot|p" => \$POT_ARG, "headers|s" => \$HEADERS_ARG, "maintain|m" => \$MAINTAIN_ARG, "report|r" => \$REPORT_ARG, "verbose|x" => \$VERBOSE, "gettext-package|g=s" => \$GETTEXT_PACKAGE, "output-file|o=s" => \$OUTPUT_FILE, ) or &Console_WriteError_InvalidOption; &Console_Write_IntltoolHelp if $HELP_ARG; &Console_Write_IntltoolVersion if $VERSION_ARG; my $arg_count = ($DIST_ARG > 0) + ($POT_ARG > 0) + ($HEADERS_ARG > 0) + ($MAINTAIN_ARG > 0) + ($REPORT_ARG > 0); &Console_Write_IntltoolHelp if $arg_count > 1; my $PKGNAME = FindPackageName (); # --version and --help don't require a module name my $MODULE = $GETTEXT_PACKAGE || $PKGNAME || "unknown"; if ($POT_ARG) { &GenerateHeaders; &GeneratePOTemplate; } elsif ($HEADERS_ARG) { &GenerateHeaders; } elsif ($MAINTAIN_ARG) { &FindLeftoutFiles; } elsif ($REPORT_ARG) { &GenerateHeaders; &GeneratePOTemplate; &Console_Write_CoverageReport; } elsif ((defined $ARGV[0]) && $ARGV[0] =~ /^[a-z]/) { my $lang = $ARGV[0]; ## Report error if the language file supplied ## to the command line is non-existent &Console_WriteError_NotExisting("$SRCDIR/$lang.po") if ! -s "$SRCDIR/$lang.po"; if (!$DIST_ARG) { print "Working, please wait..." if $VERBOSE; &GenerateHeaders; &GeneratePOTemplate; } &POFile_Update ($lang, $OUTPUT_FILE); &Console_Write_TranslationStatus ($lang, $OUTPUT_FILE); } else { &Console_Write_IntltoolHelp; } exit; ######### sub Console_Write_IntltoolVersion { print <<_EOF_; ${PROGRAM} (${PACKAGE}) $VERSION Written by Kenneth Christiansen, Maciej Stachowiak, and Darin Adler. Copyright (C) 2000-2003 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. _EOF_ exit; } sub Console_Write_IntltoolHelp { print <<_EOF_; Usage: ${PROGRAM} [OPTION]... LANGCODE Updates PO template files and merge them with the translations. Mode of operation (only one is allowed): -p, --pot generate the PO template only -s, --headers generate the header files in POTFILES.in -m, --maintain search for left out files from POTFILES.in -r, --report display a status report for the module -d, --dist merge LANGCODE.po with existing PO template Extra options: -g, --gettext-package=NAME override PO template name, useful with --pot -o, --output-file=FILE write merged translation to FILE -x, --verbose display lots of feedback --help display this help and exit --version output version information and exit Examples of use: ${PROGRAM} --pot just create a new PO template ${PROGRAM} xy create new PO template and merge xy.po with it Report bugs to http://bugzilla.gnome.org/ (product name "$PACKAGE") or send email to . _EOF_ exit; } sub echo_n { my $str = shift; my $ret = `echo "$str"`; $ret =~ s/\n$//; # do we need the "s" flag? return $ret; } sub POFile_DetermineType ($) { my $type = $_; my $gettext_type; my $xml_regex = "(?:" . $xml_support . ")"; my $ini_regex = "(?:" . $ini_support . ")"; my $buildin_regex = "(?:" . $buildin_gettext_support . ")"; if ($type =~ /\[type: gettext\/([^\]].*)]/) { $gettext_type=$1; } elsif ($type =~ /schemas(\.in)+$/) { $gettext_type="schemas"; } elsif ($type =~ /glade2?(\.in)*$/) { $gettext_type="glade"; } elsif ($type =~ /scm(\.in)*$/) { $gettext_type="scheme"; } elsif ($type =~ /keys(\.in)+$/) { $gettext_type="keys"; } # bucket types elsif ($type =~ /$xml_regex$/) { $gettext_type="xml"; } elsif ($type =~ /$ini_regex$/) { $gettext_type="ini"; } elsif ($type =~ /$buildin_regex$/) { $gettext_type="buildin"; } else { $gettext_type="unknown"; } return "gettext\/$gettext_type"; } sub TextFile_DetermineEncoding ($) { my $gettext_code="ASCII"; # All files are ASCII by default my $filetype=`file $_ | cut -d ' ' -f 2`; if ($? eq "0") { if ($filetype =~ /^(ISO|UTF)/) { chomp ($gettext_code = $filetype); } elsif ($filetype =~ /^XML/) { $gettext_code="UTF-8"; # We asume that .glade and other .xml files are UTF-8 } } return $gettext_code; } sub isNotValidMissing { my ($file) = @_; return if $file =~ /^\{arch\}\/.*$/; return if $file =~ /^$varhash{"PACKAGE"}-$varhash{"VERSION"}\/.*$/; } sub FindLeftoutFiles { my (@buf_i18n_plain, @buf_i18n_xml, @buf_i18n_xml_unmarked, @buf_i18n_ini, @buf_potfiles, @buf_potfiles_ignore, @buf_allfiles, @buf_allfiles_sorted, @buf_potfiles_sorted, @buf_potfiles_ignore_sorted ); ## Search and find all translatable files find sub { push @buf_i18n_plain, "$File::Find::name" if /\.($buildin_gettext_support)$/; push @buf_i18n_xml, "$File::Find::name" if /\.($xml_support)$/; push @buf_i18n_ini, "$File::Find::name" if /\.($ini_support)$/; push @buf_i18n_xml_unmarked, "$File::Find::name" if /\.(schemas(\.in)+)$/; }, ".."; find sub { push @buf_i18n_plain, "$File::Find::name" if /\.($buildin_gettext_support)$/; push @buf_i18n_xml, "$File::Find::name" if /\.($xml_support)$/; push @buf_i18n_ini, "$File::Find::name" if /\.($ini_support)$/; push @buf_i18n_xml_unmarked, "$File::Find::name" if /\.(schemas(\.in)+)$/; }, "$SRCDIR/.." if "$SRCDIR" ne "."; open POTFILES, $POTFILES_in or die "$PROGRAM: there's no POTFILES.in!\n"; @buf_potfiles = grep !/^(#|\s*$)/, ; close POTFILES; foreach (@buf_potfiles) { s/^\[.*]\s*//; } print "Searching for missing translatable files...\n" if $VERBOSE; ## Check if we should ignore some found files, when ## comparing with POTFILES.in foreach my $ignore ("POTFILES.skip", "POTFILES.ignore") { (-s "$SRCDIR/$ignore") or next; if ("$ignore" eq "POTFILES.ignore") { print "The usage of POTFILES.ignore is deprecated. Please consider moving the\n". "content of this file to POTFILES.skip.\n"; } print "Found $ignore: Ignoring files...\n" if $VERBOSE; open FILE, "<$SRCDIR/$ignore" or die "ERROR: Failed to open $SRCDIR/$ignore!\n"; while () { push @buf_potfiles_ignore, $_ unless /^(#|\s*$)/; } close FILE; @buf_potfiles_ignore_sorted = sort (@buf_potfiles_ignore); } foreach my $file (@buf_i18n_plain) { my $in_comment = 0; my $in_macro = 0; open FILE, "<$file"; while () { # Handle continued multi-line comment. if ($in_comment) { next unless s-.*\*/--; $in_comment = 0; } # Handle continued macro. if ($in_macro) { $in_macro = 0 unless /\\$/; next; } # Handle start of macro (or any preprocessor directive). if (/^\s*\#/) { $in_macro = 1 if /^([^\\]|\\.)*\\$/; next; } # Handle comments and quoted text. while (m-(/\*|//|\'|\")-) # \' and \" keep emacs perl mode happy { my $match = $1; if ($match eq "/*") { if (!s-/\*.*?\*/--) { s-/\*.*--; $in_comment = 1; } } elsif ($match eq "//") { s-//.*--; } else # ' or " { if (!s-$match([^\\]|\\.)*?$match-QUOTEDTEXT-) { warn "mismatched quotes at line $. in $file\n"; s-$match.*--; } } } if (/\w\.GetString *\(QUOTEDTEXT/) { if (defined isNotValidMissing (unpack("x3 A*", $file))) { ## Remove the first 3 chars and add newline push @buf_allfiles, unpack("x3 A*", $file) . "\n"; } last; } ## C_ N_ Q_ and _ are the macros defined in gi8n.h if (/[CNQ]?_ *\(QUOTEDTEXT/) { if (defined isNotValidMissing (unpack("x3 A*", $file))) { ## Remove the first 3 chars and add newline push @buf_allfiles, unpack("x3 A*", $file) . "\n"; } last; } } close FILE; } foreach my $file (@buf_i18n_xml) { open FILE, "<$file"; while () { # FIXME: share the pattern matching code with intltool-extract if (/\s_[-A-Za-z0-9._:]+\s*=\s*\"([^"]+)\"/ || /<_[^>]+>/ || /translatable=\"yes\"/) { if (defined isNotValidMissing (unpack("x3 A*", $file))) { push @buf_allfiles, unpack("x3 A*", $file) . "\n"; } last; } } close FILE; } foreach my $file (@buf_i18n_ini) { open FILE, "<$file"; while () { if (/_(.*)=/) { if (defined isNotValidMissing (unpack("x3 A*", $file))) { push @buf_allfiles, unpack("x3 A*", $file) . "\n"; } last; } } close FILE; } foreach my $file (@buf_i18n_xml_unmarked) { if (defined isNotValidMissing (unpack("x3 A*", $file))) { push @buf_allfiles, unpack("x3 A*", $file) . "\n"; } } @buf_allfiles_sorted = sort (@buf_allfiles); @buf_potfiles_sorted = sort (@buf_potfiles); my %in2; foreach (@buf_potfiles_sorted) { s#^$SRCDIR/../##; s#^$SRCDIR/##; $in2{$_} = 1; } foreach (@buf_potfiles_ignore_sorted) { s#^$SRCDIR/../##; s#^$SRCDIR/##; $in2{$_} = 1; } my @result; foreach (@buf_allfiles_sorted) { my $dummy = $_; my $srcdir = $SRCDIR; $srcdir =~ s#^../##; $dummy =~ s#^$srcdir/../##; $dummy =~ s#^$srcdir/##; $dummy =~ s#_build/##; if (!exists($in2{$dummy})) { push @result, $dummy } } my @buf_potfiles_notexist; foreach (@buf_potfiles_sorted) { chomp (my $dummy = $_); if ("$dummy" ne "" and !(-f "$SRCDIR/../$dummy" or -f "../$dummy")) { push @buf_potfiles_notexist, $_; } } ## Save file with information about the files missing ## if any, and give information about this procedure. if (@result + @buf_potfiles_notexist > 0) { if (@result) { print "\n" if $VERBOSE; unlink "missing"; open OUT, ">missing"; print OUT @result; close OUT; warn "\e[1mThe following files contain translations and are currently not in use. Please\e[0m\n". "\e[1mconsider adding these to the POTFILES.in file, located in the po/ directory.\e[0m\n\n"; print STDERR @result, "\n"; warn "If some of these files are left out on purpose then please add them to\n". "POTFILES.skip instead of POTFILES.in. A file \e[1m'missing'\e[0m containing this list\n". "of left out files has been written in the current directory.\n"; } if (@buf_potfiles_notexist) { unlink "notexist"; open OUT, ">notexist"; print OUT @buf_potfiles_notexist; close OUT; warn "\n" if ($VERBOSE or @result); warn "\e[1mThe following files do not exist anymore:\e[0m\n\n"; warn @buf_potfiles_notexist, "\n"; warn "Please remove them from POTFILES.in. A file \e[1m'notexist'\e[0m\n". "containing this list of absent files has been written in the current directory.\n"; } } ## If there is nothing to complain about, notify the user else { print "\nAll files containing translations are present in POTFILES.in.\n" if $VERBOSE; } } sub Console_WriteError_InvalidOption { ## Handle invalid arguments print STDERR "Try `${PROGRAM} --help' for more information.\n"; exit 1; } sub isProgramInPath { my ($file) = @_; # If either a file exists, or when run it returns 0 exit status return 1 if ((-x $file) or (system("$file --version >$devnull") == 0)); return 0; } sub isGNUGettextTool { my ($file) = @_; # Check that we are using GNU gettext tools if (isProgramInPath ($file)) { my $version = `$file --version`; return 1 if ($version =~ m/.*\(GNU .*\).*/); } return 0; } sub GenerateHeaders { my $EXTRACT = $ENV{"INTLTOOL_EXTRACT"} || "intltool-extract"; ## Generate the .h header files, so we can allow glade and ## xml translation support if (! isProgramInPath ("$EXTRACT")) { print STDERR "\n *** The intltool-extract script wasn't found!" ."\n *** Without it, intltool-update can not generate files.\n"; exit; } else { open (FILE, $POTFILES_in) or die "$PROGRAM: POTFILES.in not found.\n"; while () { chomp; next if /^\[\s*encoding/; ## Find xml files in POTFILES.in and generate the ## files with help from the extract script my $gettext_type= &POFile_DetermineType ($1); if (/\.($xml_support|$ini_support)$/ || /^\[/) { s/^\[[^\[].*]\s*//; my $filename = "../$_"; if ($VERBOSE) { system ($EXTRACT, "--update", "--srcdir=$SRCDIR", "--type=$gettext_type", $filename); } else { system ($EXTRACT, "--update", "--type=$gettext_type", "--srcdir=$SRCDIR", "--quiet", $filename); } } } close FILE; } } # # Generate .pot file from POTFILES.in # sub GeneratePOTemplate { my $XGETTEXT = $ENV{"XGETTEXT"} || "xgettext"; my $XGETTEXT_ARGS = $ENV{"XGETTEXT_ARGS"} || ''; chomp $XGETTEXT; if (! isGNUGettextTool ("$XGETTEXT")) { print STDERR " *** GNU xgettext is not found on this system!\n". " *** Without it, intltool-update can not extract strings.\n"; exit; } print "Building $MODULE.pot...\n" if $VERBOSE; open INFILE, $POTFILES_in; unlink "POTFILES.in.temp"; open OUTFILE, ">POTFILES.in.temp" or die("Cannot open POTFILES.in.temp for writing"); my $gettext_support_nonascii = 0; # checks for GNU gettext >= 0.12 my $dummy = `$XGETTEXT --version --from-code=UTF-8 >$devnull 2>$devnull`; if ($? == 0) { $gettext_support_nonascii = 1; } else { # urge everybody to upgrade gettext print STDERR "WARNING: This version of gettext does not support extracting non-ASCII\n". " strings. That means you should install a version of gettext\n". " that supports non-ASCII strings (such as GNU gettext >= 0.12),\n". " or have to let non-ASCII strings untranslated. (If there is any)\n"; } my $encoding = "ASCII"; my $forced_gettext_code; my @temp_headers; my $encoding_problem_is_reported = 0; while () { next if (/^#/ or /^\s*$/); chomp; my $gettext_code; if (/^\[\s*encoding:\s*(.*)\s*\]/) { $forced_gettext_code=$1; } elsif (/\.($xml_support|$ini_support)$/ || /^\[/) { s/^\[.*]\s*//; print OUTFILE "../$_.h\n"; push @temp_headers, "../$_.h"; $gettext_code = &TextFile_DetermineEncoding ("../$_.h") if ($gettext_support_nonascii and not defined $forced_gettext_code); } else { print OUTFILE "$SRCDIR/../$_\n"; $gettext_code = &TextFile_DetermineEncoding ("$SRCDIR/../$_") if ($gettext_support_nonascii and not defined $forced_gettext_code); } next if (! $gettext_support_nonascii); if (defined $forced_gettext_code) { $encoding=$forced_gettext_code; } elsif (defined $gettext_code and "$encoding" ne "$gettext_code") { if ($encoding eq "ASCII") { $encoding=$gettext_code; } elsif ($gettext_code ne "ASCII") { # Only report once because the message is quite long if (! $encoding_problem_is_reported) { print STDERR "WARNING: You should use the same file encoding for all your project files,\n". " but $PROGRAM thinks that most of the source files are in\n". " $encoding encoding, while \"$_\" is (likely) in\n". " $gettext_code encoding. If you are sure that all translatable strings\n". " are in same encoding (say UTF-8), please \e[1m*prepend*\e[0m the following\n". " line to POTFILES.in:\n\n". " [encoding: UTF-8]\n\n". " and make sure that configure.in/ac checks for $PACKAGE >= 0.27 .\n". "(such warning message will only be reported once.)\n"; $encoding_problem_is_reported = 1; } } } } close OUTFILE; close INFILE; unlink "$MODULE.pot"; my @xgettext_argument=("$XGETTEXT", "--add-comments", "--directory\=.", "--default-domain\=$MODULE", "--flag\=g_strdup_printf:1:c-format", "--flag\=g_string_printf:2:c-format", "--flag\=g_string_append_printf:2:c-format", "--flag\=g_error_new:3:c-format", "--flag\=g_set_error:4:c-format", "--flag\=g_markup_printf_escaped:1:c-format", "--flag\=g_log:3:c-format", "--flag\=g_print:1:c-format", "--flag\=g_printerr:1:c-format", "--flag\=g_printf:1:c-format", "--flag\=g_fprintf:2:c-format", "--flag\=g_sprintf:2:c-format", "--flag\=g_snprintf:3:c-format", "--flag\=g_scanner_error:2:c-format", "--flag\=g_scanner_warn:2:c-format", "--output\=$MODULE\.pot", "--files-from\=\.\/POTFILES\.in\.temp"); my $XGETTEXT_KEYWORDS = &FindPOTKeywords; push @xgettext_argument, $XGETTEXT_KEYWORDS; my $MSGID_BUGS_ADDRESS = &FindMakevarsBugAddress; push @xgettext_argument, "--msgid-bugs-address\=\"$MSGID_BUGS_ADDRESS\"" if $MSGID_BUGS_ADDRESS; push @xgettext_argument, "--from-code\=$encoding" if ($gettext_support_nonascii); push @xgettext_argument, $XGETTEXT_ARGS if $XGETTEXT_ARGS; my $xgettext_command = join ' ', @xgettext_argument; # intercept xgettext error message print "Running $xgettext_command\n" if $VERBOSE; my $xgettext_error_msg = `$xgettext_command 2>\&1`; my $command_failed = $?; unlink "POTFILES.in.temp"; print "Removing generated header (.h) files..." if $VERBOSE; unlink foreach (@temp_headers); print "done.\n" if $VERBOSE; if (! $command_failed) { if (! -e "$MODULE.pot") { print "None of the files in POTFILES.in contain strings marked for translation.\n" if $VERBOSE; } else { print "Wrote $MODULE.pot\n" if $VERBOSE; } } else { if ($xgettext_error_msg =~ /--from-code/) { # replace non-ASCII error message with a more useful one. print STDERR "ERROR: xgettext failed to generate PO template file because there is non-ASCII\n". " string marked for translation. Please make sure that all strings marked\n". " for translation are in uniform encoding (say UTF-8), then \e[1m*prepend*\e[0m the\n". " following line to POTFILES.in and rerun $PROGRAM:\n\n". " [encoding: UTF-8]\n\n"; } else { print STDERR "$xgettext_error_msg"; if (-e "$MODULE.pot") { # is this possible? print STDERR "ERROR: xgettext failed but still managed to generate PO template file.\n". " Please consult error message above if there is any.\n"; } else { print STDERR "ERROR: xgettext failed to generate PO template file. Please consult\n". " error message above if there is any.\n"; } } exit (1); } } sub POFile_Update { -f "$MODULE.pot" or die "$PROGRAM: $MODULE.pot does not exist.\n"; my $MSGMERGE = $ENV{"MSGMERGE"} || "msgmerge"; my ($lang, $outfile) = @_; if (! isGNUGettextTool ("$MSGMERGE")) { print STDERR " *** GNU msgmerge is not found on this system!\n". " *** Without it, intltool-update can not extract strings.\n"; exit; } print "Merging $SRCDIR/$lang.po with $MODULE.pot..." if $VERBOSE; my $infile = "$SRCDIR/$lang.po"; $outfile = "$SRCDIR/$lang.po" if ($outfile eq ""); # I think msgmerge won't overwrite old file if merge is not successful system ("$MSGMERGE", "-o", $outfile, $infile, "$MODULE.pot"); } sub Console_WriteError_NotExisting { my ($file) = @_; ## Report error if supplied language file is non-existing print STDERR "$PROGRAM: $file does not exist!\n"; print STDERR "Try '$PROGRAM --help' for more information.\n"; exit; } sub GatherPOFiles { my @po_files = glob ("./*.po"); @languages = map (&POFile_GetLanguage, @po_files); foreach my $lang (@languages) { $po_files_by_lang{$lang} = shift (@po_files); } } sub POFile_GetLanguage ($) { s/^(.*\/)?(.+)\.po$/$2/; return $_; } sub Console_Write_TranslationStatus { my ($lang, $output_file) = @_; my $MSGFMT = $ENV{"MSGFMT"} || "msgfmt"; if (! isGNUGettextTool ("$MSGFMT")) { print STDERR " *** GNU msgfmt is not found on this system!\n". " *** Without it, intltool-update can not extract strings.\n"; exit; } $output_file = "$SRCDIR/$lang.po" if ($output_file eq ""); system ("$MSGFMT", "-o", "$devnull", "--verbose", $output_file); } sub Console_Write_CoverageReport { my $MSGFMT = $ENV{"MSGFMT"} || "msgfmt"; if (! isGNUGettextTool ("$MSGFMT")) { print STDERR " *** GNU msgfmt is not found on this system!\n". " *** Without it, intltool-update can not extract strings.\n"; exit; } &GatherPOFiles; foreach my $lang (@languages) { print STDERR "$lang: "; &POFile_Update ($lang, ""); } print STDERR "\n\n * Current translation support in $MODULE \n\n"; foreach my $lang (@languages) { print STDERR "$lang: "; system ("$MSGFMT", "-o", "$devnull", "--verbose", "$SRCDIR/$lang.po"); } } sub SubstituteVariable { my ($str) = @_; # always need to rewind file whenever it has been accessed seek (CONF, 0, 0); # cache each variable. varhash is global to we can add # variables elsewhere. while () { if (/^(\w+)=(.*)$/) { ($varhash{$1} = $2) =~ s/^["'](.*)["']$/$1/; } } if ($str =~ /^(.*)\${?([A-Z_]+)}?(.*)$/) { my $rest = $3; my $untouched = $1; my $sub = ""; # Ignore recursive definitions of variables $sub = $varhash{$2} if defined $varhash{$2} and $varhash{$2} !~ /\${?$2}?/; return SubstituteVariable ("$untouched$sub$rest"); } # We're using Perl backticks ` and "echo -n" here in order to # expand any shell escapes (such as backticks themselves) in every variable return echo_n ($str); } sub CONF_Handle_Open { my $base_dirname = getcwd(); $base_dirname =~ s@.*/@@; my ($conf_in, $src_dir); if ($base_dirname =~ /^po(-.+)?$/) { if (-f "Makevars") { my $makefile_source; local (*IN); open (IN, ") { if (/^top_builddir[ \t]*=/) { $src_dir = $_; $src_dir =~ s/^top_builddir[ \t]*=[ \t]*([^ \t\n\r]*)/$1/; chomp $src_dir; if (-f "$src_dir" . "/configure.ac") { $conf_in = "$src_dir" . "/configure.ac" . "\n"; } else { $conf_in = "$src_dir" . "/configure.in" . "\n"; } last; } } close IN; $conf_in || die "Cannot find top_builddir in Makevars."; } elsif (-f "$SRCDIR/../configure.ac") { $conf_in = "$SRCDIR/../configure.ac"; } elsif (-f "$SRCDIR/../configure.in") { $conf_in = "$SRCDIR/../configure.in"; } else { my $makefile_source; local (*IN); open (IN, ") { if (/^top_srcdir[ \t]*=/) { $src_dir = $_; $src_dir =~ s/^top_srcdir[ \t]*=[ \t]*([^ \t\n\r]*)/$1/; chomp $src_dir; $conf_in = "$src_dir" . "/configure.in" . "\n"; last; } } close IN; $conf_in || die "Cannot find top_srcdir in Makefile."; } open (CONF, "<$conf_in"); } else { print STDERR "$PROGRAM: Unable to proceed.\n" . "Make sure to run this script inside the po directory.\n"; exit; } } sub FindPackageName { my $version; my $domain = &FindMakevarsDomain; my $name = $domain || "untitled"; &CONF_Handle_Open; my $conf_source; { local (*IN); open (IN, "<&CONF") || return $name; seek (IN, 0, 0); local $/; # slurp mode $conf_source = ; close IN; } # priority for getting package name: # 1. GETTEXT_PACKAGE # 2. first argument of AC_INIT (with >= 2 arguments) # 3. first argument of AM_INIT_AUTOMAKE (with >= 2 argument) # /^AM_INIT_AUTOMAKE\([\s\[]*([^,\)\s\]]+)/m # the \s makes this not work, why? if ($conf_source =~ /^AM_INIT_AUTOMAKE\(([^,\)]+),([^,\)]+)/m) { ($name, $version) = ($1, $2); $name =~ s/[\[\]\s]//g; $version =~ s/[\[\]\s]//g; $varhash{"PACKAGE_NAME"} = $name if (not $name =~ /\${?AC_PACKAGE_NAME}?/); $varhash{"PACKAGE"} = $name if (not $name =~ /\${?PACKAGE}?/); $varhash{"PACKAGE_VERSION"} = $version if (not $name =~ /\${?AC_PACKAGE_VERSION}?/); $varhash{"VERSION"} = $version if (not $name =~ /\${?VERSION}?/); } if ($conf_source =~ /^AC_INIT\(([^,\)]+),([^,\)]+)/m) { ($name, $version) = ($1, $2); $name =~ s/[\[\]\s]//g; $version =~ s/[\[\]\s]//g; $varhash{"PACKAGE_NAME"} = $name if (not $name =~ /\${?AC_PACKAGE_NAME}?/); $varhash{"PACKAGE"} = $name if (not $name =~ /\${?PACKAGE}?/); $varhash{"PACKAGE_VERSION"} = $version if (not $name =~ /\${?AC_PACKAGE_VERSION}?/); $varhash{"VERSION"} = $version if (not $name =~ /\${?VERSION}?/); } # \s makes this not work, why? $name = $1 if $conf_source =~ /^GETTEXT_PACKAGE=\[?([^\n\]]+)/m; # m4 macros AC_PACKAGE_NAME, AC_PACKAGE_VERSION etc. have same value # as corresponding $PACKAGE_NAME, $PACKAGE_VERSION etc. shell variables. $name =~ s/\bAC_PACKAGE_/\$PACKAGE_/g; $name = $domain if $domain; $name = SubstituteVariable ($name); $name =~ s/^["'](.*)["']$/$1/; return $name if $name; } sub FindPOTKeywords { my $keywords = "--keyword\=\_ --keyword\=N\_ --keyword\=U\_ --keyword\=Q\_"; my $varname = "XGETTEXT_OPTIONS"; my $make_source; { local (*IN); open (IN, "; close IN; } # unwrap lines split with a trailing \ $make_source =~ s/\\ $ \n/ /mxg; $keywords = $1 if $make_source =~ /^$varname[ ]*=\[?([^\n\]]+)/m; return $keywords; } sub FindMakevarsDomain { my $domain = ""; my $makevars_source; { local (*IN); open (IN, "; close IN; } $domain = $1 if $makevars_source =~ /^DOMAIN[ ]*=\[?([^\n\]\$]+)/m; $domain =~ s/^\s+//; $domain =~ s/\s+$//; return $domain; } sub FindMakevarsBugAddress { my $address = ""; my $makevars_source; { local (*IN); open (IN, "; close IN; } $address = $1 if $makevars_source =~ /^MSGID_BUGS_ADDRESS[ ]*=\[?([^\n\]\$]+)/m; $address =~ s/^\s+//; $address =~ s/\s+$//; return $address; } parcellite-1.2.1/README0000644000175000017500000000365313041603201012616 0ustar hlehleParcellite - Lightweight GTK+ Clipboard Manager ------------------------------------------------------------------------------- Copyright (C) 2007-2008 Gilberto "Xyhthyx" Miralla Copyright (C) 2009-2016 Doug Springer Introduction ------------------------------------------------------------------------------- Parcellite is a lightweight GTK+ clipboard manager. This is a stripped down, basic-features-only clipboard manager with a small memory footprint for those who like simplicity. Project website: http://parcellite.sourceforge.net/ How to compile and install parcellite ------------------------------------------------------------------------------- Requirements: * gtk+ >= 2.10.0 Download the parcellite source code, then: $ tar zxvf parcellite-x.y.z.tar.gz $ cd parcellite-x.y.z $ ./autogen.sh # See note below on OpenBSD $ ./configure $ make $ sudo make install or from the subversion checkout: $ svn co http//:svn.code.sf.net/p/parcellite/code/trunk parcellite $ cd parcellite $ ./autogen.sh $ ./configure $ make $ sudo make install OpenBSD notes: Thanks to Lawrence Teo for this tidbit on BSD. For OpenBSD, you will need to use GNU make instead of BSD make (complains about .desktop files). GNU make is usually available on BSD systems by installing the "gmake" package. the configure script needs to be invoked as follows on OpenBSD: LIBS="`pkg-config --libs gtk+-2.0`" ./configure If not, configure will report that the gtk >= 2.10.0 requirement is not met on OpenBSD. Release instructions: 1) run rel.sh - it copies the trunk to the tag the script asks the developer for. 2) If 1 doesn't work, rel.deb.sh can be run to complete the .deb builds. 3) run rel.ppa.sh to build & dput code to the ppa. All scripts are run from a checked-out svn trunk directory (i.e. same directory as this file). To update the pot file, run extract_strings.sh in the trunk directory. parcellite-1.2.1/build-debpkg.sh0000755000175000017500000000236113041603201014621 0ustar hlehle#!/bin/sh # For parcellite deb packaging, install these packages (apt-get): # dh-make intltool libgtk2.0-dev INCD=$(dirname $0) . "$INCD/rel.common" if [ $# -lt 1 ]; then echo "Usage $0 configopts" echo " -c config opts" echo " -k gpg key ID" echo " -p /path/to/source/tar" echo " -t tag tag (like 1.1.4) we are operating on." exit 1 fi while getopts c:k:p:t: opt ; do #echo "opt=$opt arg=$OPTARG" case $opt in c) OPTS="$OPTARG" ;; k) KEY="-k$OPTARG" ;; p) TARPATH=$OPTARG ;; t) tag="$OPTARG" ask_version $tag ;; *) echo "Invalid option $OPTARG" exit 1 ;; esac done log "OPTS='$OPTS'" select_gpg_keys DEBEMAIL=$GEMAIL DEBFULLNAME=$GNAME export DEBFULLNAME DEBEMAIL _ARCH=$(uname -m); case $_ARCH in x86_64) ARCH="amd64";; i686|i586|i486|i386) ARCH="i386";; *) echo "Unknown machine '$_ARCH'. Add machine to this build" exit 1;; esac dh_make -s $KEY -f $TARPATH log "build-debpkg.sh: currently in $(pwd)" cd debian rm emacsen-* manpage.* init.d.ex README.Debian cd .. cp deb/copyright debian sed "s/ADD_ARCH_HERE/$ARCH/g" deb/control >debian/control cp ../rules debian/rules #if [ -n "$OPTS" ]; then # echo "DEB_CONFIGURE_EXTRA_FLAGS += $OPTS" >> debian/rules #fi dpkg-buildpackage -rfakeroot parcellite-1.2.1/m4/0000755000175000017500000000000013041603201012247 5ustar hlehleparcellite-1.2.1/m4/iconv.m40000644000175000017500000001375313041603201013640 0ustar hlehle# iconv.m4 serial AM6 (gettext-0.17) dnl Copyright (C) 2000-2002, 2007 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. AC_DEFUN([AM_ICONV_LINKFLAGS_BODY], [ dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV dnl accordingly. AC_LIB_LINKFLAGS_BODY([iconv]) ]) AC_DEFUN([AM_ICONV_LINK], [ dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and dnl those with the standalone portable GNU libiconv installed). AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV dnl accordingly. AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY]) dnl Add $INCICONV to CPPFLAGS before performing the following checks, dnl because if the user has installed libiconv and not disabled its use dnl via --without-libiconv-prefix, he wants to use it. The first dnl AC_TRY_LINK will then fail, the second AC_TRY_LINK will succeed. am_save_CPPFLAGS="$CPPFLAGS" AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCICONV]) AC_CACHE_CHECK([for iconv], am_cv_func_iconv, [ am_cv_func_iconv="no, consider installing GNU libiconv" am_cv_lib_iconv=no AC_TRY_LINK([#include #include ], [iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd);], am_cv_func_iconv=yes) if test "$am_cv_func_iconv" != yes; then am_save_LIBS="$LIBS" LIBS="$LIBS $LIBICONV" AC_TRY_LINK([#include #include ], [iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd);], am_cv_lib_iconv=yes am_cv_func_iconv=yes) LIBS="$am_save_LIBS" fi ]) if test "$am_cv_func_iconv" = yes; then AC_CACHE_CHECK([for working iconv], am_cv_func_iconv_works, [ dnl This tests against bugs in AIX 5.1 and HP-UX 11.11. am_save_LIBS="$LIBS" if test $am_cv_lib_iconv = yes; then LIBS="$LIBS $LIBICONV" fi AC_TRY_RUN([ #include #include int main () { /* Test against AIX 5.1 bug: Failures are not distinguishable from successful returns. */ { iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8"); if (cd_utf8_to_88591 != (iconv_t)(-1)) { static const char input[] = "\342\202\254"; /* EURO SIGN */ char buf[10]; const char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_utf8_to_88591, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if (res == 0) return 1; } } #if 0 /* This bug could be worked around by the caller. */ /* Test against HP-UX 11.11 bug: Positive return value instead of 0. */ { iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591"); if (cd_88591_to_utf8 != (iconv_t)(-1)) { static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337"; char buf[50]; const char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_88591_to_utf8, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if ((int)res > 0) return 1; } } #endif /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is provided. */ if (/* Try standardized names. */ iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1) /* Try IRIX, OSF/1 names. */ && iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1) /* Try AIX names. */ && iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1) /* Try HP-UX names. */ && iconv_open ("utf8", "eucJP") == (iconv_t)(-1)) return 1; return 0; }], [am_cv_func_iconv_works=yes], [am_cv_func_iconv_works=no], [case "$host_os" in aix* | hpux*) am_cv_func_iconv_works="guessing no" ;; *) am_cv_func_iconv_works="guessing yes" ;; esac]) LIBS="$am_save_LIBS" ]) case "$am_cv_func_iconv_works" in *no) am_func_iconv=no am_cv_lib_iconv=no ;; *) am_func_iconv=yes ;; esac else am_func_iconv=no am_cv_lib_iconv=no fi if test "$am_func_iconv" = yes; then AC_DEFINE(HAVE_ICONV, 1, [Define if you have the iconv() function and it works.]) fi if test "$am_cv_lib_iconv" = yes; then AC_MSG_CHECKING([how to link with libiconv]) AC_MSG_RESULT([$LIBICONV]) else dnl If $LIBICONV didn't lead to a usable library, we don't need $INCICONV dnl either. CPPFLAGS="$am_save_CPPFLAGS" LIBICONV= LTLIBICONV= fi AC_SUBST(LIBICONV) AC_SUBST(LTLIBICONV) ]) AC_DEFUN([AM_ICONV], [ AM_ICONV_LINK if test "$am_cv_func_iconv" = yes; then AC_MSG_CHECKING([for iconv declaration]) AC_CACHE_VAL(am_cv_proto_iconv, [ AC_TRY_COMPILE([ #include #include extern #ifdef __cplusplus "C" #endif #if defined(__STDC__) || defined(__cplusplus) size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft); #else size_t iconv(); #endif ], [], am_cv_proto_iconv_arg1="", am_cv_proto_iconv_arg1="const") am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"]) am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'` AC_MSG_RESULT([$]{ac_t:- }[$]am_cv_proto_iconv) AC_DEFINE_UNQUOTED(ICONV_CONST, $am_cv_proto_iconv_arg1, [Define as const if the declaration of iconv() needs const.]) fi ]) parcellite-1.2.1/m4/lib-ld.m40000644000175000017500000000653113041603201013661 0ustar hlehle# lib-ld.m4 serial 3 (gettext-0.13) dnl Copyright (C) 1996-2003 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Subroutines of libtool.m4, dnl with replacements s/AC_/AC_LIB/ and s/lt_cv/acl_cv/ to avoid collision dnl with libtool.m4. dnl From libtool-1.4. Sets the variable with_gnu_ld to yes or no. AC_DEFUN([AC_LIB_PROG_LD_GNU], [AC_CACHE_CHECK([if the linker ($LD) is GNU ld], acl_cv_prog_gnu_ld, [# I'd rather use --version here, but apparently some GNU ld's only accept -v. case `$LD -v 2>&1 conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by GCC]) case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [[\\/]* | [A-Za-z]:[\\/]*)] [re_direlt='/[^/][^/]*/\.\./'] # Canonicalize the path of ld ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL(acl_cv_path_LD, [if test -z "$LD"; then IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then acl_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some GNU ld's only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in *GNU* | *'with BFD'*) test "$with_gnu_ld" != no && break ;; *) test "$with_gnu_ld" != yes && break ;; esac fi done IFS="$ac_save_ifs" else acl_cv_path_LD="$LD" # Let the user override the test with a path. fi]) LD="$acl_cv_path_LD" if test -n "$LD"; then AC_MSG_RESULT($LD) else AC_MSG_RESULT(no) fi test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH]) AC_LIB_PROG_LD_GNU ]) parcellite-1.2.1/m4/lib-prefix.m40000644000175000017500000001503613041603201014557 0ustar hlehle# lib-prefix.m4 serial 5 (gettext-0.15) dnl Copyright (C) 2001-2005 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. dnl AC_LIB_ARG_WITH is synonymous to AC_ARG_WITH in autoconf-2.13, and dnl similar to AC_ARG_WITH in autoconf 2.52...2.57 except that is doesn't dnl require excessive bracketing. ifdef([AC_HELP_STRING], [AC_DEFUN([AC_LIB_ARG_WITH], [AC_ARG_WITH([$1],[[$2]],[$3],[$4])])], [AC_DEFUN([AC_][LIB_ARG_WITH], [AC_ARG_WITH([$1],[$2],[$3],[$4])])]) dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed dnl to access previously installed libraries. The basic assumption is that dnl a user will want packages to use other packages he previously installed dnl with the same --prefix option. dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate dnl libraries, but is otherwise very convenient. AC_DEFUN([AC_LIB_PREFIX], [ AC_BEFORE([$0], [AC_LIB_LINKFLAGS]) AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) dnl By default, look in $includedir and $libdir. use_additional=yes AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) AC_LIB_ARG_WITH([lib-prefix], [ --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib --without-lib-prefix don't search for libraries in includedir and libdir], [ if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" fi fi ]) if test $use_additional = yes; then dnl Potentially add $additional_includedir to $CPPFLAGS. dnl But don't add it dnl 1. if it's the standard /usr/include, dnl 2. if it's already present in $CPPFLAGS, dnl 3. if it's /usr/local/include and we are using GCC on Linux, dnl 4. if it doesn't exist as a directory. if test "X$additional_includedir" != "X/usr/include"; then haveit= for x in $CPPFLAGS; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then if test -d "$additional_includedir"; then dnl Really add $additional_includedir to $CPPFLAGS. CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir" fi fi fi fi dnl Potentially add $additional_libdir to $LDFLAGS. dnl But don't add it dnl 1. if it's the standard /usr/lib, dnl 2. if it's already present in $LDFLAGS, dnl 3. if it's /usr/local/lib and we are using GCC on Linux, dnl 4. if it doesn't exist as a directory. if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then haveit= for x in $LDFLAGS; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then if test -n "$GCC"; then case $host_os in linux*) haveit=yes;; esac fi fi if test -z "$haveit"; then if test -d "$additional_libdir"; then dnl Really add $additional_libdir to $LDFLAGS. LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir" fi fi fi fi fi ]) dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix, dnl acl_final_exec_prefix, containing the values to which $prefix and dnl $exec_prefix will expand at the end of the configure script. AC_DEFUN([AC_LIB_PREPARE_PREFIX], [ dnl Unfortunately, prefix and exec_prefix get only finally determined dnl at the end of configure. if test "X$prefix" = "XNONE"; then acl_final_prefix="$ac_default_prefix" else acl_final_prefix="$prefix" fi if test "X$exec_prefix" = "XNONE"; then acl_final_exec_prefix='${prefix}' else acl_final_exec_prefix="$exec_prefix" fi acl_save_prefix="$prefix" prefix="$acl_final_prefix" eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" prefix="$acl_save_prefix" ]) dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the dnl variables prefix and exec_prefix bound to the values they will have dnl at the end of the configure script. AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX], [ acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" $1 exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" ]) dnl AC_LIB_PREPARE_MULTILIB creates a variable acl_libdirstem, containing dnl the basename of the libdir, either "lib" or "lib64". AC_DEFUN([AC_LIB_PREPARE_MULTILIB], [ dnl There is no formal standard regarding lib and lib64. The current dnl practice is that on a system supporting 32-bit and 64-bit instruction dnl sets or ABIs, 64-bit libraries go under $prefix/lib64 and 32-bit dnl libraries go under $prefix/lib. We determine the compiler's default dnl mode by looking at the compiler's library search path. If at least dnl of its elements ends in /lib64 or points to a directory whose absolute dnl pathname ends in /lib64, we assume a 64-bit ABI. Otherwise we use the dnl default, namely "lib". acl_libdirstem=lib searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'` if test -n "$searchpath"; then acl_save_IFS="${IFS= }"; IFS=":" for searchdir in $searchpath; do if test -d "$searchdir"; then case "$searchdir" in */lib64/ | */lib64 ) acl_libdirstem=lib64 ;; *) searchdir=`cd "$searchdir" && pwd` case "$searchdir" in */lib64 ) acl_libdirstem=lib64 ;; esac ;; esac fi done IFS="$acl_save_IFS" fi ]) parcellite-1.2.1/m4/ChangeLog0000644000175000017500000000061513041603201014023 0ustar hlehle2008-05-31 gettextize * gettext.m4: New file, from gettext-0.17. * iconv.m4: New file, from gettext-0.17. * lib-ld.m4: New file, from gettext-0.17. * lib-link.m4: New file, from gettext-0.17. * lib-prefix.m4: New file, from gettext-0.17. * nls.m4: New file, from gettext-0.17. * po.m4: New file, from gettext-0.17. * progtest.m4: New file, from gettext-0.17. parcellite-1.2.1/m4/po.m40000644000175000017500000004460613041603201013141 0ustar hlehle# po.m4 serial 15 (gettext-0.17) dnl Copyright (C) 1995-2007 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1995-2000. dnl Bruno Haible , 2000-2003. AC_PREREQ(2.50) dnl Checks for all prerequisites of the po subdirectory. AC_DEFUN([AM_PO_SUBDIRS], [ AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl AC_REQUIRE([AM_PROG_MKDIR_P])dnl defined by automake AC_REQUIRE([AM_NLS])dnl dnl Release version of the gettext macros. This is used to ensure that dnl the gettext macros and po/Makefile.in.in are in sync. AC_SUBST([GETTEXT_MACRO_VERSION], [0.17]) dnl Perform the following tests also if --disable-nls has been given, dnl because they are needed for "make dist" to work. dnl Search for GNU msgfmt in the PATH. dnl The first test excludes Solaris msgfmt and early GNU msgfmt versions. dnl The second test excludes FreeBSD msgfmt. AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, [$ac_dir/$ac_word --statistics /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1 && (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], :) AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) dnl Test whether it is GNU msgfmt >= 0.15. changequote(,)dnl case `$MSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) MSGFMT_015=: ;; *) MSGFMT_015=$MSGFMT ;; esac changequote([,])dnl AC_SUBST([MSGFMT_015]) changequote(,)dnl case `$GMSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) GMSGFMT_015=: ;; *) GMSGFMT_015=$GMSGFMT ;; esac changequote([,])dnl AC_SUBST([GMSGFMT_015]) dnl Search for GNU xgettext 0.12 or newer in the PATH. dnl The first test excludes Solaris xgettext and early GNU xgettext versions. dnl The second test excludes FreeBSD xgettext. AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, [$ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1 && (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], :) dnl Remove leftover from FreeBSD xgettext call. rm -f messages.po dnl Test whether it is GNU xgettext >= 0.15. changequote(,)dnl case `$XGETTEXT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) XGETTEXT_015=: ;; *) XGETTEXT_015=$XGETTEXT ;; esac changequote([,])dnl AC_SUBST([XGETTEXT_015]) dnl Search for GNU msgmerge 0.11 or newer in the PATH. AM_PATH_PROG_WITH_TEST(MSGMERGE, msgmerge, [$ac_dir/$ac_word --update -q /dev/null /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1], :) dnl Installation directories. dnl Autoconf >= 2.60 defines localedir. For older versions of autoconf, we dnl have to define it here, so that it can be used in po/Makefile. test -n "$localedir" || localedir='${datadir}/locale' AC_SUBST([localedir]) dnl Support for AM_XGETTEXT_OPTION. test -n "${XGETTEXT_EXTRA_OPTIONS+set}" || XGETTEXT_EXTRA_OPTIONS= AC_SUBST([XGETTEXT_EXTRA_OPTIONS]) AC_CONFIG_COMMANDS([po-directories], [[ for ac_file in $CONFIG_FILES; do # Support "outfile[:infile[:infile...]]" case "$ac_file" in *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; esac # PO directories have a Makefile.in generated from Makefile.in.in. case "$ac_file" in */Makefile.in) # Adjust a relative srcdir. ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` # In autoconf-2.13 it is called $ac_given_srcdir. # In autoconf-2.50 it is called $srcdir. test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" case "$ac_given_srcdir" in .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; /*) top_srcdir="$ac_given_srcdir" ;; *) top_srcdir="$ac_dots$ac_given_srcdir" ;; esac # Treat a directory as a PO directory if and only if it has a # POTFILES.in file. This allows packages to have multiple PO # directories under different names or in different locations. if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then rm -f "$ac_dir/POTFILES" test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES" cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES" POMAKEFILEDEPS="POTFILES.in" # ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend # on $ac_dir but don't depend on user-specified configuration # parameters. if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then # The LINGUAS file contains the set of available languages. if test -n "$OBSOLETE_ALL_LINGUAS"; then test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete" fi ALL_LINGUAS_=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"` # Hide the ALL_LINGUAS assigment from automake < 1.5. eval 'ALL_LINGUAS''=$ALL_LINGUAS_' POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS" else # The set of available languages was given in configure.in. # Hide the ALL_LINGUAS assigment from automake < 1.5. eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS' fi # Compute POFILES # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po) # Compute UPDATEPOFILES # as $(foreach lang, $(ALL_LINGUAS), $(lang).po-update) # Compute DUMMYPOFILES # as $(foreach lang, $(ALL_LINGUAS), $(lang).nop) # Compute GMOFILES # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo) case "$ac_given_srcdir" in .) srcdirpre= ;; *) srcdirpre='$(srcdir)/' ;; esac POFILES= UPDATEPOFILES= DUMMYPOFILES= GMOFILES= for lang in $ALL_LINGUAS; do POFILES="$POFILES $srcdirpre$lang.po" UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" DUMMYPOFILES="$DUMMYPOFILES $lang.nop" GMOFILES="$GMOFILES $srcdirpre$lang.gmo" done # CATALOGS depends on both $ac_dir and the user's LINGUAS # environment variable. INST_LINGUAS= if test -n "$ALL_LINGUAS"; then for presentlang in $ALL_LINGUAS; do useit=no if test "%UNSET%" != "$LINGUAS"; then desiredlanguages="$LINGUAS" else desiredlanguages="$ALL_LINGUAS" fi for desiredlang in $desiredlanguages; do # Use the presentlang catalog if desiredlang is # a. equal to presentlang, or # b. a variant of presentlang (because in this case, # presentlang can be used as a fallback for messages # which are not translated in the desiredlang catalog). case "$desiredlang" in "$presentlang"*) useit=yes;; esac done if test $useit = yes; then INST_LINGUAS="$INST_LINGUAS $presentlang" fi done fi CATALOGS= if test -n "$INST_LINGUAS"; then for lang in $INST_LINGUAS; do CATALOGS="$CATALOGS $lang.gmo" done fi test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile" sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile" for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do if test -f "$f"; then case "$f" in *.orig | *.bak | *~) ;; *) cat "$f" >> "$ac_dir/Makefile" ;; esac fi done fi ;; esac done]], [# Capture the value of obsolete ALL_LINGUAS because we need it to compute # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it # from automake < 1.5. eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"' # Capture the value of LINGUAS because we need it to compute CATALOGS. LINGUAS="${LINGUAS-%UNSET%}" ]) ]) dnl Postprocesses a Makefile in a directory containing PO files. AC_DEFUN([AM_POSTPROCESS_PO_MAKEFILE], [ # When this code is run, in config.status, two variables have already been # set: # - OBSOLETE_ALL_LINGUAS is the value of LINGUAS set in configure.in, # - LINGUAS is the value of the environment variable LINGUAS at configure # time. changequote(,)dnl # Adjust a relative srcdir. ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` # In autoconf-2.13 it is called $ac_given_srcdir. # In autoconf-2.50 it is called $srcdir. test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" case "$ac_given_srcdir" in .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; /*) top_srcdir="$ac_given_srcdir" ;; *) top_srcdir="$ac_dots$ac_given_srcdir" ;; esac # Find a way to echo strings without interpreting backslash. if test "X`(echo '\t') 2>/dev/null`" = 'X\t'; then gt_echo='echo' else if test "X`(printf '%s\n' '\t') 2>/dev/null`" = 'X\t'; then gt_echo='printf %s\n' else echo_func () { cat < "$ac_file.tmp" if grep -l '@TCLCATALOGS@' "$ac_file" > /dev/null; then # Add dependencies that cannot be formulated as a simple suffix rule. for lang in $ALL_LINGUAS; do frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'` cat >> "$ac_file.tmp" < /dev/null; then # Add dependencies that cannot be formulated as a simple suffix rule. for lang in $ALL_LINGUAS; do frobbedlang=`echo $lang | sed -e 's/_/-/g' -e 's/^sr-CS/sr-SP/' -e 's/@latin$/-Latn/' -e 's/@cyrillic$/-Cyrl/' -e 's/^sr-SP$/sr-SP-Latn/' -e 's/^uz-UZ$/uz-UZ-Latn/'` cat >> "$ac_file.tmp" <> "$ac_file.tmp" <= 1.10 to complain if config.rpath is missing. m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([config.rpath])]) AC_REQUIRE([AC_PROG_CC]) dnl we use $CC, $GCC, $LDFLAGS AC_REQUIRE([AC_LIB_PROG_LD]) dnl we use $LD, $with_gnu_ld AC_REQUIRE([AC_CANONICAL_HOST]) dnl we use $host AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir AC_CACHE_CHECK([for shared library run path origin], acl_cv_rpath, [ CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh . ./conftest.sh rm -f ./conftest.sh acl_cv_rpath=done ]) wl="$acl_cv_wl" acl_libext="$acl_cv_libext" acl_shlibext="$acl_cv_shlibext" acl_libname_spec="$acl_cv_libname_spec" acl_library_names_spec="$acl_cv_library_names_spec" acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" acl_hardcode_direct="$acl_cv_hardcode_direct" acl_hardcode_minus_L="$acl_cv_hardcode_minus_L" dnl Determine whether the user wants rpath handling at all. AC_ARG_ENABLE(rpath, [ --disable-rpath do not hardcode runtime library paths], :, enable_rpath=yes) ]) dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and dnl the libraries corresponding to explicit and implicit dependencies. dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables. dnl Also, sets the LIB${NAME}_PREFIX variable to nonempty if libname was found dnl in ${LIB${NAME}_PREFIX}/$acl_libdirstem. AC_DEFUN([AC_LIB_LINKFLAGS_BODY], [ AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) dnl Autoconf >= 2.61 supports dots in --with options. define([N_A_M_E],[m4_if(m4_version_compare(m4_defn([m4_PACKAGE_VERSION]),[2.61]),[-1],[translit([$1],[.],[_])],[$1])]) dnl By default, look in $includedir and $libdir. use_additional=yes AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) AC_LIB_ARG_WITH([lib]N_A_M_E[-prefix], [ --with-lib]N_A_M_E[-prefix[=DIR] search for lib$1 in DIR/include and DIR/lib --without-lib]N_A_M_E[-prefix don't search for lib$1 in includedir and libdir], [ if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" fi fi ]) dnl Search the library and its dependencies in $additional_libdir and dnl $LDFLAGS. Using breadth-first-seach. LIB[]NAME= LTLIB[]NAME= INC[]NAME= LIB[]NAME[]_PREFIX= rpathdirs= ltrpathdirs= names_already_handled= names_next_round='$1 $2' while test -n "$names_next_round"; do names_this_round="$names_next_round" names_next_round= for name in $names_this_round; do already_handled= for n in $names_already_handled; do if test "$n" = "$name"; then already_handled=yes break fi done if test -z "$already_handled"; then names_already_handled="$names_already_handled $name" dnl See if it was already located by an earlier AC_LIB_LINKFLAGS dnl or AC_LIB_HAVE_LINKFLAGS call. uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` eval value=\"\$HAVE_LIB$uppername\" if test -n "$value"; then if test "$value" = yes; then eval value=\"\$LIB$uppername\" test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value" eval value=\"\$LTLIB$uppername\" test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value" else dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined dnl that this library doesn't exist. So just drop it. : fi else dnl Search the library lib$name in $additional_libdir and $LDFLAGS dnl and the already constructed $LIBNAME/$LTLIBNAME. found_dir= found_la= found_so= found_a= eval libname=\"$acl_libname_spec\" # typically: libname=lib$name if test -n "$acl_shlibext"; then shrext=".$acl_shlibext" # typically: shrext=.so else shrext= fi if test $use_additional = yes; then dir="$additional_libdir" dnl The same code as in the loop below: dnl First look for a shared library. if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi dnl Then look for a static library. if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi fi if test "X$found_dir" = "X"; then for x in $LDFLAGS $LTLIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) case "$x" in -L*) dir=`echo "X$x" | sed -e 's/^X-L//'` dnl First look for a shared library. if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi dnl Then look for a static library. if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi ;; esac if test "X$found_dir" != "X"; then break fi done fi if test "X$found_dir" != "X"; then dnl Found the library. LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then dnl Linking with a shared library. We attempt to hardcode its dnl directory into the executable's runpath, unless it's the dnl standard /usr/lib. if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/$acl_libdirstem"; then dnl No hardcoding is needed. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" else dnl Use an explicit option to hardcode DIR into the resulting dnl binary. dnl Potentially add DIR to ltrpathdirs. dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. haveit= for x in $ltrpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $found_dir" fi dnl The hardcoding into $LIBNAME is system dependent. if test "$acl_hardcode_direct" = yes; then dnl Using DIR/libNAME.so during linking hardcodes DIR into the dnl resulting binary. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" else if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then dnl Use an explicit option to hardcode DIR into the resulting dnl binary. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" dnl Potentially add DIR to rpathdirs. dnl The rpathdirs will be appended to $LIBNAME at the end. haveit= for x in $rpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $found_dir" fi else dnl Rely on "-L$found_dir". dnl But don't add it if it's already contained in the LDFLAGS dnl or the already constructed $LIBNAME haveit= for x in $LDFLAGS $LIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir" fi if test "$acl_hardcode_minus_L" != no; then dnl FIXME: Not sure whether we should use dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" dnl here. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" else dnl We cannot use $acl_hardcode_runpath_var and LD_RUN_PATH dnl here, because this doesn't fit in flags passed to the dnl compiler. So give up. No hardcoding. This affects only dnl very old systems. dnl FIXME: Not sure whether we should use dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" dnl here. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then dnl Linking with a static library. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a" else dnl We shouldn't come here, but anyway it's good to have a dnl fallback. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name" fi fi dnl Assume the include files are nearby. additional_includedir= case "$found_dir" in */$acl_libdirstem | */$acl_libdirstem/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` LIB[]NAME[]_PREFIX="$basedir" additional_includedir="$basedir/include" ;; esac if test "X$additional_includedir" != "X"; then dnl Potentially add $additional_includedir to $INCNAME. dnl But don't add it dnl 1. if it's the standard /usr/include, dnl 2. if it's /usr/local/include and we are using GCC on Linux, dnl 3. if it's already present in $CPPFLAGS or the already dnl constructed $INCNAME, dnl 4. if it doesn't exist as a directory. if test "X$additional_includedir" != "X/usr/include"; then haveit= if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then for x in $CPPFLAGS $INC[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_includedir"; then dnl Really add $additional_includedir to $INCNAME. INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir" fi fi fi fi fi dnl Look for dependencies. if test -n "$found_la"; then dnl Read the .la file. It defines the variables dnl dlname, library_names, old_library, dependency_libs, current, dnl age, revision, installed, dlopen, dlpreopen, libdir. save_libdir="$libdir" case "$found_la" in */* | *\\*) . "$found_la" ;; *) . "./$found_la" ;; esac libdir="$save_libdir" dnl We use only dependency_libs. for dep in $dependency_libs; do case "$dep" in -L*) additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME. dnl But don't add it dnl 1. if it's the standard /usr/lib, dnl 2. if it's /usr/local/lib and we are using GCC on Linux, dnl 3. if it's already present in $LDFLAGS or the already dnl constructed $LIBNAME, dnl 4. if it doesn't exist as a directory. if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then haveit= if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then haveit= for x in $LDFLAGS $LIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then dnl Really add $additional_libdir to $LIBNAME. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir" fi fi haveit= for x in $LDFLAGS $LTLIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then dnl Really add $additional_libdir to $LTLIBNAME. LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir" fi fi fi fi ;; -R*) dir=`echo "X$dep" | sed -e 's/^X-R//'` if test "$enable_rpath" != no; then dnl Potentially add DIR to rpathdirs. dnl The rpathdirs will be appended to $LIBNAME at the end. haveit= for x in $rpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $dir" fi dnl Potentially add DIR to ltrpathdirs. dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. haveit= for x in $ltrpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $dir" fi fi ;; -l*) dnl Handle this in the next round. names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` ;; *.la) dnl Handle this in the next round. Throw away the .la's dnl directory; it is already contained in a preceding -L dnl option. names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) dnl Most likely an immediate library name. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep" LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep" ;; esac done fi else dnl Didn't find the library; assume it is in the system directories dnl known to the linker and runtime loader. (All the system dnl directories known to the linker should also be known to the dnl runtime loader, otherwise the system is severely misconfigured.) LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name" fi fi fi done done if test "X$rpathdirs" != "X"; then if test -n "$acl_hardcode_libdir_separator"; then dnl Weird platform: only the last -rpath option counts, the user must dnl pass all path elements in one option. We can arrange that for a dnl single library, but not when more than one $LIBNAMEs are used. alldirs= for found_dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" done dnl Note: acl_hardcode_libdir_flag_spec uses $libdir and $wl. acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" else dnl The -rpath options are cumulative. for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then dnl When using libtool, the option that works for both libraries and dnl executables is -R. The -R options are cumulative. for found_dir in $ltrpathdirs; do LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir" done fi ]) dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR, dnl unless already present in VAR. dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes dnl contains two or three consecutive elements that belong together. AC_DEFUN([AC_LIB_APPENDTOVAR], [ for element in [$2]; do haveit= for x in $[$1]; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X$element"; then haveit=yes break fi done if test -z "$haveit"; then [$1]="${[$1]}${[$1]:+ }$element" fi done ]) dnl For those cases where a variable contains several -L and -l options dnl referring to unknown libraries and directories, this macro determines the dnl necessary additional linker options for the runtime path. dnl AC_LIB_LINKFLAGS_FROM_LIBS([LDADDVAR], [LIBSVALUE], [USE-LIBTOOL]) dnl sets LDADDVAR to linker options needed together with LIBSVALUE. dnl If USE-LIBTOOL evaluates to non-empty, linking with libtool is assumed, dnl otherwise linking without libtool is assumed. AC_DEFUN([AC_LIB_LINKFLAGS_FROM_LIBS], [ AC_REQUIRE([AC_LIB_RPATH]) AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) $1= if test "$enable_rpath" != no; then if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then dnl Use an explicit option to hardcode directories into the resulting dnl binary. rpathdirs= next= for opt in $2; do if test -n "$next"; then dir="$next" dnl No need to hardcode the standard /usr/lib. if test "X$dir" != "X/usr/$acl_libdirstem"; then rpathdirs="$rpathdirs $dir" fi next= else case $opt in -L) next=yes ;; -L*) dir=`echo "X$opt" | sed -e 's,^X-L,,'` dnl No need to hardcode the standard /usr/lib. if test "X$dir" != "X/usr/$acl_libdirstem"; then rpathdirs="$rpathdirs $dir" fi next= ;; *) next= ;; esac fi done if test "X$rpathdirs" != "X"; then if test -n ""$3""; then dnl libtool is used for linking. Use -R options. for dir in $rpathdirs; do $1="${$1}${$1:+ }-R$dir" done else dnl The linker is used for linking directly. if test -n "$acl_hardcode_libdir_separator"; then dnl Weird platform: only the last -rpath option counts, the user dnl must pass all path elements in one option. alldirs= for dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$dir" done acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" $1="$flag" else dnl The -rpath options are cumulative. for dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" $1="${$1}${$1:+ }$flag" done fi fi fi fi fi AC_SUBST([$1]) ]) parcellite-1.2.1/m4/progtest.m40000644000175000017500000000555013041603201014365 0ustar hlehle# progtest.m4 serial 4 (gettext-0.14.2) dnl Copyright (C) 1996-2003, 2005 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1996. AC_PREREQ(2.50) # Search path for a program which passes the given test. dnl AM_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR, dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]]) AC_DEFUN([AM_PATH_PROG_WITH_TEST], [ # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Find out how to test for executable files. Don't use a zero-byte file, # as systems may use methods other than mode bits to determine executability. cat >conf$$.file <<_ASEOF #! /bin/sh exit 0 _ASEOF chmod +x conf$$.file if test -x conf$$.file >/dev/null 2>&1; then ac_executable_p="test -x" else ac_executable_p="test -f" fi rm -f conf$$.file # Extract the first word of "$2", so it can be a program name with args. set dummy $2; ac_word=[$]2 AC_MSG_CHECKING([for $ac_word]) AC_CACHE_VAL(ac_cv_path_$1, [case "[$]$1" in [[\\/]]* | ?:[[\\/]]*) ac_cv_path_$1="[$]$1" # Let the user override the test with a path. ;; *) ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in ifelse([$5], , $PATH, [$5]); do IFS="$ac_save_IFS" test -z "$ac_dir" && ac_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then echo "$as_me: trying $ac_dir/$ac_word..." >&AS_MESSAGE_LOG_FD if [$3]; then ac_cv_path_$1="$ac_dir/$ac_word$ac_exec_ext" break 2 fi fi done done IFS="$ac_save_IFS" dnl If no 4th arg is given, leave the cache variable unset, dnl so AC_PATH_PROGS will keep looking. ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" ])dnl ;; esac])dnl $1="$ac_cv_path_$1" if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then AC_MSG_RESULT([$]$1) else AC_MSG_RESULT(no) fi AC_SUBST($1)dnl ]) parcellite-1.2.1/m4/intltool.m40000644000175000017500000002421513041603201014361 0ustar hlehle## intltool.m4 - Configure intltool for the target system. -*-Shell-script-*- ## Copyright (C) 2001 Eazel, Inc. ## Author: Maciej Stachowiak ## Kenneth Christiansen ## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## (at your option) any later version. ## ## This program is distributed in the hope that it will be useful, but ## WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ## General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ## ## As a special exception to the GNU General Public License, if you ## distribute this file as part of a program that contains a ## configuration script generated by Autoconf, you may include it under ## the same distribution terms that you use for the rest of that program. dnl IT_PROG_INTLTOOL([MINIMUM-VERSION], [no-xml]) # serial 40 IT_PROG_INTLTOOL AC_DEFUN([IT_PROG_INTLTOOL], [ AC_PREREQ([2.50])dnl AC_REQUIRE([AM_NLS])dnl case "$am__api_version" in 1.[01234]) AC_MSG_ERROR([Automake 1.5 or newer is required to use intltool]) ;; *) ;; esac if test -n "$1"; then AC_MSG_CHECKING([for intltool >= $1]) INTLTOOL_REQUIRED_VERSION_AS_INT=`echo $1 | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'` INTLTOOL_APPLIED_VERSION=`intltool-update --version | head -1 | cut -d" " -f3` [INTLTOOL_APPLIED_VERSION_AS_INT=`echo $INTLTOOL_APPLIED_VERSION | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'` ] AC_MSG_RESULT([$INTLTOOL_APPLIED_VERSION found]) test "$INTLTOOL_APPLIED_VERSION_AS_INT" -ge "$INTLTOOL_REQUIRED_VERSION_AS_INT" || AC_MSG_ERROR([Your intltool is too old. You need intltool $1 or later.]) fi AC_PATH_PROG(INTLTOOL_UPDATE, [intltool-update]) AC_PATH_PROG(INTLTOOL_MERGE, [intltool-merge]) AC_PATH_PROG(INTLTOOL_EXTRACT, [intltool-extract]) if test -z "$INTLTOOL_UPDATE" -o -z "$INTLTOOL_MERGE" -o -z "$INTLTOOL_EXTRACT"; then AC_MSG_ERROR([The intltool scripts were not found. Please install intltool.]) fi INTLTOOL_DESKTOP_RULE='%.desktop: %.desktop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_DIRECTORY_RULE='%.directory: %.directory.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_KEYS_RULE='%.keys: %.keys.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -k -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_PROP_RULE='%.prop: %.prop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_OAF_RULE='%.oaf: %.oaf.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -o -p $(top_srcdir)/po $< [$]@' INTLTOOL_PONG_RULE='%.pong: %.pong.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_SERVER_RULE='%.server: %.server.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -o -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_SHEET_RULE='%.sheet: %.sheet.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_SOUNDLIST_RULE='%.soundlist: %.soundlist.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_UI_RULE='%.ui: %.ui.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_XML_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_XML_NOMERGE_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u /tmp $< [$]@' INTLTOOL_XAM_RULE='%.xam: %.xml.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_KBD_RULE='%.kbd: %.kbd.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -m -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_CAVES_RULE='%.caves: %.caves.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_SCHEMAS_RULE='%.schemas: %.schemas.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -s -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_THEME_RULE='%.theme: %.theme.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_SERVICE_RULE='%.service: %.service.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_POLICY_RULE='%.policy: %.policy.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' _IT_SUBST(INTLTOOL_DESKTOP_RULE) _IT_SUBST(INTLTOOL_DIRECTORY_RULE) _IT_SUBST(INTLTOOL_KEYS_RULE) _IT_SUBST(INTLTOOL_PROP_RULE) _IT_SUBST(INTLTOOL_OAF_RULE) _IT_SUBST(INTLTOOL_PONG_RULE) _IT_SUBST(INTLTOOL_SERVER_RULE) _IT_SUBST(INTLTOOL_SHEET_RULE) _IT_SUBST(INTLTOOL_SOUNDLIST_RULE) _IT_SUBST(INTLTOOL_UI_RULE) _IT_SUBST(INTLTOOL_XAM_RULE) _IT_SUBST(INTLTOOL_KBD_RULE) _IT_SUBST(INTLTOOL_XML_RULE) _IT_SUBST(INTLTOOL_XML_NOMERGE_RULE) _IT_SUBST(INTLTOOL_CAVES_RULE) _IT_SUBST(INTLTOOL_SCHEMAS_RULE) _IT_SUBST(INTLTOOL_THEME_RULE) _IT_SUBST(INTLTOOL_SERVICE_RULE) _IT_SUBST(INTLTOOL_POLICY_RULE) # Check the gettext tools to make sure they are GNU AC_PATH_PROG(XGETTEXT, xgettext) AC_PATH_PROG(MSGMERGE, msgmerge) AC_PATH_PROG(MSGFMT, msgfmt) AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) if test -z "$XGETTEXT" -o -z "$MSGMERGE" -o -z "$MSGFMT"; then AC_MSG_ERROR([GNU gettext tools not found; required for intltool]) fi xgversion="`$XGETTEXT --version|grep '(GNU ' 2> /dev/null`" mmversion="`$MSGMERGE --version|grep '(GNU ' 2> /dev/null`" mfversion="`$MSGFMT --version|grep '(GNU ' 2> /dev/null`" if test -z "$xgversion" -o -z "$mmversion" -o -z "$mfversion"; then AC_MSG_ERROR([GNU gettext tools not found; required for intltool]) fi AC_PATH_PROG(INTLTOOL_PERL, perl) if test -z "$INTLTOOL_PERL"; then AC_MSG_ERROR([perl not found]) fi AC_MSG_CHECKING([for perl >= 5.8.1]) $INTLTOOL_PERL -e "use 5.8.1;" > /dev/null 2>&1 if test $? -ne 0; then AC_MSG_ERROR([perl 5.8.1 is required for intltool]) else IT_PERL_VERSION="`$INTLTOOL_PERL -e \"printf '%vd', $^V\"`" AC_MSG_RESULT([$IT_PERL_VERSION]) fi if test "x$2" != "xno-xml"; then AC_MSG_CHECKING([for XML::Parser]) if `$INTLTOOL_PERL -e "require XML::Parser" 2>/dev/null`; then AC_MSG_RESULT([ok]) else AC_MSG_ERROR([XML::Parser perl module is required for intltool]) fi fi # Substitute ALL_LINGUAS so we can use it in po/Makefile AC_SUBST(ALL_LINGUAS) # Set DATADIRNAME correctly if it is not set yet # (copied from glib-gettext.m4) if test -z "$DATADIRNAME"; then AC_LINK_IFELSE( [AC_LANG_PROGRAM([[]], [[extern int _nl_msg_cat_cntr; return _nl_msg_cat_cntr]])], [DATADIRNAME=share], [case $host in *-*-solaris*) dnl On Solaris, if bind_textdomain_codeset is in libc, dnl GNU format message catalog is always supported, dnl since both are added to the libc all together. dnl Hence, we'd like to go with DATADIRNAME=share dnl in this case. AC_CHECK_FUNC(bind_textdomain_codeset, [DATADIRNAME=share], [DATADIRNAME=lib]) ;; *) [DATADIRNAME=lib] ;; esac]) fi AC_SUBST(DATADIRNAME) IT_PO_SUBDIR([po]) ]) # IT_PO_SUBDIR(DIRNAME) # --------------------- # All po subdirs have to be declared with this macro; the subdir "po" is # declared by IT_PROG_INTLTOOL. # AC_DEFUN([IT_PO_SUBDIR], [AC_PREREQ([2.53])dnl We use ac_top_srcdir inside AC_CONFIG_COMMANDS. dnl dnl The following CONFIG_COMMANDS should be exetuted at the very end dnl of config.status. AC_CONFIG_COMMANDS_PRE([ AC_CONFIG_COMMANDS([$1/stamp-it], [ if [ ! grep "^# INTLTOOL_MAKEFILE$" "$1/Makefile.in" > /dev/null ]; then AC_MSG_ERROR([$1/Makefile.in.in was not created by intltoolize.]) fi rm -f "$1/stamp-it" "$1/stamp-it.tmp" "$1/POTFILES" "$1/Makefile.tmp" >"$1/stamp-it.tmp" [sed '/^#/d s/^[[].*] *// /^[ ]*$/d '"s|^| $ac_top_srcdir/|" \ "$srcdir/$1/POTFILES.in" | sed '$!s/$/ \\/' >"$1/POTFILES" ] [sed '/^POTFILES =/,/[^\\]$/ { /^POTFILES =/!d r $1/POTFILES } ' "$1/Makefile.in" >"$1/Makefile"] rm -f "$1/Makefile.tmp" mv "$1/stamp-it.tmp" "$1/stamp-it" ]) ])dnl ]) # _IT_SUBST(VARIABLE) # ------------------- # Abstract macro to do either _AM_SUBST_NOTMAKE or AC_SUBST # AC_DEFUN([_IT_SUBST], [ AC_SUBST([$1]) m4_ifdef([_AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE([$1])]) ] ) # deprecated macros AU_ALIAS([AC_PROG_INTLTOOL], [IT_PROG_INTLTOOL]) # A hint is needed for aclocal from Automake <= 1.9.4: # AC_DEFUN([AC_PROG_INTLTOOL], ...) parcellite-1.2.1/m4/gettext.m40000644000175000017500000003457013041603201014206 0ustar hlehle# gettext.m4 serial 60 (gettext-0.17) dnl Copyright (C) 1995-2007 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1995-2000. dnl Bruno Haible , 2000-2006. dnl Macro to add for using GNU gettext. dnl Usage: AM_GNU_GETTEXT([INTLSYMBOL], [NEEDSYMBOL], [INTLDIR]). dnl INTLSYMBOL can be one of 'external', 'no-libtool', 'use-libtool'. The dnl default (if it is not specified or empty) is 'no-libtool'. dnl INTLSYMBOL should be 'external' for packages with no intl directory, dnl and 'no-libtool' or 'use-libtool' for packages with an intl directory. dnl If INTLSYMBOL is 'use-libtool', then a libtool library dnl $(top_builddir)/intl/libintl.la will be created (shared and/or static, dnl depending on --{enable,disable}-{shared,static} and on the presence of dnl AM-DISABLE-SHARED). If INTLSYMBOL is 'no-libtool', a static library dnl $(top_builddir)/intl/libintl.a will be created. dnl If NEEDSYMBOL is specified and is 'need-ngettext', then GNU gettext dnl implementations (in libc or libintl) without the ngettext() function dnl will be ignored. If NEEDSYMBOL is specified and is dnl 'need-formatstring-macros', then GNU gettext implementations that don't dnl support the ISO C 99 formatstring macros will be ignored. dnl INTLDIR is used to find the intl libraries. If empty, dnl the value `$(top_builddir)/intl/' is used. dnl dnl The result of the configuration is one of three cases: dnl 1) GNU gettext, as included in the intl subdirectory, will be compiled dnl and used. dnl Catalog format: GNU --> install in $(datadir) dnl Catalog extension: .mo after installation, .gmo in source tree dnl 2) GNU gettext has been found in the system's C library. dnl Catalog format: GNU --> install in $(datadir) dnl Catalog extension: .mo after installation, .gmo in source tree dnl 3) No internationalization, always use English msgid. dnl Catalog format: none dnl Catalog extension: none dnl If INTLSYMBOL is 'external', only cases 2 and 3 can occur. dnl The use of .gmo is historical (it was needed to avoid overwriting the dnl GNU format catalogs when building on a platform with an X/Open gettext), dnl but we keep it in order not to force irrelevant filename changes on the dnl maintainers. dnl AC_DEFUN([AM_GNU_GETTEXT], [ dnl Argument checking. ifelse([$1], [], , [ifelse([$1], [external], , [ifelse([$1], [no-libtool], , [ifelse([$1], [use-libtool], , [errprint([ERROR: invalid first argument to AM_GNU_GETTEXT ])])])])]) ifelse([$2], [], , [ifelse([$2], [need-ngettext], , [ifelse([$2], [need-formatstring-macros], , [errprint([ERROR: invalid second argument to AM_GNU_GETTEXT ])])])]) define([gt_included_intl], ifelse([$1], [external], ifdef([AM_GNU_GETTEXT_][INTL_SUBDIR], [yes], [no]), [yes])) define([gt_libtool_suffix_prefix], ifelse([$1], [use-libtool], [l], [])) gt_NEEDS_INIT AM_GNU_GETTEXT_NEED([$2]) AC_REQUIRE([AM_PO_SUBDIRS])dnl ifelse(gt_included_intl, yes, [ AC_REQUIRE([AM_INTL_SUBDIR])dnl ]) dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) dnl Sometimes libintl requires libiconv, so first search for libiconv. dnl Ideally we would do this search only after the dnl if test "$USE_NLS" = "yes"; then dnl if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then dnl tests. But if configure.in invokes AM_ICONV after AM_GNU_GETTEXT dnl the configure script would need to contain the same shell code dnl again, outside any 'if'. There are two solutions: dnl - Invoke AM_ICONV_LINKFLAGS_BODY here, outside any 'if'. dnl - Control the expansions in more detail using AC_PROVIDE_IFELSE. dnl Since AC_PROVIDE_IFELSE is only in autoconf >= 2.52 and not dnl documented, we avoid it. ifelse(gt_included_intl, yes, , [ AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY]) ]) dnl Sometimes, on MacOS X, libintl requires linking with CoreFoundation. gt_INTL_MACOSX dnl Set USE_NLS. AC_REQUIRE([AM_NLS]) ifelse(gt_included_intl, yes, [ BUILD_INCLUDED_LIBINTL=no USE_INCLUDED_LIBINTL=no ]) LIBINTL= LTLIBINTL= POSUB= dnl Add a version number to the cache macros. case " $gt_needs " in *" need-formatstring-macros "*) gt_api_version=3 ;; *" need-ngettext "*) gt_api_version=2 ;; *) gt_api_version=1 ;; esac gt_func_gnugettext_libc="gt_cv_func_gnugettext${gt_api_version}_libc" gt_func_gnugettext_libintl="gt_cv_func_gnugettext${gt_api_version}_libintl" dnl If we use NLS figure out what method if test "$USE_NLS" = "yes"; then gt_use_preinstalled_gnugettext=no ifelse(gt_included_intl, yes, [ AC_MSG_CHECKING([whether included gettext is requested]) AC_ARG_WITH(included-gettext, [ --with-included-gettext use the GNU gettext library included here], nls_cv_force_use_gnu_gettext=$withval, nls_cv_force_use_gnu_gettext=no) AC_MSG_RESULT($nls_cv_force_use_gnu_gettext) nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext" if test "$nls_cv_force_use_gnu_gettext" != "yes"; then ]) dnl User does not insist on using GNU NLS library. Figure out what dnl to use. If GNU gettext is available we use this. Else we have dnl to fall back to GNU NLS library. if test $gt_api_version -ge 3; then gt_revision_test_code=' #ifndef __GNU_GETTEXT_SUPPORTED_REVISION #define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) #endif changequote(,)dnl typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; changequote([,])dnl ' else gt_revision_test_code= fi if test $gt_api_version -ge 2; then gt_expression_test_code=' + * ngettext ("", "", 0)' else gt_expression_test_code= fi AC_CACHE_CHECK([for GNU gettext in libc], [$gt_func_gnugettext_libc], [AC_TRY_LINK([#include $gt_revision_test_code extern int _nl_msg_cat_cntr; extern int *_nl_domain_bindings;], [bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_domain_bindings], [eval "$gt_func_gnugettext_libc=yes"], [eval "$gt_func_gnugettext_libc=no"])]) if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then dnl Sometimes libintl requires libiconv, so first search for libiconv. ifelse(gt_included_intl, yes, , [ AM_ICONV_LINK ]) dnl Search for libintl and define LIBINTL, LTLIBINTL and INCINTL dnl accordingly. Don't use AC_LIB_LINKFLAGS_BODY([intl],[iconv]) dnl because that would add "-liconv" to LIBINTL and LTLIBINTL dnl even if libiconv doesn't exist. AC_LIB_LINKFLAGS_BODY([intl]) AC_CACHE_CHECK([for GNU gettext in libintl], [$gt_func_gnugettext_libintl], [gt_save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $INCINTL" gt_save_LIBS="$LIBS" LIBS="$LIBS $LIBINTL" dnl Now see whether libintl exists and does not depend on libiconv. AC_TRY_LINK([#include $gt_revision_test_code extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (const char *);], [bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("")], [eval "$gt_func_gnugettext_libintl=yes"], [eval "$gt_func_gnugettext_libintl=no"]) dnl Now see whether libintl exists and depends on libiconv. if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" != yes; } && test -n "$LIBICONV"; then LIBS="$LIBS $LIBICONV" AC_TRY_LINK([#include $gt_revision_test_code extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (const char *);], [bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("")], [LIBINTL="$LIBINTL $LIBICONV" LTLIBINTL="$LTLIBINTL $LTLIBICONV" eval "$gt_func_gnugettext_libintl=yes" ]) fi CPPFLAGS="$gt_save_CPPFLAGS" LIBS="$gt_save_LIBS"]) fi dnl If an already present or preinstalled GNU gettext() is found, dnl use it. But if this macro is used in GNU gettext, and GNU dnl gettext is already preinstalled in libintl, we update this dnl libintl. (Cf. the install rule in intl/Makefile.in.) if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" = "yes"; } \ || { { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; } \ && test "$PACKAGE" != gettext-runtime \ && test "$PACKAGE" != gettext-tools; }; then gt_use_preinstalled_gnugettext=yes else dnl Reset the values set by searching for libintl. LIBINTL= LTLIBINTL= INCINTL= fi ifelse(gt_included_intl, yes, [ if test "$gt_use_preinstalled_gnugettext" != "yes"; then dnl GNU gettext is not found in the C library. dnl Fall back on included GNU gettext library. nls_cv_use_gnu_gettext=yes fi fi if test "$nls_cv_use_gnu_gettext" = "yes"; then dnl Mark actions used to generate GNU NLS library. BUILD_INCLUDED_LIBINTL=yes USE_INCLUDED_LIBINTL=yes LIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LIBICONV $LIBTHREAD" LTLIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LTLIBICONV $LTLIBTHREAD" LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'` fi CATOBJEXT= if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then dnl Mark actions to use GNU gettext tools. CATOBJEXT=.gmo fi ]) if test -n "$INTL_MACOSX_LIBS"; then if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then dnl Some extra flags are needed during linking. LIBINTL="$LIBINTL $INTL_MACOSX_LIBS" LTLIBINTL="$LTLIBINTL $INTL_MACOSX_LIBS" fi fi if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then AC_DEFINE(ENABLE_NLS, 1, [Define to 1 if translation of program messages to the user's native language is requested.]) else USE_NLS=no fi fi AC_MSG_CHECKING([whether to use NLS]) AC_MSG_RESULT([$USE_NLS]) if test "$USE_NLS" = "yes"; then AC_MSG_CHECKING([where the gettext function comes from]) if test "$gt_use_preinstalled_gnugettext" = "yes"; then if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then gt_source="external libintl" else gt_source="libc" fi else gt_source="included intl directory" fi AC_MSG_RESULT([$gt_source]) fi if test "$USE_NLS" = "yes"; then if test "$gt_use_preinstalled_gnugettext" = "yes"; then if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then AC_MSG_CHECKING([how to link with libintl]) AC_MSG_RESULT([$LIBINTL]) AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCINTL]) fi dnl For backward compatibility. Some packages may be using this. AC_DEFINE(HAVE_GETTEXT, 1, [Define if the GNU gettext() function is already present or preinstalled.]) AC_DEFINE(HAVE_DCGETTEXT, 1, [Define if the GNU dcgettext() function is already present or preinstalled.]) fi dnl We need to process the po/ directory. POSUB=po fi ifelse(gt_included_intl, yes, [ dnl If this is used in GNU gettext we have to set BUILD_INCLUDED_LIBINTL dnl to 'yes' because some of the testsuite requires it. if test "$PACKAGE" = gettext-runtime || test "$PACKAGE" = gettext-tools; then BUILD_INCLUDED_LIBINTL=yes fi dnl Make all variables we use known to autoconf. AC_SUBST(BUILD_INCLUDED_LIBINTL) AC_SUBST(USE_INCLUDED_LIBINTL) AC_SUBST(CATOBJEXT) dnl For backward compatibility. Some configure.ins may be using this. nls_cv_header_intl= nls_cv_header_libgt= dnl For backward compatibility. Some Makefiles may be using this. DATADIRNAME=share AC_SUBST(DATADIRNAME) dnl For backward compatibility. Some Makefiles may be using this. INSTOBJEXT=.mo AC_SUBST(INSTOBJEXT) dnl For backward compatibility. Some Makefiles may be using this. GENCAT=gencat AC_SUBST(GENCAT) dnl For backward compatibility. Some Makefiles may be using this. INTLOBJS= if test "$USE_INCLUDED_LIBINTL" = yes; then INTLOBJS="\$(GETTOBJS)" fi AC_SUBST(INTLOBJS) dnl Enable libtool support if the surrounding package wishes it. INTL_LIBTOOL_SUFFIX_PREFIX=gt_libtool_suffix_prefix AC_SUBST(INTL_LIBTOOL_SUFFIX_PREFIX) ]) dnl For backward compatibility. Some Makefiles may be using this. INTLLIBS="$LIBINTL" AC_SUBST(INTLLIBS) dnl Make all documented variables known to autoconf. AC_SUBST(LIBINTL) AC_SUBST(LTLIBINTL) AC_SUBST(POSUB) ]) dnl gt_NEEDS_INIT ensures that the gt_needs variable is initialized. m4_define([gt_NEEDS_INIT], [ m4_divert_text([DEFAULTS], [gt_needs=]) m4_define([gt_NEEDS_INIT], []) ]) dnl Usage: AM_GNU_GETTEXT_NEED([NEEDSYMBOL]) AC_DEFUN([AM_GNU_GETTEXT_NEED], [ m4_divert_text([INIT_PREPARE], [gt_needs="$gt_needs $1"]) ]) dnl Usage: AM_GNU_GETTEXT_VERSION([gettext-version]) AC_DEFUN([AM_GNU_GETTEXT_VERSION], []) parcellite-1.2.1/m4/nls.m40000644000175000017500000000226613041603201013313 0ustar hlehle# nls.m4 serial 3 (gettext-0.15) dnl Copyright (C) 1995-2003, 2005-2006 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1995-2000. dnl Bruno Haible , 2000-2003. AC_PREREQ(2.50) AC_DEFUN([AM_NLS], [ AC_MSG_CHECKING([whether NLS is requested]) dnl Default is enabled NLS AC_ARG_ENABLE(nls, [ --disable-nls do not use Native Language Support], USE_NLS=$enableval, USE_NLS=yes) AC_MSG_RESULT($USE_NLS) AC_SUBST(USE_NLS) ]) parcellite-1.2.1/svnversion.sh0000755000175000017500000000155613041603201014511 0ustar hlehle#!/bin/sh echo "$0">svnversion.log if [ -n "$1" ]; then echo "Immediate Mode">>svnversion.log IM=1 else IM=0 fi which svnversion > _svnversion_test if [ $? -ne 0 ] ;then echo "svn" else CWD=$(pwd) #path supplied? D=$(dirname $0) if [ "." = "$D" ]; then PPATH="$CWD" #no else PPATH="$D" fi cd "$PPATH" # are we lndired? LINK=$(readlink configure.ac) if [ -n "$LINK" ]; then #link FULLPATH=$(dirname "$LINK") else FULLPATH="$CWD" fi cd "$FULLPATH" echo "Using $FULLPATH">>"$CWD/svnversion.log" SVER=$(svn info .|grep -i "revision"|sed 's!.*: !!'|tr -d ' ') echo -n "svn$SVER" cd $CWD if [ "$IM" = "1" ]; then sed -i "s#\(.*VERSION \).*#\1\"svn$SVER\"#" config.h echo "Make sure to do svn up in source svn to update local svn info, then run again." rm src/main.o echo "Removed src/main.o. Recompile." fi fi parcellite-1.2.1/ChangeLog0000644000175000017500000004135313041603201013507 0ustar hlehleV1.2.1 Monday, Jan 23, 2017 +Implemented patch from Christopher Oliver that fixes a memory access bug on history clear. +Fixed minor missing fclose bug in save_history credits dcb. +Fixed bug 144, Clipboard text quoted for action commands. V1.2.0 Monday, Jan 23, 2017 +Removed -d option. +Fixed bug 151, history clear not working. +Fixed bug 150, Command line examples not working. Note: parcellite must be running already. +Fixed bug 147, resource leak on history file. +Fixed bug 143, Parcellite fails to start as daemon. Also fixes Debian bug 785472. +Added TW_zh .po file. V1.1.9 Wednesday, Oct 01, 2014 +Fixed bug 120, position_history broken. We limit x & y with screen limit -100. +Fixed bug 124, Enter does not select entry. +Fixed bug 125, Unsolicited error message about xdotool. +Added feature request 57, change systray icon. +Updated Spanish translation by jcsl. +Updated Chinese translation by wenjie. +Fixed Bug 123, right-click edit broken. +Fixed unsolicited error message on startup (related to bug 125). +Cleaned up many warnings. Note to self: use env CFLAGS=-Wall ./configure --prefix=/usr/local +Initial attempt at fixing bugs 129/137/133 - unable to copy files in file manager & text deselection. +Attempt to clean up 'malformed email address' for Lintin. V1.1.8 Thursday, July 3, 2014 +Fixed bug 107, segfault when action key missing in parcelliterc. +Fixed bug 108, red search-as-you-type with super-K key. +Fixed bug 109, segfault when action key missing and history key changed. +Updated Russian translation. +Fix broken case-sensitive search. +Fixed bug 111, unlock a mutext not locked. +Fixed history editing problem issue where history is updated while editing. +Added emphatic statement about xdotool on the autopaste tooltip. +Added pref_mapper that maps prefs to integer values so we don't have to string compares in main loop. Should decrease CPU cycles considerably in the ticker. +Added ability to use system-wide XDG config file on first startup. +Added dialog popup if auto-paste is checked and xdotool does not exist. +Added item_limit (which is the same thing as data_size) which limits per-item size. +Fixed syncronization bug when trim whitespace was selected and proccessed entry was already in history. +Fix of bug in write_fifo. +Fix item and data size to correct scaling, and change to KB for better granularity. +Fix bug 121, context menu stays up after history menu is deactivated. +Fix new bug with memory leak by destroying history menu every time, related to bug 121. +Fix minor bug where edit shows up on right-click even when user disabled it. +Fix bug where right-click-ctrl/shift did not delete history entries. V1.1.7 Tuesday, October 15, 2013 +Added remote i386 build and upload to sourceforge. +Fixed bug 100, pot doesn't contain entries +Updated French translation. +Fixed duplicate empty string which causes errors in translations. +Final fix for bug 81. +Fix Duplicate Edit box when editing keyboard history entries (reported in bug 103 as sidenote). +Added Right-click edit option, to directly edit any history item, without it being current selection. +Fixed bug 102/feature request 49, low resolution icon. +Fixed history containing 0 length items. +Added ability to right-click edit each menu item (rather than Alt-E). +Fix part 1 of bug 104, Right-click edit with 0 len text results in blank entries on clip. +Fix part 2 of bug 104, crashing with right-click edit blank entries. +Changed append_item so it is not de-allocating/reallocating memory, instead just repositions entry in list. +Fixed two or more action keys having the same key. +Fix bug 105, failure to build with libappindicator. +WARNING: I've changed the data size limit to be in Kb, not Mb, as it was before. Adjust accordingly (multiply by 1000). +Added history mutex locking around each bit that accesses the global history menu. V1.1.6 Thursday, August 1 2013 +Fixed Bug #99, Broken CLI functionality. Now looks at XDG_SESSION_COOKIE, XDG_SEAT, and DISPLAY, introduced by multi-user fix. +Fixed bug where if fifo are not found in client mode, parcellite segfaults. +Apply patch for typo in German translation, patch #30. +Updated parcellite.pot (./extract_strings.sh). +Changed name of history file from hist.test to history (debug escape). To restore the history, Quit Parcellite, then cd to $HOME/.local/share/parcellite: mv hist.test history +Added script to generate parcellite.pot & check in file, and gets run before each release from rel.sh. +Updated Brazilian Portuguese translation. V1.1.5 Wednesday, July 17 2013 +Added ppa script. +Updated German Translation from patch by Christoph Wickert. +Fixed bug 79, reverse order doesn't work. +Added fifo_cmd, and stop_all, run_all commands. +Fixed bug 82, Parcellite sometimes eats about twenty last characters from a an entry in history. +Fixed bug where item length reverts to 50 if > 75. Now uses DEF_ITEM_LENGTH_MAX. +Added Frame creation to add_section. +Tentative Fix for bug 81, Cannot run for multiple users, on multiple X sessions. +Fixed bug 83, Ctrl+c/v does not work for blender. +Added automake rule to set svn version each time svn version is built. +Fixed svnversion to use local copy. +Added Clipboard standard usage notes to main.c. +Fixed Bug 85, Garbage in clipboard when app is closed. +Fixed Bug 86, Parcellite not putting history text in clipboard. +Fixed Bug 87,Error converting selection from UTF8_STRING fills X log. +Improved documentation for Actions. +Fix bug 88, Parcellite does not work with appindicator in Raring. +Fix bug 92, Ctrl-Shift/Right-Click followed by Clear produces SegFault/Double Free. +Added Keyboard Input feature. +Fixed bug #94, spam stdout with Looking for 'indicator-menu'. +Fixed bug 97, inkscape doesn't work (other objects besides text overwritten from clip). +Added Restore Empty option in preferences, and added -v/--version option. +Fixed bug 89, odd behaviour with gnome-terminal search. +Fixed bug 91, gnome-terminal and deselect bug (again). +Fixed bug 96, entries with lots of tabs too wide/feature-request, alternate non-printing display. +Added debug_update preference (but currently disabled via DEBUG_UPDATE in parcellite.h. +Fixed GTK warning about GTK_IS_WIDGET/GTK_IS_WINDOW when history window closes. +Changed mulituser logic to look at owner of PID dir in /proc (added pid_to_uid). +Added XDG_SESSION_COOKIE check to see if we are in the same X session for multi-users. +Added gpg key for deb build (does not effect application). V1.1.4 Saturday, January 19 2013 Changes +Fixed Visual deselection bug where parcellite was doing unnecessary updates. +Changed appindicator usage. If indicator-appmenu is not strstr found, then use old status icon. +This change should revert icon behaviour back to pre-libappindicator, for WMs that are not Unity. +Added History to popup menu when running Unity. +Removed Mutex locs for clipboard updates, commented out some debug prints. V1.1.3 Thursday, January 17 2013 Changes +Fixed persistent history so it is persistent if checked. +Changed all single lists to double. +Cleaned up prefs subsystem code in add_section. +Fixed corner case bug with persistent history moving to normal. +Fixed fifo segfault on parcellite fresh install. V1.1.2 Thursday, January 17 2013 Changes +Added tooltips for Primary,copy, and syncronize options. +Fixed lockup bug recently introduced. +Fixed status icon showing up with -n in appindicator. +Changed Paste All to Copy All to clip. V1.1.1 Wednesday, January 16 2013 Changes +Added Paste All on history item right-click. +Added Edit on history item right-click. +Fix Bug 3417225,Alt+c clear invoked when Ctrl+Alt+c is hotkey. +Fix Bug 2687052(re-introduced in rc7) that auto-deselects text in apps like LyX and DevHelp. SVN319 +Added tooltip for Action/Command column headers. +Fixed svnversion.sh so it shows correct svn revision +Added automatic paste via xdotool. +Added multiple items per line on preferences subsytem. V1.1.0 Wednesday, January 16 2013 Changes ***This is a major release.*** +Added patch 3389976 - history menu crash, utf-8 +Added UTF-8 checks on incomming text streams. +Changed history entries to structures (and history file format) to support upcoming features. +Added persistent history list and corresponding hot key. +Added right-click either history list with a Move To or cancel. +Added Save As for the history file - writes a text file out. +Major rewrite of cliboard handling. It is now very simple and eliminates a lot of CPU overhead. +Fixed bug 3560995, mouse button events causing false searches. +Added appindicator so it appears in unity. +Completely re-wrote prefs sybsystem, so prefs are easier to add. +Fixed wide dialog, and quit instant activation. +Added current entry on to preference. +Added locking for clipboard updates. +Fixed lost clip entries when selecting existing history clip entries. V1.0.2rc6 Wednesday, January 9 2013 Changes +Applied glib patch from bug 3518845 +Applied 0 size Action file lockup from bug 3459123 +Fixed arrow/home/page up keys messing up search-as-you-type. +Fixed having multiple copies of parcellite. Checks to see if already running. +Fixed double backspace on search-as-you-type. +Fixed command line copies to clipboard. Should work on all X sessions. +Note: entry is not immediately added to clipboard. There is a 1/2 sec delay. V1.0.2rc5 Friday, September 9 2011 Changes +Fixed the primary deselect and file cut/paste issue. V1.0.2rc4 Monday, September 5 2011 Changes +Fix bugs introduced in clipboard code selection. Should fix primary deselect and file cut/paste issue. +Applied FSF Address change patch from Andrew Starr-Bochicchio, Debian. +Changed history limit to 1000. +Applied build patch on new Debian boxes Andrew Starr-Bochicchio, Debian. V1.0.2rc3 Sunday, August 7 2011 Changes +Fixed xdg compliance, based on patch by Victor Ananjevsky. +Fixed Status Icon missing on execute Action. +Fixed Capture Hyperlinks only +Added Ignore Whitespace only +Added Trim Whitespace +Added Trim Newlines +Fixed Actions having HTML markup in the clipboard entry. +Fixed goption warning. +Updated Russian (Alexander Kazancev). +Updated Catalan translation, position type. (Fuertes::Benjami) +cleaned up clipboard handling stuff, which broke primary selection. V1.0.2rc2 Tuesday, April 05 2011 Changes +Fixed E, Alt-E (edit clipboard) not working bug. V1.0.2rc1 Thursday, March 24 2011 Changes +Move configure.in to configure.ac, fix so just links with gtk+ +Removed files autogenerated by automake tools. +Added auto-insert svn version for svn builds. +Changed item_length to go down to 5 and up to 100. +Changed Hot Keys so they activate on keypress. +Added Ctrl,Shift-delete functionality. +Added debian package build script. V1.0.1 Thursday, March 9 2011 Changes +Fixed build so dist-clean does not remove icons. +Added wrapper p_strcmp so it builds with Gtk <2.16 V1.0.0 Wednesday, March 2 2011 Changes +Created new icon 'parcellite' and added it to install. +Moved newline to after elipsizing (thanks, Christian). +Added right-click delete. +Added history location +Added search as you type. +Added Data Size limt. V0.9.3 Monday, December 20 2010 Changes +Fixed 100% CPU bug that occurs with certain clipboard data. +Fixed list not staying at the top of the list. +Added patch that corrects clipboard losing text data when app closes. +Added more man page information. V0.9.2 Friday, January 01 2010 New + Danish translation (by Kim Jensen). + Czech translation (by Miloš Koutný). + French translation (by Vincent Coiffier). + Romanian translation (by Ovidiu D. Niţan). Changes + Modified action execution code. + Removed dependency on pthreads. + Clear option clears clipboard and primary contents. + Use accessor functions instead direct access (by Javier Jardon). + Add missing include statements to silence gcc warnings (by Ludwig Nussel). + Clipboard sync cannot be enabled unless both copy and primary are enabled. + Empty clipboard and primary recovery no longer overwrites contents of other types. + Removes newline characters ('\n') from the history menu entries (by Daniel Di Marco). V0.9.1 Wednesday, March 18 2009 New + Several new translations. + Print primary contents command line option. + Clipboard and primary synchronization (by Wolfgang Schnerring). Changes + Updated translations. + Eliminated redundant disk activity. + Control-click patch for actions menu. + Selected items are bumped to the top of the history. + Improved (once again) new clipboard/primary contents handling. + Piping clipboard contents no longer truncates new line character. + New Edit Clipboard dialog. Old dialog had strange behavior under different window managers. V0.9 Thursday, November 20 2008 New + Confirm clear option. + Parcellite menu hotkey. + Translated .desktop files. + Hungarian and turkish translation. + Support for managing x-selection (primary). + Prevent empty clipboard. Clipboard/Primary contents are backed up and recovered if they ever become NULL. Changes + Fixed/updated daemon mode. + Changed preferences dialog. + Changed actions preferences to use GtkTreeView's built in editing mode. + Fixed bug with icon showing up in --no-icon mode when you execute an action. + Fixed parcellite-startup.desktop to include "Type=Application" to prevent desktop-file-validate from failing. V0.8 Monday, August 11 2008 New + Daemon mode. + Reverse history option. + Internationalization support. + German, Russian, Italian and Spanish translations. + No-icon option (uses Ctrl-Alt-P for the menu). Changes + Menu generation and display is quicker. + Selected items also get copied to primary. + History shows newest item first by default. + Performance and overall improvement on action executions. V0.7 Sunday, March 30 2008 New + Added man page. + Option to disable/enable saving history. Changes + Removed startup option. + Performance improvements. + Runs at startup by default in GNOME (remove via GNOME's Sessions application). + Config now saves in ~/.config/parcellite following freedesktop.org specifications. + Data now saves in ~/.local/share/parcellite following freedesktop.org specifications. + Bugfix: Assertion error on first run. V0.6.1 Sunday, February 24 2008 Changes + Renamed uninstall.py to uninstall-pre-0.5.py to clear up that it only uninstalls pre-0.5 versions of parcellite. + Bugfix: Edit clipboard window skipping taskbar prevented quitting if it was open and the window manager minized all windows. V0.6 Sunday, February 03 2008 New + Added global hotkeys for history and actions menu. C for clipboard and A for actions by default. Changes + Changed icon tooltip text to generic "Clipboard Manager." + Added additional verbose comments in code. + Bugfix: Edit clipboard not destroying window when finished. V0.5.1 Monday, January 21 2008 Changes + Fixed memory leak. V0.5 Saturday, January 19 2008 Notes + Remove your old .parcellite directory when upgrading to this version. + Run "python uninstall.py" as root to uninstall pre-0.5 versions of parcellite. New + Translated to C. Faster, leaner, etc. + Parcellite now features command line access to the clipboard. Example uses: echo "Hello World" | parcellite (copies Hello World to clipboard) parcellite Hello World (copies Hello World to clipboard) parcellite -o (prints clipboard contents) echo "Hello World" | parcellite -o (copies Hello World to clipboard and prints it) Changes + Added icon in about dialog. + Allow multiple instances (though I don't see why you would; could experience problems). V0.4.1 Thursday, December 13 2007 + Updated how items get captured. + Bugfix: Files couldn't save if .parcellite folder was deleted while Parcellite was running. + Bugfix: Clear was emptying clipboard contents. V0.4 Thursday, November 15 2007 New feature: Clipboard Actions + Control-clicking the tray icon brings up the new actions menu for quick shell commands using the clipboard contents (similar but simpler than Klipper actions). Changes + Added new control-click menu (actions) to the tray icon. + Added new tab in the preferences dialog for editing actions. + Minor changes to some GTK+ code, mostly variable name changes and cleanup. V0.3.2 Thursday, November 08 2007 + Minor changes to conform to Debian policies. V0.3.1 Thursday, November 01 2007 + Fixed typo. V0.3 Thursday, November 01 2007 + Added various options to change the way items are displayed. V0.2 Friday, October 05 2007 + Removed dependancy on glade. + Bugfix: Quit with open dialogs produced strange behaviour because the app does not have a main window. V0.1 Wednesday, September 19 2007 + First release. parcellite-1.2.1/src/0000755000175000017500000000000013041603201012516 5ustar hlehleparcellite-1.2.1/src/keybinder.c0000644000175000017500000001733713041603201014651 0ustar hlehle/* keybinder.c * Developed by Alex Graveley for Tomboy * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include #include #include #include #include #include "eggaccelerators.h" #include "keybinder.h" /* Uncomment the next line to print a debug trace. */ /* #define DEBUG */ #ifdef DEBUG # define TRACE(x) x #else # define TRACE(x) do {} while (FALSE); #endif typedef struct _Binding { BindkeyHandler handler; gpointer user_data; char *keystring; uint keycode; uint modifiers; } Binding; static GSList *bindings = NULL; static guint32 last_event_time = 0; static gboolean processing_event = FALSE; static guint num_lock_mask, caps_lock_mask, scroll_lock_mask; static void lookup_ignorable_modifiers (GdkKeymap *keymap) { egg_keymap_resolve_virtual_modifiers (keymap, EGG_VIRTUAL_LOCK_MASK, &caps_lock_mask); egg_keymap_resolve_virtual_modifiers (keymap, EGG_VIRTUAL_NUM_LOCK_MASK, &num_lock_mask); egg_keymap_resolve_virtual_modifiers (keymap, EGG_VIRTUAL_SCROLL_LOCK_MASK, &scroll_lock_mask); } static void grab_ungrab_with_ignorable_modifiers (GdkWindow *rootwin, Binding *binding, gboolean grab) { guint mod_masks [] = { 0, /* modifier only */ num_lock_mask, caps_lock_mask, scroll_lock_mask, num_lock_mask | caps_lock_mask, num_lock_mask | scroll_lock_mask, caps_lock_mask | scroll_lock_mask, num_lock_mask | caps_lock_mask | scroll_lock_mask, }; int i; for (i = 0; i < G_N_ELEMENTS (mod_masks); i++) { if (grab) { XGrabKey (GDK_WINDOW_XDISPLAY (rootwin), binding->keycode, binding->modifiers | mod_masks [i], GDK_WINDOW_XWINDOW (rootwin), False, GrabModeAsync, GrabModeAsync); } else { XUngrabKey (GDK_WINDOW_XDISPLAY (rootwin), binding->keycode, binding->modifiers | mod_masks [i], GDK_WINDOW_XWINDOW (rootwin)); } } } static gboolean do_grab_key (Binding *binding) { GdkKeymap *keymap = gdk_keymap_get_default (); GdkWindow *rootwin = gdk_get_default_root_window (); EggVirtualModifierType virtual_mods = 0; guint keysym = 0; if (keymap == NULL || rootwin == NULL) return FALSE; if (!egg_accelerator_parse_virtual (binding->keystring, &keysym, &virtual_mods)) return FALSE; TRACE (g_print ("Got accel %d, %d\n", keysym, virtual_mods)); binding->keycode = XKeysymToKeycode (GDK_WINDOW_XDISPLAY (rootwin), keysym); if (binding->keycode == 0) return FALSE; TRACE (g_print ("Got keycode %d\n", binding->keycode)); egg_keymap_resolve_virtual_modifiers (keymap, virtual_mods, &binding->modifiers); TRACE (g_print ("Got modmask %d\n", binding->modifiers)); gdk_error_trap_push (); grab_ungrab_with_ignorable_modifiers (rootwin, binding, TRUE /* grab */); gdk_flush (); if (gdk_error_trap_pop ()) { g_warning ("Binding '%s' failed!\n", binding->keystring); return FALSE; } return TRUE; } static gboolean do_ungrab_key (Binding *binding) { GdkWindow *rootwin = gdk_get_default_root_window (); TRACE (g_print ("Removing grab for '%s'\n", binding->keystring)); grab_ungrab_with_ignorable_modifiers (rootwin, binding, FALSE /* ungrab */); return TRUE; } static GdkFilterReturn filter_func (GdkXEvent *gdk_xevent, GdkEvent *event, gpointer data) { GdkFilterReturn return_val = GDK_FILTER_CONTINUE; XEvent *xevent = (XEvent *) gdk_xevent; guint event_mods; GSList *iter; TRACE (g_print ("Got Event! %d, %d\n", xevent->type, event->type)); switch (xevent->type) { case KeyPress: TRACE (g_print ("Got KeyRelease! keycode: %d, modifiers: %d\n", xevent->xkey.keycode, xevent->xkey.state)); /* * Set the last event time for use when showing * windows to avoid anti-focus-stealing code. */ processing_event = TRUE; last_event_time = xevent->xkey.time; event_mods = xevent->xkey.state & ~(num_lock_mask | caps_lock_mask | scroll_lock_mask); for (iter = bindings; iter != NULL; iter = iter->next) { Binding *binding = (Binding *) iter->data; if (binding->keycode == xevent->xkey.keycode && binding->modifiers == event_mods) { TRACE (g_print ("Calling handler for '%s'...\n", binding->keystring)); (binding->handler) (binding->keystring, binding->user_data); } } processing_event = FALSE; break; case KeyRelease: TRACE (g_print ("Got KeyPress! \n")); break; } return return_val; } static void keymap_changed (GdkKeymap *map) { GdkKeymap *keymap = gdk_keymap_get_default (); GSList *iter; TRACE (g_print ("Keymap changed! Regrabbing keys...")); for (iter = bindings; iter != NULL; iter = iter->next) { Binding *binding = (Binding *) iter->data; do_ungrab_key (binding); } lookup_ignorable_modifiers (keymap); for (iter = bindings; iter != NULL; iter = iter->next) { Binding *binding = (Binding *) iter->data; do_grab_key (binding); } } void keybinder_init (void) { GdkKeymap *keymap = gdk_keymap_get_default (); GdkWindow *rootwin = gdk_get_default_root_window (); lookup_ignorable_modifiers (keymap); gdk_window_add_filter (rootwin, filter_func, NULL); g_signal_connect (keymap, "keys_changed", G_CALLBACK (keymap_changed), NULL); } void keybinder_bind (const char *keystring, BindkeyHandler handler, gpointer user_data) { Binding *binding; gboolean success; binding = g_new0 (Binding, 1); binding->keystring = g_strdup (keystring); binding->handler = handler; binding->user_data = user_data; /* Sets the binding's keycode and modifiers */ success = do_grab_key (binding); if (success) { bindings = g_slist_prepend (bindings, binding); } else { g_free (binding->keystring); g_free (binding); } } void keybinder_unbind (const char *keystring, BindkeyHandler handler) { GSList *iter; /*g_fprintf(stderr,"%s: key='%s'\n",__func__,keystring); */ if(NULL == keystring) return; for (iter = bindings; iter != NULL; iter = iter->next) { Binding *binding = (Binding *) iter->data; if(NULL !=binding){ if (strcmp (keystring, binding->keystring) != 0 || handler != binding->handler) continue; do_ungrab_key (binding); bindings = g_slist_remove (bindings, binding); g_free (binding->keystring); g_free (binding); break; } } } /* * From eggcellrenderkeys.c. */ gboolean keybinder_is_modifier (guint keycode) { gint i; gint map_size; XModifierKeymap *mod_keymap; gboolean retval = FALSE; mod_keymap = XGetModifierMapping (gdk_display); map_size = 8 * mod_keymap->max_keypermod; i = 0; while (i < map_size) { if (keycode == mod_keymap->modifiermap[i]) { retval = TRUE; break; } ++i; } XFreeModifiermap (mod_keymap); return retval; } guint32 keybinder_get_current_event_time (void) { if (processing_event) return last_event_time; else return GDK_CURRENT_TIME; } parcellite-1.2.1/src/daemon.c0000644000175000017500000000707113041603201014132 0ustar hlehle/* Copyright (C) 2007-2008 by Xyhthyx * * This file is part of Parcellite. * * Parcellite is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * Parcellite is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "parcellite.h" #include #include #include "daemon.h" #include "utils.h" static gint timeout_id; static gchar* primary_text; static gchar* clipboard_text; static GtkClipboard* primary; static GtkClipboard* clipboard; /* Called during the daemon loop to protect primary/clipboard contents */ static void daemon_check() { /* Get current primary/clipboard contents */ gchar* primary_temp = gtk_clipboard_wait_for_text(primary); gchar* clipboard_temp = gtk_clipboard_wait_for_text(clipboard); /* Check if primary contents were lost */ if ((primary_temp == NULL) && (primary_text != NULL)) { /* Check contents */ gint count; GdkAtom *targets; gboolean contents = gtk_clipboard_wait_for_targets(primary, &targets, &count); g_free(targets); /* Only recover lost contents if there isn't any other type of content in the clipboard */ if (!contents) gtk_clipboard_set_text(primary, primary_text, -1); } else { /* Get the button state to check if the mouse button is being held */ GdkModifierType button_state; gdk_window_get_pointer(NULL, NULL, NULL, &button_state); if ((primary_temp != NULL) && !(button_state & GDK_BUTTON1_MASK)) { g_free(primary_text); primary_text = p_strdup(primary_temp); } } /* Check if clipboard contents were lost */ if ((clipboard_temp == NULL) && (clipboard_text != NULL)) { /* Check contents */ gint count; GdkAtom *targets; gboolean contents = gtk_clipboard_wait_for_targets(clipboard, &targets, &count); g_free(targets); /* Only recover lost contents if there isn't any other type of content in the clipboard */ if (!contents) gtk_clipboard_set_text(clipboard, clipboard_text, -1); } else { g_free(clipboard_text); clipboard_text = p_strdup(clipboard_temp); } g_free(primary_temp); g_free(clipboard_temp); } /* Called if timeout was destroyed */ static void reset_daemon(gpointer data) { if (timeout_id != 0) g_source_remove(timeout_id); /* Add the daemon loop */ timeout_id = g_timeout_add_full(G_PRIORITY_LOW, DAEMON_INTERVAL, (GSourceFunc)daemon_check, NULL, (GDestroyNotify)reset_daemon); } /* Initializes daemon mode */ void init_daemon_mode() { /* Create clipboard and primary and connect signals */ primary = gtk_clipboard_get(GDK_SELECTION_PRIMARY); clipboard = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD); /* Add the daemon loop */ timeout_id = g_timeout_add_full(G_PRIORITY_LOW, DAEMON_INTERVAL, (GSourceFunc)daemon_check, NULL, (GDestroyNotify)reset_daemon); /* Start daemon loop */ gtk_main(); } parcellite-1.2.1/src/eggaccelerators.h0000644000175000017500000000601213041603201016020 0ustar hlehle/* eggaccelerators.h * Copyright (C) 2002 Red Hat, Inc. * Developed by Havoc Pennington * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef __EGG_ACCELERATORS_H__ #define __EGG_ACCELERATORS_H__ #include #include G_BEGIN_DECLS /* Where a value is also in GdkModifierType we coincide, * otherwise we don't overlap. */ typedef enum { EGG_VIRTUAL_SHIFT_MASK = 1 << 0, EGG_VIRTUAL_LOCK_MASK = 1 << 1, EGG_VIRTUAL_CONTROL_MASK = 1 << 2, EGG_VIRTUAL_ALT_MASK = 1 << 3, /* fixed as Mod1 */ EGG_VIRTUAL_MOD2_MASK = 1 << 4, EGG_VIRTUAL_MOD3_MASK = 1 << 5, EGG_VIRTUAL_MOD4_MASK = 1 << 6, EGG_VIRTUAL_MOD5_MASK = 1 << 7, #if 0 GDK_BUTTON1_MASK = 1 << 8, GDK_BUTTON2_MASK = 1 << 9, GDK_BUTTON3_MASK = 1 << 10, GDK_BUTTON4_MASK = 1 << 11, GDK_BUTTON5_MASK = 1 << 12, /* 13, 14 are used by Xkb for the keyboard group */ #endif EGG_VIRTUAL_META_MASK = 1 << 24, EGG_VIRTUAL_SUPER_MASK = 1 << 25, EGG_VIRTUAL_HYPER_MASK = 1 << 26, EGG_VIRTUAL_MODE_SWITCH_MASK = 1 << 27, EGG_VIRTUAL_NUM_LOCK_MASK = 1 << 28, EGG_VIRTUAL_SCROLL_LOCK_MASK = 1 << 29, /* Also in GdkModifierType */ EGG_VIRTUAL_RELEASE_MASK = 1 << 30, /* 28-31 24-27 20-23 16-19 12-15 8-11 4-7 0-3 * 7 f 0 0 0 0 f f */ EGG_VIRTUAL_MODIFIER_MASK = 0x7f0000ff } EggVirtualModifierType; gboolean egg_accelerator_parse_virtual (const gchar *accelerator, guint *accelerator_key, EggVirtualModifierType *accelerator_mods); void egg_keymap_resolve_virtual_modifiers (GdkKeymap *keymap, EggVirtualModifierType virtual_mods, GdkModifierType *concrete_mods); void egg_keymap_virtualize_modifiers (GdkKeymap *keymap, GdkModifierType concrete_mods, EggVirtualModifierType *virtual_mods); gchar* egg_virtual_accelerator_name (guint accelerator_key, EggVirtualModifierType accelerator_mods); G_END_DECLS #endif /* __EGG_ACCELERATORS_H__ */ parcellite-1.2.1/src/daemon.h0000644000175000017500000000151713041603201014136 0ustar hlehle/* Copyright (C) 2007-2008 by Xyhthyx * * This file is part of Parcellite. * * Parcellite is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * Parcellite is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef DAEMON_H #define DAEMON_H G_BEGIN_DECLS #define DAEMON_INTERVAL 500 G_END_DECLS #endif parcellite-1.2.1/src/keybinder.h0000644000175000017500000000252213041603201014644 0ustar hlehle/* keybinder.h * Developed by Alex Graveley for Tomboy * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef __KEY_BINDER_H__ #define __KEY_BINDER_H__ #include G_BEGIN_DECLS typedef void (* BindkeyHandler) (char *keystring, gpointer user_data); void keybinder_init (void); void keybinder_bind (const char *keystring, BindkeyHandler handler, gpointer user_data); void keybinder_unbind (const char *keystring, BindkeyHandler handler); gboolean keybinder_is_modifier (guint keycode); guint32 keybinder_get_current_event_time (void); G_END_DECLS #endif /* __KEY_BINDER_H__ */ parcellite-1.2.1/src/attr_list.h0000644000175000017500000000307613041603201014702 0ustar hlehle/* Copyright (C) 2011-2013 by rickyrockrat * * This file is part of Parcellite. * * Parcellite is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * Parcellite is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef _ATTR_LIST_H_ #define _ATTR_LIST_H_ 1 /**for add/find/remove from list */ #define OPERATE_DELETE 1 /**delete_list */ #define OPERATE_PERSIST 2 /**persist_list */ PangoAttrInt *get_underline_attr(GtkLabel *label); gboolean is_underline(GtkLabel *label); void set_underline(GtkLabel *label, gboolean mode); PangoAttrInt *get_strikethrough_attr(GtkLabel *label); gboolean is_strikethrough(GtkLabel *label); void set_strikethrough(GtkLabel *label, gboolean mode); GList *find_h_item(GList *list,GtkWidget *w, GList *e); void add_h_item(struct history_info *h, GtkWidget *w, GList* element, gint which); void rm_h_item(struct history_info *h, GtkWidget *w, GList* element, gint which); void remove_deleted_items(struct history_info *h); void handle_marking(struct history_info *h, GtkWidget *w, gint index, gint which); #endif parcellite-1.2.1/src/eggaccelerators.c0000644000175000017500000004332113041603201016017 0ustar hlehle/* eggaccelerators.c * Copyright (C) 2002 Red Hat, Inc.; Copyright 1998, 2001 Tim Janik * Developed by Havoc Pennington, Tim Janik * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include "eggaccelerators.h" #include #include #include enum { EGG_MODMAP_ENTRY_SHIFT = 0, EGG_MODMAP_ENTRY_LOCK = 1, EGG_MODMAP_ENTRY_CONTROL = 2, EGG_MODMAP_ENTRY_MOD1 = 3, EGG_MODMAP_ENTRY_MOD2 = 4, EGG_MODMAP_ENTRY_MOD3 = 5, EGG_MODMAP_ENTRY_MOD4 = 6, EGG_MODMAP_ENTRY_MOD5 = 7, EGG_MODMAP_ENTRY_LAST = 8 }; #define MODMAP_ENTRY_TO_MODIFIER(x) (1 << (x)) typedef struct { EggVirtualModifierType mapping[EGG_MODMAP_ENTRY_LAST]; } EggModmap; const EggModmap* egg_keymap_get_modmap (GdkKeymap *keymap); static inline gboolean is_alt (const gchar *string) { return ((string[0] == '<') && (string[1] == 'a' || string[1] == 'A') && (string[2] == 'l' || string[2] == 'L') && (string[3] == 't' || string[3] == 'T') && (string[4] == '>')); } static inline gboolean is_ctl (const gchar *string) { return ((string[0] == '<') && (string[1] == 'c' || string[1] == 'C') && (string[2] == 't' || string[2] == 'T') && (string[3] == 'l' || string[3] == 'L') && (string[4] == '>')); } static inline gboolean is_modx (const gchar *string) { return ((string[0] == '<') && (string[1] == 'm' || string[1] == 'M') && (string[2] == 'o' || string[2] == 'O') && (string[3] == 'd' || string[3] == 'D') && (string[4] >= '1' && string[4] <= '5') && (string[5] == '>')); } static inline gboolean is_ctrl (const gchar *string) { return ((string[0] == '<') && (string[1] == 'c' || string[1] == 'C') && (string[2] == 't' || string[2] == 'T') && (string[3] == 'r' || string[3] == 'R') && (string[4] == 'l' || string[4] == 'L') && (string[5] == '>')); } static inline gboolean is_shft (const gchar *string) { return ((string[0] == '<') && (string[1] == 's' || string[1] == 'S') && (string[2] == 'h' || string[2] == 'H') && (string[3] == 'f' || string[3] == 'F') && (string[4] == 't' || string[4] == 'T') && (string[5] == '>')); } static inline gboolean is_shift (const gchar *string) { return ((string[0] == '<') && (string[1] == 's' || string[1] == 'S') && (string[2] == 'h' || string[2] == 'H') && (string[3] == 'i' || string[3] == 'I') && (string[4] == 'f' || string[4] == 'F') && (string[5] == 't' || string[5] == 'T') && (string[6] == '>')); } static inline gboolean is_control (const gchar *string) { return ((string[0] == '<') && (string[1] == 'c' || string[1] == 'C') && (string[2] == 'o' || string[2] == 'O') && (string[3] == 'n' || string[3] == 'N') && (string[4] == 't' || string[4] == 'T') && (string[5] == 'r' || string[5] == 'R') && (string[6] == 'o' || string[6] == 'O') && (string[7] == 'l' || string[7] == 'L') && (string[8] == '>')); } static inline gboolean is_release (const gchar *string) { return ((string[0] == '<') && (string[1] == 'r' || string[1] == 'R') && (string[2] == 'e' || string[2] == 'E') && (string[3] == 'l' || string[3] == 'L') && (string[4] == 'e' || string[4] == 'E') && (string[5] == 'a' || string[5] == 'A') && (string[6] == 's' || string[6] == 'S') && (string[7] == 'e' || string[7] == 'E') && (string[8] == '>')); } static inline gboolean is_meta (const gchar *string) { return ((string[0] == '<') && (string[1] == 'm' || string[1] == 'M') && (string[2] == 'e' || string[2] == 'E') && (string[3] == 't' || string[3] == 'T') && (string[4] == 'a' || string[4] == 'A') && (string[5] == '>')); } static inline gboolean is_super (const gchar *string) { return ((string[0] == '<') && (string[1] == 's' || string[1] == 'S') && (string[2] == 'u' || string[2] == 'U') && (string[3] == 'p' || string[3] == 'P') && (string[4] == 'e' || string[4] == 'E') && (string[5] == 'r' || string[5] == 'R') && (string[6] == '>')); } static inline gboolean is_hyper (const gchar *string) { return ((string[0] == '<') && (string[1] == 'h' || string[1] == 'H') && (string[2] == 'y' || string[2] == 'Y') && (string[3] == 'p' || string[3] == 'P') && (string[4] == 'e' || string[4] == 'E') && (string[5] == 'r' || string[5] == 'R') && (string[6] == '>')); } /** * egg_accelerator_parse_virtual: * @accelerator: string representing an accelerator * @accelerator_key: return location for accelerator keyval * @accelerator_mods: return location for accelerator modifier mask * * Parses a string representing a virtual accelerator. The format * looks like "<Control>a" or "<Shift><Alt>F1" or * "<Release>z" (the last one is for key release). The parser * is fairly liberal and allows lower or upper case, and also * abbreviations such as "<Ctl>" and "<Ctrl>". * * If the parse fails, @accelerator_key and @accelerator_mods will * be set to 0 (zero) and %FALSE will be returned. If the string contains * only modifiers, @accelerator_key will be set to 0 but %TRUE will be * returned. * * The virtual vs. concrete accelerator distinction is a relic of * how the X Window System works; there are modifiers Mod2-Mod5 that * can represent various keyboard keys (numlock, meta, hyper, etc.), * the virtual modifier represents the keyboard key, the concrete * modifier the actual Mod2-Mod5 bits in the key press event. * * Returns: %TRUE on success. */ gboolean egg_accelerator_parse_virtual (const gchar *accelerator, guint *accelerator_key, EggVirtualModifierType *accelerator_mods) { guint keyval; GdkModifierType mods; gint len; gboolean bad_keyval; if (accelerator_key) *accelerator_key = 0; if (accelerator_mods) *accelerator_mods = 0; g_return_val_if_fail (accelerator != NULL, FALSE); bad_keyval = FALSE; keyval = 0; mods = 0; len = strlen (accelerator); while (len) { if (*accelerator == '<') { if (len >= 9 && is_release (accelerator)) { accelerator += 9; len -= 9; mods |= EGG_VIRTUAL_RELEASE_MASK; } else if (len >= 9 && is_control (accelerator)) { accelerator += 9; len -= 9; mods |= EGG_VIRTUAL_CONTROL_MASK; } else if (len >= 7 && is_shift (accelerator)) { accelerator += 7; len -= 7; mods |= EGG_VIRTUAL_SHIFT_MASK; } else if (len >= 6 && is_shft (accelerator)) { accelerator += 6; len -= 6; mods |= EGG_VIRTUAL_SHIFT_MASK; } else if (len >= 6 && is_ctrl (accelerator)) { accelerator += 6; len -= 6; mods |= EGG_VIRTUAL_CONTROL_MASK; } else if (len >= 6 && is_modx (accelerator)) { static const guint mod_vals[] = { EGG_VIRTUAL_ALT_MASK, EGG_VIRTUAL_MOD2_MASK, EGG_VIRTUAL_MOD3_MASK, EGG_VIRTUAL_MOD4_MASK, EGG_VIRTUAL_MOD5_MASK }; len -= 6; accelerator += 4; mods |= mod_vals[*accelerator - '1']; accelerator += 2; } else if (len >= 5 && is_ctl (accelerator)) { accelerator += 5; len -= 5; mods |= EGG_VIRTUAL_CONTROL_MASK; } else if (len >= 5 && is_alt (accelerator)) { accelerator += 5; len -= 5; mods |= EGG_VIRTUAL_ALT_MASK; } else if (len >= 6 && is_meta (accelerator)) { accelerator += 6; len -= 6; mods |= EGG_VIRTUAL_META_MASK; } else if (len >= 7 && is_hyper (accelerator)) { accelerator += 7; len -= 7; mods |= EGG_VIRTUAL_HYPER_MASK; } else if (len >= 7 && is_super (accelerator)) { accelerator += 7; len -= 7; mods |= EGG_VIRTUAL_SUPER_MASK; } else { gchar last_ch; last_ch = *accelerator; while (last_ch && last_ch != '>') { last_ch = *accelerator; accelerator += 1; len -= 1; } } } else { /**accelerator != '<' */ keyval = gdk_keyval_from_name (accelerator); if (keyval == 0) bad_keyval = TRUE; accelerator += len; len -= len; } } if (accelerator_key) *accelerator_key = gdk_keyval_to_lower (keyval); if (accelerator_mods) *accelerator_mods = mods; return !bad_keyval; } /** * egg_virtual_accelerator_name: * @accelerator_key: accelerator keyval * @accelerator_mods: accelerator modifier mask * @returns: a newly-allocated accelerator name * * Converts an accelerator keyval and modifier mask * into a string parseable by egg_accelerator_parse_virtual(). * For example, if you pass in #GDK_q and #EGG_VIRTUAL_CONTROL_MASK, * this function returns "<Control>q". * * The caller of this function must free the returned string. */ gchar*egg_virtual_accelerator_name (guint accelerator_key, EggVirtualModifierType accelerator_mods) { static const gchar text_release[] = ""; static const gchar text_shift[] = ""; static const gchar text_control[] = ""; static const gchar text_mod1[] = ""; static const gchar text_mod2[] = ""; static const gchar text_mod3[] = ""; static const gchar text_mod4[] = ""; static const gchar text_mod5[] = ""; static const gchar text_meta[] = ""; static const gchar text_super[] = ""; static const gchar text_hyper[] = ""; guint l; gchar *keyval_name; gchar *accelerator; accelerator_mods &= EGG_VIRTUAL_MODIFIER_MASK; keyval_name = gdk_keyval_name (gdk_keyval_to_lower (accelerator_key)); if (!keyval_name) keyval_name = ""; l = 0; if (accelerator_mods & EGG_VIRTUAL_RELEASE_MASK) l += sizeof (text_release) - 1; if (accelerator_mods & EGG_VIRTUAL_SHIFT_MASK) l += sizeof (text_shift) - 1; if (accelerator_mods & EGG_VIRTUAL_CONTROL_MASK) l += sizeof (text_control) - 1; if (accelerator_mods & EGG_VIRTUAL_ALT_MASK) l += sizeof (text_mod1) - 1; if (accelerator_mods & EGG_VIRTUAL_MOD2_MASK) l += sizeof (text_mod2) - 1; if (accelerator_mods & EGG_VIRTUAL_MOD3_MASK) l += sizeof (text_mod3) - 1; if (accelerator_mods & EGG_VIRTUAL_MOD4_MASK) l += sizeof (text_mod4) - 1; if (accelerator_mods & EGG_VIRTUAL_MOD5_MASK) l += sizeof (text_mod5) - 1; if (accelerator_mods & EGG_VIRTUAL_META_MASK) l += sizeof (text_meta) - 1; if (accelerator_mods & EGG_VIRTUAL_HYPER_MASK) l += sizeof (text_hyper) - 1; if (accelerator_mods & EGG_VIRTUAL_SUPER_MASK) l += sizeof (text_super) - 1; l += strlen (keyval_name); accelerator = g_new (gchar, l + 1); l = 0; accelerator[l] = 0; if (accelerator_mods & EGG_VIRTUAL_RELEASE_MASK) { strcpy (accelerator + l, text_release); l += sizeof (text_release) - 1; } if (accelerator_mods & EGG_VIRTUAL_SHIFT_MASK) { strcpy (accelerator + l, text_shift); l += sizeof (text_shift) - 1; } if (accelerator_mods & EGG_VIRTUAL_CONTROL_MASK) { strcpy (accelerator + l, text_control); l += sizeof (text_control) - 1; } if (accelerator_mods & EGG_VIRTUAL_ALT_MASK) { strcpy (accelerator + l, text_mod1); l += sizeof (text_mod1) - 1; } if (accelerator_mods & EGG_VIRTUAL_MOD2_MASK) { strcpy (accelerator + l, text_mod2); l += sizeof (text_mod2) - 1; } if (accelerator_mods & EGG_VIRTUAL_MOD3_MASK) { strcpy (accelerator + l, text_mod3); l += sizeof (text_mod3) - 1; } if (accelerator_mods & EGG_VIRTUAL_MOD4_MASK) { strcpy (accelerator + l, text_mod4); l += sizeof (text_mod4) - 1; } if (accelerator_mods & EGG_VIRTUAL_MOD5_MASK) { strcpy (accelerator + l, text_mod5); l += sizeof (text_mod5) - 1; } if (accelerator_mods & EGG_VIRTUAL_META_MASK) { strcpy (accelerator + l, text_meta); l += sizeof (text_meta) - 1; } if (accelerator_mods & EGG_VIRTUAL_HYPER_MASK) { strcpy (accelerator + l, text_hyper); l += sizeof (text_hyper) - 1; } if (accelerator_mods & EGG_VIRTUAL_SUPER_MASK) { strcpy (accelerator + l, text_super); l += sizeof (text_super) - 1; } strcpy (accelerator + l, keyval_name); return accelerator; } void egg_keymap_resolve_virtual_modifiers (GdkKeymap *keymap, EggVirtualModifierType virtual_mods, GdkModifierType *concrete_mods) { GdkModifierType concrete; int i; const EggModmap *modmap; g_return_if_fail (GDK_IS_KEYMAP (keymap)); g_return_if_fail (concrete_mods != NULL); modmap = egg_keymap_get_modmap (keymap); /* Not so sure about this algorithm. */ concrete = 0; i = 0; while (i < EGG_MODMAP_ENTRY_LAST) { if (modmap->mapping[i] & virtual_mods) concrete |= (1 << i); ++i; } *concrete_mods = concrete; } void egg_keymap_virtualize_modifiers (GdkKeymap *keymap, GdkModifierType concrete_mods, EggVirtualModifierType *virtual_mods) { GdkModifierType virtual; int i; const EggModmap *modmap; g_return_if_fail (GDK_IS_KEYMAP (keymap)); g_return_if_fail (virtual_mods != NULL); modmap = egg_keymap_get_modmap (keymap); /* Not so sure about this algorithm. */ virtual = 0; i = 0; while (i < EGG_MODMAP_ENTRY_LAST) { if ((1 << i) & concrete_mods) { EggVirtualModifierType cleaned; cleaned = modmap->mapping[i] & ~(EGG_VIRTUAL_MOD2_MASK | EGG_VIRTUAL_MOD3_MASK | EGG_VIRTUAL_MOD4_MASK | EGG_VIRTUAL_MOD5_MASK); if (cleaned != 0) { virtual |= cleaned; } else { /* Rather than dropping mod2->mod5 if not bound, * go ahead and use the concrete names */ virtual |= modmap->mapping[i]; } } ++i; } *virtual_mods = virtual; } static void reload_modmap (GdkKeymap *keymap, EggModmap *modmap) { XModifierKeymap *xmodmap; int map_size; int i; /* FIXME multihead */ xmodmap = XGetModifierMapping (gdk_x11_get_default_xdisplay ()); memset (modmap->mapping, 0, sizeof (modmap->mapping)); /* there are 8 modifiers, and the first 3 are shift, shift lock, * and control */ map_size = 8 * xmodmap->max_keypermod; i = 3 * xmodmap->max_keypermod; while (i < map_size) { /* get the key code at this point in the map, * see if its keysym is one we're interested in */ int keycode = xmodmap->modifiermap[i]; GdkKeymapKey *keys; guint *keyvals; int n_entries; int j; EggVirtualModifierType mask; keys = NULL; keyvals = NULL; n_entries = 0; gdk_keymap_get_entries_for_keycode (keymap, keycode, &keys, &keyvals, &n_entries); mask = 0; j = 0; while (j < n_entries) { if (keyvals[j] == GDK_Num_Lock) mask |= EGG_VIRTUAL_NUM_LOCK_MASK; else if (keyvals[j] == GDK_Scroll_Lock) mask |= EGG_VIRTUAL_SCROLL_LOCK_MASK; else if (keyvals[j] == GDK_Meta_L || keyvals[j] == GDK_Meta_R) mask |= EGG_VIRTUAL_META_MASK; else if (keyvals[j] == GDK_Hyper_L || keyvals[j] == GDK_Hyper_R) mask |= EGG_VIRTUAL_HYPER_MASK; else if (keyvals[j] == GDK_Super_L || keyvals[j] == GDK_Super_R) mask |= EGG_VIRTUAL_SUPER_MASK; else if (keyvals[j] == GDK_Mode_switch) mask |= EGG_VIRTUAL_MODE_SWITCH_MASK; ++j; } /* Mod1Mask is 1 << 3 for example, i.e. the * fourth modifier, i / keyspermod is the modifier * index */ modmap->mapping[i/xmodmap->max_keypermod] |= mask; g_free (keyvals); g_free (keys); ++i; } /* Add in the not-really-virtual fixed entries */ modmap->mapping[EGG_MODMAP_ENTRY_SHIFT] |= EGG_VIRTUAL_SHIFT_MASK; modmap->mapping[EGG_MODMAP_ENTRY_CONTROL] |= EGG_VIRTUAL_CONTROL_MASK; modmap->mapping[EGG_MODMAP_ENTRY_LOCK] |= EGG_VIRTUAL_LOCK_MASK; modmap->mapping[EGG_MODMAP_ENTRY_MOD1] |= EGG_VIRTUAL_ALT_MASK; modmap->mapping[EGG_MODMAP_ENTRY_MOD2] |= EGG_VIRTUAL_MOD2_MASK; modmap->mapping[EGG_MODMAP_ENTRY_MOD3] |= EGG_VIRTUAL_MOD3_MASK; modmap->mapping[EGG_MODMAP_ENTRY_MOD4] |= EGG_VIRTUAL_MOD4_MASK; modmap->mapping[EGG_MODMAP_ENTRY_MOD5] |= EGG_VIRTUAL_MOD5_MASK; XFreeModifiermap (xmodmap); } const EggModmap* egg_keymap_get_modmap (GdkKeymap *keymap) { EggModmap *modmap; /* This is all a hack, much simpler when we can just * modify GDK directly. */ modmap = g_object_get_data (G_OBJECT (keymap), "egg-modmap"); if (modmap == NULL) { modmap = g_new0 (EggModmap, 1); /* FIXME modify keymap change events with an event filter * and force a reload if we get one */ reload_modmap (keymap, modmap); g_object_set_data_full (G_OBJECT (keymap), "egg-modmap", modmap, g_free); } g_assert (modmap != NULL); return modmap; } parcellite-1.2.1/src/main.c0000644000175000017500000025110013041603201013605 0ustar hlehle/* Copyright (C) 2007-2008 by Xyhthyx * * This file is part of Parcellite. * * Parcellite is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * Parcellite is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . NOTES: We keep track of a delete list while the history menu is up. We add/remove items from that list until we get a selection done event, then we delete those items from the real history From http://standards.freedesktop.org/clipboards-spec/clipboards-latest.txt Application authors should follow the following guidelines to get correct behavior: - selecting but with no explicit copy should only set PRIMARY, never CLIPBOARD - middle mouse button should paste PRIMARY, never CLIPBOARD - explicit cut/copy commands (i.e. menu items, toolbar buttons) should always set CLIPBOARD to the currently-selected data (i.e. conceptually copy PRIMARY to CLIPBOARD) - explicit cut/copy commands should always set both CLIPBOARD and PRIMARY, even when copying doesn't involve a selection (e.g. a "copy url" -option which explicitly copies an url without the url being selected first) - explicit paste commands should paste CLIPBOARD, not PRIMARY - a selection becoming unselected should never unset PRIMARY - possibly contradicting the ICCCM, clients don't need to support SECONDARY, though if anyone can figure out what it's good for they should feel free to use it for that - cut buffers are evil; they only support ASCII, they don't work with many clients, and they require data to be copied to the X server. Therefore clients should avoid using cut buffers and use only selections. We can monitor ownership change with: // This callback is invoked when the clipboard owner changes. void handle_owner_change(GtkClipboard *clipboard, GdkEvent *event, gpointer data){ } } g_signal_connect(clipboard, "owner-change", G_CALLBACK(handle_owner_change), NULL); */ #ifdef HAVE_CONFIG_H #include #endif #include "parcellite.h" #include #include /**ACT are actions, and MODE is the mode of the action */ /** #define ACT_STOP 0 #define ACT_RUN 1 */ /** defines the mode of the above actions. These are bit-wise */ #define CMODE_PRI 1 #define CMODE_CLI 2 #define CMODE_ALL 3 /**needs to be or of the above */ #define GDK_MODIFIER_MASK_MINE (GDK_CONTROL_MASK|GDK_META_MASK|GDK_SUPER_MASK) /*\ GDK_MOD1_MASK|GDK_MOD2_MASK |GDK_MOD3_MASK|GDK_MOD4_MASK|GDK_MOD5_MASK| \ GDK_BUTTON1_MASK|GDK_BUTTON2_MASK|GDK_BUTTON3_MASK|GDK_BUTTON4_MASK|\ GDK_BUTTON5_MASK)|GDK_HYPER_MASK) */ #define FIFCMD_STOP_PRI "stop_pri" #define FIFCMD_STOP_CLI "stop_cli" #define FIFCMD_STOP_ALL "stop_all" #define FIFCMD_RUN_PRI "run_pri" #define FIFCMD_RUN_CLI "run_cli" #define FIFCMD_RUN_ALL "run_all" GtkWidget *hmenu; /**see parcellite.h for DEBUG defines */ static GtkClipboard* primary; static GtkClipboard* clipboard; struct p_fifo *fifo; #ifdef HAVE_APPINDICATOR static AppIndicator *indicator=NULL; static GtkWidget *indicator_menu = NULL; #endif static GtkStatusIcon *status_icon=NULL; GMutex *hist_lock=NULL; static gboolean actions_lock = FALSE; static int show_icon=0; static int have_appindicator=0; /**if set, we have a running indicator-appmenu */ static int ignore_clipboard=0; /**if set, don't process clip entries */ #ifdef HAVE_APPINDICATOR static gchar *appindicator_process="indicator-messages-service"; /**process name */ #endif static int cmd_mode=CMODE_ALL; /**both clipboards */ /** static int cmd_state=ACT_RUN; running */ /**defines for moving between clipboard histories */ #define HIST_MOVE_TO_CANCEL 0 #define HIST_MOVE_TO_OK 1 /**clipboard handling modes */ #define H_MODE_INIT 0 /**clear out clipboards */ #define H_MODE_NEW 1 /**new text, process it */ #define H_MODE_LIST 2 /**from list, just put it on the clip */ #define H_MODE_CHECK 3 /**see if there is new/lost contents. */ #define H_MODE_LAST 4 /**just return the last updated value. */ #define H_MODE_IGNORE 5 /**just put it on the clipboard, do not process and do not add to hist list */ #define H_MODE_EMPTY_MASK 0x100 /**debug, see line 399 */ #define H_MODE_CHANGED_MASK 0x200 /**debug, see line 399 */ #define EDIT_MODE_USE_RIGHT_CLICK 1 /**used in edit dialog creation to determine behaviour. If this is set, it will edit the entry, and replace it in the history. */ #define EDIT_MODE_RC_EDIT_SET 2 /**used to */ /**speed up pref to int lookup. */ int hyperlinks_only,ignore_whiteonly,trim_newline,trim_wspace_begend,use_primary,use_copy,current_on_top,restore_empty,synchronize; static struct pref2int pref2int_map[]={ {.val=&hyperlinks_only,.name="hyperlinks_only"}, {.val=&ignore_whiteonly,.name="ignore_whiteonly"}, {.val=&trim_newline,.name="trim_newline"}, {.val=&trim_wspace_begend,.name="trim_wspace_begend"}, {.val=&use_primary,.name="use_primary"}, {.val=&use_copy,.name="use_copy"}, {.val=¤t_on_top,.name="current_on_top"}, {.val=&restore_empty,.name="restore_empty"}, {.val=&synchronize,.name="synchronize"}, {.val=NULL,.name=NULL}, }; /**protos in this file */ void create_app_indicator(void); /**Turns up in 2.16 */ int p_strcmp (const char *str1, const char *str2) { #if (GTK_MAJOR_VERSION > 2 || ( GTK_MAJOR_VERSION == 2 && GTK_MAJOR_VERSION >= 16)) return g_strcmp0(str1,str2); #else if(NULL ==str1 && NULL == str2) return 0; if(NULL ==str1 && str2) return -1; if(NULL ==str2 && str1) return 1; return strcmp(str1,str2); #endif } /***************************************************************************/ /** Process the text based on our preferences. WARNING! This modifies ntext! \n\b Arguments: \n\b Returns: processed text, or NULL if it is invalid. ****************************************************************************/ gchar *process_new_item(GtkClipboard *clip,gchar *ntext, int *mod) { glong len,nlen; gchar *rtn=NULL; int i=0; if(NULL != mod) *mod=0; if(NULL == ntext) return NULL; /**we now check our options... */ /*printf("opt\n"); fflush(NULL); */ if (hyperlinks_only){ if(is_hyperlink(ntext)) goto process; } else { /*printf("wo\n"); fflush(NULL); */ if(ignore_whiteonly){ gchar *s; for (s=ntext; NULL !=s && *s; ++s){ if(!isspace(*s)){ /* printf("Saw 0x%x\n",*s); */ goto process; break; } } }else goto process; } /**set the clipboard to the last entry - effectively deleting this entry */ goto done; process: /**now process the text. */ /*printf("proc\n"); fflush(NULL); */ len=strlen(ntext);/*g_utf8_strlen(ntext,-1); */ nlen= validate_utf8_text(ntext, len); if(nlen){ rtn=ntext; if(trim_newline){ gchar *c; for (c=ntext;*c;){ if(iscntrl(*c)){ *c=' '; ++i; } c=g_utf8_next_char(c); } } if( trim_wspace_begend ) { ntext=g_strstrip(ntext); if(NULL != mod && 0 == i && len == nlen){ if(strlen(ntext) != len) ++i; } } }else ++i; if(NULL != mod ){ if(i || nlen != len) *mod=1; } done: return rtn; } /***************************************************************************/ /** . \n\b Arguments: \n\b Returns: text that was updated or NULL if not. ****************************************************************************/ gchar *_update_clipboard (GtkClipboard *clip, gchar *n, gchar **old, int set, int mode) { /*return NULL; */ if(NULL != n) { #ifdef DEBUG_UPDATE if(clip==primary) g_printf("%03x-set%d PRI to '%s'\n",mode,set,n); else g_printf("%03x-set%d CLI to '%s'\n",mode,set,n); #endif if( set) gtk_clipboard_set_text(clip, n, -1); if(NULL != old ){ if( NULL != *old) g_free(*old); *old=g_strdup(n); return *old; } }else if( NULL != old){ if(NULL != *old) g_free(*old); *old=NULL; } return NULL; } /***************************************************************************/ /** This checks to see if ANY content exists (i.e. like images). \n\b Arguments: \n\b Returns: ****************************************************************************/ gboolean content_exists(GtkClipboard *clip) { gint count; GdkAtom *targets; gboolean contents = gtk_clipboard_wait_for_targets(clip, &targets, &count); g_free(targets); return contents; } /***************************************************************************/ /** \n\b Arguments: \n\b Returns: clipboard contents, to be freed with g_free, or NULL if empty. ****************************************************************************/ gchar *is_clipboard_empty(GtkClipboard *clip) { /** int count; GdkAtom *targets; if(clipboard == clip) g_printf("-%s-",gtk_clipboard_wait_for_text(clip)); gboolean contents = gtk_clipboard_wait_for_targets(clip, &targets, &count); if(clipboard == clip) g_printf("-%s-2nd-",gtk_clipboard_wait_for_text(clip)); g_free(targets); if(TRUE == contents || count >0) return 0;*/ #if 1 if(TRUE == gtk_clipboard_wait_is_text_available(clip)) return(gtk_clipboard_wait_for_text(clip)); #else /**attempt to fix bug 87, Error converting selection from UTF8_STRING Go http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt line 2.3.4 will reproduce this using FireFox. */ if(TRUE == gtk_clipboard_wait_is_text_available(clip)){ gchar *x=gtk_clipboard_wait_for_text(clip); if(FALSE == g_utf8_validate(x,-1,NULL)) gtk_clipboard_set_text(clip,"_BAD_UTF8_",-1); /** ulong l1, l2; l1=strlen*/ /**if NULL == x, we have a problem with whatever is in the clipboard. */ /*if(NULL ==x) */ return(x); } #endif return NULL; } /***************************************************************************/ /** See if we should update the clipboard that just changed. \n\b Arguments: clip - which clipboard intext is the text coming from the clip (above) processed is set if we handle this clip with the options we have \n\b Returns: set if we changed the new text or not. ****************************************************************************/ int do_we_set_clipboard(GtkClipboard *clip,gchar *intext,gchar **processed, int *mod) { gchar *unproc_clip; int set; if( NULL != intext) unproc_clip=g_strdup(intext); else unproc_clip=g_strdup("_NoClip_xyzpdq_"); /**process_new_item */ if(NULL != (*processed=process_new_item(clip,intext,mod)) ){ /**clipboard already has selection, no need to update if we did not change it via processing */ if(0 == p_strcmp(*processed,unproc_clip))set=0; else set=1; } else set=0; g_free(unproc_clip); return set; } /***************************************************************************/ /** Update one clipboard at a time. \n\b Arguments: \n\b Returns: text that was placed in history or NULL ****************************************************************************/ gchar *update_clipboard(GtkClipboard *clip,gchar *intext, gint mode) { /**current/last item in clipboard */ static gchar *ptext=NULL; static gchar *ctext=NULL; static gchar *last=NULL; /**last text change, for either clipboard */ int mod; gchar **existing, *changed=NULL; gchar *processed; GdkModifierType button_state; if(1 == ignore_clipboard) return NULL; /* gchar *clipname; */ int set=1; if( H_MODE_LAST == mode) return last; if(clip==primary){ /* clipname="PRI "; */ existing=&ptext; } else{ /* clipname="CLI "; */ existing=&ctext; } /** if(H_MODE_CHECK!=mode ) */ /*g_printf("HC%d-%c: in %s,ex %s\n",mode,clip==primary?'p':'c',intext,*existing); */ if( H_MODE_INIT == mode){ if(NULL != *existing) g_free(*existing); *existing=NULL; if(NULL != intext) _update_clipboard(clip,intext,NULL,1,mode); /* gtk_clipboard_set_text(clip, intext, -1); */ return NULL; } /**check that our clipboards are valid and user wants to use them */ if((clip != primary && clip != clipboard) || (clip == primary && !use_primary) || (clip == clipboard && !use_copy)) return NULL; if( H_MODE_CHECK==mode &&clip == primary){/*fix auto-deselect of text in applications like DevHelp and LyX*/ gdk_window_get_pointer(NULL, NULL, NULL, &button_state); if ( button_state & (GDK_BUTTON1_MASK|GDK_SHIFT_MASK) ) /**button down, done. */ goto done; } if(0 && NULL != intext){ /**we run this in process_new_item */ validate_utf8_text(intext,strlen(intext)); } /*g_printf("BS=0x%02X ",button_state); */ if( H_MODE_IGNORE == mode){ /**ignore processing and just put it on the clip. */ DTRACE(g_fprintf(stderr,"%sJustSet '%s'\n",clip==clipboard?"CLI":"PRI",intext)); _update_clipboard(clip,intext,NULL,1,mode); /*gtk_clipboard_set_text(clip, intext, -1); */ return intext; } if(H_MODE_LIST == mode && 0 != p_strcmp(intext,*existing)){ /**just set clipboard contents. Already in list */ DTRACE(g_fprintf(stderr,"%sInList '%s' ex '%s'\n",clip==clipboard?"CLI":"PRI",intext,*existing)); last=_update_clipboard(clip,intext,existing,1,mode); if( NULL != last){/**maintain persistence, if set */ append_item(last,current_on_top?HIST_DEL|HIST_CHECKDUP|HIST_KEEP_FLAGS:0,0,CLIP_TYPE_TEXT); } goto done; } /**check for lost contents and restore if lost */ changed=is_clipboard_empty(clip); if(NULL != changed){ if(0 == validate_utf8_text(changed,strlen(changed))) goto done; } /**handle empty clipboard */ if(NULL == changed){/**it is empty */ if(NULL != *existing && 1 == restore_empty) { DTRACE(g_fprintf(stderr,"%sclp empty, ",clip==clipboard?"CLI":"PRI")); /* Only recover lost contents if there isn't any other type of content in the clipboard */ if (!content_exists(clip)) { DTRACE(g_fprintf(stderr,"set to '%s'\n",*existing)); _update_clipboard(clip, *existing,NULL,1,mode|H_MODE_EMPTY_MASK); /*gtk_clipboard_set_text(clip, *existing, -1); */ last=*existing; } else DTRACE(g_fprintf(stderr,"Left Null\n")); return *existing; } return NULL; /**Nothing to do */ } /**check for changed clipboard content - in all modes */ /*changed=gtk_clipboard_wait_for_text(clip); */ if(0 == p_strcmp(*existing, changed) ){ g_free(changed); /**no change, do nothing */ changed=NULL; } else { DTRACE(g_fprintf(stderr,"%sclp changed: ex '%s' is '%s' - ",clip==clipboard?"CLI":"PRI",*existing,changed)); set=do_we_set_clipboard(clip,changed,&processed,&mod); if(NULL != processed ){ /**only check processed/changed. No need to update this clip, since the text is already there. If we have identical lines except for whitespace, we also have to set the clipboard. */ #ifdef DEBUG_UPDATE if(set) DTRACE(g_fprintf(stderr,"set=%d. c='%s' p='%s'\n",set,changed,processed)); #endif last=_update_clipboard(clip,processed,existing,set,mode|H_MODE_CHANGED_MASK); }else {/**restore clipboard - new item is binary/garbage/empty */ gchar *d; if(NULL ==*existing && NULL != history_list){ struct history_item *c; c=(struct history_item *)(history_list->data); d=c->text; }else d=*existing; if(NULL != d){ DTRACE(g_fprintf(stderr,"\n%srestore clp '%s', ex='%s'\n",clip==clipboard?"CLI":"PRI",d,*existing)); last=_update_clipboard(clip,d,existing,1,mode); } } if(NULL != last) append_item(last,current_on_top?HIST_DEL|HIST_CHECKDUP|HIST_KEEP_FLAGS:0,0,CLIP_TYPE_TEXT); g_free(changed); changed=NULL; } if( H_MODE_CHECK==mode ){ goto done; } /**FIXME: Do we use the changed clip item or the one passed to us? hmmm Use the changed one. */ if(H_MODE_NEW==mode){ set=do_we_set_clipboard(clip,intext,&processed,&mod); #ifdef DEBUG_UPDATE if(set) DTRACE(g_printf("%sNEW '%s' was '%s'\n",clip==clipboard?"CLI":"PRI",processed,*existing)); #endif if(NULL != processed){ last=_update_clipboard(clip,processed,existing,set,mode); if(NULL != last) append_item(last,current_on_top?HIST_DEL|HIST_CHECKDUP|HIST_KEEP_FLAGS:0,0,CLIP_TYPE_TEXT); }else return NULL; } done: return *existing; } /***************************************************************************/ /** Convience function to update both clipboards at the same time \n\b Arguments: \n\b Returns: ****************************************************************************/ void update_clipboards(gchar *intext, gint mode) { /*g_printf("upclips\n"); */ update_clipboard(primary, intext, mode); update_clipboard(clipboard, intext, mode); } /***************************************************************************/ /** Run a command. For now, just start and stop \n\b Arguments: \n\b Returns: ****************************************************************************/ void do_command(gchar *buf, gint len) { g_printf("Got '%s' cmd\n",buf); if(!p_strcmp(buf,FIFCMD_RUN_ALL)) { cmd_mode|=CMODE_ALL; return; } if(!p_strcmp(buf,FIFCMD_RUN_CLI)) { cmd_mode|=CMODE_CLI; return; } if(!p_strcmp(buf,FIFCMD_RUN_PRI)) { cmd_mode|=CMODE_PRI; return; } if(!p_strcmp(buf,FIFCMD_STOP_ALL)) { cmd_mode&=~(CMODE_ALL); return; } if(!p_strcmp(buf,FIFCMD_STOP_CLI)) { cmd_mode&=~(CMODE_CLI); return; } if(!p_strcmp(buf,FIFCMD_STOP_PRI)) { cmd_mode&=~(CMODE_PRI); return; } } /***************************************************************************/ /** Checks the clipboards and fifos for changes. \n\b Arguments: \n\b Returns: ****************************************************************************/ void check_clipboards(gint mode) { gchar *ptext, *ctext, *last; int n=0; /*g_printf("check_clipboards\n"); */ if(fifo->clen){/**we have a command to execute */ /*fifo->which should be ID_CMD: */ if(fifo->dbg) g_printf("Running CMD '%s'\n",fifo->cbuf); do_command(fifo->cbuf, fifo->clen); if(fifo->dbg) g_printf("mode is 0x%X\n",cmd_mode); fifo->clen=0; return; } if(!(CMODE_ALL & cmd_mode)) return; if(fifo->rlen >0){ switch(fifo->which){ case ID_PRIMARY: fifo->rlen=validate_utf8_text(fifo->buf, fifo->rlen); if(fifo->dbg) g_printf("Setting PRI '%s'\n",fifo->buf); update_clipboard(primary, fifo->buf, H_MODE_NEW); fifo->rlen=0; n=1; break; case ID_CLIPBOARD: fifo->rlen=validate_utf8_text(fifo->buf, fifo->rlen); if(fifo->dbg) g_printf("Setting CLI '%s'\n",fifo->buf); update_clipboard(clipboard, fifo->buf, H_MODE_NEW); n=2; fifo->rlen=0; break; default: fifo->rlen=validate_utf8_text(fifo->buf, fifo->rlen); g_printf("CLIP not set, discarding '%s'\n",fifo->buf); fifo->rlen=0; break; } } ptext=update_clipboard(primary, NULL, H_MODE_CHECK); ctext=update_clipboard(clipboard, ptext, H_MODE_CHECK); /*g_printf("pt=%s,ct=%s\n",ptext,ctext); */ /* Synchronization */ if (synchronize) { if(NULL==ptext && NULL ==ctext) goto done; last=update_clipboard(NULL, NULL, H_MODE_LAST); /*g_printf("pt=%s,ct=%s, last=%s\n",ptext,ctext,last); */ if( NULL != last && 0 != p_strcmp(ptext,ctext)){ /**last is a copy, of things that may be deallocated */ last=strdup(last); /*g_printf("Update clipb '%s' '%s' to '%s'\n",ptext,ctext,last); */ update_clipboards(last, H_MODE_LIST); g_free(last); } } done: return; } #ifdef HAVE_APPINDICATOR /***************************************************************************/ /** Check for appindicator. \n\b Arguments: \n\b Returns: ****************************************************************************/ gboolean check_for_appindictor( gpointer data) { int mode=PROC_MODE_STRSTR; if(NULL != appindicator_process && !have_appindicator ){ /*g_printf("Looking for '%s'\n",appindicator_process); */ if(get_pref_int32("multi_user")) mode|=PROC_MODE_USER_QUALIFY; if(proc_find(appindicator_process,mode,NULL) >0){ have_appindicator=1; if(NULL == indicator && show_icon) create_app_indicator(); return FALSE; } } if (1 == (int)data)/*short timer, don't call again, bug fix 118*/ return FALSE; return TRUE; } #endif /***************************************************************************/ /** Called every CHECK_INTERVAL seconds to check for new items \n\b Arguments: \n\b Returns: ****************************************************************************/ gboolean check_clipboards_tic(gpointer data) { /** gchar *txt=gtk_clipboard_wait_for_text(clipboard); g_printf("%s\n",txt);*/ if(2 == ignore_clipboard) return TRUE; check_clipboards(H_MODE_CHECK); #ifdef HAVE_APPINDICATOR if(have_appindicator){ if(NULL == indicator && show_icon) create_app_indicator(); } #endif return TRUE; } #if 0 /* Thread function called for each action performed */ static void *execute_action(void *command) { /* Execute action */ actions_lock = TRUE; if (!have_appindicator && show_icon) { gtk_status_icon_set_from_stock((GtkStatusIcon*)status_icon, GTK_STOCK_EXECUTE); gtk_status_icon_set_tooltip((GtkStatusIcon*)status_icon, _("Executing action...")); } if(system((gchar*)command)) g_fprintf(stderr,"sytem command '%s' failed\n",(gchar *)command); if (!have_appindicator &&show_icon) { gtk_status_icon_set_from_icon_name((GtkStatusIcon*)status_icon, get_pref_string("icon_name")); gtk_status_icon_set_tooltip((GtkStatusIcon*)status_icon, _("Clipboard Manager")); } actions_lock = FALSE; g_free((gchar*)command); /* Exit this thread */ pthread_exit(NULL); return NULL; } #endif /* Called when execution action exits */ static void action_exit(GPid pid, gint status, gpointer data) { g_spawn_close_pid(pid); if (!have_appindicator && show_icon) { gtk_status_icon_set_from_icon_name((GtkStatusIcon*)status_icon, get_pref_string("icon_name")); gtk_status_icon_set_tooltip((GtkStatusIcon*)status_icon, _("Clipboard Manager")); } actions_lock = FALSE; } /* Called when an action is selected from actions menu */ static void action_selected(GtkButton *button, gpointer user_data) { /* Change icon and enable lock */ actions_lock = TRUE; if (!have_appindicator && show_icon) { gtk_status_icon_set_from_stock((GtkStatusIcon*)status_icon, GTK_STOCK_EXECUTE); gtk_status_icon_set_tooltip((GtkStatusIcon*)status_icon, _("Executing action...")); } /* Insert clipboard into command (user_data), and prepare it for execution */ gchar* clipboard_text = gtk_clipboard_wait_for_text(clipboard); g_fprintf(stderr,"Got cmd '%s', text '%s'->",(gchar *)user_data,clipboard_text);fflush(NULL); gchar* quoted_clipboard_text = g_shell_quote(clipboard_text); gchar* command=g_strdup_printf((gchar *)user_data,quoted_clipboard_text); g_fprintf(stderr," '%s'\n",command);fflush(NULL); g_free(clipboard_text); g_free(quoted_clipboard_text); g_free(user_data); gchar* shell_command = g_shell_quote(command); g_free(command); gchar* cmd = g_strconcat("/bin/sh -c ", shell_command, NULL); g_free(shell_command); /* Execute action */ GPid pid; gchar **argv; g_shell_parse_argv(cmd, NULL, &argv, NULL); g_fprintf(stderr,"cmd '%s' argv '%s' '%s' '%s'\n",cmd,argv[1],argv[2],argv[3]); g_free(cmd); g_spawn_async(NULL, argv, NULL, G_SPAWN_DO_NOT_REAP_CHILD, NULL, NULL, &pid, NULL); g_child_watch_add(pid, (GChildWatchFunc)action_exit, NULL); g_strfreev(argv); } /* Called when Edit Actions is selected from actions menu */ static void edit_actions_selected(GtkButton *button, gpointer user_data) { /* This helps prevent multiple instances */ if (!gtk_grab_get_current()) /* Show the preferences dialog on the actions tab */ show_preferences(ACTIONS_TAB); } /***************************************************************************/ /** Called when Edit is selected from history menu \n\b Arguments: \n\b Returns: ****************************************************************************/ static void edit_selected(GtkMenuItem *menu_item, gpointer user_data) { struct history_info *h=(struct history_info*)user_data; GList* element=NULL; struct history_item *c=NULL; gint rslt,itype,iflags; if(NULL ==h) return; /*g_fprintf(stderr,"edit_selected call\n"); */ /* This helps prevent multiple instances */ if (!gtk_grab_get_current() ||h->wi.tmp1&EDIT_MODE_RC_EDIT_SET) { gchar* current_clipboard_text=NULL; /*g_fprintf(stderr,"current..."); */ /* Create clipboard buffer and set its text */ GtkTextBuffer* text_buffer = gtk_text_buffer_new(NULL); if(h->wi.index != -1){/**use index as pointer to text */ element = g_list_nth(history_list, h->wi.index); if(NULL == element){ g_fprintf(stderr,"edit_selected: element is NULL\n"); return; } c=(struct history_item *)(element->data); if(NULL == c){ g_fprintf(stderr,"edit_selected: element->data is NULL\n"); return; } current_clipboard_text=p_strdup(c->text); g_fprintf(stderr,"Got Text frmo wi.index ele %p '%s'",element,c->text); } else{ h->wi.tmp1=0; if( NULL != h->element_text){/**this case should never happen */ g_fprintf(stderr,"Oops. shouldn't be here\n"); current_clipboard_text=p_strdup(h->element_text); }else{ g_fprintf(stderr,"List Empty. Grab clipboard.\n"); current_clipboard_text = gtk_clipboard_wait_for_text(clipboard); } } if (current_clipboard_text != NULL) { g_fprintf(stderr,"Got '%s' for edit text\n",current_clipboard_text); TRACE(g_fprintf(stderr,"Got '%s'\n",current_clipboard_text)); gtk_text_buffer_set_text(text_buffer, current_clipboard_text, -1); } else { g_fprintf(stderr,"NULL text to edit. Nothing to do.\n"); return; } /*g_fprintf(stderr,"cr dialog\n"); */ /* Create the dialog */ GtkWidget* dialog = gtk_dialog_new_with_buttons(_("Editing Clipboard"), NULL, (GTK_DIALOG_MODAL + GTK_DIALOG_NO_SEPARATOR), GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, NULL); gtk_window_set_default_size((GtkWindow*)dialog, 450, 300); gtk_window_set_icon((GtkWindow*)dialog, gtk_widget_render_icon(dialog, GTK_STOCK_EDIT, -1, NULL)); /* Build the scrolled window with the text view */ GtkWidget* scrolled_window = gtk_scrolled_window_new((GtkAdjustment*) gtk_adjustment_new(0, 0, 0, 0, 0, 0), (GtkAdjustment*) gtk_adjustment_new(0, 0, 0, 0, 0, 0)); gtk_scrolled_window_set_policy((GtkScrolledWindow*)scrolled_window, GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), scrolled_window, TRUE, TRUE, 2); GtkWidget* text_view = gtk_text_view_new_with_buffer(text_buffer); gtk_text_view_set_left_margin((GtkTextView*)text_view, 2); gtk_text_view_set_right_margin((GtkTextView*)text_view, 2); gtk_container_add((GtkContainer*)scrolled_window, text_view); ignore_clipboard=1; /* Run the dialog */ gtk_widget_show_all(dialog); rslt=gtk_dialog_run((GtkDialog*)dialog); if ( GTK_RESPONSE_ACCEPT == rslt) { GtkTextIter start, end; guint32 slen; gchar *ntext=NULL; gtk_text_buffer_get_start_iter(text_buffer, &start); gtk_text_buffer_get_end_iter(text_buffer, &end); gchar* new_clipboard_text = gtk_text_buffer_get_text(text_buffer, &start, &end, TRUE); slen=strlen(new_clipboard_text); /*g_fprintf(stderr,"New Txt='%s'\n",new_clipboard_text); */ if(0 == slen ){ /**just delete history entry, and set next in order to clipboard */ if(NULL == element){/**just clear clipboard? or FIXME: is there a way to determine the element? */ /*gtk_clipboard_set_text(clipboard,"",0); */ gtk_clipboard_clear(clipboard); goto finish; } g_fprintf(stderr,"Freeing %p\n",element->data); g_free(element->data); if(element == history_list && NULL != element->next ){ /**set clipboard(s) to next entry */ c=(struct history_item *)(element->next->data); if(NULL != c) ntext=c->text; } history_list = g_list_delete_link(history_list, element); if(NULL != ntext)/**set clipboards to next entry FIXME: Need logic here as to which clip(s) to update. */ update_clipboards(ntext, H_MODE_LIST); }else {/**Text is not blank */ g_fprintf(stderr,"Try to add '%s'\n",new_clipboard_text); if(!p_strcmp(new_clipboard_text,current_clipboard_text)) /**same text, nothing to do */ goto finish; if( NULL != c){ itype=c->type; iflags=c->flags; }else { itype=CLIP_TYPE_TEXT; iflags=0; } /**save changes to the history - deallocate current entry, and add new entry */ /**FIXME: Need to filter this through existing & valid text? */ if(NULL != element && NULL != element->data){ struct history_item *d=(struct history_item *)(element->data); g_fprintf(stderr,"ele!null. Free %p '%s'\n",element,d->text); g_free(element->data); history_list=g_list_delete_link(history_list, element); append_item(new_clipboard_text,HIST_DEL|HIST_CHECKDUP|HIST_KEEP_FLAGS,iflags,itype); }else{ gint flags=0; g_fprintf(stderr,"ele IS null\n"); /**delete the edited entry - sets the flags for the entry. */ gint node=is_duplicate(current_clipboard_text, 1, &flags); element=g_list_nth(history_list,node); history_list=g_list_remove_link(history_list,element); /**Does this cause crash since we are in the middle of a history window? Need to kill history menu too? What about setting up an indicator that on next tic, if history is not active, we update? */ } } finish: if(NULL != new_clipboard_text) g_free(new_clipboard_text); } ignore_clipboard=0; gtk_widget_destroy(dialog); g_free(current_clipboard_text); } else TRACE(g_fprintf(stderr,"gtk_grab_get_current returned !0\n")); } /***************************************************************************/ /** Only enabled when persistent history is enabled. \n\b Arguments: \n\b Returns: ****************************************************************************/ gboolean history_item_right_click_on_edit(GtkWidget *menuitem, gpointer data) { struct history_info *h=(struct history_info*)data; h->wi.tmp1|=EDIT_MODE_USE_RIGHT_CLICK; edit_selected((GtkMenuItem *)menuitem, data); return TRUE; } /***************************************************************************/ /** Paste all. Grab all of the history and paste it to the clipboard. \n\b Arguments: \n\b Returns: ****************************************************************************/ gboolean history_item_right_click_on_copy_all(GtkWidget *menuitem, gpointer data) { GList *element; gchar*str=NULL; gchar*last=NULL; gchar*delim= g_strcompress(get_pref_string("persistent_delim")); int which; struct history_info *h=(struct history_info*)data; /**if persistent and this history is persistent, only get persistent. FIXME: this will only work with separarate set. */ which=(get_pref_int32("persistent_history") && h->histno == HIST_DISPLAY_PERSISTENT); for (element = history_list; element != NULL; element = element->next) { struct history_item *c=(struct history_item *)(element->data); if(which && !(c->flags&CLIP_TYPE_PERSISTENT)) continue; if(NULL ==str) str=c->text; else { if(NULL == delim) str=g_strconcat(str,c->text,NULL); else str=g_strconcat(str,delim,c->text,NULL); if(NULL != last) g_free(last); last=str; } } if(NULL != last){ update_clipboards(str,H_MODE_IGNORE); g_free(last); } return TRUE; } /***************************************************************************/ /** . \n\b Arguments: \n\b Returns: ****************************************************************************/ gboolean handle_history_item_right_click (int i, gpointer data) { /* we passed the view as userdata when we connected the signal */ struct history_info *h=(struct history_info*)data; struct history_item *c=NULL; if(NULL !=h ){ GList* element = g_list_nth(history_list, h->wi.index); if(NULL !=element){ c=(struct history_item *)(element->data); /*g_printf("%s ",c->text); */ } } switch(i){ case HIST_MOVE_TO_CANCEL: /* g_print("canceled\n"); */ break; case HIST_MOVE_TO_OK: /* g_printf("Move to"); */ handle_marking(h,h->wi.item,h->wi.index,OPERATE_PERSIST); break; } /*gtk_widget_grab_focus(h->menu); */ return TRUE; } /**callback wrappers for the above function */ gboolean history_item_right_click_on_move (GtkWidget *menuitem, gpointer data) { return handle_history_item_right_click(HIST_MOVE_TO_OK,data); } gboolean history_item_right_click_on_cancel (GtkWidget *menuitem, gpointer data) { return handle_history_item_right_click(HIST_MOVE_TO_CANCEL,data); } /***************************************************************************/ /** Fixes the right-click history being up when history is deactiviated. \n\b Arguments: \n\b Returns: ****************************************************************************/ void destroy_right_click_history_cb(GtkWidget *attach_widget, GtkMenu *menu) { /*g_printf("%s:\n",__func__); */ gtk_widget_destroy ((GtkWidget *) attach_widget); } /***************************************************************************/ /** Display the right-click menu. h->menu contains the top-level history window \n\b Arguments: \n\b Returns: if (event->type == GDK_BUTTON_PRESS && event->button == 3) view_popup_menu(treeview, event, userdata); h->wi.index contains the element of the item clicked on. ****************************************************************************/ void history_item_right_click (struct history_info *h, GdkEventKey *e, gint index) { GtkWidget *menu, *menuitem; struct history_item *c=NULL; if(NULL !=h ){ GList* element = g_list_nth(history_list, h->wi.index); if(NULL !=element){ c=(struct history_item *)(element->data); /*g_printf("%s ",c->text); */ } } else{ g_fprintf(stderr,"h-i-r-c: h is NULL"); return; } if(get_pref_int32("persistent_history")) { menu = gtk_menu_new(); gtk_menu_attach_to_widget((GtkMenu *)h->menu,menu,destroy_right_click_history_cb); /**fix */ menuitem = gtk_menu_item_new_with_label("Copy All to Clip"); g_signal_connect(menuitem, "activate", (GCallback) history_item_right_click_on_copy_all, (gpointer)h); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); /*g_printf("CreatehistR\n"); */ if(NULL != c){ if(c->flags & CLIP_TYPE_PERSISTENT) menuitem = gtk_menu_item_new_with_label("Move To Normal"); else menuitem = gtk_menu_item_new_with_label("Move To Persistent"); } else menuitem = gtk_menu_item_new_with_label("Move To?"); g_signal_connect(menuitem, "activate",(GCallback) history_item_right_click_on_move, (gpointer)h); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); if(get_pref_int32("rc_edit") ){ menuitem = gtk_menu_item_new_with_label("Edit"); g_signal_connect(menuitem, "activate", (GCallback) history_item_right_click_on_edit, (gpointer)h); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); } menuitem = gtk_menu_item_new_with_label("Cancel"); g_signal_connect(menuitem, "activate", (GCallback) history_item_right_click_on_cancel, (gpointer)h); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); gtk_widget_show_all(menu); /* Note: event can be NULL here when called from view_onPopupMenu; * gdk_event_get_time() accepts a NULL argument */ gtk_menu_popup(GTK_MENU(menu), h->menu, NULL, NULL, NULL, 0, /*(e != NULL) ? ((GdkEventButton *)e)->button : 0, */ gdk_event_get_time((GdkEvent*)e)); /*gtk_widget_grab_focus(menu); */ }else if(get_pref_int32("rc_edit") ){ /**just edit the selected text */ h->wi.tmp1|=EDIT_MODE_USE_RIGHT_CLICK|EDIT_MODE_RC_EDIT_SET; edit_selected((GtkMenuItem *)NULL,(gpointer)h); } } /* Called when Clear is selected from history menu */ static void clear_selected(GtkMenuItem *menu_item, gpointer user_data) { int clear=1; /* Check for confirm clear option */ if (get_pref_int32("confirm_clear")) { GtkWidget* confirm_dialog = gtk_message_dialog_new(NULL, GTK_DIALOG_MODAL, GTK_MESSAGE_OTHER, GTK_BUTTONS_OK_CANCEL, _("Clear the history?")); if (gtk_dialog_run((GtkDialog*)confirm_dialog) != GTK_RESPONSE_OK) { clear=0; } gtk_widget_destroy(confirm_dialog); } if(clear){ struct history_info *h=(struct history_info *)user_data; /* Clear history and free history-related variables */ remove_deleted_items(h); /**fix bug 92, Shift/ctrl right-click followed by clear segfaults/double free. */ clear_history(); /*g_printf("Clear hist done, h=%p, h->delete_list=%p\n",h, h->delete_list); */ update_clipboard(primary, "", H_MODE_INIT); update_clipboard(clipboard, "", H_MODE_INIT); } } /* Called when About is selected from right-click menu */ static void show_about_dialog(GtkMenuItem *menu_item, gpointer user_data) { /* This helps prevent multiple instances */ if (!gtk_grab_get_current()) { const gchar* authors[] = {_("Gilberto \"Xyhthyx\" Miralla \nDoug Springer "), NULL}; const gchar* license = "This program is free software; you can redistribute it and/or modify\n" "it under the terms of the GNU General Public License as published by\n" "the Free Software Foundation; either version 3 of the License, or\n" "(at your option) any later version.\n\n" "This program is distributed in the hope that it will be useful,\n" "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" "GNU General Public License for more details.\n\n" "You should have received a copy of the GNU General Public License\n" "along with this program. If not, see ."; /* Create the about dialog */ GtkWidget* about_dialog = gtk_about_dialog_new(); gtk_window_set_icon((GtkWindow*)about_dialog, gtk_widget_render_icon(about_dialog, GTK_STOCK_ABOUT, -1, NULL)); gtk_about_dialog_set_name((GtkAboutDialog*)about_dialog, "Parcellite"); #ifdef HAVE_CONFIG_H /**VER=555; sed "s#\(.*\)svn.*\".*#\1svn$VER\"#" config.h */ gtk_about_dialog_set_version((GtkAboutDialog*)about_dialog, VERSION); #endif gtk_about_dialog_set_comments((GtkAboutDialog*)about_dialog, _("Lightweight GTK+ clipboard manager.")); gtk_about_dialog_set_website((GtkAboutDialog*)about_dialog, "http://parcellite.sourceforge.net"); gtk_about_dialog_set_copyright((GtkAboutDialog*)about_dialog, _("Copyright (C) 2007, 2008 Gilberto \"Xyhthyx\" Miralla\nCopyright (C) 2010-2013 Doug Springer")); gtk_about_dialog_set_authors((GtkAboutDialog*)about_dialog, authors); gtk_about_dialog_set_translator_credits ((GtkAboutDialog*)about_dialog, "Miloš Koutný \n" "Kim Jensen \n" "Eckhard M. Jäger \n" "Michael Stempin \n" "Benjamin Danon \n" "Németh Tamás \n" "Davide Truffa \n" "Jiro Kawada \n" "Øyvind Sæther \n" "pankamyk \n" "Tomasz Rusek \n" "Phantom X \n" "Ovidiu D. Niţan \n" "Alexander Kazancev \n" "Daniel Nylander \n" "Hedef Türkçe \n" "Lyman Li \n" "Gilberto \"Xyhthyx\" Miralla "); gtk_about_dialog_set_license((GtkAboutDialog*)about_dialog, license); gtk_about_dialog_set_logo_icon_name((GtkAboutDialog*)about_dialog, PARCELLITE_ICON); /* Run the about dialog */ gtk_dialog_run((GtkDialog*)about_dialog); gtk_widget_destroy(about_dialog); } } /* Called when Preferences is selected from right-click menu */ static void preferences_selected(GtkMenuItem *menu_item, gpointer user_data) { /* This helps prevent multiple instances */ if (!gtk_grab_get_current()){ /* Show the preferences dialog */ show_preferences(0); } } /* Called when Quit is selected from right-click menu */ static void quit_selected(GtkMenuItem *menu_item, gpointer user_data) { /* Prevent quit with dialogs open */ if (!gtk_grab_get_current()) /* Quit the program */ gtk_main_quit(); } /* Called when status icon is control-clicked */ static gboolean show_actions_menu(gpointer data) { /* Declare some variables */ GtkWidget *menu, *menu_item, *menu_image, *item_label; /* Create menu */ menu = gtk_menu_new(); g_signal_connect((GObject*)menu,"selection-done", (GCallback)gtk_widget_destroy, NULL); /* Actions using: */ menu_item = gtk_image_menu_item_new_with_label("Actions using:"); menu_image = gtk_image_new_from_stock(GTK_STOCK_EXECUTE, GTK_ICON_SIZE_MENU); gtk_image_menu_item_set_image((GtkImageMenuItem*)menu_item, menu_image); g_signal_connect((GObject*)menu_item, "select", (GCallback)gtk_menu_item_deselect, NULL); gtk_menu_shell_append((GtkMenuShell*)menu, menu_item); /* Clipboard contents */ gchar* text = gtk_clipboard_wait_for_text(clipboard); if (text != NULL) { menu_item = gtk_menu_item_new_with_label("None"); /* Modify menu item label properties */ item_label = gtk_bin_get_child((GtkBin*)menu_item); gtk_label_set_single_line_mode((GtkLabel*)item_label, TRUE); gtk_label_set_ellipsize((GtkLabel*)item_label, get_pref_int32("ellipsize")); gtk_label_set_width_chars((GtkLabel*)item_label, 30); /* Making bold... */ gchar* bold_text = g_markup_printf_escaped("%s", text); gtk_label_set_markup((GtkLabel*)item_label, bold_text); g_free(bold_text); /* Append menu item */ g_signal_connect((GObject*)menu_item, "select", (GCallback)gtk_menu_item_deselect, NULL); gtk_menu_shell_append((GtkMenuShell*)menu, menu_item); g_free(text); } else { /* Create menu item for empty clipboard contents */ menu_item = gtk_menu_item_new_with_label("None"); /* Modify menu item label properties */ item_label = gtk_bin_get_child((GtkBin*)menu_item); gtk_label_set_markup((GtkLabel*)item_label, _("None")); /* Append menu item */ g_signal_connect((GObject*)menu_item, "select", (GCallback)gtk_menu_item_deselect, NULL); gtk_menu_shell_append((GtkMenuShell*)menu, menu_item); } /* -------------------- */ gtk_menu_shell_append((GtkMenuShell*)menu, gtk_separator_menu_item_new()); /* Actions */ gchar* path = g_build_filename(g_get_user_data_dir(), ACTIONS_FILE, NULL); printf("got path '%s'\n",path); fflush(NULL); FILE* actions_file = fopen(path, "rb"); g_free(path); /* Check that it opened and begin read */ if (actions_file) { gint size; if(0==fread(&size, 4, 1, actions_file)) g_print("1:got 0 items from fread\n"); /* Check if actions file is empty */ if (!size) { /* File contained no actions so adding empty */ menu_item = gtk_menu_item_new_with_label(_("Empty")); gtk_widget_set_sensitive(menu_item, FALSE); gtk_menu_shell_append((GtkMenuShell*)menu, menu_item); } /* Continue reading items until size is 0 */ while (size) { /* Read name */ gchar* name = (gchar*)g_malloc(size + 1); if( 0 ==fread(name, size, 1, actions_file)) g_print("2:got 0 items from fread\n"); name[size] = '\0'; menu_item = gtk_menu_item_new_with_label(name); if(0 ==fread(&size, 4, 1, actions_file)) g_print("3:got 0 items from fread\n"); /* Read command */ gchar* command = (gchar*)g_malloc(size + 1); if(0 ==fread(command, size, 1, actions_file)) g_print("4:got 0 items from fread\n"); command[size] = '\0'; g_print("name='%s' cmd='%s'\n",name,command); if(0 ==fread(&size, 4, 1, actions_file)) g_print("5:got 0 items from fread\n"); /* Append the action */ gtk_menu_shell_append((GtkMenuShell*)menu, menu_item); g_signal_connect((GObject*)menu_item, "activate", (GCallback)action_selected, (gpointer)command); g_free(name); } fclose(actions_file); } else { /* File did not open so adding empty */ menu_item = gtk_menu_item_new_with_label(_("Empty")); gtk_widget_set_sensitive(menu_item, FALSE); gtk_menu_shell_append((GtkMenuShell*)menu, menu_item); } /* -------------------- */ gtk_menu_shell_append((GtkMenuShell*)menu, gtk_separator_menu_item_new()); /* Edit actions */ menu_item = gtk_image_menu_item_new_with_mnemonic(_("_Edit actions")); menu_image = gtk_image_new_from_stock(GTK_STOCK_EDIT, GTK_ICON_SIZE_MENU); gtk_image_menu_item_set_image((GtkImageMenuItem*)menu_item, menu_image); g_signal_connect((GObject*)menu_item, "activate", (GCallback)edit_actions_selected, NULL); gtk_menu_shell_append((GtkMenuShell*)menu, menu_item); /* Popup the menu... */ gtk_widget_show_all(menu); gtk_menu_popup((GtkMenu*)menu, NULL, NULL, NULL, NULL, 1, gtk_get_current_event_time()); /* Return false so the g_timeout_add() function is called only once */ return FALSE; } /***************************************************************************/ /** Called just before destroying history menu. \n\b Arguments: \n\b Returns: ****************************************************************************/ static gboolean selection_done(GtkMenuShell *menushell, gpointer user_data) { struct history_info *h=(struct history_info *)user_data; /*g_printf("%s: %p %p\n",__func__,h,NULL == h?0:h->delete_list); */ if(NULL != h && NULL != h->delete_list){/**have a list of items to delete. */ remove_deleted_items(h); goto done; } /*g_print("selection_active=%d\n",selection_active); */ /*g_print("Got selection_done\n"); */ if(h->change_flag && get_pref_int32("save_history")){ save_history(); h->change_flag=0; } done: /*gtk_widget_destroy((GtkWidget *)menushell); - fixes annoying GTK_IS_WIDGET/GTK_IS_WINDOW warnings from GTK when history dialog is destroyed. */ return FALSE; } /***************************************************************************/ /** Set the background color of the widget. \n\b Arguments: \n\b Returns: ****************************************************************************/ void set_widget_bg(gchar *color, GtkWidget *w) { GdkColor c, *cp; /**GtkRcStyle *st; c.red = 65535; c.green = 0; c.blue = 0;*/ /*g_print("set_widget_bg\n"); */ if(NULL != color){ gdk_color_parse (color, &c); cp=&c; }else cp=NULL; gtk_widget_modify_bg(w, GTK_STATE_NORMAL, cp); return; #if 0 /**none of this works */ gtk_widget_modify_bg(w, GTK_STATE_ACTIVE, cp); /*gdk_color_parse (color, &c); */ st=gtk_widget_get_modifier_style(w); /*st=gtk_rc_style_new (); */ st->bg[GTK_STATE_NORMAL] = st->bg[GTK_STATE_ACTIVE] = c; gtk_widget_modify_style (w, st); gtk_widget_show(w); /*gtk_widget_modify_bg (w, GTK_STATE_NORMAL, &c); */ #endif } /***************************************************************************/ /**postition the history dialog - should only be called if get_pref_int32("history_pos") is set. \n\b Arguments: if user_data is 1, just set x&y to max. \n\b Returns: ****************************************************************************/ void postition_history(GtkMenu *menu,gint *x,gint *y,gboolean *push_in, gpointer user_data) { GdkScreen *s; gint sx,sy; s=gdk_screen_get_default(); sx= gdk_screen_get_width(s); sy= gdk_screen_get_height(s); if(NULL !=push_in) *push_in=FALSE; if(1 == GPOINTER_TO_INT(user_data)){ if(NULL !=x) *x=sx; if(NULL !=y) *y=sy; }else{ if(get_pref_int32("history_pos")){ int xx,yy; xx=get_pref_int32("history_x"); if(xx > sx ) xx=sx; else if(xx <1 ) xx=1; yy=get_pref_int32("history_y"); if(yy > sx ) yy=sx; else if(yy <1 ) yy=1; if(NULL !=x) *x=xx; if(NULL !=y) *y=yy; TRACE(g_fprintf(stderr,"x=%d, y=%d\n",xx,yy)); } } } /***************************************************************************/ /** This handles events for the history menu, which is the parent of each item. \n\b Arguments: user is the struct history_info created in history menu. \n\b Returns: FALSE if key was not handled, TRUE if it was. You get two key presses if you return FALSE. ****************************************************************************/ static gboolean key_release_cb (GtkWidget *w,GdkEventKey *e, gpointer user) { static gchar *kstr=NULL; static gint idx; /*static GdkEvent *last_event=NULL; */ gint first, current,off; static GtkWidget *item=NULL; GList *children; struct history_info *h; h=(struct history_info *)user; if(0&& NULL != e ){ if(GDK_MOTION_NOTIFY==e->type) return FALSE; printf("krc (%x) S%x T%x C%x,SE%x, G%x, W%p, wdg%p", e->keyval,e->state,e->type, e->hardware_keycode,e->send_event,e->group,e->window,w); if(GDK_DRAG_ENTER == e->type || GDK_DRAG_LEAVE==e->type){ printf(" Drag %s\n",GDK_DRAG_ENTER == e->type?"ENTER":"LEAVE"); } if(GDK_BUTTON_RELEASE==e->type || GDK_BUTTON_PRESS==e->type ){ GdkEventButton *b=(GdkEventButton *)e; printf(" button %d State 0x%x\n",b->button, b->state); if(GDK_BUTTON_RELEASE==e->type && 3 == b->button){ /*toggle-size-request", */ /*allow item_selected to get called */ /*return FALSE; */ } /*return TRUE; */ } printf("\n"); fflush(NULL); } /**serves as init for keysearch */ if(NULL ==w && NULL==e && NULL == user){ if(NULL != kstr) g_free(kstr); kstr=g_strnfill(KBUF_SIZE+8,0); idx=0; return FALSE; }else if(NULL == kstr){ g_print("kstr null. Not init\n"); return FALSE; } if(NULL == e){ g_print("No Event!\n"); return FALSE; } if(0 == get_pref_int32("type_search"))/**searching is turned off */ return FALSE; /**ignore left-clicks */ if(GDK_BUTTON_RELEASE==e->type && 3 == ((GdkEventButton *)e)->button) return FALSE; if(GDK_KEY_PRESS == e->type && ' ' == e->keyval) /**ignore space presses */ return TRUE; if(GDK_KEY_PRESS == e->type) return FALSE; /**pass all other non-release events on */ if(GDK_KEY_RELEASE != e->type && GDK_BUTTON_RELEASE != e->type) return FALSE; /** if(GDK_SELECTION_NOTIFY == e->type){ g_print("last %x\n",last_event->type); last_event=(GdkEvent *)e; return TRUE; } last_event=(GdkEvent *)e;*/ /** if(user) if(e->state & (GDK_SHIFT_MASK|GDK_LOCK_MASK) != e->state){ g_print("rfs to use mods\n"); TRACE(g_fprintf(stderr,"state is %X. Refusing to use mods\n",e->state)); return TRUE; } have to use for _ and others*/ /**ignore Ctrl-Alt */ if((GDK_CONTROL_MASK|GDK_MOD1_MASK)==(e->state & (GDK_CONTROL_MASK|GDK_MOD1_MASK))) return FALSE; if( e->state & GDK_MOD1_MASK){/**alt key pressed */ if(e->keyval == 'e'){ TRACE(g_fprintf(stderr,"Alt-E\n")); gtk_grab_remove(w); edit_selected((GtkMenuItem *)h, (gpointer)h); return TRUE; } else if(e->keyval == 'c'){ TRACE(g_fprintf(stderr,"Alt-C\n")); clear_selected(NULL, (gpointer)h); return TRUE; } else{ TRACE(g_fprintf(stderr,"Ignoring Alt-%c (0x%02x) state 0x%x",e->keyval,e->keyval,e->state)); } return FALSE; } /**end alt key pressed */ if(e->state & (GDK_MODIFIER_MASK_MINE)) /**ignore all modifier keys */ return FALSE; if(e->state &GDK_SHIFT_MASK && !get_pref_int32("case_search")) /**ignore shift */ return FALSE; if( GDK_EXPOSE== e->type || GDK_BUTTON_RELEASE==e->type) /**fix bug 3560995, item 1/2, red clipboard. */ return FALSE; if(e->keyval == 0xff08){/**backspace */ // g_printf("0x%x bs %d ",e->type,idx); if(idx) --idx; else if( NULL != h->clip_item){ gtk_menu_shell_select_item((GtkMenuShell *)h->menu,(GtkWidget *)h->clip_item); } set_widget_bg(NULL,h->menu); kstr[idx]=0; // g_printf(" %d\n",idx); return TRUE; } /**end backspace */ if( e->keyval == 0xffe1 || e->keyval == 0xffe2){ /*fprintf(stderr,"Ignoring key '%c' 0x%02x\n",e->keyval,e->keyval); */ TRACE(g_fprintf(stderr,"Ignoring key '%c' 0x%02x\n",e->keyval,e->keyval)); return FALSE; } if(e->keyval >= 0xff50 && e->keyval <= 0xff57) /**arrow keys, home,end,pgup,pgdwn */ return FALSE; if(idx>=KBUF_SIZE){ TRACE(g_fprintf(stderr,"keys full\n")); return TRUE; } kstr[idx++]=e->keyval; kstr[idx]=0; for ( off=0; off<50;++off){ /** this loop does a char search based on offset */ children=gtk_container_get_children((GtkContainer *)h->menu); item=NULL; current=first=0; /**first is edit, */ while(NULL != children->next){ gchar *l; gint slen; GtkWidget *child=gtk_bin_get_child((GtkBin*)children->data); if(GTK_IS_LABEL(child)){ l=(gchar *)gtk_label_get_text((GtkLabel *)child); slen=strlen(l); if(slen>off){ gint c; if(get_pref_int32("case_search")) c=strncmp(kstr,&l[off],idx); else c=g_ascii_strncasecmp(kstr,&l[off],idx); if(!c){ if(0 ==current){ first=1; } else{ first=0; } if(!first ){ TRACE(g_fprintf(stderr,"Got cmp'%s'='%s'\n",kstr,l)); item=(GtkWidget *)children->data; goto foundit; } } } } children=children->next; ++current; } } /**didn't find it. Set our title and return */ set_widget_bg("red",h->menu); return TRUE; foundit: set_widget_bg(NULL,h->menu); /**user->children... GList *children; gpointer data,next,prev data should be a GtkMenuItem list, whose children are labels... */ /*str=(gchar *)gtk_label_get_text((GtkLabel *)gtk_bin_get_child((GtkBin*)children->data)); */ TRACE(g_fprintf(stderr,"Got '%c' 0x%02x, state 0x%02X",e->keyval,e->keyval,e->state)); if(NULL !=item){ if(first){TRACE(g_fprintf(stderr,"First:"));} /*if(last)TRACE(g_fprintf(stderr,"Last:")); */ TRACE(g_fprintf(stderr,"At Item '%s'",gtk_label_get_text((GtkLabel *)gtk_bin_get_child((GtkBin*)item)))); gtk_menu_shell_select_item((GtkMenuShell *)h->menu,(GtkWidget *)item); } TRACE(g_fprintf(stderr,"\n")); return TRUE; } /***************************************************************************/ /** Set clipboard from history list. \n\b Arguments: \n\b Returns: ****************************************************************************/ void set_clipboard_text(struct history_info *h, GList *element) { int auto_whatever=0; gchar *action=NULL; gchar *txt=NULL; gchar *cmd=NULL; if(NULL == find_h_item(h->delete_list,NULL,element)){ /**not in our delete list */ /**make a copy of txt, because it gets freed and re-allocated. */ txt=p_strdup(((struct history_item *)(element->data))->text); DTRACE(g_fprintf(stderr,"set_clip_text %s\n",txt)); if(use_copy) update_clipboard(clipboard, txt, H_MODE_LIST); if(use_primary) update_clipboard(primary, txt, H_MODE_LIST); auto_whatever=1; } g_signal_emit_by_name ((gpointer)h->menu,"selection-done"); if(0 == auto_whatever) return; /*g_printf("set_clip_text done\n"); */ if (get_pref_int32("automatic_paste")) { /** mousedown 2 */ if(get_pref_int32("auto_mouse")) action=g_strdup("mousedown 2 && xdotool mouseup 2'"); else if(get_pref_int32("auto_key")) action=g_strdup("key ctrl+v'"); } if( get_pref_int32("key_input")) action=g_strconcat("type \"",txt,"\"'",NULL); if(NULL == action) goto done; /**from clipit 1.4.1 */ cmd = g_strconcat("/bin/sh -c 'xdotool ", action, NULL); g_fprintf(stderr,"xdotool:'%s'\ntext:'%s'\n",cmd,txt); GPid pid; gchar **argv; g_shell_parse_argv(cmd, NULL, &argv, NULL); g_free(cmd); g_spawn_async(NULL, argv, NULL, G_SPAWN_DO_NOT_REAP_CHILD, NULL, NULL, &pid, NULL); g_child_watch_add(pid, (GChildWatchFunc)action_exit, NULL); g_strfreev(argv); /**end from clipit 1.4.1 */ done: if(NULL != txt) g_free(txt); if(NULL != action) g_free(action); } /***************************************************************************/ /** This handles the events for each item in the history menu. \n\b Arguments: user is element number \n\b Returns: ****************************************************************************/ static gboolean my_item_event (GtkWidget *w,GdkEventKey *e, gpointer user) { static struct history_info *h=NULL; GtkWidget *menu=NULL; if(NULL==w && NULL==e){ h=(struct history_info *)user; /*g_print("my_item_event: Set menu to %p\n",h); */ return FALSE; } if(NULL == h) return FALSE; menu=h->menu; /**check for enter */ if(GDK_MOTION_NOTIFY == e->type) return FALSE; /*printf("my_item_event: T 0x%x S 0x%x ",e->type,e->state); */ if(NULL !=h && GDK_ENTER_NOTIFY ==e->type ){/**add to delete */ GdkEventCrossing *enter=(GdkEventCrossing *)e; /*printf("state 0x%x\n",enter->state); */ /**use shift and right-click */ if(GDK_SHIFT_MASK&enter->state && GDK_BUTTON3_MASK&enter->state) handle_marking(h,w,GPOINTER_TO_INT(user),OPERATE_DELETE); } if(GDK_KEY_PRESS == e->type){ /*GdkEventKey *k= (GdkEventKey *)e; */ printf("key press %d (0x%x)\n",e->keyval,e->keyval); fflush(NULL); } if(GDK_BUTTON_RELEASE==e->type){ GdkEventButton *b=(GdkEventButton *)e; GList* element = g_list_nth(history_list, GPOINTER_TO_INT(user)); /*printf("type %x State 0x%x val %x %p '%s'\n",e->type, b->state,b->button,w,(gchar *)((struct history_item *(element->data))->text)); */ if(3 == b->button){ /**right-click */ if(GDK_CONTROL_MASK&b->state){ handle_marking(h,w,GPOINTER_TO_INT(user),OPERATE_DELETE); }else{ /**shift-right click release */ if((GDK_CONTROL_MASK|GDK_SHIFT_MASK)&b->state) return FALSE; /*g_print("Calling popup\n"); */ h->wi.event=e; h->wi.item=w; h->wi.index=GPOINTER_TO_INT(user); /*g_fprintf(stderr,"Calling hist_itemRclk\n"); */ history_item_right_click(h,e,GPOINTER_TO_INT(user)); } return TRUE; }else if( 1 == b->button){ /* Get the text from the right element and set as clipboard */ set_clipboard_text(h,element); } fflush(NULL); } return FALSE; } /***************************************************************************/ /** Attempt to handle enter key behaviour. \n\b Arguments: \n\b Returns: ****************************************************************************/ static void item_selected(GtkMenuItem *menu_item, gpointer user_data) { static struct history_info *h=NULL; if(NULL ==menu_item){ h=(struct history_info *)user_data; return; } GdkEventKey *k=(GdkEventKey *)gtk_get_current_event(); GList* element = g_list_nth(history_list, GPOINTER_TO_INT(user_data)); /*g_print ("item_selected '%s' type %x val %x\n",(gchar *)((struct history_item *(element->data))->text),k->type, k->keyval); */ if(0xFF0d == k->keyval && GDK_KEY_PRESS == k->type){ set_clipboard_text(h,element); } } /***************************************************************************/ /** Write the elements to the menu. \n\b Arguments: \n\b Returns: ****************************************************************************/ void write_history_menu_items(GList *list, GtkWidget *menu) { GList *element; if(NULL == list) return; for (element = list; element != NULL; element = element->next) gtk_menu_shell_append((GtkMenuShell*)menu,element->data); } /***************************************************************************/ /** Replace non-printing characters with ??. 0x09->E28692 - \2192 0x0a->E2818B - \204b space-E290A3 - \u2423 \n\b Arguments: \n\b Returns: ****************************************************************************/ GString* convert_string(GString* s) { gchar arrow[4]={0xe2,0x86,0x92,0x00};/**0xe28692 (UTF-8 right-arrow) \\ */ gchar pharagraph[4]={0xe2,0x81,0x8b,0x00}; /**utf-8 pharagraph symbol \2192 */ gchar square_u[4]={0xe2,0x90,0xA3,0}; /**square-u \\2423 */ gchar *p, *r; for (p=s->str; p!= NULL; p=g_utf8_find_next_char(p,s->str+s->len)){ switch(*p){ case 0x09:r=arrow; break; case 0x0a:r=pharagraph; break; case 0x20:r=square_u; break; default:r=NULL; break; } if(NULL !=r ) {/**replace. */ gint32 pos=(p-s->str)+1; *p=r[0]; s=g_string_insert(s,pos,&r[1]); p=s->str+pos+2; } } return s; } /***************************************************************************/ /** . \n\b Arguments: u is history. \n\b Returns: ****************************************************************************/ void destroy_history_menu(GtkMenuShell *menu, gpointer u) { /*g_printf("%s:\n",__func__); */ selection_done(menu,u); /**allow deleted items to be deleted. */ gtk_widget_destroy((GtkWidget *)menu); } /***************************************************************************/ /** Called when status icon is left-clicked or action key hit. \n\b Arguments: \n\b Returns: ****************************************************************************/ static gboolean show_history_menu(gpointer data) { /* Declare some variables */ GtkWidget *menu, *menu_item, *menu_image, *item_label; static struct history_info h; h.histno=GPOINTER_TO_INT(data);/**persistent or normal history */ h.change_flag=0; h.element_text=NULL; h.wi.index=-1; /**init our keystroke function */ key_release_cb(NULL,NULL,NULL); GList *element, *persistent=NULL; GList *lhist=NULL; int single_line=get_pref_int32("single_line"); /* Create the menu */ menu = gtk_menu_new(); h.menu=hmenu=menu; h.clip_item=NULL; h.delete_list=NULL; h.persist_list=NULL; h.wi.tmp1=0; /** used to tell edit what we are to edit */ /*g_printf("h.menu=%p\n",menu); */ /*g_print("histmen %p\n",menu); */ my_item_event(NULL,NULL,(gpointer)&h); /**init our function */ item_selected(NULL,(gpointer)&h); /**ditto */ gtk_menu_shell_set_take_focus((GtkMenuShell *)menu,TRUE); /**grab keyboard focus */ /*g_signal_connect((GObject*)menu, "selection-done", (GCallback)selection_done, gtk_menu_get_attach_widget (menu)); */ g_signal_connect((GObject*)menu, "cancel", (GCallback)selection_done, &h); g_signal_connect((GObject*)menu, "selection-done", (GCallback)selection_done, &h); /*g_signal_connect((GObject*)menu, "selection-done", (GCallback)gtk_widget_destroy, NULL); */ /**Trap key events */ /* g_signal_connect((GObject*)menu, "key-release-event", (GCallback)key_release_cb, (gpointer)&h); */ g_signal_connect((GObject*)menu, "event", (GCallback)key_release_cb, (gpointer)&h); /**trap mnemonic events */ /*g_signal_connect((GObject*)menu, "mnemonic-activate", (GCallback)key_release_cb, (gpointer)menu); */ /* -------------------- */ /*gtk_menu_shell_append((GtkMenuShell*)menu, gtk_separator_menu_item_new()); */ /* Items */ if ((history_list != NULL) && (history_list->data != NULL)) { /* Declare some variables */ gint32 item_length= get_pref_int32("item_length"); gint32 ellipsize = get_pref_int32("ellipsize"); gint32 persistent_history=get_pref_int32("persistent_history"); gint32 nonprint_disp=get_pref_int32("nonprint_disp"); gint element_number = 0; gchar* primary_temp = gtk_clipboard_wait_for_text(primary); gchar* clipboard_temp = gtk_clipboard_wait_for_text(clipboard); /* Reverse history if enabled */ if (0 && get_pref_int32("reverse_history")) { /*history_list = g_list_reverse(history_list); */ element_number = g_list_length(history_list) - 1; } /* Go through each element and adding each */ for (element = history_list; element != NULL; element = element->next) { struct history_item *c=(struct history_item *)(element->data); gchar* hist_text=c->text; if(!(HIST_DISPLAY_PERSISTENT&h.histno) && (c->flags & CLIP_TYPE_PERSISTENT)) goto next_loop; else if( !(HIST_DISPLAY_NORMAL&h.histno) && !(c->flags & CLIP_TYPE_PERSISTENT)) goto next_loop; GString* string = g_string_new(hist_text); if(nonprint_disp) string=convert_string(string); glong len=g_utf8_strlen(string->str, string->len); /* Ellipsize text */ if (len > item_length) { switch (ellipsize) { case PANGO_ELLIPSIZE_START: string = g_string_erase(string, 0, g_utf8_offset_to_pointer(string->str, len - item_length) - string->str); /*string = g_string_erase(string, 0, string->len-(get_pref_int32("item_length"))); */ string = g_string_prepend(string, "..."); break; case PANGO_ELLIPSIZE_MIDDLE: { gchar* p1 = g_utf8_offset_to_pointer(string->str, item_length / 2); gchar* p2 = g_utf8_offset_to_pointer(string->str, len - item_length / 2); string = g_string_erase(string, p1 - string->str, p2 - p1); string = g_string_insert(string, p1 - string->str, "..."); /** string = g_string_erase(string, (get_pref_int32("item_length")/2), string->len-(get_pref_int32("item_length"))); string = g_string_insert(string, (string->len/2), "...");*/ } break; case PANGO_ELLIPSIZE_END: string = g_string_truncate(string, g_utf8_offset_to_pointer(string->str, item_length) - string->str); /*string = g_string_truncate(string, get_pref_int32("item_length")); */ string = g_string_append(string, "..."); break; } } /* Remove control characters */ gsize i = 0; while (i < string->len) { /**fix 100% CPU utilization for odd data. - bug 2976890 */ gsize nline=0; while(string->str[i+nline] == '\n' && nline+ilen) nline++; if(nline){ g_string_erase(string, i, nline); /* RMME printf("e %ld",nline);fflush(NULL); */ } else i++; } /* Make new item with ellipsized text */ menu_item = gtk_menu_item_new_with_label(string->str); g_signal_connect((GObject*)menu_item, "event", (GCallback)my_item_event, GINT_TO_POINTER(element_number)); g_signal_connect((GObject*)menu_item, "activate", (GCallback)item_selected, GINT_TO_POINTER(element_number)); /* Modify menu item label properties */ item_label = gtk_bin_get_child((GtkBin*)menu_item); if(single_line){ /*gtk_label_set_line_wrap */ gtk_label_set_single_line_mode((GtkLabel*)item_label, TRUE); } else{ gtk_label_set_single_line_mode((GtkLabel*)item_label, FALSE); } /* Check if item is also clipboard text and make bold */ if ((clipboard_temp) && (p_strcmp(hist_text, clipboard_temp) == 0)) { gchar* bold_text = g_markup_printf_escaped("%s", string->str); if( NULL == bold_text) g_fprintf(stderr,"NulBMKUp:'%s'\n",string->str); gtk_label_set_markup((GtkLabel*)item_label, bold_text); g_free(bold_text); h.clip_item=menu_item; h.element_text=hist_text; h.wi.index=element_number; } else if ((primary_temp) && (p_strcmp(hist_text, primary_temp) == 0)) { gchar* italic_text = g_markup_printf_escaped("%s", string->str); if( NULL == italic_text) g_fprintf(stderr,"NulIMKUp:'%s'\n",string->str); gtk_label_set_markup((GtkLabel*)item_label, italic_text); g_free(italic_text); h.clip_item=menu_item; h.element_text=hist_text; h.wi.index=element_number; } if(persistent_history && c->flags &CLIP_TYPE_PERSISTENT){ persistent = g_list_prepend(persistent, menu_item); /*g_printf("persistent %s\n",c->text); */ } else{ /* Append item */ lhist = g_list_prepend(lhist, menu_item); } /* Prepare for next item */ g_string_free(string, TRUE); next_loop: /** if (get_pref_int32("reverse_history")) element_number--; else*/ element_number++; } /**end of for loop for each history item */ /* Cleanup */ g_free(primary_temp); g_free(clipboard_temp); /* Return history to normal if reversed */ /** if (get_pref_int32("reverse_history")) history_list = g_list_reverse(history_list);*/ } else { /* Nothing in history so adding empty */ menu_item = gtk_menu_item_new_with_label(_("Empty")); gtk_widget_set_sensitive(menu_item, FALSE); gtk_menu_shell_append((GtkMenuShell*)menu, menu_item); } if (!get_pref_int32("reverse_history")) { lhist = g_list_reverse(lhist); persistent = g_list_reverse(persistent); } /**now actually add them from the list */ if(get_pref_int32("persistent_history")){ if(get_pref_int32("persistent_on_top")){ write_history_menu_items(persistent,menu); gtk_menu_shell_append((GtkMenuShell*)menu, gtk_separator_menu_item_new()); write_history_menu_items(lhist,menu); } else{ write_history_menu_items(lhist,menu); gtk_menu_shell_append((GtkMenuShell*)menu, gtk_separator_menu_item_new()); write_history_menu_items(persistent,menu); } }else { /**normal old operation, forget about persistence. */ write_history_menu_items(lhist,menu); } /* -------------------- */ gtk_menu_shell_append((GtkMenuShell*)menu, gtk_separator_menu_item_new()); if(get_pref_int32("type_search")){ /* Edit clipboard */ h.title_item = gtk_image_menu_item_new_with_label( _("Use Alt-E to edit, Alt-C to clear") ); menu_image = gtk_image_new_from_stock(GTK_STOCK_EDIT, GTK_ICON_SIZE_MENU); gtk_image_menu_item_set_image((GtkImageMenuItem*)h.title_item, menu_image); gtk_menu_shell_append((GtkMenuShell*)menu, h.title_item); }else{ menu_item = gtk_image_menu_item_new_with_mnemonic(_("_Edit Clipboard")); menu_image = gtk_image_new_from_stock(GTK_STOCK_EDIT, GTK_ICON_SIZE_MENU); gtk_image_menu_item_set_image((GtkImageMenuItem*)menu_item, menu_image); g_signal_connect((GObject*)menu_item, "activate", (GCallback)edit_selected, (gpointer)&h); gtk_menu_shell_append((GtkMenuShell*)menu, menu_item); menu_item = gtk_image_menu_item_new_with_mnemonic(_("_Clear")); /* Clear */ menu_image = gtk_image_new_from_stock(GTK_STOCK_CLEAR, GTK_ICON_SIZE_MENU); gtk_image_menu_item_set_image((GtkImageMenuItem*)menu_item, menu_image); g_signal_connect((GObject*)menu_item, "activate", (GCallback)clear_selected, (gpointer)&h); gtk_menu_shell_append((GtkMenuShell*)menu, menu_item); } g_list_free(lhist); g_list_free(persistent); /* g_signal_connect(menu,"deactivate",(GCallback)destroy_history_menu,(gpointer)&h); */ g_signal_connect(menu,"selection-done",(GCallback)destroy_history_menu,(gpointer)&h); /* Popup the menu... */ gtk_widget_show_all(menu); gtk_menu_popup((GtkMenu*)menu, NULL, NULL, get_pref_int32("history_pos")?postition_history:NULL, NULL, 1, gtk_get_current_event_time()); /**set last entry at first -fixes bug 2974614 */ if(get_pref_int32("reverse_history") && NULL != h.clip_item) gtk_menu_shell_select_item((GtkMenuShell*)menu,h.clip_item); else gtk_menu_shell_select_first((GtkMenuShell*)menu, TRUE); /* Return FALSE so the g_timeout_add() function is called only once */ return FALSE; } /***************************************************************************/ /** . \n\b Arguments: \n\b Returns: ****************************************************************************/ gint figure_histories(void) { gint i; if(get_pref_int32("persistent_history")){ if(get_pref_int32("persistent_separate")) i=HIST_DISPLAY_NORMAL; else i=HIST_DISPLAY_PERSISTENT|HIST_DISPLAY_NORMAL; }else i=HIST_DISPLAY_NORMAL; /*g_printf("Using history 0x%X\n",i); */ return i; } /***************************************************************************/ /** . \n\b Arguments: \n\b Returns: ****************************************************************************/ void _show_history_menu (GtkMenuItem *m, gpointer data) { g_timeout_add(POPUP_DELAY, show_history_menu, GINT_TO_POINTER(figure_histories())); } /***************************************************************************/ /** . \n\b Arguments: \n\b Returns: ****************************************************************************/ GtkWidget *create_parcellite_menu(guint button, guint activate_time) { /* Declare some variables */ GtkWidget *menu, *menu_item; /* Create the menu */ menu = gtk_menu_new(); /*g_signal_connect((GObject*)menu, "selection-done", (GCallback)gtk_widget_destroy, NULL); */ /* About */ menu_item = gtk_image_menu_item_new_from_stock(GTK_STOCK_ABOUT, NULL); g_signal_connect((GObject*)menu_item, "activate", (GCallback)show_about_dialog, NULL); gtk_menu_shell_append((GtkMenuShell*)menu, menu_item); /* Save History */ menu_item = gtk_image_menu_item_new_from_stock(GTK_STOCK_SAVE_AS, NULL); g_signal_connect((GObject*)menu_item, "activate", (GCallback)history_save_as, NULL); gtk_widget_set_tooltip_text(menu_item, _("Save History as a text file. Prepends xHIST_0000 to each entry. x is either P(persistent) or N (normal)")); gtk_menu_shell_append((GtkMenuShell*)menu, menu_item); /* Preferences */ menu_item = gtk_image_menu_item_new_from_stock(GTK_STOCK_PREFERENCES, NULL); g_signal_connect((GObject*)menu_item, "activate", (GCallback)preferences_selected, NULL); gtk_menu_shell_append((GtkMenuShell*)menu, menu_item); if(have_appindicator){ /* History */ GtkWidget *img=gtk_image_new_from_icon_name(PARCELLITE_ICON,GTK_ICON_SIZE_MENU); menu_item = gtk_image_menu_item_new_with_mnemonic(_("_History")); gtk_image_menu_item_set_image((GtkImageMenuItem *)menu_item,img); g_signal_connect((GObject*)menu_item, "activate", (GCallback)_show_history_menu, NULL); gtk_menu_shell_append((GtkMenuShell*)menu, menu_item); } /* -------------------- */ gtk_menu_shell_append((GtkMenuShell*)menu, gtk_separator_menu_item_new()); /* Quit */ menu_item = gtk_image_menu_item_new_from_stock(GTK_STOCK_QUIT, NULL); g_signal_connect((GObject*)menu_item, "activate", (GCallback)quit_selected, NULL); gtk_menu_shell_append((GtkMenuShell*)menu, menu_item); /* Popup the menu... */ gtk_widget_show_all(menu); gtk_menu_popup((GtkMenu*)menu, NULL, NULL, NULL, NULL, button, activate_time); return menu; } /* Called when status icon is right-clicked */ static void show_parcellite_menu(GtkStatusIcon *status_icon, guint button, guint activate_time, gpointer data) { create_parcellite_menu(button, activate_time); } /* Called when status icon is left-clicked */ static void status_icon_clicked(GtkStatusIcon *status_icon, gpointer user_data) { /* Check what type of click was recieved */ GdkModifierType state; gtk_get_current_event_state(&state); /* Control click */ if (state == GDK_MOD2_MASK+GDK_CONTROL_MASK || state == GDK_CONTROL_MASK) { g_fprintf(stderr,"Got Ctrl-click\n"); if (actions_lock == FALSE) { g_timeout_add(POPUP_DELAY, show_actions_menu, NULL); } } /* Normal click */ else { g_timeout_add(POPUP_DELAY, show_history_menu, GINT_TO_POINTER(figure_histories())); } } /***************************************************************************/ /** . \n\b Arguments: \n\b Returns: ****************************************************************************/ void setup_icon( void ) { if(0 == have_appindicator){/* no Indicator */ if(NULL == status_icon){ status_icon = gtk_status_icon_new_from_icon_name(get_pref_string("icon_name")); gtk_status_icon_set_tooltip((GtkStatusIcon*)status_icon, _("Clipboard Manager")); g_signal_connect((GObject*)status_icon, "activate", (GCallback)status_icon_clicked, NULL); g_signal_connect((GObject*)status_icon, "popup-menu", (GCallback)show_parcellite_menu, NULL); } else { gtk_status_icon_set_from_icon_name(status_icon,get_pref_string("icon_name")); } } #ifdef HAVE_APPINDICATOR else { if(NULL == indicator) { indicator = app_indicator_new(get_pref_string("icon_name"), get_pref_string("icon_name"), APP_INDICATOR_CATEGORY_APPLICATION_STATUS); app_indicator_set_status (indicator, APP_INDICATOR_STATUS_ACTIVE); } app_indicator_set_attention_icon (indicator,get_pref_string("icon_name")); app_indicator_set_icon (indicator,get_pref_string("icon_name")); } #endif } #ifdef HAVE_APPINDICATOR /***************************************************************************/ /** . \n\b Arguments: \n\b Returns: ****************************************************************************/ void create_app_indicator(void) { if(NULL == indicator_menu) /* Create the menu */ indicator_menu = create_parcellite_menu(0,gtk_get_current_event_time()); /* check if we need to create the indicator or just refresh the menu */ setup_icon(); app_indicator_set_menu (indicator, GTK_MENU (indicator_menu)); } #endif /* Called when history global hotkey is pressed */ void history_hotkey(char *keystring, gpointer user_data) { g_timeout_add(POPUP_DELAY, show_history_menu, GINT_TO_POINTER(figure_histories())); } /* Called when persistent history global hotkey is pressed */ void phistory_hotkey(char *keystring, gpointer user_data) { if(get_pref_int32("persistent_history") && get_pref_int32("persistent_separate")) g_timeout_add(POPUP_DELAY, show_history_menu, GINT_TO_POINTER(HIST_DISPLAY_PERSISTENT)); } /* Called when actions global hotkey is pressed */ void actions_hotkey(char *keystring, gpointer user_data) { g_timeout_add(POPUP_DELAY, show_actions_menu, NULL); } /* Called when actions global hotkey is pressed */ void menu_hotkey(char *keystring, gpointer user_data) { #ifdef HAVE_APPINDICATOR /*create_app_indicator(); */ create_parcellite_menu(0, gtk_get_current_event_time()); /** GtkWidget * w=create_parcellite_menu(0, gtk_get_current_event_time()); app_indicator_set_menu (indicator, GTK_MENU (w));*/ #else show_parcellite_menu(status_icon, 0, 0, NULL); #endif } /* Startup calls and initializations */ static void parcellite_init() { int i; /* Create clipboard */ primary = gtk_clipboard_get(GDK_SELECTION_PRIMARY); clipboard = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD); /**check to see if optional helpers exist. */ check_for_tools(); if(FALSE ==g_thread_supported()){ g_fprintf(stderr,"g_thread not init!\n"); } hist_lock= g_mutex_new(); show_icon=!get_pref_int32("no_icon"); /* Read history */ if (get_pref_int32("save_history")){ gchar *x; /*g_printf("Calling read_hist\n"); */ read_history(); if(NULL != history_list){ struct history_item *c; c=(struct history_item *)(history_list->data); if(NULL == (x=is_clipboard_empty(primary))) update_clipboard(primary,c->text,H_MODE_LIST); else g_free (x); if(NULL == (x=is_clipboard_empty(clipboard))) update_clipboard(clipboard,c->text,H_MODE_LIST); else g_free(x); } } g_timeout_add(CHECK_INTERVAL, check_clipboards_tic, NULL); #ifdef HAVE_APPINDICATOR /* This closes bug 118, menu showing up at launch*/ g_timeout_add(500, check_for_appindictor, (void *)(1)); g_timeout_add(CHECK_APPINDICATOR_INTERVAL, check_for_appindictor, NULL); #endif /* Bind global keys */ keybinder_init(); for (i=0;NULL != keylist[i].name; ++i) bind_itemkey(keylist[i].name,keylist[i].keyfunc); /* Create status icon */ if (show_icon) { #ifdef HAVE_APPINDICATOR if(have_appindicator)/* Indicator */ create_app_indicator(); #endif if(!have_appindicator){ setup_icon(); } } } /***************************************************************************/ /** . \n\b Arguments: which - which fifo we write to. \n\b Returns: ****************************************************************************/ void write_stdin(struct p_fifo *fifo, int which) { if (!isatty(fileno(stdin))) { GString* piped_string = g_string_new(NULL); /* Append stdin to string */ while (1) { gchar* buffer = (gchar*)g_malloc(256); if (fgets(buffer, 256, stdin) == NULL) { g_free(buffer); break; } g_string_append(piped_string, buffer); g_free(buffer); } /* Check if anything was piped in */ if (piped_string->len > 0) { /* Truncate new line character */ /* g_string_truncate(piped_string, (piped_string->len - 1)); */ /* Copy to clipboard */ write_fifo(fifo,which,piped_string->str,piped_string->len); /*sleep(10); */ /* Exit */ } g_string_free(piped_string, TRUE); } } /***************************************************************************/ /** . \n\b Arguments: \n\b Returns: ****************************************************************************/ int main(int argc, char *argv[]) { struct cmdline_opts *opts; int mode; bindtextdomain(GETTEXT_PACKAGE, PARCELLITELOCALEDIR); bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8"); textdomain(GETTEXT_PACKAGE); /* Initiate GTK+ */ gtk_init(&argc, &argv); /**this just maps to the static struct, prefs do not need to be loaded */ pref_mapper(pref2int_map,PM_INIT); check_dirs(); /**make sure we set up default RC if it doesn't exist. */ /* Read preferences */ read_preferences(0); #ifdef DEBUG_UPDATE if(get_pref_int32("debug_update")) debug_update=1; #endif /* Parse options */ opts=parse_options(argc, argv); if(NULL == opts) return 1; if(opts->exit) return 0; mode=PROC_MODE_EXACT; if(get_pref_int32("multi_user")) mode|=PROC_MODE_USER_QUALIFY; /*g_printf("mode=0x%X\n",mode); */ if(proc_find(PARCELLITE_PROG_NAME,mode,NULL)<2) /**1 for me, and 1 for a running instance */ mode=PROG_MODE_DAEMON; /**first instance */ else mode=PROG_MODE_CLIENT; /**already running, just access fifos & exit. */ /**get options/cmd line not parsed. */ if( NULL != opts->leftovers)g_print("%s\n",opts->leftovers); /**init fifo should set up the fifo and the callback (if we are daemon mode) */ if(opts->primary) { if(NULL == (fifo=init_fifo(FIFO_MODE_PRI|mode))) return 1; if(fifo->dbg) g_fprintf(stderr,"Hit PRI opt!\n"); if(PROG_MODE_CLIENT & mode){ if(NULL != opts->leftovers){ write_fifo(fifo,FIFO_MODE_PRI,opts->leftovers,strlen(opts->leftovers)); g_free(opts->leftovers); } if(fifo->dbg) g_fprintf(stderr,"checking stdin\n"); write_stdin(fifo,FIFO_MODE_PRI); usleep(1000); } /* Grab primary */ GtkClipboard* prim = gtk_clipboard_get(GDK_SELECTION_PRIMARY); /* Print primary text (if any) */ gchar* prim_text = gtk_clipboard_wait_for_text(prim); if (prim_text) g_print("%s", prim_text); g_free(prim_text); } else if(opts->clipboard){ if(NULL == (fifo=init_fifo(FIFO_MODE_CLI|mode))) return 1; if(PROG_MODE_CLIENT & mode){ if(NULL != opts->leftovers){ write_fifo(fifo,FIFO_MODE_CLI,opts->leftovers,strlen(opts->leftovers)); g_free(opts->leftovers); } write_stdin(fifo,FIFO_MODE_CLI); usleep(1000); } GtkClipboard* clip = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD); /* Print clipboard text (if any) */ gchar* clip_text = gtk_clipboard_wait_for_text(clip); if (clip_text) g_print("%s", clip_text); g_free(clip_text); } else { /*use CLIPBOARD*/ GtkClipboard* clip = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD); if(NULL == (fifo=init_fifo(FIFO_MODE_NONE|mode))) return 1; /* Copy from unrecognized options */ if(PROG_MODE_CLIENT & mode){ if(NULL != opts->leftovers){ write_fifo(fifo,FIFO_MODE_CLI,opts->leftovers,strlen(opts->leftovers)); g_free(opts->leftovers); } /* Check if stdin is piped */ write_stdin(fifo,FIFO_MODE_CLI); usleep(1000); } gchar* clip_text = gtk_clipboard_wait_for_text(clip); if (clip_text) g_print("%s", clip_text); g_free(clip_text); } if(PROG_MODE_CLIENT & mode){ close_fifos(fifo); return 0; } /* Init Parcellite */ parcellite_init(mode); /*g_printf("Start main loop\n"); */ /* Run GTK+ loop */ gtk_main(); #ifdef HAVE_APPINDICATOR if (have_appindicator & show_icon) app_indicator_set_status(indicator, APP_INDICATOR_STATUS_PASSIVE); #endif /* Unbind keys */ keybinder_unbind(get_pref_string("phistory_key"), phistory_hotkey); keybinder_unbind(get_pref_string("history_key"), history_hotkey); keybinder_unbind(get_pref_string("actions_key"), actions_hotkey); keybinder_unbind(get_pref_string("menu_key"), menu_hotkey); /* Cleanup */ /** g_free(prefs.history_key); g_free(prefs.actions_key); g_free(prefs.menu_key); */ g_list_free(history_list); close_fifos(fifo); /* Exit */ return 0; } parcellite-1.2.1/src/utils.h0000644000175000017500000000513013041603201014026 0ustar hlehle/* Copyright (C) 2007-2008 by Xyhthyx * * This file is part of Parcellite. * * Parcellite is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * Parcellite is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef UTILS_H #define UTILS_H G_BEGIN_DECLS #include "parcellite.h" #define CONFIG_DIR PARCELLITE_PROG_NAME #define DATA_DIR PARCELLITE_PROG_NAME struct cmdline_opts { gboolean icon; gboolean clipboard; gboolean primary; gboolean exit; gboolean version; gchar *leftovers; gint appindicator; }; gchar *p_strdup( const gchar *str ); void check_dirs( void ); gboolean is_hyperlink(gchar* link); struct cmdline_opts *parse_options(int argc, char* argv[]); #define PROG_MODE_CLIENT 2 #define PROG_MODE_DAEMON 1 #define FIFO_MODE_NONE 0x10 #define FIFO_MODE_PRI 0x20 #define FIFO_MODE_CLI 0x40 #define FIFO_MODE_CMD 0x80 #define PROC_MODE_EXACT 1 #define PROC_MODE_STRSTR 2 #define PROC_MODE_USER_QUALIFY 4 struct p_fifo { int whoami; /**client or daemon */ int fifo_p; /**primary fifo */ int fifo_c; /**clipboard fifo */ int fifo_cmd; /**command interface (in to daemon) */ int fifo_dat; /**data out */ GIOChannel *g_ch_p; /**so we can add watches in the main loop */ GIOChannel *g_ch_c; /**so we can add watches in the main loop */ GIOChannel *g_ch_cmd; /** cmd watcher */ gchar *cbuf; /**cmd buffer */ gchar *dbuf; /**data buffer */ gchar *buf; /**the data itself */ gint clen; /**cmd len */ gint tclen; /**allocated cmd len */ gint dlen; /**data len */ gint len; /**total len of buffer (alloc amount) */ gint rlen; /**received lenght */ gint which; /**which clipboard the buffer should be written to */ gint dbg; /**set to debug fifo system */ }; int proc_find(const char* name, int mode, pid_t *pid); int create_fifo(void); int open_fifos(struct p_fifo *fifo); int read_fifo(struct p_fifo *f, int which); int write_fifo(struct p_fifo *f, int which, char *buf, int len); struct p_fifo* init_fifo(int mode); void close_fifos(struct p_fifo *p); void show_gtk_dialog(gchar *message, gchar *title); G_END_DECLS #endif parcellite-1.2.1/src/preferences.h0000644000175000017500000000374213041603201015176 0ustar hlehle/* Copyright (C) 2007-2008 by Xyhthyx * * This file is part of Parcellite. * * Parcellite is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * Parcellite is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef PREFERENCES_H #define PREFERENCES_H G_BEGIN_DECLS #define ACTIONS_FILE "parcellite/actions" #define FIFO_FILE_C "parcellite/fifo_c" #define FIFO_FILE_P "parcellite/fifo_p" #define FIFO_FILE_CMD "parcellite/fifo_cmd" #define FIFO_FILE_DAT "parcellite/fifo_data" #define PREFERENCES_FILE "parcellite/parcelliterc" struct keys { gchar *name; gchar *keyval; void *keyfunc; }; struct pref2int { gchar *name; int *val; }; struct tool_flag { int flag; gchar *name; }; /**for our mapper */ #define PM_INIT 0 #define PM_UPDATE 1 #define TOOL_XDOTOOL 0x01 extern struct tool_flag tool_flags[]; extern struct keys keylist[]; /*struct pref_item* get_pref(char *name); */ void check_for_tools( void ); int get_first_pref(int section); void pref_mapper (struct pref2int *m, int mode); int init_pref( void ); int set_pref_widget (char *name, GtkWidget *w); GtkWidget *get_pref_widget (char *name); gint32 set_pref_int32(char *name, gint32 val); gint32 get_pref_int32 (char *name); int set_pref_string (char *name, char *string); gchar *get_pref_string (char *name); void bind_itemkey(char *name, void (fhk)(char *, gpointer) ); void read_preferences(int mode); void show_preferences(gint tab); G_END_DECLS #endif parcellite-1.2.1/src/Makefile.am0000644000175000017500000000167313041603201014561 0ustar hlehleAM_CFLAGS = -I$(top_srcdir) -DPARCELLITELOCALEDIR=\""$(parcellitelocaledir)"\" INCLUDES = $(GTK_CFLAGS) $(APPINDICATOR_CFLAGS) LDADD = $(GTK_LIBS) $(APPINDICATOR_LIBS) -lX11 -lgdk-x11-2.0 -lpango-1.0 -lgobject-2.0 -lglib-2.0 bin_PROGRAMS = parcellite DISTCLEANFILES = *.bak *.log *~ .deps/*.P parcellite_SOURCES = main.c main.h \ utils.c utils.h \ parcellite-i18n.h\ daemon.c daemon.h \ history.c history.h \ keybinder.c keybinder.h \ preferences.c preferences.h \ eggaccelerators.c eggaccelerators.h \ attr_list.c attr_list.h $(top_srcdir)/config.h: $(parcellite_SOURCES) GO=$$(grep -c svnversion $(top_srcdir)/configure.ac); if [ "0" != "$$GO" ]; then \ VER=$$($(top_srcdir)/svnversion.sh); sed -i "s#\(.*\)svn.*\".*#\1$$VER\"#" $(top_srcdir)/config.h; fi parcellite-1.2.1/src/parcellite-i18n.h0000644000175000017500000000135713041603201015576 0ustar hlehle#ifndef __PARCELLITE_INTL_H__ #define __PARCELLITE_INTL_H__ #ifdef HAVE_CONFIG_H #include "config.h" #endif /* HAVE_CONFIG_H */ #ifdef ENABLE_NLS #include #define _(String) gettext(String) #ifdef gettext_noop #define N_(String) gettext_noop(String) #else #define N_(String) (String) #endif #else /* NLS is disabled */ #define _(String) (String) #define N_(String) (String) #define textdomain(String) (String) #define gettext(String) (String) #define dgettext(Domain,String) (String) #define dcgettext(Domain,String,Type) (String) #define bindtextdomain(Domain,Directory) (Domain) #define bind_textdomain_codeset(Domain,Codeset) (Codeset) #endif /* ENABLE_NLS */ #endif /* __PARCELLITE_INTL_H__ */ parcellite-1.2.1/src/history.h0000644000175000017500000000375213041603201014377 0ustar hlehle/* Copyright (C) 2007-2008 by Xyhthyx * * This file is part of Parcellite. * * Parcellite is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * Parcellite is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef HISTORY_H #define HISTORY_H G_BEGIN_DECLS #define HISTORY_FILE "parcellite/history" #define CLIP_TYPE_TEXT 0x1 #define CLIP_TYPE_IMG 0x2 #define CLIP_TYPE_PERSISTENT 0x4 #define HIST_DEL 0x10 #define HIST_CHECKDUP 1 #define HIST_KEEP_FLAGS 2 /**give us a genric struct for future expansion */ struct history_gen{ /**16 bytes, for overlay over res, below. */ gint16 a; gint16 b; gint16 c; gint16 d; }__attribute__((__packed__)); struct history_item { guint32 len; /**length of data item, MUST be first in structure */ gint16 type; /**currently, text or image */ gint16 flags; /**persistence, or?? */ guint32 res[4]; gchar text[8]; /**reserve 64 bits (8 bytes) for pointer to data. */ }__attribute__((__packed__)); extern GList* history_list; glong validate_utf8_text(gchar *text, glong len); void read_history(); void save_history(); struct history_item *new_clip_item(gint type, guint32 len, void *data); gint is_duplicate(gchar* item, int mode,int *type); void append_item(gchar* item, int checkdup, gint iflags, gint itype); void truncate_history(); gpointer get_last_item(); void clear_history( void ); void delete_duplicate(gchar* item); void history_save_as(GtkMenuItem *menu_item, gpointer user_data); G_END_DECLS #endif parcellite-1.2.1/src/history.c0000644000175000017500000004401313041603201014365 0ustar hlehle/* Copyright (C) 2007-2008 by Xyhthyx * * This file is part of Parcellite. * * Parcellite is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * Parcellite is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "parcellite.h" /**This is now a gslist of */ GList* history_list=NULL; static gint dbg=0; /**todo: handle parcellite history magic: if it does not exist, then we assume original format, and convert. Need to provide a menu item that allows user to convert back to old? or just provide manual instructions to convert back (i.e. dd skip)? */ #define HISTORY_MAGIC_SIZE 32 #define HISTORY_VERSION 1 /**index (-1) into array below */ static gchar* history_magics[]={ "1.0ParcelliteHistoryFile", NULL, }; #define HISTORY_FILE0 HISTORY_FILE /*#define HISTORY_FILE0 "parcellite/hist.test" */ /***************************************************************************/ /** Pass in the text via the struct. We assume len is correct, and BYTE based, not character. \n\b Arguments: \n\b Returns: length of resulting string. ****************************************************************************/ glong validate_utf8_text(gchar *text, glong len) { const gchar *valid; if(NULL == text || len <= 0) return 0; text[len]=0; if(FALSE == g_utf8_validate(text,-1,&valid)) { len=valid-text; text[len]=0; g_fprintf(stderr,"Truncating invalid utf8 text entry: '%s'\n",text); } return len; } /***************************************************************************/ /** Read the old history file and covert to the new format. \n\b Arguments: \n\b Returns: ****************************************************************************/ void read_history_old () { /* Build file path */ gchar* history_path = g_build_filename(g_get_user_data_dir(), HISTORY_FILE0, NULL); /* Open the file for reading */ FILE* history_file = fopen(history_path, "rb"); g_free(history_path); /* Check that it opened and begin read */ if (history_file) { /* Read the size of the first item */ gint size=1; g_mutex_lock(hist_lock); /* Continue reading until size is 0 */ while (size) { struct history_item *c; if (fread(&size, 4, 1, history_file) != 1){ size = 0; break; } else if( 0 == size ) break; /* Malloc according to the size of the item */ c = (struct history_item *)g_malloc0(size+ 2+sizeof(struct history_item)); c->type=CLIP_TYPE_TEXT; c->len=size; /* Read item and add ending character */ if(fread(c->text, size, 1, history_file) !=1){ g_printf("Error reading history file entry \n"); }else{ c->text[size] = 0; c->len=validate_utf8_text(c->text,c->len); if(0 != c->len) /* Prepend item and read next size */ history_list = g_list_prepend(history_list, c); else g_free(c); } } /* Close file and reverse the history to normal */ fclose(history_file); history_list = g_list_reverse(history_list); g_mutex_unlock(hist_lock); } } /* Saves history to ~/.local/share/parcellite/history */ void save_history_old() { /* Check that the directory is available */ check_dirs(); /* Build file path */ gchar* history_path = g_build_filename(g_get_user_data_dir(),HISTORY_FILE0, NULL); /* Open the file for writing */ FILE* history_file = fopen(history_path, "wb"); g_free(history_path); /* Check that it opened and begin write */ if (history_file) { GList* element; /* Write each element to a binary file */ for (element = history_list; element != NULL; element = element->next) { /* Create new GString from element data, write its length (size) * to file followed by the element data itself */ GString* item = g_string_new((gchar*)element->data); fwrite(&(item->len), 4, 1, history_file); fputs(item->str, history_file); g_string_free(item, TRUE); } /* Write 0 to indicate end of file */ gint end = 0; fwrite(&end, 4, 1, history_file); fclose(history_file); } } /***************************************************************************/ /** . \n\b Arguments: magic is what we are looking for, fmagic iw what we read from the file. \n\b Returns: history matched on match, -1 on erro, 0 if not found ****************************************************************************/ int check_magic(gchar *fmagic) { gint i, rtn; gchar *magic=g_malloc0(2+HISTORY_MAGIC_SIZE); if( NULL == magic) return -1; for (i=0;NULL !=history_magics[i];++i){ memset(magic,0,HISTORY_MAGIC_SIZE); memcpy(magic,history_magics[i],strlen(history_magics[i])); if(!memcmp(magic,fmagic,HISTORY_MAGIC_SIZE)){ rtn= i+1; goto done; } } rtn=0; done: g_free(magic); return rtn; } /***************************************************************************/ /** Reads history from ~/.local/share/parcellite/history . Current scheme is to have the total zize of element followed by the type, then the data \n\b Arguments: \n\b Returns: ****************************************************************************/ void read_history () { size_t x; /* Build file path */ gchar* history_path = g_build_filename(g_get_user_data_dir(),HISTORY_FILE0,NULL); gchar *magic=g_malloc0(2+HISTORY_MAGIC_SIZE); /*g_printf("History file '%s'",history_path); */ /* Open the file for reading */ FILE* history_file = fopen(history_path, "rb"); g_free(history_path); /* Check that it opened and begin read */ if (history_file) { /* Read the magic*/ guint32 size=1, end; if (fread(magic,HISTORY_MAGIC_SIZE , 1, history_file) != 1){ g_fprintf(stderr,"No magic! Assume no history.\n"); goto done; } if(HISTORY_VERSION !=check_magic(magic)){ g_fprintf(stderr,"Assuming old history style. Read and convert.\n"); /*g_printf("TODO! History version not matching!!Discarding history.\n"); */ g_free(magic); fclose(history_file); read_history_old(); return; } if(dbg) g_printf("History Magic OK. Reading\n"); /* Continue reading until size is 0 */ g_mutex_lock(hist_lock); while (size) { struct history_item *c; if (fread(&size, 4, 1, history_file) != 1) size = 0; if(0 == size) break; /* Malloc according to the size of the item */ c = (struct history_item *)g_malloc0(size+ 1); end=size-(sizeof(struct history_item)+4); if (fread(c, sizeof(struct history_item), 1, history_file) !=1) g_fprintf(stderr,"history_read: Invalid type!"); if(c->len != end) g_fprintf(stderr,"len check: invalid: ex %d got %d\n",end,c->len); /* Read item and add ending character */ if ((x =fread(&c->text,end,1,history_file)) != 1){ c->text[end] = 0; g_fprintf(stderr,"history_read: Invalid text, code %ld!\n'%s'\n",(unsigned long)x,c->text); } else { c->text[end] = 0; c->len=validate_utf8_text(c->text,c->len); if(dbg) g_fprintf(stderr,"len %d type %d '%s'\n",c->len,c->type,c->text); if(0 != c->len) /* Prepend item and read next size */ history_list = g_list_prepend(history_list, c); else g_free(c); } } done: g_free(magic); /* Close file and reverse the history to normal */ fclose(history_file); history_list = g_list_reverse(history_list); g_mutex_unlock(hist_lock); } if(dbg) g_printf("History read done\n"); } /** NOTES: gint width, height, rowstride, n_channels,bits_per_sample ; guchar *pixels; n_channels = gdk_pixbuf_get_n_channels (pixbuf); g_assert (gdk_pixbuf_get_colorspace (pixbuf) == GDK_COLORSPACE_RGB); bits_per_sample=gdk_pixbuf_get_bits_per_sample (pixbuf); width = gdk_pixbuf_get_width (pixbuf); height = gdk_pixbuf_get_height (pixbuf); rowstride = gdk_pixbuf_get_rowstride (pixbuf); pixels = gdk_pixbuf_get_pixels (pixbuf); len of pixbuf=rowstride*(height-1)+width * ((n_channels * bits_per_sample + 7) / 8) last row of pixbuf=width * ((n_channels * bits_per_sample + 7) / 8) */ /* Saves history to ~/.local/share/parcellite/history */ /***************************************************************************/ /** write total len, then write type, then write data. \n\b Arguments: \n\b Returns: ****************************************************************************/ void save_history() { /* Check that the directory is available */ check_dirs(); /* Build file path */ gchar* history_path = g_build_filename(g_get_user_data_dir(), HISTORY_FILE0, NULL); /* Open the file for writing */ FILE* history_file = fopen(history_path, "wb"); /* Check that it opened and begin write */ if (history_file) { GList* element; gchar *magic=g_malloc0(2+HISTORY_MAGIC_SIZE); if( NULL == magic) { fclose(history_file); return; } memcpy(magic,history_magics[HISTORY_VERSION-1],strlen(history_magics[HISTORY_VERSION-1])); fwrite(magic,HISTORY_MAGIC_SIZE,1,history_file); g_mutex_lock(hist_lock); /* Write each element to a binary file */ for (element = history_list; element != NULL; element = element->next) { struct history_item *c; gint32 len; /* Create new GString from element data, write its length (size) * to file followed by the element data itself */ c=(struct history_item *)element->data; /**write total len */ /**write total len */ if(c->len >0){ len=c->len+sizeof(struct history_item)+4; fwrite(&len,4,1,history_file); fwrite(c,sizeof(struct history_item),1,history_file); fwrite(c->text,c->len,1,history_file); } } g_mutex_unlock(hist_lock); /* Write 0 to indicate end of file */ gint end = 0; fwrite(&end, 4, 1, history_file); fclose(history_file); }else{ g_fprintf(stderr,"Unable to open history file for save '%s'\n",history_path); } g_free(history_path); } /***************************************************************************/ /** . \n\b Arguments: \n\b Returns: ****************************************************************************/ struct history_item *new_clip_item(gint type, guint32 len, void *data) { struct history_item *c; if(NULL == (c=g_malloc0(sizeof(struct history_item)+len))){ g_fprintf(stderr,"Hit NULL for malloc of history_item!\n"); return NULL; } c->type=type; memcpy(c->text,data,len); c->len=len; return c; } /***************************************************************************/ /** checks to see if text is already in history. Also is a find text \n\b Arguments: if mode is 1, delete it too. \n\b Returns: -1 if not found, or nth element. ****************************************************************************/ gint is_duplicate(gchar* item, int mode, gint *flags) { GList* element; gint i; if(NULL ==item) return -1; /* Go through each element compare each */ for (i=0,element = history_list; element != NULL; element = element->next,++i) { struct history_item *c; c=(struct history_item *)element->data; if(CLIP_TYPE_TEXT == c->type){ if (g_strcmp0((gchar*)c->text, item) == 0) { if(mode){ if(NULL != flags && (CLIP_TYPE_PERSISTENT&c->flags)){ *flags=c->flags; } /*g_printf("Freeing 0x%02X '%s'\n",c->flags,c->text); */ /** g_free(element->data); history_list = g_list_delete_link(history_list, element);*/ } return i; break; } } } return -1; } /***************************************************************************/ /** Adds item to the end of history . \n\b Arguments: \n\b Returns: ****************************************************************************/ void append_item(gchar* item, int checkdup, gint iflags, gint itype) { gint flags=0,node=-1; GList *element=NULL; struct history_item *c=NULL; if(NULL == item) return; g_mutex_lock(hist_lock); /**delete if HIST_DEL flag is set. */ if( checkdup & HIST_CHECKDUP){ node=is_duplicate(item, checkdup & HIST_DEL, &flags); /*g_printf("isd done "); */ if(node > -1){ /**found it */ /*g_printf(" found\n"); */ if(!(checkdup & HIST_DEL)) return; } } if (-1 != node ){/**we found a duplicate in the history, remove, then re-add existing */ element=g_list_nth(history_list,node); history_list=g_list_remove_link(history_list,element); }else{ /**not found */ if(NULL == (c=new_clip_item(CLIP_TYPE_TEXT,strlen(item),item)) ) return; if(node > -1 && (checkdup & HIST_KEEP_FLAGS) ){ c->flags=flags; /*g_printf("Restoring 0x%02X '%s'\n",c->flags,c->text); */ } else c->flags=iflags; c->type=itype; } /*g_printf("Append '%s'\n",item); */ /* Prepend new item */ history_list = g_list_prepend(history_list, NULL ==element?c:element->data); g_mutex_unlock(hist_lock); /* Shorten history if necessary */ truncate_history(); } /***************************************************************************/ /** Deletes duplicate item in history . Orphaned function. \n\b Arguments: \n\b Returns: ****************************************************************************/ void delete_duplicate(gchar* item) { GList* element; int p=get_pref_int32("persistent_history"); /* Go through each element compare each */ g_mutex_lock(hist_lock); for (element = history_list; element != NULL; element = element->next) { struct history_item *c; c=(struct history_item *)element->data; if( (!p || !(CLIP_TYPE_PERSISTENT&c->flags)) && CLIP_TYPE_TEXT == c->type){ if (g_strcmp0((gchar*)c->text, item) == 0) { g_printf("del dup '%s'\n",c->text); g_free(element->data); history_list = g_list_delete_link(history_list, element); break; } } } g_mutex_unlock(hist_lock); } /***************************************************************************/ /** Truncates history to history_limit items, while preserving persistent data, if specified by the user. FIXME: This may not shorten the history \n\b Arguments: \n\b Returns: ****************************************************************************/ void truncate_history() { int p=get_pref_int32("persistent_history"); if (history_list) { g_mutex_lock(hist_lock); guint ll=g_list_length(history_list); guint lim=get_pref_int32("history_limit"); if(ll > lim){ /* Shorten history if necessary */ GList* last = g_list_last(history_list); while (last->prev && ll>lim) { struct history_item *c=(struct history_item *)last->data; last=last->prev; if(!p || !(c->flags&CLIP_TYPE_PERSISTENT)){ history_list=g_list_remove(history_list,c); --ll; } } } g_mutex_unlock(hist_lock); /* Save changes */ if (get_pref_int32("save_history")) save_history(); } } /* Returns pointer to last item in history */ gpointer get_last_item() { if (history_list) { if (history_list->data) { /* Return the last element */ gpointer last_item = history_list->data; return last_item; } else return NULL; } else return NULL; } /***************************************************************************/ /** . \n\b Arguments: \n\b Returns: ****************************************************************************/ void clear_history( void ) { g_mutex_lock(hist_lock); if( !get_pref_int32("persistent_history")){ g_list_free(history_list); history_list = NULL; } else{ /**save any persistent items */ GList *element, *successor; for (element = history_list; element != NULL; element = successor) { struct history_item *c; c=(struct history_item *)element->data; successor=element->next; if(!(c->flags & CLIP_TYPE_PERSISTENT)) history_list=g_list_remove(history_list,c); } } g_mutex_unlock(hist_lock); if (get_pref_int32("save_history")) save_history(); } /***************************************************************************/ /** . \n\b Arguments: \n\b Returns: ****************************************************************************/ int save_history_as_text(gchar *path) { FILE* fp = fopen(path, "w"); /* Check that it opened and begin write */ if (fp) { gint i; GList* element; g_mutex_lock(hist_lock); /* Write each element to file */ for (i=0,element = history_list; element != NULL; element = element->next) { struct history_item *c; c=(struct history_item *)element->data; if(c->flags & CLIP_TYPE_PERSISTENT) fprintf(fp,"PHIST_%04d %s\n",i,c->text); else fprintf(fp,"NHIST_%04d %s\n",i,c->text); ++i; } g_mutex_unlock(hist_lock); fclose(fp); } g_printf("histpath='%s'\n",path); return 0; } /***************************************************************************/ /** Dialog to save the history file. \n\b Arguments: \n\b Returns: ****************************************************************************/ void history_save_as(GtkMenuItem *menu_item, gpointer user_data) { GtkWidget *dialog; dialog = gtk_file_chooser_dialog_new ("Save History File", NULL,/**parent */ GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, NULL); gtk_window_set_icon((GtkWindow*)dialog, gtk_widget_render_icon(dialog, GTK_STOCK_SAVE_AS, -1, NULL)); gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (dialog), TRUE); /* if (user_edited_a_new_document) { */ gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), g_get_home_dir()); gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (dialog), "ParcelliteHistory.txt"); /** } else gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (dialog), filename_for_existing_document);*/ if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) { gchar *filename; filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog)); save_history_as_text (filename); g_free (filename); } gtk_widget_destroy (dialog); } parcellite-1.2.1/src/preferences.c0000644000175000017500000015102013041603201015162 0ustar hlehle/* Copyright (C) 2007-2008 by Xyhthyx * * This file is part of Parcellite. * * Parcellite is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * Parcellite is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "parcellite.h" #include void setup_icon( void ); /**in main.c */ #define MAX_HISTORY 1000 #define INIT_HISTORY_KEY NULL #define INIT_ACTIONS_KEY NULL #define INIT_MENU_KEY NULL #define DEF_USE_COPY TRUE #define DEF_USE_PRIMARY FALSE #define DEF_SYNCHRONIZE FALSE #define DEF_SAVE_HISTORY TRUE #define DEF_HISTORY_LIMIT 25 #define DEF_HYPERLINKS_ONLY FALSE #define DEF_CONFIRM_CLEAR TRUE #define DEF_SINGLE_LINE TRUE #define DEF_REVERSE_HISTORY FALSE #define DEF_ITEM_LENGTH 50 #define DEF_ITEM_LENGTH_MAX 200 #define DEF_ELLIPSIZE 2 #define DEF_PHISTORY_KEY "X" #define DEF_HISTORY_KEY "H" #define DEF_ACTIONS_KEY "A" #define DEF_MENU_KEY "P" #define DEF_NO_ICON FALSE /**allow lower nibble to become the number of items of this type */ #define PREF_TYPE_TOGGLE 0x10 #define PREF_TYPE_SPIN 0x20 #define PREF_TYPE_COMBO 0x30 #define PREF_TYPE_ENTRY 0x40 /**gchar * */ #define PREF_TYPE_ALIGN 0x50 /**label, then align box */ #define PREF_TYPE_SPACER 0x60 #define PREF_TYPE_FRAME 0x70 /**frame for each section */ #define PREF_TYPE_MASK 0xF0 #define PREF_TYPE_NMASK 0xF #define PREF_TYPE_SINGLE_LINE 1 #define PREF_SEC_NONE 0 #define PREF_SEC_CLIP 1 #define PREF_SEC_HIST 2 #define PREF_SEC_MISC 3 #define PREF_SEC_DISP 4 #define PREF_SEC_ACT 5 #define PREF_SEC_XMISC 6 #define RC_VERSION_NAME "RCVersion" #define RC_VERSION 1 struct myadj { gdouble lower; gdouble upper; gdouble step; gdouble page; }; static char *icon_name="parcellite"; struct myadj align_hist_x={1,100,1,10}; struct myadj align_hist_y={1,100,1,10}; struct myadj align_data_lim={0,1000000,1,10}; struct myadj align_hist_lim={5, MAX_HISTORY, 1, 10}; struct myadj align_line_lim={5, DEF_ITEM_LENGTH_MAX, 1, 5}; struct pref_item { gchar *name; /**name/id to find pref */ gint32 val; /**int val */ float fval; gchar *cval; /**char val */ GtkWidget *w; /**widget in menu */ gint type; /**PREF_TYPE_ */ gchar *desc; /**shows up in menu */ gchar *tip; /**tooltip */ gint sec; /**clipboard,history, misc,display,hotkeys */ gchar *sig; /**signal, if any */ GCallback sfunc; /**function to call */ struct myadj *adj; }; static struct pref_item dummy[2]; static void check_toggled(GtkToggleButton *togglebutton, gpointer user_data); static void search_toggled(GtkToggleButton *b, gpointer user); static gint dbg=0; static int tool_bitfield=0; static int tool_bitfield_check=0; struct pref2int *pref2int_mapper=NULL; struct tool_flag tool_flags[]={ {.flag=TOOL_XDOTOOL,.name="xdotool"}, {.flag=0,.name=NULL }, /*{.flag=,.name= }, */ }; /**hot key list, mainly for easy sanity checks. */ struct keys keylist[]={ {.name="menu_key",.keyval=DEF_MENU_KEY,.keyfunc=(void *)menu_hotkey}, {.name="history_key",.keyval=DEF_HISTORY_KEY,.keyfunc=(void *)history_hotkey}, {.name="phistory_key",.keyval=DEF_PHISTORY_KEY,.keyfunc=(void *)phistory_hotkey}, {.name="actions_key",.keyval=DEF_ACTIONS_KEY,.keyfunc=(void *)actions_hotkey}, {.name=NULL,.keyval=NULL,.keyfunc=(void *)0}, }; /**must be in same order as above struct array */ gchar *def_keyvals[]={ DEF_MENU_KEY,DEF_HISTORY_KEY,DEF_PHISTORY_KEY,DEF_ACTIONS_KEY}; struct pref_item myprefs[]={ /**Behaviour */ /**Clipboards */ {.adj=NULL,.cval=NULL,.sig=NULL,.sfunc=NULL,.sec=PREF_SEC_CLIP,.name=NULL,.type=PREF_TYPE_FRAME,.desc="Clipboards",.tip=NULL,.val=0}, {.adj=NULL,.cval=NULL,.sig="toggled",.sfunc=(GCallback)check_toggled,.sec=PREF_SEC_CLIP,.name="use_copy",.type=PREF_TYPE_TOGGLE,.desc="Use _Copy (Ctrl-C)",.tip="If checked, Use the clipboard, which is Ctrl-C, Ctrl-V",.val=DEF_USE_COPY}, {.adj=NULL,.cval=NULL,.sig="toggled",.sfunc=(GCallback)check_toggled,.sec=PREF_SEC_CLIP,.name="use_primary",.type=PREF_TYPE_TOGGLE,.desc="Use _Primary (Selection)",.tip="If checked, Use the primary clipboard (mouse highlight-copy, middle mouse button paste)",.val=DEF_USE_PRIMARY}, {.adj=NULL,.cval=NULL,.sig=NULL,.sec=PREF_SEC_CLIP,.name="synchronize",.type=PREF_TYPE_TOGGLE,.desc="S_ynchronize clipboards",.tip="If checked, will keep both clipboards with the same content. If primary is pasted, then copy will have the same data.",.val=DEF_SYNCHRONIZE}, /**History */ {.adj=NULL,.cval=NULL,.sig=NULL,.sfunc=NULL,.sec=PREF_SEC_HIST,.name=NULL,.type=PREF_TYPE_FRAME,.desc="History",.tip=NULL,.val=0}, {.adj=NULL,.cval=NULL,.sig=NULL,.sec=PREF_SEC_HIST,.name="save_history",.type=PREF_TYPE_TOGGLE,.desc="Save history",.tip="Save history to a file.",.val=DEF_SAVE_HISTORY}, {.adj=NULL,.cval=NULL,.sig=NULL,.sec=PREF_SEC_HIST,.name="history_pos",.type=PREF_TYPE_TOGGLE|PREF_TYPE_SINGLE_LINE,.desc="Position history",.tip="If checked, use X, Y to position the history list",.val=0}, {.adj=&align_hist_x,.cval=NULL,.sig=NULL,.sec=PREF_SEC_HIST,.name="history_x",.type=PREF_TYPE_SPIN|PREF_TYPE_SINGLE_LINE,.desc="X",.tip=NULL,.val=1}, {.adj=&align_hist_y,.cval=NULL,.sig=NULL,.sec=PREF_SEC_HIST,.name="history_y",.type=PREF_TYPE_SPIN|PREF_TYPE_SINGLE_LINE,.desc="Y",.tip="Position in pixels from the top of the screen",.val=1}, {.adj=&align_hist_lim,.cval=NULL,.sig=NULL,.sec=PREF_SEC_HIST,.name="history_limit",.type=PREF_TYPE_SPIN,.desc="Items in history",.tip="Maximum number of clipboard entries to keep",.val=DEF_HISTORY_LIMIT}, {.adj=&align_data_lim,.cval=NULL,.sig=NULL,.sec=PREF_SEC_HIST,.name="data_size",.type=PREF_TYPE_SPIN,.desc="Max Data Size(KB)",.tip="Maximum data size of entire history list",.val=0}, {.adj=&align_hist_lim,.cval=NULL,.sig=NULL,.sec=PREF_SEC_HIST,.name="item_size",.type=PREF_TYPE_SPIN,.desc="Max Item Size(KB)",.tip="Maximum data size of one item",.val=0}, {.adj=NULL,.cval=NULL,.sig=NULL,.sec=PREF_SEC_HIST,.name="nop",.type=PREF_TYPE_SPACER,.desc=" ",.tip=NULL}, {.adj=NULL,.cval=NULL,.sig=NULL,.sec=PREF_SEC_HIST,.name="automatic_paste",.type=PREF_TYPE_TOGGLE|PREF_TYPE_SINGLE_LINE,.desc="Auto Paste",.tip="If checked, will use xdotool to paste wherever the mouse is.\nNOTE! Package xdotool MUST BE INSTALLED for this to work.",.val=0}, {.adj=NULL,.cval=NULL,.sig=NULL,.sec=PREF_SEC_HIST,.name="auto_key",.type=PREF_TYPE_TOGGLE|PREF_TYPE_SINGLE_LINE,.desc="Key",.tip="If checked, will use Ctrl-V paste.",.val=0}, {.adj=NULL,.cval=NULL,.sig=NULL,.sec=PREF_SEC_HIST,.name="auto_mouse",.type=PREF_TYPE_TOGGLE|PREF_TYPE_SINGLE_LINE,.desc="Mouse",.tip="If checked, will use middle mouse to paste.",.val=1}, {.adj=NULL,.cval=NULL,.sig=NULL,.sec=PREF_SEC_HIST,.name="key_input",.type=PREF_TYPE_TOGGLE,.desc="Keyboard Input",.tip="If checked, will emit the history entry via the keyboard entry.",.val=0}, {.adj=NULL,.cval=NULL,.sig=NULL,.sec=PREF_SEC_HIST,.name="restore_empty",.type=PREF_TYPE_TOGGLE,.desc="Restore Empty",.tip="If checked, will restore clipboard entry on application exit.",.val=1}, {.adj=NULL,.cval=NULL,.sig=NULL,.sec=PREF_SEC_HIST,.name="rc_edit",.type=PREF_TYPE_TOGGLE,.desc="Right Click Edit",.tip="If checked, edit the history item clicked on.",.val=0}, /**Miscellaneous */ {.adj=NULL,.cval=NULL,.sig=NULL,.sfunc=NULL,.sec=PREF_SEC_MISC,.name=NULL,.type=PREF_TYPE_FRAME,.desc="Miscellaneous",.tip=NULL,.val=0}, {.adj=NULL,.cval=NULL,.sig="toggled",.sfunc=(GCallback)search_toggled,.sec=PREF_SEC_MISC,.name="type_search",.type=PREF_TYPE_TOGGLE,.desc="Search As You Type",.tip="If checked, does a search-as-you-type. Turns red if not found. Goes to top (Alt-E) line when no chars are entered for search"}, {.adj=NULL,.cval=NULL,.sig="toggled",.sfunc=(GCallback)search_toggled,.sec=PREF_SEC_MISC,.name="case_search",.type=PREF_TYPE_TOGGLE,.desc="Case Sensitive Search",.tip="If checked, does case sensitive search"}, {.adj=NULL,.cval=NULL,.sig=NULL,.sec=PREF_SEC_MISC,.name="ignore_whiteonly",.type=PREF_TYPE_TOGGLE,.desc="Ignore Whitespace Only",.tip="If checked, will ignore any clipboard additions that contain only whitespace."}, {.adj=NULL,.cval=NULL,.sig=NULL,.sec=PREF_SEC_MISC,.name="trim_wspace_begend",.type=PREF_TYPE_TOGGLE,.desc="Trim Whitespace",.tip="If checked, will trim whitespace from beginning and end of entry."}, {.adj=NULL,.cval=NULL,.sig=NULL,.sec=PREF_SEC_MISC,.name="trim_newline",.type=PREF_TYPE_TOGGLE,.desc="Trim Newlines",.tip="If checked, will replace newlines with spaces."}, {.adj=NULL,.cval=NULL,.sig=NULL,.sec=PREF_SEC_MISC,.name="hyperlinks_only",.type=PREF_TYPE_TOGGLE,.desc="Capture hyperlinks only",.tip=NULL,.val=DEF_HYPERLINKS_ONLY}, {.adj=NULL,.cval=NULL,.sig=NULL,.sec=PREF_SEC_MISC,.name="confirm_clear",.type=PREF_TYPE_TOGGLE,.desc="Confirm before clearing history",.tip=NULL,.val=DEF_CONFIRM_CLEAR}, /**Display add icon here...*/ {.adj=NULL,.cval=NULL,.sig=NULL,.sfunc=NULL,.sec=PREF_SEC_DISP,.name=NULL,.type=PREF_TYPE_FRAME,.desc="Items",.tip=NULL,.val=0}, {.adj=NULL,.cval=NULL,.sig=NULL,.sec=PREF_SEC_DISP,.name="current_on_top",.type=PREF_TYPE_TOGGLE,.desc="Current entry on top",.tip="If checked, places current clipboard entry at top of list. If not checked, history does not get sorted.",.val=TRUE}, {.adj=NULL,.cval=NULL,.sig=NULL,.sec=PREF_SEC_DISP,.name="single_line",.type=PREF_TYPE_TOGGLE,.desc="Show in a single line",.tip=NULL,.val=DEF_SINGLE_LINE}, {.adj=NULL,.cval=NULL,.sig=NULL,.sec=PREF_SEC_DISP,.name="reverse_history",.type=PREF_TYPE_TOGGLE,.desc="Show in reverse order",.tip="If checked, the current entry will be on the bottom instead of the top.",.val=DEF_REVERSE_HISTORY}, {.adj=NULL,.cval=NULL,.sig=NULL,.sec=PREF_SEC_DISP,.name="nop",.type=PREF_TYPE_SPACER,.desc=" ",.tip=NULL}, {.adj=&align_line_lim,.cval=NULL,.sig=NULL,.sec=PREF_SEC_DISP,.name="item_length",.type=PREF_TYPE_SPIN,.desc="Character length of items",.tip=NULL,.val=DEF_ITEM_LENGTH}, {.adj=NULL,.cval=NULL,.sig=NULL,.sec=PREF_SEC_DISP,.name="nop",.type=PREF_TYPE_SPACER,.desc=" ",.tip=NULL}, {.adj=NULL,.cval=NULL,.sig=NULL,.sec=PREF_SEC_DISP,.name="persistent_history",.type=PREF_TYPE_TOGGLE,.desc="Persistent History",.tip="If checked, enables the persistent history.",.val=FALSE}, {.adj=NULL,.cval=NULL,.sig=NULL,.sec=PREF_SEC_DISP,.name="persistent_separate",.type=PREF_TYPE_TOGGLE,.desc="Persistent As Separate List",.tip="If checked, puts the persistent history in a new list and enables the Persistent History HotKey. You will need to use the persistent history hotkey to see the history.",.val=FALSE}, {.adj=NULL,.cval=NULL,.sig=NULL,.sec=PREF_SEC_DISP,.name="persistent_on_top",.type=PREF_TYPE_TOGGLE,.desc="Persistent On Top",.tip="If checked, puts the persistent history at the top of the history list. If the option above is checked, this option has no effect.",.val=FALSE}, {.adj=NULL,.cval="\\n",.sig=NULL,.sec=PREF_SEC_DISP,.name="persistent_delim",.type=PREF_TYPE_ENTRY,.desc="Paste All Entry Delimiter",.tip="This string will be inserted between each line of history for paste all."}, {.adj=NULL,.cval=NULL,.sig=NULL,.sec=PREF_SEC_DISP,.name="nonprint_disp",.type=PREF_TYPE_TOGGLE,.desc="Alternate Non-printing Display",.tip="If checked, will display tabs with Right arrow (utf8,\\2192), newlines with pharagrph(\\204b), and spaces with square-u(\\2423).", .val=FALSE}, {.adj=NULL,.cval=NULL,.sig=NULL,.sec=PREF_SEC_DISP,.name="nop",.type=PREF_TYPE_SPACER,.desc=" ",.tip=NULL}, {.adj=NULL,.cval=NULL,.sig=NULL,.sec=PREF_SEC_NONE,.name="ellipsize",.type=PREF_TYPE_COMBO,.desc="Omit items in the:",.tip=NULL,.val=DEF_ELLIPSIZE}, /**miscellaneous that doesn't fit elswhew */ {.adj=NULL,.cval=NULL,.sig=NULL,.sfunc=NULL,.sec=PREF_SEC_XMISC,.name=NULL,.type=PREF_TYPE_FRAME,.desc="Miscellaneous",.tip=NULL,.val=0}, {.adj=NULL,.cval=NULL,.sig=NULL,.sec=PREF_SEC_XMISC,.name="multi_user",.type=PREF_TYPE_TOGGLE,.desc="Multiuser",.tip="If checked, enables checking multiple concurrent user logic. Use if several different users are logged in at the same time.",.val=TRUE}, {.adj=NULL,.cval=PARCELLITE_ICON,.sig=NULL,.sec=PREF_SEC_XMISC,.name="icon_name",.type=PREF_TYPE_ENTRY,.desc="Parcellite Icon Name",.tip="Name of Parcellite icon. If this is mis-typed, icon will not appear.",.val=TRUE}, #ifdef DEBUG_UPDATE {.adj=NULL,.cval=NULL,.sig=NULL,.sec=PREF_SEC_XMISC,.name="debug_update",.type=PREF_TYPE_TOGGLE,.desc="DebugUpdate",.tip="If checked, enables debug prints on clipboard update logic. This only takes effect when enabled at start up, and may be disabled at compile time.",.val=FALSE}, #endif /**Action Keys */ {.adj=NULL,.cval=NULL,.sig=NULL,.sec=PREF_SEC_ACT,.name="menu_key",.type=PREF_TYPE_ENTRY,.desc="Menu key combination",.tip=NULL}, {.adj=NULL,.cval=NULL,.sig=NULL,.sec=PREF_SEC_ACT,.name="history_key",.type=PREF_TYPE_ENTRY,.desc="History key combination:",.tip=NULL}, {.adj=NULL,.cval=NULL,.sig=NULL,.sec=PREF_SEC_ACT,.name="phistory_key",.type=PREF_TYPE_ENTRY,.desc="Persistent history key:",.tip=NULL}, {.adj=NULL,.cval=NULL,.sig=NULL,.sec=PREF_SEC_ACT,.name="actions_key",.type=PREF_TYPE_ENTRY,.desc="Actions key combination:",.tip=NULL}, {.adj=NULL,.cval=NULL,.sig=NULL,.sec=PREF_SEC_NONE,.name="no_icon",.val=FALSE}, {.adj=NULL,.cval=NULL,.sig=NULL,.sec=PREF_SEC_NONE,.name=NULL,.desc=NULL}, }; GtkListStore* actions_list; GtkTreeSelection* actions_selection; /***************************************************************************/ /** Set up which tools are available on the system. \n\b Arguments: \n\b Returns: ****************************************************************************/ static void check_for_tools_exit(GPid pid, gint status, gpointer data) { int flag= GPOINTER_TO_INT(data); g_spawn_close_pid(pid); if( WIFEXITED(status) ){ if(0 ==WEXITSTATUS(status) ) tool_bitfield|=flag; } tool_bitfield_check &= ~(flag); g_fprintf(stderr,"Flag 0x%04x, status %d, EXIT %d STAT %d\n",flag,status,WIFEXITED(status),WEXITSTATUS(status) ); } /***************************************************************************/ /** Check for installed tools and set flags accordingly. \n\b Arguments: \n\b Returns: ****************************************************************************/ void check_for_tools(void ) { GPid pid; gchar **argv; int i; for (i=0; NULL != tool_flags[i].name; ++i){ gchar cmd[100]; tool_bitfield_check|=tool_flags[i].flag; sprintf(cmd,"/bin/sh -c 'which %s'>/dev/null\n",tool_flags[i].name); g_shell_parse_argv(cmd, NULL, &argv, NULL); g_spawn_async(NULL, argv, NULL, G_SPAWN_DO_NOT_REAP_CHILD, NULL, NULL, &pid, NULL); g_child_watch_add(pid, (GChildWatchFunc)check_for_tools_exit, GINT_TO_POINTER(tool_flags[i].flag)); g_strfreev(argv); } } /***************************************************************************/ /** . \n\b Arguments: \n\b Returns: Structure of item ****************************************************************************/ struct pref_item* get_pref(char *name) { int i; for (i=0;NULL != myprefs[i].desc; ++i){ if(NULL == myprefs[i].name) continue; if(!g_strcmp0(myprefs[i].name,name)) return &myprefs[i]; } return &dummy[0]; } /***************************************************************************/ /** Set an array that is updated every time the preferences are changed. \n\b Arguments: \n\b Returns: ****************************************************************************/ void pref_mapper (struct pref2int *m, int mode) { int i; if(PM_INIT == mode){ pref2int_mapper=m; return; } for (i=0; pref2int_mapper[i].name != NULL && pref2int_mapper[i].val != NULL; ++i){ struct pref_item *p=get_pref(pref2int_mapper[i].name); *pref2int_mapper[i].val=p->val; } } /***************************************************************************/ /** . \n\b Arguments: pointer of widget \n\b Returns: Structure of item ****************************************************************************/ struct pref_item* get_pref_by_widget(GtkWidget *w) { int i; for (i=0;NULL != myprefs[i].desc; ++i){ if(NULL == myprefs[i].name) continue; if(w == myprefs[i].w) return &myprefs[i]; } return &dummy[0]; } /***************************************************************************/ /** Find first item in section. \n\b Arguments: \n\b Returns: index into struct where found, or end of list ****************************************************************************/ int get_first_pref(int section) { int i; for (i=0;NULL != myprefs[i].desc; ++i){ if(section == myprefs[i].sec){ if(dbg)g_printf("gfp:returning sec %d, '%s\n",section, myprefs[i].desc); return i; } } if(dbg)g_printf("Didn't find section %d\n",i); return i; } /***************************************************************************/ /** . \n\b Arguments: \n\b Returns: ****************************************************************************/ int init_pref( void ) { GdkScreen *s; gint sx,sy; s=gdk_screen_get_default(); sx= gdk_screen_get_width(s); sy= gdk_screen_get_height(s); dummy[0].cval="dummy String"; dummy[0].w=NULL; dummy[0].desc="Dummy desc"; dummy[0].tip="Dummy tip"; dummy[1].name=NULL; dummy[1].sec=PREF_SEC_NONE; align_hist_y.upper=sy-100; align_hist_x.upper=sx-100; return 0; } /***************************************************************************/ /** set the wideget of item. \n\b Arguments: \n\b Returns: ****************************************************************************/ int set_pref_widget (char *name, GtkWidget *w) { struct pref_item *p=get_pref(name); if(NULL == p) return -1; p->w=w; return 0; } /***************************************************************************/ /** get the char * value of string. \n\b Arguments: \n\b Returns: ****************************************************************************/ GtkWidget *get_pref_widget (char *name) { struct pref_item *p=get_pref(name); if(NULL == p) return dummy[0].w; return p->w; } /***************************************************************************/ /** Set the int value of name. \n\b Arguments: \n\b Returns: ****************************************************************************/ int set_pref_int32(char *name, gint32 val) { struct pref_item *p=get_pref(name); if(NULL == p) return -1; p->val=val; return 0; } /***************************************************************************/ /** get the int value of name. \n\b Arguments: \n\b Returns: ****************************************************************************/ gint32 get_pref_int32 (char *name) { struct pref_item *p=get_pref(name); if(NULL == p) return -1; return p->val; } /***************************************************************************/ /** Set the float value of name. \n\b Arguments: \n\b Returns: ****************************************************************************/ int set_pref_float(char *name, float fval) { struct pref_item *p=get_pref(name); if(NULL == p) return -1; p->fval=fval; return 0; } /***************************************************************************/ /** get the float value of name. \n\b Arguments: \n\b Returns: ****************************************************************************/ float get_pref_float (char *name) { struct pref_item *p=get_pref(name); if(NULL == p) return -1; return p->fval; } /***************************************************************************/ /** set the char *value of string. \n\b Arguments: \n\b Returns: ****************************************************************************/ int set_pref_string (char *name, char *string) { struct pref_item *p=get_pref(name); if(NULL == p) return -1; if(p->cval != NULL) g_free(p->cval); p->cval=g_strdup(string); return 0; } /***************************************************************************/ /** get the char * value of string. \n\b Arguments: \n\b Returns: ****************************************************************************/ gchar *get_pref_string (char *name) { struct pref_item *p=get_pref(name); if(NULL == p) return dummy[0].cval; return p->cval; } /***************************************************************************/ /** . \n\b Arguments: \n\b Returns: ****************************************************************************/ void unbind_itemkey(char *name, void *fhk ) { struct pref_item *p=get_pref(name); if(NULL == p){ if(dbg)g_printf("pref:null found for %s\n",name); return; } keybinder_unbind(p->cval, fhk); g_free(p->cval); p->cval=NULL; } /***************************************************************************/ /** . \n\b Arguments: \n\b Returns: ****************************************************************************/ void bind_itemkey(char *name, void (fhk)(char *, gpointer) ) { struct pref_item *p=get_pref(name); if(NULL ==p){ if(dbg)g_printf("pref2:null found for %s\n",name); return; } if(NULL != p->cval && 0 != p->cval) keybinder_bind(p->cval, fhk, NULL); } /***************************************************************************/ /** . \n\b Arguments: \n\b Returns: ****************************************************************************/ void set_key_entry(gchar *name, gchar *val) { int i; for (i=0;NULL != keylist[i].name; ++i){ if(!g_strcmp0(keylist[i].name,name)){ if(NULL == val) keylist[i].keyval=""; else keylist[i].keyval=val; return; } } } /***************************************************************************/ /** . \n\b Arguments: \n\b Returns: ****************************************************************************/ void set_keys_from_prefs( void ) { int i,l; for (i=0;NULL != keylist[i].name; ++i){ /**NOTE: do not set up default keys here! User may WANT them null */ /** call egg_accelerator_parse_virtual to validate? */ set_key_entry(keylist[i].name,get_pref_string(keylist[i].name)); /*g_fprintf(stderr,"key '%s' val '%s'\n",keylist[i].name, keylist[i].keyval); */ } /**now go through and make sure we have no duplicates */ for (i=0;NULL != keylist[i].name; ++i){ if(0 != keylist[i].keyval[0]){ /**see if it exists elsewhere */ for (l=0;NULL != keylist[l].name; ++l){ if(l!=i && 0 != keylist[l].keyval[0]){ if(!g_strcmp0(keylist[i].keyval, keylist[l].keyval)) { /**conflict!, delete second */ g_fprintf(stderr,"Error! Hot keys have same key '%s': '%s' and '%s'. Ignoring second entry\n",keylist[i].keyval,keylist[i].name,keylist[l].name); set_key_entry(keylist[l].name,""); set_pref_string(keylist[l].name,""); } } } } } } /***************************************************************************/ /** . \n\b Arguments: mode - if 0, do not display helper missing dialog. \n\b Returns: ****************************************************************************/ void check_sanity(int mode) { gint32 x,y; gchar *val; check_for_tools(); /**update the list of tools parcellite needs. */ while(tool_bitfield_check){ g_main_context_iteration(NULL, TRUE); usleep(100000); } val=get_pref_string("icon_name"); if(NULL != val && strcmp(icon_name, val)){ setup_icon( ); icon_name=strdup(val); } x=get_pref_int32("history_x"); y=get_pref_int32("history_y"); postition_history(NULL,&x,&y,NULL, 0); /**have function limit x,y according to screen limits */ set_pref_int32("history_x",x); set_pref_int32("history_y",y); x=get_pref_int32("history_limit"); if ((!x) || (x > MAX_HISTORY) || (x < 0)) set_pref_int32("history_limit",DEF_HISTORY_LIMIT); x=get_pref_int32("item_length"); if ((!x) || (x > DEF_ITEM_LENGTH_MAX) || (x < 0)) set_pref_int32("item_length",DEF_ITEM_LENGTH); x=get_pref_int32("ellipsize"); if ((!x) || (x > 3) || (x < 0)) set_pref_int32("ellipsize",DEF_ELLIPSIZE); set_keys_from_prefs(); if(get_pref_int32("persistent_history")){ if(get_pref_int32("persistent_separate")) set_pref_int32("persistent_on_top",0); }else{ set_pref_int32("persistent_separate",0); set_pref_int32("persistent_on_top",0); } if(get_pref_int32("automatic_paste")){ if(!(tool_bitfield&TOOL_XDOTOOL)){ g_fprintf(stderr,"tool_bitfield=0x%x\n",tool_bitfield); set_pref_int32("automatic_paste",0); if( mode ) show_gtk_dialog("xdotool is not installed\nParcellite's auto-paste will not function without xdotool.","xdotool Not Installed" ); } else{ if(get_pref_int32("auto_key") && get_pref_int32("auto_mouse")) set_pref_int32("auto_key",0); if(!get_pref_int32("auto_key") && !get_pref_int32("auto_mouse")) set_pref_int32("auto_mouse",1); } } } /* Apply the new preferences */ static void apply_preferences() { int i; /* Unbind the keys before binding new ones */ for (i=0;NULL != keylist[i].name; ++i) unbind_itemkey(keylist[i].name,keylist[i].keyfunc); for (i=0;NULL != myprefs[i].desc; ++i){ if(NULL == myprefs[i].name) continue; switch(myprefs[i].type&PREF_TYPE_MASK){ case PREF_TYPE_TOGGLE: myprefs[i].val=gtk_toggle_button_get_active((GtkToggleButton*)myprefs[i].w); break; case PREF_TYPE_SPIN: myprefs[i].val=gtk_spin_button_get_value_as_int((GtkSpinButton*)myprefs[i].w); myprefs[i].fval=(float)gtk_spin_button_get_value((GtkSpinButton*)myprefs[i].w); break; case PREF_TYPE_COMBO: myprefs[i].val=gtk_combo_box_get_active((GtkComboBox*)myprefs[i].w) + 1; break; case PREF_TYPE_ENTRY: myprefs[i].cval=g_strdup(gtk_entry_get_text((GtkEntry*)myprefs[i].w )); break; case PREF_TYPE_SPACER: break; default: if(dbg)g_printf("apply_pref:don't know how to handle type %d\n",myprefs[i].type); break; } } check_sanity(1); /* Bind keys and apply the new history limit */ for (i=0;NULL != keylist[i].name; ++i) bind_itemkey(keylist[i].name,keylist[i].keyfunc); truncate_history(); pref_mapper(NULL, PM_UPDATE); } /***************************************************************************/ /** . \n\b Arguments: \n\b Returns: ****************************************************************************/ static void save_preferences() { int i; /* Create key */ GKeyFile* rc_key = g_key_file_new(); g_key_file_set_integer(rc_key, "rc", RC_VERSION_NAME, RC_VERSION); if(0 == get_pref_int32("type_search")) set_pref_int32("case_search",0); /* Add values */ for (i=0;NULL != myprefs[i].desc; ++i){ if(NULL == myprefs[i].name) continue; switch(myprefs[i].type&PREF_TYPE_MASK){ case PREF_TYPE_TOGGLE: g_key_file_set_boolean(rc_key, "rc", myprefs[i].name, myprefs[i].val); break; case PREF_TYPE_COMBO: case PREF_TYPE_SPIN: g_key_file_set_integer(rc_key, "rc", myprefs[i].name, myprefs[i].val); break; case PREF_TYPE_ENTRY: g_key_file_set_string(rc_key, "rc", myprefs[i].name, myprefs[i].cval); break; case PREF_TYPE_SPACER: break; default: if(dbg)g_printf("save_pref:don't know how to handle type %d\n",myprefs[i].type); break; } } /* Check config and data directories */ check_dirs(); /* Save key to file */ gchar* rc_file = g_build_filename(g_get_user_config_dir(), PREFERENCES_FILE, NULL); g_file_set_contents(rc_file, g_key_file_to_data(rc_key, NULL, NULL), -1, NULL); g_key_file_free(rc_key); g_free(rc_file); } /***************************************************************************/ /** Read the parcelliterc file. \n\b Arguments: mode - 0 to not display missing helper warnings \n\b Returns: ****************************************************************************/ void read_preferences(int mode) { gchar *c,*rc_file = g_build_filename(g_get_user_config_dir(), PREFERENCES_FILE, NULL); gint32 z; GError *err=NULL; struct pref_item *p; init_pref(); /* Create key */ GKeyFile* rc_key = g_key_file_new(); if (g_key_file_load_from_file(rc_key, rc_file, G_KEY_FILE_NONE, NULL)) { int i; i=g_key_file_get_integer(rc_key, "rc", RC_VERSION_NAME,&err); /**this begins in 1.1.8 */ /* Load values */ for (i=0;NULL != myprefs[i].desc; ++i){ if(NULL == myprefs[i].name) continue; err=NULL; switch(myprefs[i].type&PREF_TYPE_MASK){ case PREF_TYPE_TOGGLE: z=g_key_file_get_boolean(rc_key, "rc", myprefs[i].name,&err); if( NULL ==err) myprefs[i].val=z; break; case PREF_TYPE_COMBO: case PREF_TYPE_SPIN: z=g_key_file_get_integer(rc_key, "rc", myprefs[i].name,&err); if( NULL ==err) myprefs[i].val=z; break; case PREF_TYPE_ENTRY: c=g_key_file_get_string(rc_key, "rc", myprefs[i].name, &err); if( NULL ==err) myprefs[i].cval=c; break; case PREF_TYPE_SPACER: break; default: if(dbg) g_printf("read_pref:don't know how to handle type %d for '%s'\n",myprefs[i].type,myprefs[i].name); continue; break; } if(NULL != err) g_printf("Unable to load pref '%s'\n",myprefs[i].name); if(dbg)g_printf("rp:Set '%s' to %d (%s)\n",myprefs[i].name, myprefs[i].val, myprefs[i].cval); } p=get_pref("type_search"); if(0 == p->val){ p=get_pref("case_search"); p->val=0; } /* Check for errors and set default values if any */ check_sanity(mode); } else { /* Init default keys on error */ int i; for (i=0;NULL != keylist[i].name; ++i) set_pref_string(keylist[i].name,def_keyvals[i]); } pref_mapper(NULL, PM_UPDATE); g_key_file_free(rc_key); g_free(rc_file); } /* Read ~/.parcellite/actions into the treeview */ static void read_actions() { /* Open the file for reading */ gchar* path = g_build_filename(g_get_user_data_dir(), ACTIONS_FILE, NULL); FILE* actions_file = fopen(path, "rb"); g_free(path); /* Check that it opened and begin read */ if (actions_file) { /* Keep a row reference */ GtkTreeIter row_iter; /* Read the size of the first item */ gint size=0; if(0 ==fread(&size, 4, 1, actions_file)) g_print("P1:0 Items read\n"); /* Continue reading until size is 0 */ while (size != 0) { /* Read name */ gchar* name = (gchar*)g_malloc(size + 1); if(0 ==fread(name, size, 1, actions_file)) g_print("P1:0 Items read\n"); name[size] = '\0'; if(0 ==fread(&size, 4, 1, actions_file)) g_print("P1:0 Items read\n"); /* Read command */ gchar* command = (gchar*)g_malloc(size + 1); if(0 ==fread(command, size, 1, actions_file)) g_print("P1:0 Items read\n"); command[size] = '\0'; if(0 ==fread(&size, 4, 1, actions_file)) g_print("P1:0 Items read\n"); /* Append the read action */ gtk_list_store_append(actions_list, &row_iter); gtk_list_store_set(actions_list, &row_iter, 0, name, 1, command, -1); g_free(name); g_free(command); } fclose(actions_file); } } /* Save the actions treeview to ~/.local/share/parcellite/actions */ static void save_actions() { /* Check config and data directories */ check_dirs(); /* Open the file for writing */ gchar* path = g_build_filename(g_get_user_data_dir(), ACTIONS_FILE, NULL); FILE* actions_file = fopen(path, "wb"); g_free(path); /* Check that it opened and begin write */ if (actions_file) { GtkTreeIter action_iter; /* Get and check if there's a first iter */ if (gtk_tree_model_get_iter_first((GtkTreeModel*)actions_list, &action_iter)) { do { /* Get name and command */ gchar *name, *command; gtk_tree_model_get((GtkTreeModel*)actions_list, &action_iter, 0, &name, 1, &command, -1); GString* s_name = g_string_new(name); GString* s_command = g_string_new(command); g_free(name); g_free(command); /* Check that there's text to save */ if ((s_name->len == 0) || (s_command->len == 0)) { /* Free strings and skip iteration */ g_string_free(s_name, TRUE); g_string_free(s_command, TRUE); continue; } else { /* Save action */ fwrite(&(s_name->len), 4, 1, actions_file); fputs(s_name->str, actions_file); fwrite(&(s_command->len), 4, 1, actions_file); fputs(s_command->str, actions_file); /* Free strings */ g_string_free(s_name, TRUE); g_string_free(s_command, TRUE); } } while(gtk_tree_model_iter_next((GtkTreeModel*)actions_list, &action_iter)); } /* End of file write */ gint end = 0; fwrite(&end, 4, 1, actions_file); fclose(actions_file); } } /* Called when clipboard checks are pressed */ static void check_toggled(GtkToggleButton *togglebutton, gpointer user_data) { if (gtk_toggle_button_get_active((GtkToggleButton*)get_pref_widget("use_copy")) && gtk_toggle_button_get_active((GtkToggleButton*)get_pref_widget("use_primary"))) { /* Only allow synchronize option if both primary and clipboard are enabled */ gtk_widget_set_sensitive((GtkWidget*)get_pref_widget("synchronize"), TRUE); } else { /* Disable synchronize option */ gtk_toggle_button_set_active((GtkToggleButton*)get_pref_widget("synchronize"), FALSE); gtk_widget_set_sensitive((GtkWidget*)get_pref_widget("synchronize"), FALSE); } } static void search_toggled(GtkToggleButton *b, gpointer user) { struct pref_item *u,*p; u=get_pref_by_widget((GtkWidget *)user); p=get_pref("case_search"); if(u == p){ if(TRUE == gtk_toggle_button_get_active((GtkToggleButton*)p->w) && FALSE == gtk_toggle_button_get_active((GtkToggleButton*)get_pref_widget("type_search")) ) gtk_toggle_button_set_active((GtkToggleButton*)get_pref_widget("type_search"), TRUE); }else if( u == get_pref("type_search")){ if(FALSE == gtk_toggle_button_get_active((GtkToggleButton*)get_pref_widget("type_search")) && TRUE == gtk_toggle_button_get_active((GtkToggleButton*)p->w) ) gtk_toggle_button_set_active((GtkToggleButton*)p->w, FALSE); } } /* Called when Add... button is clicked */ static void add_action(GtkButton *button, gpointer user_data) { /* Append new item */ GtkTreeIter row_iter; gtk_list_store_append(actions_list, &row_iter); /* Add a %s to the command */ gtk_list_store_set(actions_list, &row_iter, 1, "%s", -1); /* Set the first column to editing */ GtkTreePath* row_path = gtk_tree_model_get_path((GtkTreeModel*)actions_list, &row_iter); GtkTreeView* treeview = gtk_tree_selection_get_tree_view(actions_selection); GtkTreeViewColumn* column = gtk_tree_view_get_column(treeview, 0); gtk_tree_view_set_cursor(treeview, row_path, column, TRUE); gtk_tree_path_free(row_path); } /* Called when Remove button is clicked */ static void remove_action(GtkButton *button, gpointer user_data) { GtkTreeIter sel_iter; /* Check if selected */ if (gtk_tree_selection_get_selected(actions_selection, NULL, &sel_iter)) { /* Delete selected and select next */ GtkTreePath* tree_path = gtk_tree_model_get_path((GtkTreeModel*)actions_list, &sel_iter); gtk_list_store_remove(actions_list, &sel_iter); gtk_tree_selection_select_path(actions_selection, tree_path); /* Select previous if the last row was deleted */ if (!gtk_tree_selection_path_is_selected(actions_selection, tree_path)) { if (gtk_tree_path_prev(tree_path)) gtk_tree_selection_select_path(actions_selection, tree_path); } gtk_tree_path_free(tree_path); } } /* Called when Up button is clicked */ static void move_action_up(GtkButton *button, gpointer user_data) { GtkTreeIter sel_iter; /* Check if selected */ if (gtk_tree_selection_get_selected(actions_selection, NULL, &sel_iter)) { /* Create path to previous row */ GtkTreePath* tree_path = gtk_tree_model_get_path((GtkTreeModel*)actions_list, &sel_iter); /* Check if previous row exists */ if (gtk_tree_path_prev(tree_path)) { /* Swap rows */ GtkTreeIter prev_iter; gtk_tree_model_get_iter((GtkTreeModel*)actions_list, &prev_iter, tree_path); gtk_list_store_swap(actions_list, &sel_iter, &prev_iter); } gtk_tree_path_free(tree_path); } } /* Called when Down button is clicked */ static void move_action_down(GtkButton *button, gpointer user_data) { GtkTreeIter sel_iter; /* Check if selected */ if (gtk_tree_selection_get_selected(actions_selection, NULL, &sel_iter)) { /* Create iter to next row */ GtkTreeIter next_iter = sel_iter; /* Check if next row exists */ if (gtk_tree_model_iter_next((GtkTreeModel*)actions_list, &next_iter)) /* Swap rows */ gtk_list_store_swap(actions_list, &sel_iter, &next_iter); } } /* Called when delete key is pressed */ static void delete_key_pressed(GtkWidget *widget, GdkEventKey *event, gpointer user_data) { /* Check if DEL key was pressed (keyval: 65535) */ if (event->keyval == 65535) remove_action(NULL, NULL); } /* Called when a cell is edited */ static void edit_action(GtkCellRendererText *renderer, gchar *path, gchar *new_text, gpointer cell) { GtkTreeIter sel_iter; /* Check if selected */ if (gtk_tree_selection_get_selected(actions_selection, NULL, &sel_iter)) { /* Apply changes */ gtk_list_store_set(actions_list, &sel_iter, GPOINTER_TO_INT(cell), new_text, -1); } } /***************************************************************************/ /** . \n\b Arguments: \n\b Returns: ****************************************************************************/ int update_pref_widgets( void) { int i,rtn=0; for (i=0;NULL !=myprefs[i].desc; ++i){ if(NULL != myprefs[i].name){ switch (myprefs[i].type&PREF_TYPE_MASK){ case PREF_TYPE_TOGGLE: gtk_toggle_button_set_active((GtkToggleButton*)myprefs[i].w, myprefs[i].val); break; case PREF_TYPE_SPIN: gtk_spin_button_set_value((GtkSpinButton*)myprefs[i].w, (gdouble)myprefs[i].val); break; case PREF_TYPE_COMBO: gtk_combo_box_set_active((GtkComboBox*)myprefs[i].w, myprefs[i].val - 1); break; case PREF_TYPE_ENTRY: gtk_entry_set_text((GtkEntry*)myprefs[i].w, myprefs[i].cval); break; case PREF_TYPE_SPACER: break; default: if(dbg)g_printf("apply_pref:don't know how to handle type %d\n",myprefs[i].type); rtn=-1; continue; break; } if(dbg)g_printf("up:Set '%s' to %d (%s)\n",myprefs[i].name, myprefs[i].val, myprefs[i].cval); } } return rtn; } /***************************************************************************/ /** . \n\b Arguments: section is the section to add, parent is the box to put it in. \n\b Returns: -1 on error; ****************************************************************************/ int add_section(int sec, GtkWidget *parent) { int i,rtn=0; int single_st, single_is; gint connect; GtkWidget *hbox, *label, *child, *vbox, *alignment; GtkWidget* packit; vbox=parent; single_st=single_is=0; for (i=get_first_pref(sec);sec==myprefs[i].sec; ++i){ connect=1; single_st=(myprefs[i].type&(PREF_TYPE_NMASK|PREF_TYPE_SINGLE_LINE)); /**deterimine if we are in single line */ if(single_st && !single_is){ /**start of single line */ hbox = gtk_hbox_new(FALSE, 2); /**create hbox */ /*g_printf("alloc %p hbox\n",hbox); */ single_is=1; } switch (myprefs[i].type&PREF_TYPE_MASK){ case PREF_TYPE_FRAME:/**must be first in section, since it sets vbox. */ myprefs[i].w= gtk_frame_new(NULL); gtk_frame_set_shadow_type((GtkFrame*) myprefs[i].w, GTK_SHADOW_NONE); label = gtk_label_new(NULL); /**myprefs[i].desc */ gtk_label_set_markup((GtkLabel*)label, _(myprefs[i].desc)); gtk_frame_set_label_widget((GtkFrame*) myprefs[i].w, label); alignment = gtk_alignment_new(0.50, 0.50, 1.0, 1.0); gtk_alignment_set_padding((GtkAlignment*)alignment, 12, 0, 12, 0); gtk_container_add((GtkContainer*) myprefs[i].w, alignment); vbox = gtk_vbox_new(FALSE, 2); gtk_container_add((GtkContainer*)alignment, vbox); gtk_box_pack_start((GtkBox*)parent, myprefs[i].w,FALSE,FALSE,0); continue; break; case PREF_TYPE_TOGGLE: myprefs[i].w=gtk_check_button_new_with_mnemonic(_(myprefs[i].desc)); packit=myprefs[i].w; break; case PREF_TYPE_SPIN: if(!single_is) hbox = gtk_hbox_new(FALSE, 4); label = gtk_label_new(NULL); gtk_label_set_markup((GtkLabel*)label, _(myprefs[i].desc)); gtk_box_pack_start((GtkBox*)hbox, label, FALSE, FALSE, 0); myprefs[i].w=gtk_spin_button_new((GtkAdjustment*)gtk_adjustment_new ( \ myprefs[i].val,myprefs[i].adj->lower,myprefs[i].adj->upper,myprefs[i].adj->step,myprefs[i].adj->page,0 ),10,0); gtk_box_pack_start((GtkBox*)hbox, myprefs[i].w, FALSE, FALSE, 0); gtk_spin_button_set_update_policy((GtkSpinButton*)myprefs[i].w, GTK_UPDATE_IF_VALID); if(NULL != myprefs[i].tip) gtk_widget_set_tooltip_text(label, _(myprefs[i].tip)); packit=hbox; break; case PREF_TYPE_ENTRY: if(!single_is) hbox = gtk_hbox_new(TRUE, 4); label = gtk_label_new(NULL); gtk_label_set_markup((GtkLabel*)label, _(myprefs[i].desc)); gtk_misc_set_alignment((GtkMisc*)label, 0.0, 0.50); gtk_box_pack_start((GtkBox*)hbox, label, TRUE, TRUE, 0); myprefs[i].w = gtk_entry_new(); gtk_entry_set_width_chars((GtkEntry*)myprefs[i].w, 10); gtk_box_pack_end((GtkBox*)hbox,myprefs[i].w, TRUE, TRUE, 0); packit=hbox; break; case PREF_TYPE_COMBO: /**handled in show_preferences, only one so */ continue; break; case PREF_TYPE_SPACER: packit=myprefs[i].w=gtk_menu_item_new_with_label(""); child=gtk_bin_get_child((GtkBin *)packit); gtk_misc_set_padding((GtkMisc *)child,0,0); gtk_label_set_markup ((GtkLabel *)child, " "); break; default: if(dbg)g_printf("add_sec:don't know how to handle type %d\n",myprefs[i].type); rtn=-1; continue; break; } /**tooltips are set on the label of the spin box, not the widget and are handled above */ if(PREF_TYPE_SPIN != myprefs[i].type && NULL != myprefs[i].tip) gtk_widget_set_tooltip_text(myprefs[i].w, _(myprefs[i].tip)); if(NULL != myprefs[i].sig && connect) g_signal_connect((GObject*)myprefs[i].w, myprefs[i].sig, (GCallback)myprefs[i].sfunc, myprefs[i].w); if(dbg)g_printf("Packing %s\n",myprefs[i].name); if(single_is){ if(packit != hbox){ /*g_printf("Packed a slwidget %p<-%p\n",hbox, myprefs[i].w); */ gtk_box_pack_start((GtkBox*)hbox,myprefs[i].w , FALSE, FALSE, 0); } /**else already packed above. */ } else /**espand fill padding */ gtk_box_pack_start((GtkBox*)vbox, packit, TRUE, TRUE, 0); /**check for end of single line. */ single_st=(myprefs[i+1].type&(PREF_TYPE_NMASK|PREF_TYPE_SINGLE_LINE)); /**deterimine if we are in single line */ if(single_is && !single_st){/**end of single line */ /**exp fill padding */ gtk_box_pack_start((GtkBox*)vbox, hbox, TRUE, TRUE, 0); /**pack the hbox into parent */ /*g_printf("pack %p<-%p hbox\n",vbox,hbox); */ single_is=0; } } if(dbg)g_printf("Ending on %d '%s'\n",i,myprefs[i].name); return rtn; } /* Shows the preferences dialog on the given tab */ void show_preferences(gint tab) { /* Declare some variables */ GtkWidget *frame,*label,*alignment,*hbox, *vbox; struct pref_item *p; GtkTreeViewColumn *tree_column; init_pref(); /* Create the dialog */ GtkWidget* dialog = gtk_dialog_new_with_buttons(_("Preferences"), NULL, (GTK_DIALOG_MODAL + GTK_DIALOG_NO_SEPARATOR), GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, NULL); gtk_window_set_icon((GtkWindow*)dialog, gtk_widget_render_icon(dialog, GTK_STOCK_PREFERENCES, -1, NULL)); gtk_window_set_resizable((GtkWindow*)dialog, FALSE); /* Create notebook */ GtkWidget* notebook = gtk_notebook_new(); #if GTK_CHECK_VERSION (2,14,0) gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area (GTK_DIALOG(dialog))), notebook, TRUE, TRUE, 2); #else gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), notebook, TRUE, TRUE, 2); #endif /* Build the behavior page */ GtkWidget* page_behavior = gtk_alignment_new(0.50, 0.50, 1.0, 1.0); gtk_alignment_set_padding((GtkAlignment*)page_behavior, 12, 6, 12, 6); gtk_notebook_append_page((GtkNotebook*)notebook, page_behavior, gtk_label_new(_("Behavior"))); GtkWidget* vbox_behavior = gtk_vbox_new(FALSE, 12); gtk_container_add((GtkContainer*)page_behavior, vbox_behavior); /* Build the clipboards frame & copy section */ add_section(PREF_SEC_CLIP,vbox_behavior); /* Build the history frame */ add_section(PREF_SEC_HIST,vbox_behavior); /* Build the miscellaneous frame */ add_section(PREF_SEC_MISC,vbox_behavior); /* Build the display page */ GtkWidget* page_display = gtk_alignment_new(0.50, 0.50, 1.0, 1.0); gtk_alignment_set_padding((GtkAlignment*)page_display, 12, 6, 12, 6); gtk_notebook_append_page((GtkNotebook*)notebook, page_display, gtk_label_new(_("Display"))); GtkWidget* vbox_display = gtk_vbox_new(FALSE, 12); gtk_container_add((GtkContainer*)page_display, vbox_display); /* Build the items frame */ add_section(PREF_SEC_DISP,vbox_display); /* Build the omitting frame */ frame = gtk_frame_new(NULL); gtk_frame_set_shadow_type((GtkFrame*)frame, GTK_SHADOW_NONE); label = gtk_label_new(NULL); gtk_label_set_markup((GtkLabel*)label, _("Omitting")); gtk_frame_set_label_widget((GtkFrame*)frame, label); alignment = gtk_alignment_new(0.50, 0.50, 1.0, 1.0); gtk_alignment_set_padding((GtkAlignment*)alignment, 12, 0, 12, 0); gtk_container_add((GtkContainer*)frame, alignment); vbox = gtk_vbox_new(FALSE, 2); gtk_container_add((GtkContainer*)alignment, vbox); hbox = gtk_hbox_new(FALSE, 4); gtk_box_pack_start((GtkBox*)vbox, hbox, FALSE, FALSE, 0); p=get_pref("ellipsize"); label = gtk_label_new(_(p->desc)); gtk_misc_set_alignment((GtkMisc*)label, 0.0, 0.50); gtk_box_pack_start((GtkBox*)hbox, label, FALSE, FALSE, 0); p->w = gtk_combo_box_new_text(); gtk_combo_box_append_text((GtkComboBox*)p->w, _("Beginning")); gtk_combo_box_append_text((GtkComboBox*)p->w, _("Middle")); gtk_combo_box_append_text((GtkComboBox*)p->w, _("End")); gtk_box_pack_start((GtkBox*)hbox, p->w, FALSE, FALSE, 0); gtk_box_pack_start((GtkBox*)vbox_display, frame, FALSE, FALSE, 0); /* Build the misc Display frame */ add_section(PREF_SEC_XMISC,vbox_display); /* Build the actions page */ GtkWidget* page_actions = gtk_alignment_new(0.50, 0.50, 1.0, 1.0); gtk_alignment_set_padding((GtkAlignment*)page_actions, 6, 6, 6, 6); gtk_notebook_append_page((GtkNotebook*)notebook, page_actions, gtk_label_new(_("Actions"))); GtkWidget* vbox_actions = gtk_vbox_new(FALSE, 6); gtk_container_add((GtkContainer*)page_actions, vbox_actions); /* Build the actions label */ label = gtk_label_new(_("Control-click Parcellite's tray icon to use actions,")); gtk_widget_set_tooltip_text(label, _("Use %% if you want a literal %. See the man page for gnuC printf (man 2 printf) for more information.")); gtk_label_set_line_wrap((GtkLabel*)label, TRUE); gtk_misc_set_alignment((GtkMisc*)label, 0.0, 0.50); gtk_box_pack_start((GtkBox*)vbox_actions, label, FALSE, FALSE, 0); /* Build the actions treeview */ GtkWidget* scrolled_window = gtk_scrolled_window_new( (GtkAdjustment*)gtk_adjustment_new(0, 0, 0, 0, 0, 0), (GtkAdjustment*)gtk_adjustment_new(0, 0, 0, 0, 0, 0)); gtk_scrolled_window_set_policy((GtkScrolledWindow*)scrolled_window, GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type((GtkScrolledWindow*)scrolled_window, GTK_SHADOW_ETCHED_OUT); GtkWidget* treeview = gtk_tree_view_new(); gtk_tree_view_set_reorderable((GtkTreeView*)treeview, TRUE); gtk_tree_view_set_rules_hint((GtkTreeView*)treeview, TRUE); actions_list = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_STRING); gtk_tree_view_set_model((GtkTreeView*)treeview, (GtkTreeModel*)actions_list); GtkCellRenderer* name_renderer = gtk_cell_renderer_text_new(); g_object_set(name_renderer, "editable", TRUE, NULL); g_signal_connect((GObject*)name_renderer, "edited", (GCallback)edit_action, (gpointer)0); label=gtk_label_new(_("Action")); gtk_widget_set_tooltip_text(label,"This is the Action Name. \nDO NOT put commands here."); gtk_widget_show (label); tree_column = gtk_tree_view_column_new_with_attributes(_("Action"), name_renderer, "text", 0, NULL); gtk_tree_view_column_set_widget(tree_column,label); gtk_tree_view_column_set_resizable(tree_column, TRUE); gtk_tree_view_append_column((GtkTreeView*)treeview, tree_column); GtkCellRenderer* command_renderer = gtk_cell_renderer_text_new(); g_object_set(command_renderer, "editable", TRUE, NULL); g_object_set(command_renderer, "ellipsize-set", TRUE, "ellipsize", PANGO_ELLIPSIZE_END, NULL); g_signal_connect((GObject*)command_renderer, "edited", (GCallback)edit_action, (gpointer)1); label=gtk_label_new(_("Command")); gtk_widget_set_tooltip_text(label,"Put the full commands here. ex echo \"parcellite gave me %s\">>$HOME/ptest"); gtk_widget_show (label); tree_column = gtk_tree_view_column_new_with_attributes(_("Command"), command_renderer, "text", 1, NULL); gtk_tree_view_column_set_widget(tree_column,label); gtk_tree_view_column_set_expand(tree_column, TRUE); gtk_tree_view_append_column((GtkTreeView*)treeview, tree_column); gtk_container_add((GtkContainer*)scrolled_window, treeview); gtk_box_pack_start((GtkBox*)vbox_actions, scrolled_window, TRUE, TRUE, 0); /* Edit selection and connect treeview related signals */ actions_selection = gtk_tree_view_get_selection((GtkTreeView*)treeview); gtk_tree_selection_set_mode(actions_selection, GTK_SELECTION_BROWSE); g_signal_connect((GObject*)treeview, "key-press-event", (GCallback)delete_key_pressed, NULL); /* Build the buttons */ GtkWidget* hbbox = gtk_hbutton_box_new(); gtk_box_set_spacing((GtkBox*)hbbox, 6); gtk_button_box_set_layout((GtkButtonBox*)hbbox, GTK_BUTTONBOX_START); GtkWidget* add_button = gtk_button_new_with_label(_("Add...")); gtk_button_set_image((GtkButton*)add_button, gtk_image_new_from_stock(GTK_STOCK_ADD, GTK_ICON_SIZE_MENU)); g_signal_connect((GObject*)add_button, "clicked", (GCallback)add_action, NULL); gtk_box_pack_start((GtkBox*)hbbox, add_button, FALSE, TRUE, 0); GtkWidget* remove_button = gtk_button_new_with_label(_("Remove")); gtk_button_set_image((GtkButton*)remove_button, gtk_image_new_from_stock(GTK_STOCK_REMOVE, GTK_ICON_SIZE_MENU)); g_signal_connect((GObject*)remove_button, "clicked", (GCallback)remove_action, NULL); gtk_box_pack_start((GtkBox*)hbbox, remove_button, FALSE, TRUE, 0); GtkWidget* up_button = gtk_button_new(); gtk_button_set_image((GtkButton*)up_button, gtk_image_new_from_stock(GTK_STOCK_GO_UP, GTK_ICON_SIZE_MENU)); g_signal_connect((GObject*)up_button, "clicked", (GCallback)move_action_up, NULL); gtk_box_pack_start((GtkBox*)hbbox, up_button, FALSE, TRUE, 0); GtkWidget* down_button = gtk_button_new(); gtk_button_set_image((GtkButton*)down_button, gtk_image_new_from_stock(GTK_STOCK_GO_DOWN, GTK_ICON_SIZE_MENU)); g_signal_connect((GObject*)down_button, "clicked", (GCallback)move_action_down, NULL); gtk_box_pack_start((GtkBox*)hbbox, down_button, FALSE, TRUE, 0); gtk_box_pack_start((GtkBox*)vbox_actions, hbbox, FALSE, FALSE, 0); /* Build the hotkeys page */ GtkWidget* page_extras = gtk_alignment_new(0.50, 0.50, 1.0, 1.0); gtk_alignment_set_padding((GtkAlignment*)page_extras, 12, 6, 12, 6); gtk_notebook_append_page((GtkNotebook*)notebook, page_extras, gtk_label_new(_("Hotkeys"))); GtkWidget* vbox_extras = gtk_vbox_new(FALSE, 12); gtk_container_add((GtkContainer*)page_extras, vbox_extras); /* Build the hotkeys frame */ frame = gtk_frame_new(NULL); gtk_frame_set_shadow_type((GtkFrame*)frame, GTK_SHADOW_NONE); label = gtk_label_new(NULL); gtk_label_set_markup((GtkLabel*)label, _("Hotkeys")); gtk_frame_set_label_widget((GtkFrame*)frame, label); alignment = gtk_alignment_new(0.50, 0.50, 1.0, 1.0); gtk_alignment_set_padding((GtkAlignment*)alignment, 12, 0, 12, 0); gtk_container_add((GtkContainer*)frame, alignment); vbox = gtk_vbox_new(FALSE, 2); gtk_container_add((GtkContainer*)alignment, vbox); add_section(PREF_SEC_ACT,vbox); gtk_box_pack_start((GtkBox*)vbox_extras,frame,FALSE,FALSE,0); /* Make widgets reflect current preferences */ update_pref_widgets(); /* Read actions */ read_actions(); /* Run the dialog */ gtk_widget_show_all(dialog); gtk_notebook_set_current_page((GtkNotebook*)notebook, tab); if (gtk_dialog_run((GtkDialog*)dialog) == GTK_RESPONSE_ACCEPT) { /* Apply and save preferences */ apply_preferences(); save_preferences(); save_actions(); } gtk_widget_destroy(dialog); } parcellite-1.2.1/src/parcellite.h0000644000175000017500000000341613041603201015017 0ustar hlehle/* Copyright (C) 2011-2012 by rickyrockrat * * This file is part of Parcellite. * * Parcellite is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * Parcellite is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef _PARCELLITE_H_ #define _PARCELLITE_H_ 1 #include #include #include #include #include #ifdef HAVE_APPINDICATOR #include #endif #include #define PARCELLITE_PROG_NAME "parcellite" #define PARCELLITE_ICON PARCELLITE_PROG_NAME /*uncomment the next line to debug the clipboard updates This provides a debug_update preference. must have debug_update enabled in prefs when started. */ /*#define DEBUG_UPDATE */ /* Uncomment the next line to print a debug trace. */ /*#define DEBUG */ #ifdef DEBUG # define TRACE(x) x #else # define TRACE(x) do {} while (FALSE); #endif #ifdef DEBUG_UPDATE static int debug_update=0; /**disable/enable DTRACE */ # define DTRACE(x) if (debug_update) x #else # define DTRACE(x) do {} while (FALSE); #endif #include "daemon.h" #include "utils.h" #include "preferences.h" #include "history.h" #include "main.h" #include "keybinder.h" #include "parcellite-i18n.h" #include "attr_list.h" #endif parcellite-1.2.1/src/main.h0000644000175000017500000000503513041603201013616 0ustar hlehle/* Copyright (C) 2007-2008 by Xyhthyx * * This file is part of Parcellite. * * Parcellite is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * Parcellite is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef MAIN_H #define MAIN_H #include "preferences.h" G_BEGIN_DECLS extern GMutex *hist_lock; #define ACTIONS_TAB 2 #define POPUP_DELAY 100 #define CHECK_INTERVAL 500 #define CHECK_APPINDICATOR_INTERVAL 30000 /**check for existence of indicator-appmenu */ #define ID_PRIMARY 0 #define ID_CLIPBOARD 1 #define ID_CMD 2 #define HIST_DISPLAY_NORMAL 1 #define HIST_DISPLAY_PERSISTENT 2 #define KBUF_SIZE 200 struct widget_info{ GtkWidget *menu; /**top level history list window */ GtkWidget *item; /**item we are looking at */ GdkEventKey *event; /**event info where we filled this struct */ gint index; /**index into the array */ gint tmp1; /**gp vars */ gint tmp2; }; /**keeps track of each menu item and the element it's created from. */ struct s_item_info { GtkWidget *item; GList *element; }; struct history_info{ GtkWidget *menu; /**top level history menu */ GtkWidget *clip_item; /**currently selected history item (represents clipboard) */ gchar *element_text; /**texts of selected history clipboard item */ GtkWidget *title_item; GList *delete_list; /**struct s_item_info - for the delete list */ GList *persist_list; /**struct s_item_info - for the persistent list */ struct widget_info wi; /**temp for usage in popups */ gint histno; /**which history? HIST_DISPLAY_NORMAL/HIST_DISPLAY_PERSISTENT*/ gint change_flag; /**bit wise flags for history state */ }; int p_strcmp (const char *str1, const char *str2); void phistory_hotkey(char *keystring, gpointer user_data); void history_hotkey(char *keystring, gpointer user_data); void actions_hotkey(char *keystring, gpointer user_data); void menu_hotkey(char *keystring, gpointer user_data); void postition_history(GtkMenu *menu,gint *x,gint *y,gboolean *push_in, gpointer user_data); G_END_DECLS #endif parcellite-1.2.1/src/attr_list.c0000644000175000017500000002374013041603201014675 0ustar hlehle/* Copyright (C) 2011-2013 by rickyrockrat * * This file is part of Parcellite. * * Parcellite is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * Parcellite is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ /** \file ****************************************************************** \n\b File: attr_list.c \n\b Author: Doug Springer \n\b Company: DNK Designs Inc. \n\b Date: 01/09/2013 9:22 pm \n\b Description: General attribute changing and list manipulation routines. */ /************************************************************************ */ #include "parcellite.h" /***************************************************************************/ /** Get the underline on the given lable, or allocate new one. \n\b Arguments: \n\b Returns: ****************************************************************************/ PangoAttrInt *get_underline_attr(GtkLabel *label) { PangoAttrList *attrs=gtk_label_get_attributes (label); PangoAttribute *attr; if (NULL == attrs){/**no existing list. Add one */ /*attrs = pango_attr_list_new (); attr=NULL;*/ return(NULL); }else{ /**grab attribte, if there is one. */ PangoAttrIterator* iter; iter=pango_attr_list_get_iterator(attrs); attr=pango_attr_iterator_get (iter,PANGO_ATTR_UNDERLINE); pango_attr_iterator_destroy(iter); } return (PangoAttrInt *)attr; } /***************************************************************************/ /** Returns 0 if not strikethrough, 1 if it is. \n\b Arguments: \n\b Returns: ****************************************************************************/ gboolean is_underline(GtkLabel *label) { PangoAttrInt *strike=get_underline_attr(label); if(NULL == strike || strike->value == FALSE) return FALSE; return TRUE; } /***************************************************************************/ /** Set the strike through on/off. Create a new strike through and/or attr list. \n\b Arguments: \n\b Returns: ****************************************************************************/ void set_underline(GtkLabel *label, gboolean mode) { PangoAttrInt *strike; PangoAttrList *attrs; strike=get_underline_attr(label); if(NULL ==(attrs=gtk_label_get_attributes (label)) ) attrs = pango_attr_list_new (); /** printf("strike=%p attrs=%p\n",strike,attrs); fflush(NULL);*/ if(NULL ==strike || strike->value != mode){ PangoAttribute *attr=pango_attr_underline_new(mode); pango_attr_list_change (attrs, attr); gtk_label_set_attributes (label, attrs); } } /***************************************************************************/ /** Get the strikethrough on the given lable, or allocate new one. \n\b Arguments: \n\b Returns: ****************************************************************************/ PangoAttrInt *get_strikethrough_attr(GtkLabel *label) { PangoAttrList *attrs=gtk_label_get_attributes (label); PangoAttribute *attr; if (NULL == attrs){/**no existing list. Add one */ /*attrs = pango_attr_list_new (); attr=NULL;*/ return(NULL); }else{ /**grab attribte, if there is one. */ PangoAttrIterator* iter; iter=pango_attr_list_get_iterator(attrs); attr=pango_attr_iterator_get (iter,PANGO_ATTR_STRIKETHROUGH); pango_attr_iterator_destroy(iter); } if(0 && NULL == attr){ /**No existing strikethrough. Add the attribute. */ attr=pango_attr_strikethrough_new(FALSE); pango_attr_list_change (attrs, attr); gtk_label_set_attributes (label, attrs); } return (PangoAttrInt *)attr; } /***************************************************************************/ /** Returns 0 if not strikethrough, 1 if it is. \n\b Arguments: \n\b Returns: ****************************************************************************/ gboolean is_strikethrough(GtkLabel *label) { PangoAttrInt *strike=get_strikethrough_attr(label); if(NULL == strike || strike->value == FALSE) return FALSE; return TRUE; } /***************************************************************************/ /** Set the strike through on/off. Create a new strike through and/or attr list. \n\b Arguments: \n\b Returns: ****************************************************************************/ void set_strikethrough(GtkLabel *label, gboolean mode) { PangoAttrInt *strike; PangoAttrList *attrs; strike=get_strikethrough_attr(label); if(NULL ==(attrs=gtk_label_get_attributes (label)) ) attrs = pango_attr_list_new (); /** printf("strike=%p attrs=%p\n",strike,attrs); fflush(NULL);*/ if(NULL ==strike || strike->value != mode){ PangoAttribute *attr=pango_attr_strikethrough_new(mode); pango_attr_list_change (attrs, attr); gtk_label_set_attributes (label, attrs); } } /***************************************************************************/ /** Find the item in the delete list. \n\b Arguments: \n\b Returns: ****************************************************************************/ GList *find_h_item(GList *list,GtkWidget *w, GList *e) { GList *i; for ( i=list; NULL != i; i=i->next){ struct s_item_info *it=(struct s_item_info *)i->data; if( (NULL == w || it->item ==w) && it->element==e){/**found it */ /*printf("Found %p\n",i); fflush(NULL); */ return i; } } return NULL; } /***************************************************************************/ /** Add an item to the history delete list. \n\b Arguments: \n\b Returns: ****************************************************************************/ void add_h_item(struct history_info *h, GtkWidget *w, GList* element, gint which) { GList *ele; GList *op=NULL; switch(which){ case OPERATE_DELETE: op=h->delete_list; break; case OPERATE_PERSIST: op=h->persist_list; break; default: g_fprintf(stderr,"Invalid list '%d'\n",which); return; } struct s_item_info *i; if(NULL == (ele=find_h_item(op,w,element) ) ){ if(NULL != (i=g_malloc(sizeof(struct s_item_info)) ) ){ i->item=w; i->element=element; switch(which){ case OPERATE_DELETE: h->delete_list=g_list_prepend(op,(gpointer)i); break; case OPERATE_PERSIST: h->persist_list=g_list_prepend(op,(gpointer)i); break; } /*g_printf("Added w %p e %p %p\n",w,element,h->delete_list); fflush(NULL); */ }/*else g_fprintf(stderr,"%s: NULL allocating element for delete list!\n",__func__); */ }/*else g_printf("found element??\n"); */ } /***************************************************************************/ /** Delete an item from the history delete list. h->delete_list is a GList. The data points to a struct s_item_info, which contains a widget and an element - these latter two are part of the history menu, so we just need to de-allocate the delete_list structure, and delete it from the list. \n\b Arguments: \n\b Returns: ****************************************************************************/ void rm_h_item(struct history_info *h, GtkWidget *w, GList* element, gint which) { GList *i; GList *op; switch(which){ case OPERATE_DELETE: op=h->delete_list; break; case OPERATE_PERSIST: op=h->persist_list; break; } if(NULL != (i=find_h_item(op,w,element) ) ){ /*printf("Freeing %p\n",i->data); */ g_free(i->data); i->data=NULL; /*fflush(NULL); */ switch(which){ case OPERATE_DELETE: h->delete_list=g_list_delete_link(op,i); break; case OPERATE_PERSIST: h->persist_list=g_list_delete_link(op,i); break; } /** printf("Removed %p\n",i); fflush(NULL);*/ } } /***************************************************************************/ /** . \n\b Arguments: \n\b Returns: ****************************************************************************/ void remove_deleted_items(struct history_info *h) { if(NULL != h && NULL != h->delete_list){/**have a list of items to delete. */ GList *i; g_mutex_lock(hist_lock); /*g_print("Deleting items\n"); */ for (i=h->delete_list; NULL != i; i=i->next){ struct s_item_info *it=(struct s_item_info *)i->data; /*printf("Free %p.. '%s' ",it->element->data,(char *)(it->((struct history_item *(element->data))->text))); */ g_free(it->element->data); it->element->data=NULL; history_list = g_list_delete_link(history_list, it->element); /** printf("Free %p\n",it); fflush(NULL);*/ g_free(it); } h->delete_list=NULL; g_mutex_unlock(hist_lock); if (get_pref_int32("save_history")) save_history(); } } /***************************************************************************/ /** Handle marking for history window. Also manages adding/removing from the delete list, which gets called when the history window closes. \n\b Arguments: \n\b Returns: ****************************************************************************/ void handle_marking(struct history_info *h, GtkWidget *w, gint index, gint which) { GtkLabel *l=(GtkLabel *)(gtk_bin_get_child((GtkBin*)w)) ; GList* element = g_list_nth(history_list, index); if(OPERATE_DELETE == which){ if(is_strikethrough(l)){ /**un-highlight */ set_strikethrough(l,FALSE); rm_h_item(h,w,element,OPERATE_DELETE); } else { /*g_printf("marking %p ",element); */ set_strikethrough(l,TRUE); add_h_item(h,w,element,OPERATE_DELETE); } }else if(OPERATE_PERSIST == which){ struct history_item *c=(struct history_item *)(element->data); if(NULL !=c){ if(c->flags & CLIP_TYPE_PERSISTENT) c->flags&=~(CLIP_TYPE_PERSISTENT); else c->flags|=CLIP_TYPE_PERSISTENT; h->change_flag|=CLIP_TYPE_PERSISTENT; } if(is_underline(l)){ /**un-highlight */ set_underline(l,FALSE); rm_h_item(h,w,element,OPERATE_PERSIST); } else { set_underline(l,TRUE); add_h_item(h,w,element,OPERATE_PERSIST); } } } parcellite-1.2.1/src/utils.c0000644000175000017500000006143613041603201014034 0ustar hlehle/* Copyright (C) 2007-2008 by Xyhthyx * * This file is part of Parcellite. * * Parcellite is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * Parcellite is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "parcellite.h" /**for our fifo interface */ #include #include #include #include #include #include #include /**set this to debug looking up user environment vars to see other instances of parcellite */ /**#define DEBUG_MULTI */ #ifdef DEBUG_MULTI # define DMTRACE(x) x #else # define DMTRACE(x) do {} while (FALSE); #endif /** Wrapper to replace g_strdup to limit size of text copied from clipboard. g_strndup will dup to the size of the limit, which will waste resources, so try to allocate using other methods. */ gchar *p_strdup( const gchar *str ) { gchar *n=NULL; size_t l,x; if(NULL == str) return NULL; x=get_pref_int32("item_size")*1000; l=get_pref_int32("data_size")*1000; if(l>0 && lx){ l=x; } /* g_printf("Tl=%d ",l); */ if(NULL !=(n=g_malloc(l+8))){ n[l+7]=0; g_strlcpy(n,str,l+1); } /* g_printf("str '%s'\n",n); */ return n; } /* Creates program related directories if needed */ void check_dirs( void ) { gchar* data_dir = g_build_path(G_DIR_SEPARATOR_S, g_get_user_data_dir(), DATA_DIR, NULL); gchar* config_dir = g_build_path(G_DIR_SEPARATOR_S, g_get_user_config_dir(), CONFIG_DIR, NULL); gchar *rc_file; /* Check if data directory exists */ if (!g_file_test(data_dir, G_FILE_TEST_EXISTS)) { /* Try to make data directory */ if (g_mkdir_with_parents(data_dir, 0755) != 0) g_warning(_("Couldn't create directory: %s\n"), data_dir); } /* Check if config directory exists */ if (!g_file_test(config_dir, G_FILE_TEST_EXISTS)) { /* Try to make config directory */ if (g_mkdir_with_parents(config_dir, 0755) != 0) g_warning(_("Couldn't create directory: %s\n"), config_dir); } /**now see if we need to setup any config files */ rc_file = g_build_filename(g_get_user_config_dir(), PREFERENCES_FILE, NULL); if(0 != access(rc_file, R_OK)){/**doesn't exist */ const gchar * const *sysconfig=g_get_system_config_dirs(); /**NULL-terminated list of strings */ const gchar * const *d; gchar *sysrc; for (d=sysconfig; NULL!= *d; ++d){ sysrc=g_build_filename(*d, PREFERENCES_FILE, NULL); g_fprintf(stderr,"Looking in '%s'\n",sysrc); if(0 == access(sysrc, F_OK)){/**exists */ GError *e=NULL; GFile *src=g_file_new_for_path(sysrc); GFile *dst=g_file_new_for_path(rc_file); g_fprintf(stderr,"Using parcelliterc from '%s', place in '%s'\n",sysrc,rc_file); if(FALSE ==g_file_copy(src,dst,G_FILE_COPY_NONE,NULL,NULL,NULL,&e)){ g_fprintf(stderr,"Failed to copy. %s\n",e->message); } g_free(sysrc); goto done; } g_free(sysrc); } } done: /* Cleanup */ g_free(rc_file); g_free(data_dir); g_free(config_dir); } /* Returns TRUE if text is a hyperlink */ gboolean is_hyperlink(gchar* text) { /* TODO: I need a better regex, this one is poor */ GRegex* regex = g_regex_new("([A-Za-z][A-Za-z0-9+.-]{1,120}:[A-Za-z0-9/]" \ "(([A-Za-z0-9$_.+!*,;/?:@&~=-])|%[A-Fa-f0-9]{2}){1,333}" \ "(#([a-zA-Z0-9][a-zA-Z0-9$_.+!*,;/?:@&~=%-]{0,1000}))?)", G_REGEX_CASELESS, 0, NULL); gboolean result = g_regex_match(regex, text, 0, NULL); g_regex_unref(regex); return result; } /* Parses the program arguments. Returns TRUE if program needs * to exit after parsing is complete */ struct cmdline_opts *parse_options(int argc, char* argv[]) { struct cmdline_opts *opts=g_malloc0(sizeof(struct cmdline_opts)); if(NULL == opts){ g_fprintf(stderr,"Unable to malloc cmdline_opts\n"); return NULL; } if (argc <= 1) return opts; GOptionEntry main_entries[] = { { "no-icon", 'n', 0, G_OPTION_ARG_NONE, &opts->icon, _("Do not use status icon (Ctrl-Alt-P for menu)"), NULL }, { "clipboard", 'c', 0, G_OPTION_ARG_NONE, &opts->clipboard, _("Print clipboard contents"), NULL }, { "primary", 'p', 0, G_OPTION_ARG_NONE, &opts->primary, _("Print primary contents"), NULL }, { "version", 'v',0, G_OPTION_ARG_NONE,&opts->version,_("Display Version info"),NULL }, { NULL } }; /* Option parsing */ GOptionContext* context = g_option_context_new(NULL); /* Set summary */ g_option_context_set_summary(context, _("Clipboard CLI usage examples:\n\n echo \"copied to clipboard\" | parcellite\n parcellite \"copied to clipboard\"\n echo \"copied to clipboard\" | parcellite -c")); /* Set description */ g_option_context_set_description(context, _("Written by Gilberto \"Xyhthyx\" Miralla and Doug Springer.\nReport bugs to .")); /* Add entries and parse options */ g_option_context_add_main_entries(context, main_entries, NULL); g_option_context_parse(context, &argc, &argv, NULL); g_option_context_free(context); opts->leftovers = g_strjoinv(" ", argv + 1); /* Check which options were parseed */ /* Do not display icon option */ if (opts->icon) { set_pref_int32("no_icon",TRUE); } else set_pref_int32("no_icon",FALSE); if(opts->version){ gchar *v; #ifdef HAVE_CONFIG_H /**VER=555; sed "s#\(.*\)svn.*\".*#\1svn$VER\"#" config.h */ v=VERSION; #else v="Unknown"; #endif g_fprintf(stderr,"Parcellite %s, GTK %d.%d.%d\n",v, gtk_major_version, gtk_minor_version,gtk_micro_version ); opts->exit=1; } return opts; } /***************************************************************************/ /** Given a PID, look at owner of proc to determine UID. \n\b Arguments: \n\b Returns: -1 on error or UID if found ****************************************************************************/ int pid_to_uid (pid_t pid ) { struct stat st; char path[255]; snprintf(path, 254, "/proc/%ld", (long)pid); if(0 != stat(path,&st) ){ g_fprintf(stderr,"Can't stat '%s'\n",path); perror(""); return -1; } /*g_fprintf(stderr,"%ld pid is %ld uid\n",pid,st.st_uid); */ return (int)st.st_uid; } /***************************************************************************/ /** Get the current user name by examining the XDG directory. \n\b Arguments: \n\b Returns: username, if found. Use g_free. ****************************************************************************/ gchar * get_username_xdg( void ) { gchar* username; username = (gchar *)g_getenv ("HOME"); if (!username) username = (gchar *)g_get_home_dir (); /*g_printf("get_username: '%s'\n",username); */ if(NULL != username ){ gchar *t; t=g_strdup (username); username=g_strdup(basename(t)); g_free(t); return username; } return NULL; } /***************************************************************************/ /** Get uid from pid_to_uid, then get the username from userid pid_to_uid.struct passwd *getpwuid(uid_t uid); -> char *pw_name; \n\b Arguments: pid of process to lookup \n\b Returns: ****************************************************************************/ gchar *get_username_pid( pid_t pid ) { int uid; struct passwd *p; if(-1 ==(uid=pid_to_uid(pid)) ) return NULL; if(NULL == (p=getpwuid((uid_t) uid)) ){ perror("Unable to get username from passwd\n"); return NULL; } /*g_printf("%ld uid='%s'\n",pid,p->pw_name); */ return g_strdup(p->pw_name); } /***************************************************************************/ /** Gets a value give the key name from the pid envronment with null-terminated strings. \n\b Arguments: \n\b Returns: -1 on error 0 if not found 1 if found value is filled with value or NULL. value or NULL. Free value with g_free. ****************************************************************************/ int get_value_from_env(pid_t pid, gchar *key, char **value) { GFile *fp; char *env=NULL, *envf; gsize elen, i; int rtn=-1; if(NULL == value){ g_fprintf(stderr,"get_value_from_env: value null!\n"); return rtn; } *value=NULL; if(NULL == (envf=(g_malloc(strlen("/proc/9999999/environ"))))) { g_fprintf(stderr,"Unable to allocate for environ file name.\n"); return rtn; } g_sprintf(envf,"/proc/%ld/environ",(long int)pid); if(0 != access(envf, R_OK)){/**doesn't exist, or not our process */ g_fprintf(stderr,"Unable to open '%s' for PID %ld\n",envf,(long int)pid); goto error; } fp=g_file_new_for_path(envf); /**this dumps a zero at end of file. */ if(FALSE == g_file_load_contents(fp,NULL,&env,&elen,NULL,NULL) ){ g_fprintf(stderr,"Error finding '%s' for PID %ld\n",envf,(long int)pid); goto error; } if(NULL == env){ g_fprintf(stderr,"NULL evironment\n"); goto error; } /*g_printf("Loaded file '%s', looking for KEY '%s'\n",envf,key); */ ++elen; /**allow for zero @ end of file. */ for (i=0; i0){ if( 1 == x){ DMTRACE(g_fprintf(stderr," Found \n")); return 1; } else { DMTRACE(g_fprintf(stderr," Not Found \n")); return 0; } } } /**default to not in current session */ return 0; } /***************************************************************************/ /** Return a PID given a name. Used to check a if a process is running.. if 2 or greater, process is running TODO: Figure out if we are in the same X instance....Possibly this? Get our DISPLAY var Display *XOpenDisplay(NULL); --default to DISPLAY env var.... char *XDisplayString(Display *display); Then grab the Display var from ENV, or just use ENV?? Ugh. \n\b Arguments: name is name of program to find mode sets the mode of the find (exact or partial) pid is a place to put the last found pid \n\b Returns: number of instances of name found Note: /proc/pid/environ contains interesting variables: HOME USERNAME LOGNAME with this format: 0x00KEY=VAL0x00 ****************************************************************************/ int proc_find(const char* name, int mode, pid_t *pid) { DIR* dir; FILE* fp; struct dirent* ent; char* endptr; char buf[PATH_MAX]; int instances=0; if (!(dir = opendir("/proc"))) { perror("can't open /proc"); return -1; } while((ent = readdir(dir)) != NULL) { /* if endptr is not a null character, the directory is not * entirely numeric, so ignore it */ long lpid = strtol(ent->d_name, &endptr, 10); if (*endptr != '\0') { continue; } /* try to open the cmdline file */ snprintf(buf, sizeof(buf), "/proc/%ld/cmdline", lpid); if ((fp= fopen(buf, "r"))) { if (fgets(buf, sizeof(buf), fp) != NULL) { if(PROC_MODE_EXACT & mode){ gchar *b=g_path_get_basename(buf); if (!g_strcmp0(b, name)) { if(is_current_user(lpid,mode) && 1 == is_current_xsession(lpid) ) ++instances; if(NULL !=pid) *pid=lpid; } }else if( PROC_MODE_STRSTR & mode){ if(NULL !=g_strrstr(buf,name)){ if(is_current_user(lpid,mode) && 1 == is_current_xsession(lpid)) ++instances; if(NULL !=pid) *pid=lpid; /*g_printf("Looking for '%s', found '%s'\n",name,buf); */ } } } fclose(fp); } } closedir(dir); return instances; } /***************************************************************************/ /** . \n\b Arguments: \n\b Returns: ****************************************************************************/ gboolean fifo_read_cb (GIOChannel *src, GIOCondition cond, gpointer data) { struct p_fifo *f=(struct p_fifo *)data; int which; if(src == f->g_ch_p) which=FIFO_MODE_PRI; else if(src == f->g_ch_c) which=FIFO_MODE_CLI; else if( src == f->g_ch_cmd) which=FIFO_MODE_CMD; else{ g_fprintf(stderr,"Unable to determine fifo!!\n"); return 0; } if(cond & G_IO_HUP){ if(f->dbg) g_fprintf(stderr,"gothup "); return FALSE; } if(cond & G_IO_NVAL){ if(f->dbg) g_fprintf(stderr,"readnd "); return FALSE; } if(cond & G_IO_IN){ if(f->dbg) g_fprintf(stderr,"norm "); } if(f->dbg) g_fprintf(stderr,"0x%X Waiting on chars\n",cond); f->rlen=0; /** ( while (1) {*/ int s; s=read_fifo(f,which); /** usleep(100); if(-1 == s){ g_printf("Error reading fifo\n"); return 0; } else if(0 == s) break; } if(f->rlen>0){ g_printf("Setting fifo which\n"); f->which=FIFO_MODE_PRI==which?ID_PRIMARY:ID_CLIPBOARD; } */ return TRUE; } /***************************************************************************/ /** . \n\b Arguments: \n\b Returns: ****************************************************************************/ gint _create_fifo(gchar *f) { int i=0; if(0 == access(f,F_OK) ) unlink(f); if(-1 ==mkfifo(f,0660)){ perror("mkfifo "); i= -1; } g_free(f); return i; } /***************************************************************************/ /** . \n\b Arguments: \n\b Returns: ****************************************************************************/ int create_fifo(void) { gchar *f; int i=0; check_dirs(); f=g_build_filename(g_get_user_data_dir(), FIFO_FILE_C, NULL); if(-1 == _create_fifo(f) ) --i; f=g_build_filename(g_get_user_data_dir(), FIFO_FILE_P, NULL); if(-1 == _create_fifo(f) ) --i; f=g_build_filename(g_get_user_data_dir(), FIFO_FILE_CMD, NULL); if(-1 == _create_fifo(f) ) --i; return i; } /***************************************************************************/ /** . \n\b Arguments: \n\b Returns: ****************************************************************************/ int _open_fifo(char *path, int flg) { int fd; mode_t mode=0660; fd=open(path,flg,mode); if(fd<3){ fprintf(stderr,"Unable to open fifo '%s' ",path); perror(""); } g_free(path); return fd; } /***************************************************************************/ /** . \n\b Arguments: \n\b Returns: ****************************************************************************/ int open_fifos(struct p_fifo *fifo) { int flg; gchar *f; if(PROG_MODE_CLIENT & fifo->whoami) flg=O_WRONLY|O_NONBLOCK; else {/**daemon if you set O_RDONLY, you get 100%cpu usage from HUP*/ flg=O_RDWR|O_NONBLOCK;/*|O_EXCL; */ } f=g_build_filename(g_get_user_data_dir(), FIFO_FILE_P, NULL); if( (fifo->fifo_p=_open_fifo(f,flg))>2 && (PROG_MODE_DAEMON & fifo->whoami)){ if(fifo->dbg) g_fprintf(stderr,"PRI fifo %d\n",fifo->fifo_p); fifo->g_ch_p=g_io_channel_unix_new (fifo->fifo_p); g_io_add_watch (fifo->g_ch_p,G_IO_IN|G_IO_HUP,fifo_read_cb,(gpointer)fifo); } f=g_build_filename(g_get_user_data_dir(), FIFO_FILE_C, NULL); if( (fifo->fifo_c=_open_fifo(f,flg)) >2 && (PROG_MODE_DAEMON & fifo->whoami)){ fifo->g_ch_c=g_io_channel_unix_new (fifo->fifo_c); g_io_add_watch (fifo->g_ch_c,G_IO_IN|G_IO_HUP,fifo_read_cb,(gpointer)fifo); } f=g_build_filename(g_get_user_data_dir(), FIFO_FILE_CMD, NULL); if( (fifo->fifo_cmd=_open_fifo(f,flg))>2 && (PROG_MODE_DAEMON & fifo->whoami)){ if(fifo->dbg) g_fprintf(stderr,"CMD fifo %d\n",fifo->fifo_cmd); fifo->g_ch_cmd=g_io_channel_unix_new (fifo->fifo_cmd); g_io_add_watch (fifo->g_ch_cmd,G_IO_IN|G_IO_HUP,fifo_read_cb,(gpointer)fifo); } if(fifo->dbg) g_fprintf(stderr,"CLI fifo %d PRI fifo %d\n",fifo->fifo_c,fifo->fifo_p); if(fifo->fifo_c <3 || fifo->fifo_p <3) return -1; return 0; } /***************************************************************************/ /** . \n\b Arguments: \n\b Returns: ****************************************************************************/ int read_fifo(struct p_fifo *f, int which) { int i,t, fd, len, *rlen; char *buf; i=t=0; switch(which){ case FIFO_MODE_PRI: fd=f->fifo_p; f->which=ID_PRIMARY; buf=f->buf; len=f->len; rlen=&f->rlen; break; case FIFO_MODE_CLI: fd=f->fifo_c; f->which=ID_CLIPBOARD; buf=f->buf; len=f->len; rlen=&f->rlen; break; case FIFO_MODE_CMD: fd=f->fifo_cmd; f->which=ID_CMD; buf=f->cbuf; len=f->tclen; rlen=&f->clen; break; default: g_fprintf(stderr,"Unknown fifo %d!\n",which); return -1; } if(NULL ==f || fd <3 ||NULL == buf|| len <=0) return -1; while(1){ i=read(fd,buf,len-t); if(i>0) t+=i; else break; } if( -1 == i){ if( EAGAIN != errno){ perror("read_fifo"); return -1; } } buf[t]=0; *rlen=t; if(t>0) if(f->dbg) g_fprintf(stderr,"%s: Got %d '%s'\n",f->fifo_p==fd?"PRI":"CLI",t,buf); return t; } /***************************************************************************/ /** . \n\b Arguments: \n\b Returns: ****************************************************************************/ int write_fifo(struct p_fifo *f, int which, char *buf, int len) { int x,i, l,fd; x=i=l=0; switch(which){ case FIFO_MODE_PRI: if(f->dbg) g_fprintf(stderr,"Using pri fifo for write\n"); fd=f->fifo_p; break; case FIFO_MODE_CLI: if(f->dbg) g_fprintf(stderr,"Using cli fifo for write\n"); fd=f->fifo_c; break; default: g_fprintf(stderr,"Unknown fifo %d!\n",which); return -1; } if(NULL ==f || fd <3 || NULL ==buf) return -1; if(f->dbg) g_fprintf(stderr,"writing '%s'\n",buf); while(len-i>0){ x=write(fd,&buf[i],len-i); if(x>0) i+=x; ++l; if(l>0x7FFE){ g_fprintf(stderr,"Maxloop hit\n"); break; } } if( -1 == x){ if( EAGAIN != errno){ perror("write_fifo"); return -1; } } return 0; } /***************************************************************************/ /** Figure out who we are, then open the fifo accordingly. return the fifo file descriptor, or -1 on error GIOChannel* g_io_channel_unix_new (int fd); guint g_io_add_watch (GIOChannel *channel, G_IO_IN GIOFunc func, gpointer user_data); g_io_channel_shutdown(channel,TRUE,NULL); \n\b Arguments: \n\b Returns: allocated struct or NULL on fail ****************************************************************************/ struct p_fifo *init_fifo(int mode) { struct p_fifo *f=g_malloc0(sizeof(struct p_fifo)); if(NULL == f){ g_fprintf(stderr,"Unable to allocate for fifo!!\n"); return NULL; } if(NULL == (f->buf=(gchar *)g_malloc0(8000)) ){ g_fprintf(stderr,"Unable to alloc 8k buffer for fifo! Command Line Input will be ignored.\n"); g_free(f); return NULL; } f->len=7999; if(NULL == (f->cbuf=(gchar *)g_malloc0(8000)) ){ g_fprintf(stderr,"Unable to alloc 8k buffer for fifo! Command Line Input will be ignored.\n"); g_free(f); return NULL; } f->tclen=7999; /**set debug here for debug messages */ f->dbg=0; /* f->dbg=1; */ /* g_printf("My PID is %d\n",getpid()); */ /**we are daemon, and will launch */ if(mode&PROG_MODE_DAEMON){ f->whoami=PROG_MODE_DAEMON; if(f->dbg) g_fprintf(stderr,"running parcellite not found\n"); if(create_fifo() < 0 ){ g_fprintf(stderr,"error creating fifo\n"); goto err; } if(open_fifos(f) < 0 ){ g_fprintf(stderr,"Error opening fifo. Exit\n"); goto err; } return f; /**We are the client */ } else{ f->whoami=PROG_MODE_CLIENT; if(f->dbg) g_fprintf(stderr,"parcellite found\n"); if(open_fifos(f) < 0 ){ g_fprintf(stderr,"Error opening fifo. Exit\n"); goto err; } return f; } err: close_fifos(f); return NULL; } /***************************************************************************/ /** . \n\b Arguments: \n\b Returns: ****************************************************************************/ void close_fifos(struct p_fifo *f) { if(NULL ==f) return; if(NULL != f->g_ch_p) g_io_channel_shutdown(f->g_ch_p,TRUE,NULL); if(f->fifo_p>0) close(f->fifo_p); if(NULL != f->g_ch_c) g_io_channel_shutdown(f->g_ch_c,TRUE,NULL); if(f->fifo_c>0) close(f->fifo_c); g_free(f); } /***************************************************************************/ /** . \n\b Arguments: \n\b Returns: ****************************************************************************/ void show_gtk_dialog(gchar *message, gchar *title) { GtkWidget *dialog; if(NULL == message || NULL == title) return; dialog= gtk_message_dialog_new(NULL,GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_WARNING, GTK_BUTTONS_OK, message,NULL); gtk_window_set_title(GTK_WINDOW(dialog), title ); gtk_widget_show_all(dialog); gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); } parcellite-1.2.1/Makefile.am0000644000175000017500000000043113041603201013761 0ustar hlehleAUTOMAKE_OPTIONS = gnu SUBDIRS = doc po data src DISTCLEANFILES = *.bak *.log *~ EXTRA_DIST = \ m4 \ autogen.sh \ config.rpath \ m4/ChangeLog \ $(desktop_DATA) \ $(autostart_DATA) \ intltool-merge.in \ intltool-update.in \ intltool-extract.in ACLOCAL_AMFLAGS = -I m4 parcellite-1.2.1/uninstall-pre-0.5.py0000644000175000017500000000417613041603201015406 0ustar hlehle#!/usr/bin/env python # Copyright (C) 2007-2008 by Xyhthyx # This file is part of Parcellite. # Parcellite is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # Parcellite is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # Run this script as root to uninstall Parcellite v0.4 or less import os import sys # Remove current working directory so python # doesn't import local parcellite.py file sys.path.remove(os.getcwd()) try: import parcellite except ImportError: print 'Parcellite is not installed.' sys.exit(1) if not os.path.exists('/usr/bin/parcellite'): print 'Parcellite is not installed.' sys.exit(1) elif not os.environ['LOGNAME'] == 'root': print 'Please run this script as root.' sys.exit(1) files = ['/etc/xdg/autostart/parcellite-startup.desktop', '/usr/share/applications/parcellite.desktop', '/usr/share/parcellite/gui/preferences.glade', '/usr/share/parcellite/gui/clipboard.glade', '/usr/bin/parcellite'] dirs = ['/usr/share/parcellite/gui', '/usr/share/parcellite'] # Remove files for each in files: if os.path.exists(each): try: os.remove(each) print 'Removing-> ' + each except: pass # Remove directories for each in dirs: if os.path.exists(each): try: os.rmdir(each) print 'Removing-> ' + each except: pass # Remove module try: os.remove(os.path.join(os.path.dirname(parcellite.__file__), 'parcellite.py')) print 'Removing-> ' + os.path.join(os.path.dirname(parcellite.__file__), 'parcellite.py') os.remove(os.path.join(os.path.dirname(parcellite.__file__), 'parcellite.pyc')) print 'Removing-> ' + os.path.join(os.path.dirname(parcellite.__file__), 'parcellite.pyc') except: pass parcellite-1.2.1/COPYING0000644000175000017500000010451413041603201012767 0ustar hlehle GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . parcellite-1.2.1/missing0000755000175000017500000002540613041603201013335 0ustar hlehle#! /bin/sh # Common stub for a few missing GNU programs while installing. scriptversion=2005-06-08.21 # Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005 # Free Software Foundation, Inc. # Originally by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try \`$0 --help' for more information" exit 1 fi run=: # In the cases where this matters, `missing' is being run in the # srcdir already. if test -f configure.ac; then configure_ac=configure.ac else configure_ac=configure.in fi msg="missing on your system" case "$1" in --run) # Try to run requested program, and just exit if it succeeds. run= shift "$@" && exit 0 # Exit code 63 means version mismatch. This often happens # when the user try to use an ancient version of a tool on # a file that requires a minimum version. In this case we # we should proceed has if the program had been absent, or # if --run hadn't been passed. if test $? = 63; then run=: msg="probably too old" fi ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an error status if there is no known handling for PROGRAM. Options: -h, --help display this help and exit -v, --version output version information and exit --run try to run the given command, and emulate it if it fails Supported PROGRAM values: aclocal touch file \`aclocal.m4' autoconf touch file \`configure' autoheader touch file \`config.h.in' automake touch all \`Makefile.in' files bison create \`y.tab.[ch]', if possible, from existing .[ch] flex create \`lex.yy.c', if possible, from existing .c help2man touch the output file lex create \`lex.yy.c', if possible, from existing .c makeinfo touch the output file tar try tar, gnutar, gtar, then tar without non-portable flags yacc create \`y.tab.[ch]', if possible, from existing .[ch] Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: Unknown \`$1' option" echo 1>&2 "Try \`$0 --help' for more information" exit 1 ;; esac # Now exit if we have it, but it failed. Also exit now if we # don't have it and --version was passed (most likely to detect # the program). case "$1" in lex|yacc) # Not GNU programs, they don't have --version. ;; tar) if test -n "$run"; then echo 1>&2 "ERROR: \`tar' requires --run" exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then exit 1 fi ;; *) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then # Could not run --version or --help. This is probably someone # running `$TOOL --version' or `$TOOL --help' to check whether # $TOOL exists and not knowing $TOOL uses missing. exit 1 fi ;; esac # If it does not exist, or fails to run (possibly an outdated version), # try to emulate it. case "$1" in aclocal*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." touch aclocal.m4 ;; autoconf) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." touch configure ;; autoheader) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acconfig.h' or \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` test -z "$files" && files="config.h" touch_files= for f in $files; do case "$f" in *:*) touch_files="$touch_files "`echo "$f" | sed -e 's/^[^:]*://' -e 's/:.*//'`;; *) touch_files="$touch_files $f.in";; esac done touch $touch_files ;; automake*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." find . -type f -name Makefile.am -print | sed 's/\.am$/.in/' | while read f; do touch "$f"; done ;; autom4te) echo 1>&2 "\ WARNING: \`$1' is needed, but is $msg. You might have modified some files without having the proper tools for further handling them. You can get \`$1' as part of \`Autoconf' from any GNU archive site." file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'` test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo "#! /bin/sh" echo "# Created by GNU Automake missing as a replacement of" echo "# $ $@" echo "exit 0" chmod +x $file exit 1 fi ;; bison|yacc) echo 1>&2 "\ WARNING: \`$1' $msg. You should only need it if you modified a \`.y' file. You may need the \`Bison' package in order for those modifications to take effect. You can get \`Bison' from any GNU archive site." rm -f y.tab.c y.tab.h if [ $# -ne 1 ]; then eval LASTARG="\${$#}" case "$LASTARG" in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" y.tab.h fi ;; esac fi if [ ! -f y.tab.h ]; then echo >y.tab.h fi if [ ! -f y.tab.c ]; then echo 'main() { return 0; }' >y.tab.c fi ;; lex|flex) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.l' file. You may need the \`Flex' package in order for those modifications to take effect. You can get \`Flex' from any GNU archive site." rm -f lex.yy.c if [ $# -ne 1 ]; then eval LASTARG="\${$#}" case "$LASTARG" in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" lex.yy.c fi ;; esac fi if [ ! -f lex.yy.c ]; then echo 'main() { return 0; }' >lex.yy.c fi ;; help2man) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a dependency of a manual page. You may need the \`Help2man' package in order for those modifications to take effect. You can get \`Help2man' from any GNU archive site." file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` if test -z "$file"; then file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'` fi if [ -f "$file" ]; then touch $file else test -z "$file" || exec >$file echo ".ab help2man is required to generate this page" exit 1 fi ;; makeinfo) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.texi' or \`.texinfo' file, or any other file indirectly affecting the aspect of the manual. The spurious call might also be the consequence of using a buggy \`make' (AIX, DU, IRIX). You might want to install the \`Texinfo' package or the \`GNU make' package. Grab either from any GNU archive site." # The file to touch is that specified with -o ... file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` if test -z "$file"; then # ... or it is the one specified with @setfilename ... infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $infile` # ... or it is derived from the source name (dir/f.texi becomes f.info) test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info fi # If the file does not exist, the user really needs makeinfo; # let's fail without touching anything. test -f $file || exit 1 touch $file ;; tar) shift # We have already tried tar in the generic part. # Look for gnutar/gtar before invocation to avoid ugly error # messages. if (gnutar --version > /dev/null 2>&1); then gnutar "$@" && exit 0 fi if (gtar --version > /dev/null 2>&1); then gtar "$@" && exit 0 fi firstarg="$1" if shift; then case "$firstarg" in *o*) firstarg=`echo "$firstarg" | sed s/o//` tar "$firstarg" "$@" && exit 0 ;; esac case "$firstarg" in *h*) firstarg=`echo "$firstarg" | sed s/h//` tar "$firstarg" "$@" && exit 0 ;; esac fi echo 1>&2 "\ WARNING: I can't seem to be able to run \`tar' with the given arguments. You may want to install GNU tar or Free paxutils, or check the command line arguments." exit 1 ;; *) echo 1>&2 "\ WARNING: \`$1' is needed, and is $msg. You might have modified some files without having the proper tools for further handling them. Check the \`README' file, it often tells you about the needed prerequisites for installing this package. You may also peek at any GNU archive site, in case some other package would contain this missing \`$1' program." exit 1 ;; esac exit 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: parcellite-1.2.1/intltool-extract.in0000644000175000017500000005565013041603201015606 0ustar hlehle#!@INTLTOOL_PERL@ -w # -*- Mode: perl; indent-tabs-mode: nil; c-basic-offset: 4 -*- # # The Intltool Message Extractor # # Copyright (C) 2000-2001, 2003 Free Software Foundation. # # Intltool is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2 of the # License, or (at your option) any later version. # # Intltool is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # # Authors: Kenneth Christiansen # Darin Adler # ## Release information my $PROGRAM = "intltool-extract"; my $PACKAGE = "intltool"; my $VERSION = "0.37.1"; ## Loaded modules use strict; use File::Basename; use Getopt::Long; ## Scalars used by the option stuff my $TYPE_ARG = "0"; my $LOCAL_ARG = "0"; my $HELP_ARG = "0"; my $VERSION_ARG = "0"; my $UPDATE_ARG = "0"; my $QUIET_ARG = "0"; my $SRCDIR_ARG = "."; my $FILE; my $OUTFILE; my $gettext_type = ""; my $input; my %messages = (); my %loc = (); my %count = (); my %comments = (); my $strcount = 0; my $XMLCOMMENT = ""; ## Use this instead of \w for XML files to handle more possible characters. my $w = "[-A-Za-z0-9._:]"; ## Always print first $| = 1; ## Handle options GetOptions ( "type=s" => \$TYPE_ARG, "local|l" => \$LOCAL_ARG, "help|h" => \$HELP_ARG, "version|v" => \$VERSION_ARG, "update" => \$UPDATE_ARG, "quiet|q" => \$QUIET_ARG, "srcdir=s" => \$SRCDIR_ARG, ) or &error; &split_on_argument; ## Check for options. ## This section will check for the different options. sub split_on_argument { if ($VERSION_ARG) { &version; } elsif ($HELP_ARG) { &help; } elsif ($LOCAL_ARG) { &place_local; &extract; } elsif ($UPDATE_ARG) { &place_normal; &extract; } elsif (@ARGV > 0) { &place_normal; &message; &extract; } else { &help; } } sub place_normal { $FILE = $ARGV[0]; $OUTFILE = "$FILE.h"; my $dirname = dirname ($OUTFILE); if (! -d "$dirname" && $dirname ne "") { system ("mkdir -p $dirname"); } } sub place_local { $FILE = $ARGV[0]; $OUTFILE = fileparse($FILE, ()); if (!-e "tmp/") { system("mkdir tmp/"); } $OUTFILE = "./tmp/$OUTFILE.h" } sub determine_type { if ($TYPE_ARG =~ /^gettext\/(.*)/) { $gettext_type=$1 } } ## Sub for printing release information sub version{ print <<_EOF_; ${PROGRAM} (${PACKAGE}) $VERSION Copyright (C) 2000, 2003 Free Software Foundation, Inc. Written by Kenneth Christiansen, 2000. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. _EOF_ exit; } ## Sub for printing usage information sub help { print <<_EOF_; Usage: ${PROGRAM} [OPTION]... [FILENAME] Generates a header file from an XML source file. It grabs all strings between <_translatable_node> and its end tag in XML files. Read manpage (man ${PROGRAM}) for more info. --type=TYPE Specify the file type of FILENAME. Currently supports: "gettext/glade", "gettext/ini", "gettext/keys" "gettext/rfc822deb", "gettext/schemas", "gettext/scheme", "gettext/xml", "gettext/quoted", "gettext/quotedxml" -l, --local Writes output into current working directory (conflicts with --update) --update Writes output into the same directory the source file reside (conflicts with --local) --srcdir Root of the source tree -v, --version Output version information and exit -h, --help Display this help and exit -q, --quiet Quiet mode Report bugs to http://bugzilla.gnome.org/ (product name "$PACKAGE") or send email to . _EOF_ exit; } ## Sub for printing error messages sub error{ print STDERR "Try `${PROGRAM} --help' for more information.\n"; exit; } sub message { print "Generating C format header file for translation.\n" unless $QUIET_ARG; } sub extract { &determine_type; &convert; open OUT, ">$OUTFILE"; binmode (OUT) if $^O eq 'MSWin32'; &msg_write; close OUT; print "Wrote $OUTFILE\n" unless $QUIET_ARG; } sub convert { ## Reading the file { local (*IN); local $/; #slurp mode open (IN, "<$SRCDIR_ARG/$FILE") || die "can't open $SRCDIR_ARG/$FILE: $!"; $input = ; } &type_ini if $gettext_type eq "ini"; &type_keys if $gettext_type eq "keys"; &type_xml if $gettext_type eq "xml"; &type_glade if $gettext_type eq "glade"; &type_scheme if $gettext_type eq "scheme"; &type_schemas if $gettext_type eq "schemas"; &type_rfc822deb if $gettext_type eq "rfc822deb"; &type_quoted if $gettext_type eq "quoted"; &type_quotedxml if $gettext_type eq "quotedxml"; } sub entity_decode_minimal { local ($_) = @_; s/'/'/g; # ' s/"/"/g; # " s/&/&/g; return $_; } sub entity_decode { local ($_) = @_; s/'/'/g; # ' s/"/"/g; # " s/<//g; s/&/&/g; return $_; } sub escape_char { return '\"' if $_ eq '"'; return '\n' if $_ eq "\n"; return '\\\\' if $_ eq '\\'; return $_; } sub escape { my ($string) = @_; return join "", map &escape_char, split //, $string; } sub type_ini { ### For generic translatable desktop files ### while ($input =~ /^(#(.+)\n)?^_.*=(.*)$/mg) { if (defined($2)) { $comments{$3} = $2; } $messages{$3} = []; } } sub type_keys { ### For generic translatable mime/keys files ### while ($input =~ /^\s*_\w+=(.*)$/mg) { $messages{$1} = []; } } sub type_xml { ### For generic translatable XML files ### my $tree = readXml($input); parseTree(0, $tree); } sub print_var { my $var = shift; my $vartype = ref $var; if ($vartype =~ /ARRAY/) { my @arr = @{$var}; print "[ "; foreach my $el (@arr) { print_var($el); print ", "; } print "] "; } elsif ($vartype =~ /HASH/) { my %hash = %{$var}; print "{ "; foreach my $key (keys %hash) { print "$key => "; print_var($hash{$key}); print ", "; } print "} "; } else { print $var; } } # Same syntax as getAttributeString in intltool-merge.in.in, similar logic (look for ## differences comment) sub getAttributeString { my $sub = shift; my $do_translate = shift || 1; my $language = shift || ""; my $translate = shift; my $result = ""; foreach my $e (reverse(sort(keys %{ $sub }))) { my $key = $e; my $string = $sub->{$e}; my $quote = '"'; $string =~ s/^[\s]+//; $string =~ s/[\s]+$//; if ($string =~ /^'.*'$/) { $quote = "'"; } $string =~ s/^['"]//g; $string =~ s/['"]$//g; ## differences from intltool-merge.in.in if ($key =~ /^_/) { $comments{entity_decode($string)} = $XMLCOMMENT if $XMLCOMMENT; $messages{entity_decode($string)} = []; $$translate = 2; } ## differences end here from intltool-merge.in.in $result .= " $key=$quote$string$quote"; } return $result; } # Verbatim copy from intltool-merge.in.in sub getXMLstring { my $ref = shift; my $spacepreserve = shift || 0; my @list = @{ $ref }; my $result = ""; my $count = scalar(@list); my $attrs = $list[0]; my $index = 1; $spacepreserve = 1 if ((exists $attrs->{"xml:space"}) && ($attrs->{"xml:space"} =~ /^["']?preserve["']?$/)); $spacepreserve = 0 if ((exists $attrs->{"xml:space"}) && ($attrs->{"xml:space"} =~ /^["']?default["']?$/)); while ($index < $count) { my $type = $list[$index]; my $content = $list[$index+1]; if (! $type ) { # We've got CDATA if ($content) { # lets strip the whitespace here, and *ONLY* here $content =~ s/\s+/ /gs if (!$spacepreserve); $result .= $content; } } elsif ( "$type" ne "1" ) { # We've got another element $result .= "<$type"; $result .= getAttributeString(@{$content}[0], 0); # no nested translatable elements if ($content) { my $subresult = getXMLstring($content, $spacepreserve); if ($subresult) { $result .= ">".$subresult . ""; } else { $result .= "/>"; } } else { $result .= "/>"; } } $index += 2; } return $result; } # Verbatim copy from intltool-merge.in.in, except for MULTIPLE_OUTPUT handling removed # Translate list of nodes if necessary sub translate_subnodes { my $fh = shift; my $content = shift; my $language = shift || ""; my $singlelang = shift || 0; my $spacepreserve = shift || 0; my @nodes = @{ $content }; my $count = scalar(@nodes); my $index = 0; while ($index < $count) { my $type = $nodes[$index]; my $rest = $nodes[$index+1]; traverse($fh, $type, $rest, $language, $spacepreserve); $index += 2; } } # Based on traverse() in intltool-merge.in.in sub traverse { my $fh = shift; # unused, to allow us to sync code between -merge and -extract my $nodename = shift; my $content = shift; my $language = shift || ""; my $spacepreserve = shift || 0; if ($nodename && "$nodename" eq "1") { $XMLCOMMENT = $content; } elsif ($nodename) { # element my @all = @{ $content }; my $attrs = shift @all; my $translate = 0; my $outattr = getAttributeString($attrs, 1, $language, \$translate); if ($nodename =~ /^_/) { $translate = 1; $nodename =~ s/^_//; } my $lookup = ''; $spacepreserve = 0 if ((exists $attrs->{"xml:space"}) && ($attrs->{"xml:space"} =~ /^["']?default["']?$/)); $spacepreserve = 1 if ((exists $attrs->{"xml:space"}) && ($attrs->{"xml:space"} =~ /^["']?preserve["']?$/)); if ($translate) { $lookup = getXMLstring($content, $spacepreserve); if (!$spacepreserve) { $lookup =~ s/^\s+//s; $lookup =~ s/\s+$//s; } if ($lookup && $translate != 2) { $comments{$lookup} = $XMLCOMMENT if $XMLCOMMENT; $messages{$lookup} = []; } elsif ($translate == 2) { translate_subnodes($fh, \@all, $language, 1, $spacepreserve); } } else { $XMLCOMMENT = ""; my $count = scalar(@all); if ($count > 0) { my $index = 0; while ($index < $count) { my $type = $all[$index]; my $rest = $all[$index+1]; traverse($fh, $type, $rest, $language, $spacepreserve); $index += 2; } } } $XMLCOMMENT = ""; } } # Verbatim copy from intltool-merge.in.in, $fh for compatibility sub parseTree { my $fh = shift; my $ref = shift; my $language = shift || ""; my $name = shift @{ $ref }; my $cont = shift @{ $ref }; while (!$name || "$name" eq "1") { $name = shift @{ $ref }; $cont = shift @{ $ref }; } my $spacepreserve = 0; my $attrs = @{$cont}[0]; $spacepreserve = 1 if ((exists $attrs->{"xml:space"}) && ($attrs->{"xml:space"} =~ /^["']?preserve["']?$/)); traverse($fh, $name, $cont, $language, $spacepreserve); } # Verbatim copy from intltool-merge.in.in sub intltool_tree_comment { my $expat = shift; my $data = $expat->original_string(); my $clist = $expat->{Curlist}; my $pos = $#$clist; $data =~ s/^$//s; push @$clist, 1 => $data; } # Verbatim copy from intltool-merge.in.in sub intltool_tree_cdatastart { my $expat = shift; my $clist = $expat->{Curlist}; my $pos = $#$clist; push @$clist, 0 => $expat->original_string(); } # Verbatim copy from intltool-merge.in.in sub intltool_tree_cdataend { my $expat = shift; my $clist = $expat->{Curlist}; my $pos = $#$clist; $clist->[$pos] .= $expat->original_string(); } # Verbatim copy from intltool-merge.in.in sub intltool_tree_char { my $expat = shift; my $text = shift; my $clist = $expat->{Curlist}; my $pos = $#$clist; # Use original_string so that we retain escaped entities # in CDATA sections. # if ($pos > 0 and $clist->[$pos - 1] eq '0') { $clist->[$pos] .= $expat->original_string(); } else { push @$clist, 0 => $expat->original_string(); } } # Verbatim copy from intltool-merge.in.in sub intltool_tree_start { my $expat = shift; my $tag = shift; my @origlist = (); # Use original_string so that we retain escaped entities # in attribute values. We must convert the string to an # @origlist array to conform to the structure of the Tree # Style. # my @original_array = split /\x/, $expat->original_string(); my $source = $expat->original_string(); # Remove leading tag. # $source =~ s|^\s*<\s*(\S+)||s; # Grab attribute key/value pairs and push onto @origlist array. # while ($source) { if ($source =~ /^\s*([\w:-]+)\s*[=]\s*["]/) { $source =~ s|^\s*([\w:-]+)\s*[=]\s*["]([^"]*)["]||s; push @origlist, $1; push @origlist, '"' . $2 . '"'; } elsif ($source =~ /^\s*([\w:-]+)\s*[=]\s*[']/) { $source =~ s|^\s*([\w:-]+)\s*[=]\s*[']([^']*)[']||s; push @origlist, $1; push @origlist, "'" . $2 . "'"; } else { last; } } my $ol = [ { @origlist } ]; push @{ $expat->{Lists} }, $expat->{Curlist}; push @{ $expat->{Curlist} }, $tag => $ol; $expat->{Curlist} = $ol; } # Copied from intltool-merge.in.in and added comment handler. sub readXml { my $xmldoc = shift || return; my $ret = eval 'require XML::Parser'; if(!$ret) { die "You must have XML::Parser installed to run $0\n\n"; } my $xp = new XML::Parser(Style => 'Tree'); $xp->setHandlers(Char => \&intltool_tree_char); $xp->setHandlers(Start => \&intltool_tree_start); $xp->setHandlers(CdataStart => \&intltool_tree_cdatastart); $xp->setHandlers(CdataEnd => \&intltool_tree_cdataend); ## differences from intltool-merge.in.in $xp->setHandlers(Comment => \&intltool_tree_comment); ## differences end here from intltool-merge.in.in my $tree = $xp->parse($xmldoc); #print_var($tree); # Hello thereHowdydo # would be: # [foo, [{}, 1, "comment", head, [{id => "a"}, 0, "Hello ", em, [{}, 0, "there"]], bar, # [{}, 0, "Howdy", ref, [{}]], 0, "do" ] ] return $tree; } sub type_schemas { ### For schemas XML files ### # FIXME: We should handle escaped < (less than) while ($input =~ / \s* (\s*(?:\s*)?(.*?)\s*<\/default>\s*)? (\s*(?:\s*)?(.*?)\s*<\/short>\s*)? (\s*(?:\s*)?(.*?)\s*<\/long>\s*)? <\/locale> /sgx) { my @totranslate = ($3,$6,$9); my @eachcomment = ($2,$5,$8); foreach (@totranslate) { my $currentcomment = shift @eachcomment; next if !$_; s/\s+/ /g; $messages{entity_decode_minimal($_)} = []; $comments{entity_decode_minimal($_)} = $currentcomment if (defined($currentcomment)); } } } sub type_rfc822deb { ### For rfc822-style Debian configuration files ### my $lineno = 1; my $type = ''; while ($input =~ /\G(.*?)(^|\n)(_+)([^:]+):[ \t]*(.*?)(?=\n\S|$)/sg) { my ($pre, $newline, $underscore, $tag, $text) = ($1, $2, $3, $4, $5); while ($pre =~ m/\n/g) { $lineno ++; } $lineno += length($newline); my @str_list = rfc822deb_split(length($underscore), $text); for my $str (@str_list) { $strcount++; $messages{$str} = []; $loc{$str} = $lineno; $count{$str} = $strcount; my $usercomment = ''; while($pre =~ s/(^|\n)#([^\n]*)$//s) { $usercomment = "\n" . $2 . $usercomment; } $comments{$str} = $tag . $usercomment; } $lineno += ($text =~ s/\n//g); } } sub rfc822deb_split { # Debian defines a special way to deal with rfc822-style files: # when a value contain newlines, it consists of # 1. a short form (first line) # 2. a long description, all lines begin with a space, # and paragraphs are separated by a single dot on a line # This routine returns an array of all paragraphs, and reformat # them. # When first argument is 2, the string is a comma separated list of # values. my $type = shift; my $text = shift; $text =~ s/^[ \t]//mg; return (split(/, */, $text, 0)) if $type ne 1; return ($text) if $text !~ /\n/; $text =~ s/([^\n]*)\n//; my @list = ($1); my $str = ''; for my $line (split (/\n/, $text)) { chomp $line; if ($line =~ /^\.\s*$/) { # New paragraph $str =~ s/\s*$//; push(@list, $str); $str = ''; } elsif ($line =~ /^\s/) { # Line which must not be reformatted $str .= "\n" if length ($str) && $str !~ /\n$/; $line =~ s/\s+$//; $str .= $line."\n"; } else { # Continuation line, remove newline $str .= " " if length ($str) && $str !~ /\n$/; $str .= $line; } } $str =~ s/\s*$//; push(@list, $str) if length ($str); return @list; } sub type_quoted { while ($input =~ /\"(([^\"]|\\\")*[^\\\"])\"/g) { my $message = $1; my $before = $`; $message =~ s/\\\"/\"/g; $before =~ s/[^\n]//g; $messages{$message} = []; $loc{$message} = length ($before) + 2; } } sub type_quotedxml { while ($input =~ /\"(([^\"]|\\\")*[^\\\"])\"/g) { my $message = $1; my $before = $`; $message =~ s/\\\"/\"/g; $message = entity_decode($message); $before =~ s/[^\n]//g; $messages{$message} = []; $loc{$message} = length ($before) + 2; } } sub type_glade { ### For translatable Glade XML files ### my $tags = "label|title|text|format|copyright|comments|preview_text|tooltip|message"; while ($input =~ /<($tags)>([^<]+)<\/($tags)>/sg) { # Glade sometimes uses tags that normally mark translatable things for # little bits of non-translatable content. We work around this by not # translating strings that only includes something like label4 or window1. $messages{entity_decode($2)} = [] unless $2 =~ /^(window|label|dialog)[0-9]+$/; } while ($input =~ /(..[^<]*)<\/items>/sg) { for my $item (split (/\n/, $1)) { $messages{entity_decode($item)} = []; } } ## handle new glade files while ($input =~ /<(property|atkproperty)\s+[^>]*translatable\s*=\s*"yes"(?:\s+[^>]*comments\s*=\s*"([^"]*)")?[^>]*>([^<]+)<\/\1>/sg) { $messages{entity_decode($3)} = [] unless $3 =~ /^(window|label)[0-9]+$/; if (defined($2) and !($3 =~ /^(window|label)[0-9]+$/)) { $comments{entity_decode($3)} = entity_decode($2) ; } } while ($input =~ /]*)"\s+description="([^>]+)"\/>/sg) { $messages{entity_decode_minimal($2)} = []; } } sub type_scheme { my ($line, $i, $state, $str, $trcomment, $char); for $line (split(/\n/, $input)) { $i = 0; $state = 0; # 0 - nothing, 1 - string, 2 - translatable string while ($i < length($line)) { if (substr($line,$i,1) eq "\"") { if ($state == 2) { $comments{$str} = $trcomment if ($trcomment); $messages{$str} = []; $str = ''; $state = 0; $trcomment = ""; } elsif ($state == 1) { $str = ''; $state = 0; $trcomment = ""; } else { $state = 1; $str = ''; if ($i>0 && substr($line,$i-1,1) eq '_') { $state = 2; } } } elsif (!$state) { if (substr($line,$i,1) eq ";") { $trcomment = substr($line,$i+1); $trcomment =~ s/^;*\s*//; $i = length($line); } elsif ($trcomment && substr($line,$i,1) !~ /\s|\(|\)|_/) { $trcomment = ""; } } else { if (substr($line,$i,1) eq "\\") { $char = substr($line,$i+1,1); if ($char ne "\"" && $char ne "\\") { $str = $str . "\\"; } $i++; } $str = $str . substr($line,$i,1); } $i++; } } } sub msg_write { my @msgids; if (%count) { @msgids = sort { $count{$a} <=> $count{$b} } keys %count; } else { @msgids = sort keys %messages; } for my $message (@msgids) { my $offsetlines = 1; $offsetlines++ if $message =~ /%/; if (defined ($comments{$message})) { while ($comments{$message} =~ m/\n/g) { $offsetlines++; } } print OUT "# ".($loc{$message} - $offsetlines). " \"$FILE\"\n" if defined $loc{$message}; print OUT "/* ".$comments{$message}." */\n" if defined $comments{$message}; print OUT "/* xgettext:no-c-format */\n" if $message =~ /%/; my @lines = split (/\n/, $message, -1); for (my $n = 0; $n < @lines; $n++) { if ($n == 0) { print OUT "char *s = N_(\""; } else { print OUT " \""; } print OUT escape($lines[$n]); if ($n < @lines - 1) { print OUT "\\n\"\n"; } else { print OUT "\");\n"; } } } } parcellite-1.2.1/config.rpath0000755000175000017500000004364713041603201014255 0ustar hlehle#! /bin/sh # Output a system dependent set of variables, describing how to set the # run time search path of shared libraries in an executable. # # Copyright 1996-2007 Free Software Foundation, Inc. # Taken from GNU libtool, 2001 # Originally by Gordon Matzigkeit , 1996 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # # The first argument passed to this file is the canonical host specification, # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld # should be set by the caller. # # The set of defined variables is at the end of this script. # Known limitations: # - On IRIX 6.5 with CC="cc", the run time search patch must not be longer # than 256 bytes, otherwise the compiler driver will dump core. The only # known workaround is to choose shorter directory names for the build # directory and/or the installation directory. # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a shrext=.so host="$1" host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` # Code taken from libtool.m4's _LT_CC_BASENAME. for cc_temp in $CC""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`echo "$cc_temp" | sed -e 's%^.*/%%'` # Code taken from libtool.m4's AC_LIBTOOL_PROG_COMPILER_PIC. wl= if test "$GCC" = yes; then wl='-Wl,' else case "$host_os" in aix*) wl='-Wl,' ;; darwin*) case $cc_basename in xlc*) wl='-Wl,' ;; esac ;; mingw* | cygwin* | pw32* | os2*) ;; hpux9* | hpux10* | hpux11*) wl='-Wl,' ;; irix5* | irix6* | nonstopux*) wl='-Wl,' ;; newsos6) ;; linux* | k*bsd*-gnu) case $cc_basename in icc* | ecc*) wl='-Wl,' ;; pgcc | pgf77 | pgf90) wl='-Wl,' ;; ccc*) wl='-Wl,' ;; como) wl='-lopt=' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) wl='-Wl,' ;; esac ;; esac ;; osf3* | osf4* | osf5*) wl='-Wl,' ;; rdos*) ;; solaris*) wl='-Wl,' ;; sunos4*) wl='-Qoption ld ' ;; sysv4 | sysv4.2uw2* | sysv4.3*) wl='-Wl,' ;; sysv4*MP*) ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) wl='-Wl,' ;; unicos*) wl='-Wl,' ;; uts4*) ;; esac fi # Code taken from libtool.m4's AC_LIBTOOL_PROG_LD_SHLIBS. hardcode_libdir_flag_spec= hardcode_libdir_separator= hardcode_direct=no hardcode_minus_L=no case "$host_os" in cygwin* | mingw* | pw32*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; esac ld_shlibs=yes if test "$with_gnu_ld" = yes; then # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. # Unlike libtool, we use -rpath here, not --rpath, since the documented # option of GNU ld is called -rpath, not --rpath. hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' case "$host_os" in aix3* | aix4* | aix5*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs=no fi ;; amigaos*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes # Samuel A. Falvo II reports # that the semantics of dynamic libraries on AmigaOS, at least up # to version 4, is to share data among multiple programs linked # with the same dynamic library. Since this doesn't match the # behavior of shared libraries on other platforms, we cannot use # them. ld_shlibs=no ;; beos*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; cygwin* | mingw* | pw32*) # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then : else ld_shlibs=no fi ;; interix[3-9]*) hardcode_direct=no hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; gnu* | linux* | k*bsd*-gnu) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; netbsd*) ;; solaris*) if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then ld_shlibs=no elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs=no ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' else ld_shlibs=no fi ;; esac ;; sunos4*) hardcode_direct=yes ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; esac if test "$ld_shlibs" = no; then hardcode_libdir_flag_spec= fi else case "$host_os" in aix3*) # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test "$GCC" = yes; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix4* | aix5*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix5*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac fi hardcode_direct=yes hardcode_libdir_separator=':' if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct=unsupported hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi ;; esac fi # Begin _LT_AC_SYS_LIBPATH_AIX. echo 'int main () { return 0; }' > conftest.c ${CC} ${LDFLAGS} conftest.c -o conftest aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` fi if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib" fi rm -f conftest.c conftest # End _LT_AC_SYS_LIBPATH_AIX. if test "$aix_use_runtimelinking" = yes; then hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' else hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" fi fi ;; amigaos*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes # see comment about different semantics on the GNU ld section ld_shlibs=no ;; bsdi[45]*) ;; cygwin* | mingw* | pw32*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec=' ' libext=lib ;; darwin* | rhapsody*) hardcode_direct=no if test "$GCC" = yes ; then : else case $cc_basename in xlc*) ;; *) ld_shlibs=no ;; esac fi ;; dgux*) hardcode_libdir_flag_spec='-L$libdir' ;; freebsd1*) ld_shlibs=no ;; freebsd2.2*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; freebsd2*) hardcode_direct=yes hardcode_minus_L=yes ;; freebsd* | dragonfly*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; hpux9*) hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; hpux10*) if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes fi ;; hpux11*) if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: case $host_cpu in hppa*64*|ia64*) hardcode_direct=no ;; *) hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; netbsd*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; newsos6) hardcode_direct=yes hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct=yes if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then hardcode_libdir_flag_spec='${wl}-rpath,$libdir' else case "$host_os" in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) hardcode_libdir_flag_spec='-R$libdir' ;; *) hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; esac fi else ld_shlibs=no fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; osf3*) hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) if test "$GCC" = yes; then hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' else # Both cc and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi hardcode_libdir_separator=: ;; solaris*) hardcode_libdir_flag_spec='-R$libdir' ;; sunos4*) hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes ;; sysv4) case $host_vendor in sni) hardcode_direct=yes # is this really true??? ;; siemens) hardcode_direct=no ;; motorola) hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac ;; sysv4.3*) ;; sysv4*MP*) if test -d /usr/nec; then ld_shlibs=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) ;; sysv5* | sco3.2v5* | sco5v6*) hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' hardcode_libdir_separator=':' ;; uts4*) hardcode_libdir_flag_spec='-L$libdir' ;; *) ld_shlibs=no ;; esac fi # Check dynamic linker characteristics # Code taken from libtool.m4's AC_LIBTOOL_SYS_DYNAMIC_LINKER. # Unlike libtool.m4, here we don't care about _all_ names of the library, but # only about the one the linker finds when passed -lNAME. This is the last # element of library_names_spec in libtool.m4, or possibly two of them if the # linker has special search rules. library_names_spec= # the last element of library_names_spec in libtool.m4 libname_spec='lib$name' case "$host_os" in aix3*) library_names_spec='$libname.a' ;; aix4* | aix5*) library_names_spec='$libname$shrext' ;; amigaos*) library_names_spec='$libname.a' ;; beos*) library_names_spec='$libname$shrext' ;; bsdi[45]*) library_names_spec='$libname$shrext' ;; cygwin* | mingw* | pw32*) shrext=.dll library_names_spec='$libname.dll.a $libname.lib' ;; darwin* | rhapsody*) shrext=.dylib library_names_spec='$libname$shrext' ;; dgux*) library_names_spec='$libname$shrext' ;; freebsd1*) ;; freebsd* | dragonfly*) case "$host_os" in freebsd[123]*) library_names_spec='$libname$shrext$versuffix' ;; *) library_names_spec='$libname$shrext' ;; esac ;; gnu*) library_names_spec='$libname$shrext' ;; hpux9* | hpux10* | hpux11*) case $host_cpu in ia64*) shrext=.so ;; hppa*64*) shrext=.sl ;; *) shrext=.sl ;; esac library_names_spec='$libname$shrext' ;; interix[3-9]*) library_names_spec='$libname$shrext' ;; irix5* | irix6* | nonstopux*) library_names_spec='$libname$shrext' case "$host_os" in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= ;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 ;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 ;; *) libsuff= shlibsuff= ;; esac ;; esac ;; linux*oldld* | linux*aout* | linux*coff*) ;; linux* | k*bsd*-gnu) library_names_spec='$libname$shrext' ;; knetbsd*-gnu) library_names_spec='$libname$shrext' ;; netbsd*) library_names_spec='$libname$shrext' ;; newsos6) library_names_spec='$libname$shrext' ;; nto-qnx*) library_names_spec='$libname$shrext' ;; openbsd*) library_names_spec='$libname$shrext$versuffix' ;; os2*) libname_spec='$name' shrext=.dll library_names_spec='$libname.a' ;; osf3* | osf4* | osf5*) library_names_spec='$libname$shrext' ;; rdos*) ;; solaris*) library_names_spec='$libname$shrext' ;; sunos4*) library_names_spec='$libname$shrext$versuffix' ;; sysv4 | sysv4.3*) library_names_spec='$libname$shrext' ;; sysv4*MP*) library_names_spec='$libname$shrext' ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) library_names_spec='$libname$shrext' ;; uts4*) library_names_spec='$libname$shrext' ;; esac sed_quote_subst='s/\(["`$\\]\)/\\\1/g' escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"` shlibext=`echo "$shrext" | sed -e 's,^\.,,'` escaped_libname_spec=`echo "X$libname_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` escaped_library_names_spec=`echo "X$library_names_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` LC_ALL=C sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' < # Maciej Stachowiak # Darin Adler ## Release information my $PROGRAM = "intltool-update"; my $VERSION = "0.37.1"; my $PACKAGE = "intltool"; ## Loaded modules use strict; use Getopt::Long; use Cwd; use File::Copy; use File::Find; ## Scalars used by the option stuff my $HELP_ARG = 0; my $VERSION_ARG = 0; my $DIST_ARG = 0; my $POT_ARG = 0; my $HEADERS_ARG = 0; my $MAINTAIN_ARG = 0; my $REPORT_ARG = 0; my $VERBOSE = 0; my $GETTEXT_PACKAGE = ""; my $OUTPUT_FILE = ""; my @languages; my %varhash = (); my %po_files_by_lang = (); # Regular expressions to categorize file types. # FIXME: Please check if the following is correct my $xml_support = "xml(?:\\.in)*|". # http://www.w3.org/XML/ (Note: .in is not required) "ui|". # Bonobo specific - User Interface desc. files "lang|". # ? "glade2?(?:\\.in)*|". # Glade specific - User Interface desc. files (Note: .in is not required) "scm(?:\\.in)*|". # ? (Note: .in is not required) "oaf(?:\\.in)+|". # DEPRECATED: Replaces by Bonobo .server files "etspec|". # ? "server(?:\\.in)+|". # Bonobo specific "sheet(?:\\.in)+|". # ? "schemas(?:\\.in)+|". # GConf specific "pong(?:\\.in)+|". # DEPRECATED: PONG is not used [by GNOME] any longer. "kbd(?:\\.in)+|". # GOK specific. "policy(?:\\.in)+"; # PolicyKit files my $ini_support = "icon(?:\\.in)+|". # http://www.freedesktop.org/Standards/icon-theme-spec "desktop(?:\\.in)+|". # http://www.freedesktop.org/Standards/menu-spec "caves(?:\\.in)+|". # GNOME Games specific "directory(?:\\.in)+|". # http://www.freedesktop.org/Standards/menu-spec "soundlist(?:\\.in)+|". # GNOME specific "keys(?:\\.in)+|". # GNOME Mime database specific "theme(?:\\.in)+|". # http://www.freedesktop.org/Standards/icon-theme-spec "service(?:\\.in)+"; # DBus specific my $buildin_gettext_support = "c|y|cs|cc|cpp|c\\+\\+|h|hh|gob|py"; ## Always flush buffer when printing $| = 1; ## Sometimes the source tree will be rooted somewhere else. my $SRCDIR = $ENV{"srcdir"} || "."; my $POTFILES_in; $POTFILES_in = "<$SRCDIR/POTFILES.in"; my $devnull = ($^O eq 'MSWin32' ? 'NUL:' : '/dev/null'); ## Handle options GetOptions ( "help" => \$HELP_ARG, "version" => \$VERSION_ARG, "dist|d" => \$DIST_ARG, "pot|p" => \$POT_ARG, "headers|s" => \$HEADERS_ARG, "maintain|m" => \$MAINTAIN_ARG, "report|r" => \$REPORT_ARG, "verbose|x" => \$VERBOSE, "gettext-package|g=s" => \$GETTEXT_PACKAGE, "output-file|o=s" => \$OUTPUT_FILE, ) or &Console_WriteError_InvalidOption; &Console_Write_IntltoolHelp if $HELP_ARG; &Console_Write_IntltoolVersion if $VERSION_ARG; my $arg_count = ($DIST_ARG > 0) + ($POT_ARG > 0) + ($HEADERS_ARG > 0) + ($MAINTAIN_ARG > 0) + ($REPORT_ARG > 0); &Console_Write_IntltoolHelp if $arg_count > 1; my $PKGNAME = FindPackageName (); # --version and --help don't require a module name my $MODULE = $GETTEXT_PACKAGE || $PKGNAME || "unknown"; if ($POT_ARG) { &GenerateHeaders; &GeneratePOTemplate; } elsif ($HEADERS_ARG) { &GenerateHeaders; } elsif ($MAINTAIN_ARG) { &FindLeftoutFiles; } elsif ($REPORT_ARG) { &GenerateHeaders; &GeneratePOTemplate; &Console_Write_CoverageReport; } elsif ((defined $ARGV[0]) && $ARGV[0] =~ /^[a-z]/) { my $lang = $ARGV[0]; ## Report error if the language file supplied ## to the command line is non-existent &Console_WriteError_NotExisting("$SRCDIR/$lang.po") if ! -s "$SRCDIR/$lang.po"; if (!$DIST_ARG) { print "Working, please wait..." if $VERBOSE; &GenerateHeaders; &GeneratePOTemplate; } &POFile_Update ($lang, $OUTPUT_FILE); &Console_Write_TranslationStatus ($lang, $OUTPUT_FILE); } else { &Console_Write_IntltoolHelp; } exit; ######### sub Console_Write_IntltoolVersion { print <<_EOF_; ${PROGRAM} (${PACKAGE}) $VERSION Written by Kenneth Christiansen, Maciej Stachowiak, and Darin Adler. Copyright (C) 2000-2003 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. _EOF_ exit; } sub Console_Write_IntltoolHelp { print <<_EOF_; Usage: ${PROGRAM} [OPTION]... LANGCODE Updates PO template files and merge them with the translations. Mode of operation (only one is allowed): -p, --pot generate the PO template only -s, --headers generate the header files in POTFILES.in -m, --maintain search for left out files from POTFILES.in -r, --report display a status report for the module -d, --dist merge LANGCODE.po with existing PO template Extra options: -g, --gettext-package=NAME override PO template name, useful with --pot -o, --output-file=FILE write merged translation to FILE -x, --verbose display lots of feedback --help display this help and exit --version output version information and exit Examples of use: ${PROGRAM} --pot just create a new PO template ${PROGRAM} xy create new PO template and merge xy.po with it Report bugs to http://bugzilla.gnome.org/ (product name "$PACKAGE") or send email to . _EOF_ exit; } sub echo_n { my $str = shift; my $ret = `echo "$str"`; $ret =~ s/\n$//; # do we need the "s" flag? return $ret; } sub POFile_DetermineType ($) { my $type = $_; my $gettext_type; my $xml_regex = "(?:" . $xml_support . ")"; my $ini_regex = "(?:" . $ini_support . ")"; my $buildin_regex = "(?:" . $buildin_gettext_support . ")"; if ($type =~ /\[type: gettext\/([^\]].*)]/) { $gettext_type=$1; } elsif ($type =~ /schemas(\.in)+$/) { $gettext_type="schemas"; } elsif ($type =~ /glade2?(\.in)*$/) { $gettext_type="glade"; } elsif ($type =~ /scm(\.in)*$/) { $gettext_type="scheme"; } elsif ($type =~ /keys(\.in)+$/) { $gettext_type="keys"; } # bucket types elsif ($type =~ /$xml_regex$/) { $gettext_type="xml"; } elsif ($type =~ /$ini_regex$/) { $gettext_type="ini"; } elsif ($type =~ /$buildin_regex$/) { $gettext_type="buildin"; } else { $gettext_type="unknown"; } return "gettext\/$gettext_type"; } sub TextFile_DetermineEncoding ($) { my $gettext_code="ASCII"; # All files are ASCII by default my $filetype=`file $_ | cut -d ' ' -f 2`; if ($? eq "0") { if ($filetype =~ /^(ISO|UTF)/) { chomp ($gettext_code = $filetype); } elsif ($filetype =~ /^XML/) { $gettext_code="UTF-8"; # We asume that .glade and other .xml files are UTF-8 } } return $gettext_code; } sub isNotValidMissing { my ($file) = @_; return if $file =~ /^\{arch\}\/.*$/; return if $file =~ /^$varhash{"PACKAGE"}-$varhash{"VERSION"}\/.*$/; } sub FindLeftoutFiles { my (@buf_i18n_plain, @buf_i18n_xml, @buf_i18n_xml_unmarked, @buf_i18n_ini, @buf_potfiles, @buf_potfiles_ignore, @buf_allfiles, @buf_allfiles_sorted, @buf_potfiles_sorted, @buf_potfiles_ignore_sorted ); ## Search and find all translatable files find sub { push @buf_i18n_plain, "$File::Find::name" if /\.($buildin_gettext_support)$/; push @buf_i18n_xml, "$File::Find::name" if /\.($xml_support)$/; push @buf_i18n_ini, "$File::Find::name" if /\.($ini_support)$/; push @buf_i18n_xml_unmarked, "$File::Find::name" if /\.(schemas(\.in)+)$/; }, ".."; find sub { push @buf_i18n_plain, "$File::Find::name" if /\.($buildin_gettext_support)$/; push @buf_i18n_xml, "$File::Find::name" if /\.($xml_support)$/; push @buf_i18n_ini, "$File::Find::name" if /\.($ini_support)$/; push @buf_i18n_xml_unmarked, "$File::Find::name" if /\.(schemas(\.in)+)$/; }, "$SRCDIR/.." if "$SRCDIR" ne "."; open POTFILES, $POTFILES_in or die "$PROGRAM: there's no POTFILES.in!\n"; @buf_potfiles = grep !/^(#|\s*$)/, ; close POTFILES; foreach (@buf_potfiles) { s/^\[.*]\s*//; } print "Searching for missing translatable files...\n" if $VERBOSE; ## Check if we should ignore some found files, when ## comparing with POTFILES.in foreach my $ignore ("POTFILES.skip", "POTFILES.ignore") { (-s "$SRCDIR/$ignore") or next; if ("$ignore" eq "POTFILES.ignore") { print "The usage of POTFILES.ignore is deprecated. Please consider moving the\n". "content of this file to POTFILES.skip.\n"; } print "Found $ignore: Ignoring files...\n" if $VERBOSE; open FILE, "<$SRCDIR/$ignore" or die "ERROR: Failed to open $SRCDIR/$ignore!\n"; while () { push @buf_potfiles_ignore, $_ unless /^(#|\s*$)/; } close FILE; @buf_potfiles_ignore_sorted = sort (@buf_potfiles_ignore); } foreach my $file (@buf_i18n_plain) { my $in_comment = 0; my $in_macro = 0; open FILE, "<$file"; while () { # Handle continued multi-line comment. if ($in_comment) { next unless s-.*\*/--; $in_comment = 0; } # Handle continued macro. if ($in_macro) { $in_macro = 0 unless /\\$/; next; } # Handle start of macro (or any preprocessor directive). if (/^\s*\#/) { $in_macro = 1 if /^([^\\]|\\.)*\\$/; next; } # Handle comments and quoted text. while (m-(/\*|//|\'|\")-) # \' and \" keep emacs perl mode happy { my $match = $1; if ($match eq "/*") { if (!s-/\*.*?\*/--) { s-/\*.*--; $in_comment = 1; } } elsif ($match eq "//") { s-//.*--; } else # ' or " { if (!s-$match([^\\]|\\.)*?$match-QUOTEDTEXT-) { warn "mismatched quotes at line $. in $file\n"; s-$match.*--; } } } if (/\w\.GetString *\(QUOTEDTEXT/) { if (defined isNotValidMissing (unpack("x3 A*", $file))) { ## Remove the first 3 chars and add newline push @buf_allfiles, unpack("x3 A*", $file) . "\n"; } last; } ## C_ N_ Q_ and _ are the macros defined in gi8n.h if (/[CNQ]?_ *\(QUOTEDTEXT/) { if (defined isNotValidMissing (unpack("x3 A*", $file))) { ## Remove the first 3 chars and add newline push @buf_allfiles, unpack("x3 A*", $file) . "\n"; } last; } } close FILE; } foreach my $file (@buf_i18n_xml) { open FILE, "<$file"; while () { # FIXME: share the pattern matching code with intltool-extract if (/\s_[-A-Za-z0-9._:]+\s*=\s*\"([^"]+)\"/ || /<_[^>]+>/ || /translatable=\"yes\"/) { if (defined isNotValidMissing (unpack("x3 A*", $file))) { push @buf_allfiles, unpack("x3 A*", $file) . "\n"; } last; } } close FILE; } foreach my $file (@buf_i18n_ini) { open FILE, "<$file"; while () { if (/_(.*)=/) { if (defined isNotValidMissing (unpack("x3 A*", $file))) { push @buf_allfiles, unpack("x3 A*", $file) . "\n"; } last; } } close FILE; } foreach my $file (@buf_i18n_xml_unmarked) { if (defined isNotValidMissing (unpack("x3 A*", $file))) { push @buf_allfiles, unpack("x3 A*", $file) . "\n"; } } @buf_allfiles_sorted = sort (@buf_allfiles); @buf_potfiles_sorted = sort (@buf_potfiles); my %in2; foreach (@buf_potfiles_sorted) { s#^$SRCDIR/../##; s#^$SRCDIR/##; $in2{$_} = 1; } foreach (@buf_potfiles_ignore_sorted) { s#^$SRCDIR/../##; s#^$SRCDIR/##; $in2{$_} = 1; } my @result; foreach (@buf_allfiles_sorted) { my $dummy = $_; my $srcdir = $SRCDIR; $srcdir =~ s#^../##; $dummy =~ s#^$srcdir/../##; $dummy =~ s#^$srcdir/##; $dummy =~ s#_build/##; if (!exists($in2{$dummy})) { push @result, $dummy } } my @buf_potfiles_notexist; foreach (@buf_potfiles_sorted) { chomp (my $dummy = $_); if ("$dummy" ne "" and !(-f "$SRCDIR/../$dummy" or -f "../$dummy")) { push @buf_potfiles_notexist, $_; } } ## Save file with information about the files missing ## if any, and give information about this procedure. if (@result + @buf_potfiles_notexist > 0) { if (@result) { print "\n" if $VERBOSE; unlink "missing"; open OUT, ">missing"; print OUT @result; close OUT; warn "\e[1mThe following files contain translations and are currently not in use. Please\e[0m\n". "\e[1mconsider adding these to the POTFILES.in file, located in the po/ directory.\e[0m\n\n"; print STDERR @result, "\n"; warn "If some of these files are left out on purpose then please add them to\n". "POTFILES.skip instead of POTFILES.in. A file \e[1m'missing'\e[0m containing this list\n". "of left out files has been written in the current directory.\n"; } if (@buf_potfiles_notexist) { unlink "notexist"; open OUT, ">notexist"; print OUT @buf_potfiles_notexist; close OUT; warn "\n" if ($VERBOSE or @result); warn "\e[1mThe following files do not exist anymore:\e[0m\n\n"; warn @buf_potfiles_notexist, "\n"; warn "Please remove them from POTFILES.in. A file \e[1m'notexist'\e[0m\n". "containing this list of absent files has been written in the current directory.\n"; } } ## If there is nothing to complain about, notify the user else { print "\nAll files containing translations are present in POTFILES.in.\n" if $VERBOSE; } } sub Console_WriteError_InvalidOption { ## Handle invalid arguments print STDERR "Try `${PROGRAM} --help' for more information.\n"; exit 1; } sub isProgramInPath { my ($file) = @_; # If either a file exists, or when run it returns 0 exit status return 1 if ((-x $file) or (system("$file --version >$devnull") == 0)); return 0; } sub isGNUGettextTool { my ($file) = @_; # Check that we are using GNU gettext tools if (isProgramInPath ($file)) { my $version = `$file --version`; return 1 if ($version =~ m/.*\(GNU .*\).*/); } return 0; } sub GenerateHeaders { my $EXTRACT = $ENV{"INTLTOOL_EXTRACT"} || "intltool-extract"; ## Generate the .h header files, so we can allow glade and ## xml translation support if (! isProgramInPath ("$EXTRACT")) { print STDERR "\n *** The intltool-extract script wasn't found!" ."\n *** Without it, intltool-update can not generate files.\n"; exit; } else { open (FILE, $POTFILES_in) or die "$PROGRAM: POTFILES.in not found.\n"; while () { chomp; next if /^\[\s*encoding/; ## Find xml files in POTFILES.in and generate the ## files with help from the extract script my $gettext_type= &POFile_DetermineType ($1); if (/\.($xml_support|$ini_support)$/ || /^\[/) { s/^\[[^\[].*]\s*//; my $filename = "../$_"; if ($VERBOSE) { system ($EXTRACT, "--update", "--srcdir=$SRCDIR", "--type=$gettext_type", $filename); } else { system ($EXTRACT, "--update", "--type=$gettext_type", "--srcdir=$SRCDIR", "--quiet", $filename); } } } close FILE; } } # # Generate .pot file from POTFILES.in # sub GeneratePOTemplate { my $XGETTEXT = $ENV{"XGETTEXT"} || "xgettext"; my $XGETTEXT_ARGS = $ENV{"XGETTEXT_ARGS"} || ''; chomp $XGETTEXT; if (! isGNUGettextTool ("$XGETTEXT")) { print STDERR " *** GNU xgettext is not found on this system!\n". " *** Without it, intltool-update can not extract strings.\n"; exit; } print "Building $MODULE.pot...\n" if $VERBOSE; open INFILE, $POTFILES_in; unlink "POTFILES.in.temp"; open OUTFILE, ">POTFILES.in.temp" or die("Cannot open POTFILES.in.temp for writing"); my $gettext_support_nonascii = 0; # checks for GNU gettext >= 0.12 my $dummy = `$XGETTEXT --version --from-code=UTF-8 >$devnull 2>$devnull`; if ($? == 0) { $gettext_support_nonascii = 1; } else { # urge everybody to upgrade gettext print STDERR "WARNING: This version of gettext does not support extracting non-ASCII\n". " strings. That means you should install a version of gettext\n". " that supports non-ASCII strings (such as GNU gettext >= 0.12),\n". " or have to let non-ASCII strings untranslated. (If there is any)\n"; } my $encoding = "ASCII"; my $forced_gettext_code; my @temp_headers; my $encoding_problem_is_reported = 0; while () { next if (/^#/ or /^\s*$/); chomp; my $gettext_code; if (/^\[\s*encoding:\s*(.*)\s*\]/) { $forced_gettext_code=$1; } elsif (/\.($xml_support|$ini_support)$/ || /^\[/) { s/^\[.*]\s*//; print OUTFILE "../$_.h\n"; push @temp_headers, "../$_.h"; $gettext_code = &TextFile_DetermineEncoding ("../$_.h") if ($gettext_support_nonascii and not defined $forced_gettext_code); } else { print OUTFILE "$SRCDIR/../$_\n"; $gettext_code = &TextFile_DetermineEncoding ("$SRCDIR/../$_") if ($gettext_support_nonascii and not defined $forced_gettext_code); } next if (! $gettext_support_nonascii); if (defined $forced_gettext_code) { $encoding=$forced_gettext_code; } elsif (defined $gettext_code and "$encoding" ne "$gettext_code") { if ($encoding eq "ASCII") { $encoding=$gettext_code; } elsif ($gettext_code ne "ASCII") { # Only report once because the message is quite long if (! $encoding_problem_is_reported) { print STDERR "WARNING: You should use the same file encoding for all your project files,\n". " but $PROGRAM thinks that most of the source files are in\n". " $encoding encoding, while \"$_\" is (likely) in\n". " $gettext_code encoding. If you are sure that all translatable strings\n". " are in same encoding (say UTF-8), please \e[1m*prepend*\e[0m the following\n". " line to POTFILES.in:\n\n". " [encoding: UTF-8]\n\n". " and make sure that configure.in/ac checks for $PACKAGE >= 0.27 .\n". "(such warning message will only be reported once.)\n"; $encoding_problem_is_reported = 1; } } } } close OUTFILE; close INFILE; unlink "$MODULE.pot"; my @xgettext_argument=("$XGETTEXT", "--add-comments", "--directory\=.", "--default-domain\=$MODULE", "--flag\=g_strdup_printf:1:c-format", "--flag\=g_string_printf:2:c-format", "--flag\=g_string_append_printf:2:c-format", "--flag\=g_error_new:3:c-format", "--flag\=g_set_error:4:c-format", "--flag\=g_markup_printf_escaped:1:c-format", "--flag\=g_log:3:c-format", "--flag\=g_print:1:c-format", "--flag\=g_printerr:1:c-format", "--flag\=g_printf:1:c-format", "--flag\=g_fprintf:2:c-format", "--flag\=g_sprintf:2:c-format", "--flag\=g_snprintf:3:c-format", "--flag\=g_scanner_error:2:c-format", "--flag\=g_scanner_warn:2:c-format", "--output\=$MODULE\.pot", "--files-from\=\.\/POTFILES\.in\.temp"); my $XGETTEXT_KEYWORDS = &FindPOTKeywords; push @xgettext_argument, $XGETTEXT_KEYWORDS; my $MSGID_BUGS_ADDRESS = &FindMakevarsBugAddress; push @xgettext_argument, "--msgid-bugs-address\=\"$MSGID_BUGS_ADDRESS\"" if $MSGID_BUGS_ADDRESS; push @xgettext_argument, "--from-code\=$encoding" if ($gettext_support_nonascii); push @xgettext_argument, $XGETTEXT_ARGS if $XGETTEXT_ARGS; my $xgettext_command = join ' ', @xgettext_argument; # intercept xgettext error message print "Running $xgettext_command\n" if $VERBOSE; my $xgettext_error_msg = `$xgettext_command 2>\&1`; my $command_failed = $?; unlink "POTFILES.in.temp"; print "Removing generated header (.h) files..." if $VERBOSE; unlink foreach (@temp_headers); print "done.\n" if $VERBOSE; if (! $command_failed) { if (! -e "$MODULE.pot") { print "None of the files in POTFILES.in contain strings marked for translation.\n" if $VERBOSE; } else { print "Wrote $MODULE.pot\n" if $VERBOSE; } } else { if ($xgettext_error_msg =~ /--from-code/) { # replace non-ASCII error message with a more useful one. print STDERR "ERROR: xgettext failed to generate PO template file because there is non-ASCII\n". " string marked for translation. Please make sure that all strings marked\n". " for translation are in uniform encoding (say UTF-8), then \e[1m*prepend*\e[0m the\n". " following line to POTFILES.in and rerun $PROGRAM:\n\n". " [encoding: UTF-8]\n\n"; } else { print STDERR "$xgettext_error_msg"; if (-e "$MODULE.pot") { # is this possible? print STDERR "ERROR: xgettext failed but still managed to generate PO template file.\n". " Please consult error message above if there is any.\n"; } else { print STDERR "ERROR: xgettext failed to generate PO template file. Please consult\n". " error message above if there is any.\n"; } } exit (1); } } sub POFile_Update { -f "$MODULE.pot" or die "$PROGRAM: $MODULE.pot does not exist.\n"; my $MSGMERGE = $ENV{"MSGMERGE"} || "msgmerge"; my ($lang, $outfile) = @_; if (! isGNUGettextTool ("$MSGMERGE")) { print STDERR " *** GNU msgmerge is not found on this system!\n". " *** Without it, intltool-update can not extract strings.\n"; exit; } print "Merging $SRCDIR/$lang.po with $MODULE.pot..." if $VERBOSE; my $infile = "$SRCDIR/$lang.po"; $outfile = "$SRCDIR/$lang.po" if ($outfile eq ""); # I think msgmerge won't overwrite old file if merge is not successful system ("$MSGMERGE", "-o", $outfile, $infile, "$MODULE.pot"); } sub Console_WriteError_NotExisting { my ($file) = @_; ## Report error if supplied language file is non-existing print STDERR "$PROGRAM: $file does not exist!\n"; print STDERR "Try '$PROGRAM --help' for more information.\n"; exit; } sub GatherPOFiles { my @po_files = glob ("./*.po"); @languages = map (&POFile_GetLanguage, @po_files); foreach my $lang (@languages) { $po_files_by_lang{$lang} = shift (@po_files); } } sub POFile_GetLanguage ($) { s/^(.*\/)?(.+)\.po$/$2/; return $_; } sub Console_Write_TranslationStatus { my ($lang, $output_file) = @_; my $MSGFMT = $ENV{"MSGFMT"} || "msgfmt"; if (! isGNUGettextTool ("$MSGFMT")) { print STDERR " *** GNU msgfmt is not found on this system!\n". " *** Without it, intltool-update can not extract strings.\n"; exit; } $output_file = "$SRCDIR/$lang.po" if ($output_file eq ""); system ("$MSGFMT", "-o", "$devnull", "--verbose", $output_file); } sub Console_Write_CoverageReport { my $MSGFMT = $ENV{"MSGFMT"} || "msgfmt"; if (! isGNUGettextTool ("$MSGFMT")) { print STDERR " *** GNU msgfmt is not found on this system!\n". " *** Without it, intltool-update can not extract strings.\n"; exit; } &GatherPOFiles; foreach my $lang (@languages) { print STDERR "$lang: "; &POFile_Update ($lang, ""); } print STDERR "\n\n * Current translation support in $MODULE \n\n"; foreach my $lang (@languages) { print STDERR "$lang: "; system ("$MSGFMT", "-o", "$devnull", "--verbose", "$SRCDIR/$lang.po"); } } sub SubstituteVariable { my ($str) = @_; # always need to rewind file whenever it has been accessed seek (CONF, 0, 0); # cache each variable. varhash is global to we can add # variables elsewhere. while () { if (/^(\w+)=(.*)$/) { ($varhash{$1} = $2) =~ s/^["'](.*)["']$/$1/; } } if ($str =~ /^(.*)\${?([A-Z_]+)}?(.*)$/) { my $rest = $3; my $untouched = $1; my $sub = ""; # Ignore recursive definitions of variables $sub = $varhash{$2} if defined $varhash{$2} and $varhash{$2} !~ /\${?$2}?/; return SubstituteVariable ("$untouched$sub$rest"); } # We're using Perl backticks ` and "echo -n" here in order to # expand any shell escapes (such as backticks themselves) in every variable return echo_n ($str); } sub CONF_Handle_Open { my $base_dirname = getcwd(); $base_dirname =~ s@.*/@@; my ($conf_in, $src_dir); if ($base_dirname =~ /^po(-.+)?$/) { if (-f "Makevars") { my $makefile_source; local (*IN); open (IN, ") { if (/^top_builddir[ \t]*=/) { $src_dir = $_; $src_dir =~ s/^top_builddir[ \t]*=[ \t]*([^ \t\n\r]*)/$1/; chomp $src_dir; if (-f "$src_dir" . "/configure.ac") { $conf_in = "$src_dir" . "/configure.ac" . "\n"; } else { $conf_in = "$src_dir" . "/configure.in" . "\n"; } last; } } close IN; $conf_in || die "Cannot find top_builddir in Makevars."; } elsif (-f "$SRCDIR/../configure.ac") { $conf_in = "$SRCDIR/../configure.ac"; } elsif (-f "$SRCDIR/../configure.in") { $conf_in = "$SRCDIR/../configure.in"; } else { my $makefile_source; local (*IN); open (IN, ") { if (/^top_srcdir[ \t]*=/) { $src_dir = $_; $src_dir =~ s/^top_srcdir[ \t]*=[ \t]*([^ \t\n\r]*)/$1/; chomp $src_dir; $conf_in = "$src_dir" . "/configure.in" . "\n"; last; } } close IN; $conf_in || die "Cannot find top_srcdir in Makefile."; } open (CONF, "<$conf_in"); } else { print STDERR "$PROGRAM: Unable to proceed.\n" . "Make sure to run this script inside the po directory.\n"; exit; } } sub FindPackageName { my $version; my $domain = &FindMakevarsDomain; my $name = $domain || "untitled"; &CONF_Handle_Open; my $conf_source; { local (*IN); open (IN, "<&CONF") || return $name; seek (IN, 0, 0); local $/; # slurp mode $conf_source = ; close IN; } # priority for getting package name: # 1. GETTEXT_PACKAGE # 2. first argument of AC_INIT (with >= 2 arguments) # 3. first argument of AM_INIT_AUTOMAKE (with >= 2 argument) # /^AM_INIT_AUTOMAKE\([\s\[]*([^,\)\s\]]+)/m # the \s makes this not work, why? if ($conf_source =~ /^AM_INIT_AUTOMAKE\(([^,\)]+),([^,\)]+)/m) { ($name, $version) = ($1, $2); $name =~ s/[\[\]\s]//g; $version =~ s/[\[\]\s]//g; $varhash{"PACKAGE_NAME"} = $name if (not $name =~ /\${?AC_PACKAGE_NAME}?/); $varhash{"PACKAGE"} = $name if (not $name =~ /\${?PACKAGE}?/); $varhash{"PACKAGE_VERSION"} = $version if (not $name =~ /\${?AC_PACKAGE_VERSION}?/); $varhash{"VERSION"} = $version if (not $name =~ /\${?VERSION}?/); } if ($conf_source =~ /^AC_INIT\(([^,\)]+),([^,\)]+)/m) { ($name, $version) = ($1, $2); $name =~ s/[\[\]\s]//g; $version =~ s/[\[\]\s]//g; $varhash{"PACKAGE_NAME"} = $name if (not $name =~ /\${?AC_PACKAGE_NAME}?/); $varhash{"PACKAGE"} = $name if (not $name =~ /\${?PACKAGE}?/); $varhash{"PACKAGE_VERSION"} = $version if (not $name =~ /\${?AC_PACKAGE_VERSION}?/); $varhash{"VERSION"} = $version if (not $name =~ /\${?VERSION}?/); } # \s makes this not work, why? $name = $1 if $conf_source =~ /^GETTEXT_PACKAGE=\[?([^\n\]]+)/m; # m4 macros AC_PACKAGE_NAME, AC_PACKAGE_VERSION etc. have same value # as corresponding $PACKAGE_NAME, $PACKAGE_VERSION etc. shell variables. $name =~ s/\bAC_PACKAGE_/\$PACKAGE_/g; $name = $domain if $domain; $name = SubstituteVariable ($name); $name =~ s/^["'](.*)["']$/$1/; return $name if $name; } sub FindPOTKeywords { my $keywords = "--keyword\=\_ --keyword\=N\_ --keyword\=U\_ --keyword\=Q\_"; my $varname = "XGETTEXT_OPTIONS"; my $make_source; { local (*IN); open (IN, "; close IN; } # unwrap lines split with a trailing \ $make_source =~ s/\\ $ \n/ /mxg; $keywords = $1 if $make_source =~ /^$varname[ ]*=\[?([^\n\]]+)/m; return $keywords; } sub FindMakevarsDomain { my $domain = ""; my $makevars_source; { local (*IN); open (IN, "; close IN; } $domain = $1 if $makevars_source =~ /^DOMAIN[ ]*=\[?([^\n\]\$]+)/m; $domain =~ s/^\s+//; $domain =~ s/\s+$//; return $domain; } sub FindMakevarsBugAddress { my $address = ""; my $makevars_source; { local (*IN); open (IN, "; close IN; } $address = $1 if $makevars_source =~ /^MSGID_BUGS_ADDRESS[ ]*=\[?([^\n\]\$]+)/m; $address =~ s/^\s+//; $address =~ s/\s+$//; return $address; } parcellite-1.2.1/intltool-merge.in0000644000175000017500000011474613041603201015235 0ustar hlehle#!@INTLTOOL_PERL@ -w # -*- Mode: perl; indent-tabs-mode: nil; c-basic-offset: 4 -*- # # The Intltool Message Merger # # Copyright (C) 2000, 2003 Free Software Foundation. # Copyright (C) 2000, 2001 Eazel, Inc # # Intltool is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # version 2 published by the Free Software Foundation. # # Intltool is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # # Authors: Maciej Stachowiak # Kenneth Christiansen # Darin Adler # # Proper XML UTF-8'ification written by Cyrille Chepelov # ## Release information my $PROGRAM = "intltool-merge"; my $PACKAGE = "intltool"; my $VERSION = "0.37.1"; ## Loaded modules use strict; use Getopt::Long; use Text::Wrap; use File::Basename; my $must_end_tag = -1; my $last_depth = -1; my $translation_depth = -1; my @tag_stack = (); my @entered_tag = (); my @translation_strings = (); my $leading_space = ""; ## Scalars used by the option stuff my $HELP_ARG = 0; my $VERSION_ARG = 0; my $BA_STYLE_ARG = 0; my $XML_STYLE_ARG = 0; my $KEYS_STYLE_ARG = 0; my $DESKTOP_STYLE_ARG = 0; my $SCHEMAS_STYLE_ARG = 0; my $RFC822DEB_STYLE_ARG = 0; my $QUOTED_STYLE_ARG = 0; my $QUOTEDXML_STYLE_ARG = 0; my $QUIET_ARG = 0; my $PASS_THROUGH_ARG = 0; my $UTF8_ARG = 0; my $MULTIPLE_OUTPUT = 0; my $cache_file; ## Handle options GetOptions ( "help" => \$HELP_ARG, "version" => \$VERSION_ARG, "quiet|q" => \$QUIET_ARG, "oaf-style|o" => \$BA_STYLE_ARG, ## for compatibility "ba-style|b" => \$BA_STYLE_ARG, "xml-style|x" => \$XML_STYLE_ARG, "keys-style|k" => \$KEYS_STYLE_ARG, "desktop-style|d" => \$DESKTOP_STYLE_ARG, "schemas-style|s" => \$SCHEMAS_STYLE_ARG, "rfc822deb-style|r" => \$RFC822DEB_STYLE_ARG, "quoted-style" => \$QUOTED_STYLE_ARG, "quotedxml-style" => \$QUOTEDXML_STYLE_ARG, "pass-through|p" => \$PASS_THROUGH_ARG, "utf8|u" => \$UTF8_ARG, "multiple-output|m" => \$MULTIPLE_OUTPUT, "cache|c=s" => \$cache_file ) or &error; my $PO_DIR; my $FILE; my $OUTFILE; my %po_files_by_lang = (); my %translations = (); my $iconv = $ENV{"ICONV"} || "iconv"; my $devnull = ($^O eq 'MSWin32' ? 'NUL:' : '/dev/null'); sub isProgramInPath { my ($file) = @_; # If either a file exists, or when run it returns 0 exit status return 1 if ((-x $file) or (system("$file -l >$devnull") == 0)); return 0; } if (! isProgramInPath ("$iconv")) { print STDERR " *** iconv is not found on this system!\n". " *** Without it, intltool-merge can not convert encodings.\n"; exit; } # Use this instead of \w for XML files to handle more possible characters. my $w = "[-A-Za-z0-9._:]"; # XML quoted string contents my $q = "[^\\\"]*"; ## Check for options. if ($VERSION_ARG) { &print_version; } elsif ($HELP_ARG) { &print_help; } elsif ($BA_STYLE_ARG && @ARGV > 2) { &utf8_sanity_check; &preparation; &print_message; &ba_merge_translations; &finalize; } elsif ($XML_STYLE_ARG && @ARGV > 2) { &utf8_sanity_check; &preparation; &print_message; &xml_merge_output; &finalize; } elsif ($KEYS_STYLE_ARG && @ARGV > 2) { &utf8_sanity_check; &preparation; &print_message; &keys_merge_translations; &finalize; } elsif ($DESKTOP_STYLE_ARG && @ARGV > 2) { &utf8_sanity_check; &preparation; &print_message; &desktop_merge_translations; &finalize; } elsif ($SCHEMAS_STYLE_ARG && @ARGV > 2) { &utf8_sanity_check; &preparation; &print_message; &schemas_merge_translations; &finalize; } elsif ($RFC822DEB_STYLE_ARG && @ARGV > 2) { &preparation; &print_message; &rfc822deb_merge_translations; &finalize; } elsif (($QUOTED_STYLE_ARG || $QUOTEDXML_STYLE_ARG) && @ARGV > 2) { &utf8_sanity_check; &preparation; &print_message; "ed_merge_translations($QUOTEDXML_STYLE_ARG); &finalize; } else { &print_help; } exit; ## Sub for printing release information sub print_version { print <<_EOF_; ${PROGRAM} (${PACKAGE}) ${VERSION} Written by Maciej Stachowiak, Darin Adler and Kenneth Christiansen. Copyright (C) 2000-2003 Free Software Foundation, Inc. Copyright (C) 2000-2001 Eazel, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. _EOF_ exit; } ## Sub for printing usage information sub print_help { print <<_EOF_; Usage: ${PROGRAM} [OPTION]... PO_DIRECTORY FILENAME OUTPUT_FILE Generates an output file that includes some localized attributes from an untranslated source file. Mandatory options: (exactly one must be specified) -b, --ba-style includes translations in the bonobo-activation style -d, --desktop-style includes translations in the desktop style -k, --keys-style includes translations in the keys style -s, --schemas-style includes translations in the schemas style -r, --rfc822deb-style includes translations in the RFC822 style --quoted-style includes translations in the quoted string style --quotedxml-style includes translations in the quoted xml string style -x, --xml-style includes translations in the standard xml style Other options: -u, --utf8 convert all strings to UTF-8 before merging (default for everything except RFC822 style) -p, --pass-through deprecated, does nothing and issues a warning -m, --multiple-output output one localized file per locale, instead of a single file containing all localized elements -c, --cache=FILE specify cache file name (usually \$top_builddir/po/.intltool-merge-cache) -q, --quiet suppress most messages --help display this help and exit --version output version information and exit Report bugs to http://bugzilla.gnome.org/ (product name "$PACKAGE") or send email to . _EOF_ exit; } ## Sub for printing error messages sub print_error { print STDERR "Try `${PROGRAM} --help' for more information.\n"; exit; } sub print_message { print "Merging translations into $OUTFILE.\n" unless $QUIET_ARG; } sub preparation { $PO_DIR = $ARGV[0]; $FILE = $ARGV[1]; $OUTFILE = $ARGV[2]; &gather_po_files; &get_translation_database; } # General-purpose code for looking up translations in .po files sub po_file2lang { my ($tmp) = @_; $tmp =~ s/^.*\/(.*)\.po$/$1/; return $tmp; } sub gather_po_files { if (my $linguas = $ENV{"LINGUAS"}) { for my $lang (split / /, $linguas) { my $po_file = $PO_DIR . "/" . $lang . ".po"; if (-e $po_file) { $po_files_by_lang{$lang} = $po_file; } } } else { if (open LINGUAS_FILE, "$PO_DIR/LINGUAS") { while () { next if /^#/; for my $lang (split) { chomp ($lang); my $po_file = $PO_DIR . "/" . $lang . ".po"; if (-e $po_file) { $po_files_by_lang{$lang} = $po_file; } } } close LINGUAS_FILE; } else { for my $po_file (glob "$PO_DIR/*.po") { $po_files_by_lang{po_file2lang($po_file)} = $po_file; } } } } sub get_local_charset { my ($encoding) = @_; my $alias_file = $ENV{"G_CHARSET_ALIAS"} || "@INTLTOOL_LIBDIR@/charset.alias"; # seek character encoding aliases in charset.alias (glib) if (open CHARSET_ALIAS, $alias_file) { while () { next if /^\#/; return $1 if (/^\s*([-._a-zA-Z0-9]+)\s+$encoding\b/i) } close CHARSET_ALIAS; } # if not found, return input string return $encoding; } sub get_po_encoding { my ($in_po_file) = @_; my $encoding = ""; open IN_PO_FILE, $in_po_file or die; while () { ## example: "Content-Type: text/plain; charset=ISO-8859-1\n" if (/Content-Type\:.*charset=([-a-zA-Z0-9]+)\\n/) { $encoding = $1; last; } } close IN_PO_FILE; if (!$encoding) { print STDERR "Warning: no encoding found in $in_po_file. Assuming ISO-8859-1\n" unless $QUIET_ARG; $encoding = "ISO-8859-1"; } system ("$iconv -f $encoding -t UTF-8 <$devnull 2>$devnull"); if ($?) { $encoding = get_local_charset($encoding); } return $encoding } sub utf8_sanity_check { print STDERR "Warning: option --pass-through has been removed.\n" if $PASS_THROUGH_ARG; $UTF8_ARG = 1; } sub get_translation_database { if ($cache_file) { &get_cached_translation_database; } else { &create_translation_database; } } sub get_newest_po_age { my $newest_age; foreach my $file (values %po_files_by_lang) { my $file_age = -M $file; $newest_age = $file_age if !$newest_age || $file_age < $newest_age; } $newest_age = 0 if !$newest_age; return $newest_age; } sub create_cache { print "Generating and caching the translation database\n" unless $QUIET_ARG; &create_translation_database; open CACHE, ">$cache_file" || die; print CACHE join "\x01", %translations; close CACHE; } sub load_cache { print "Found cached translation database\n" unless $QUIET_ARG; my $contents; open CACHE, "<$cache_file" || die; { local $/; $contents = ; } close CACHE; %translations = split "\x01", $contents; } sub get_cached_translation_database { my $cache_file_age = -M $cache_file; if (defined $cache_file_age) { if ($cache_file_age <= &get_newest_po_age) { &load_cache; return; } print "Found too-old cached translation database\n" unless $QUIET_ARG; } &create_cache; } sub create_translation_database { for my $lang (keys %po_files_by_lang) { my $po_file = $po_files_by_lang{$lang}; if ($UTF8_ARG) { my $encoding = get_po_encoding ($po_file); if (lc $encoding eq "utf-8") { open PO_FILE, "<$po_file"; } else { print "NOTICE: $po_file is not in UTF-8 but $encoding, converting...\n" unless $QUIET_ARG;; open PO_FILE, "$iconv -f $encoding -t UTF-8 $po_file|"; } } else { open PO_FILE, "<$po_file"; } my $nextfuzzy = 0; my $inmsgid = 0; my $inmsgstr = 0; my $msgid = ""; my $msgstr = ""; while () { $nextfuzzy = 1 if /^#, fuzzy/; if (/^msgid "((\\.|[^\\]+)*)"/ ) { $translations{$lang, $msgid} = $msgstr if $inmsgstr && $msgid && $msgstr; $msgid = ""; $msgstr = ""; if ($nextfuzzy) { $inmsgid = 0; } else { $msgid = unescape_po_string($1); $inmsgid = 1; } $inmsgstr = 0; $nextfuzzy = 0; } if (/^msgstr "((\\.|[^\\]+)*)"/) { $msgstr = unescape_po_string($1); $inmsgstr = 1; $inmsgid = 0; } if (/^"((\\.|[^\\]+)*)"/) { $msgid .= unescape_po_string($1) if $inmsgid; $msgstr .= unescape_po_string($1) if $inmsgstr; } } $translations{$lang, $msgid} = $msgstr if $inmsgstr && $msgid && $msgstr; } } sub finalize { } sub unescape_one_sequence { my ($sequence) = @_; return "\\" if $sequence eq "\\\\"; return "\"" if $sequence eq "\\\""; return "\n" if $sequence eq "\\n"; return "\r" if $sequence eq "\\r"; return "\t" if $sequence eq "\\t"; return "\b" if $sequence eq "\\b"; return "\f" if $sequence eq "\\f"; return "\a" if $sequence eq "\\a"; return chr(11) if $sequence eq "\\v"; # vertical tab, see ascii(7) return chr(hex($1)) if ($sequence =~ /\\x([0-9a-fA-F]{2})/); return chr(oct($1)) if ($sequence =~ /\\([0-7]{3})/); # FIXME: Is \0 supported as well? Kenneth and Rodney don't want it, see bug #48489 return $sequence; } sub unescape_po_string { my ($string) = @_; $string =~ s/(\\x[0-9a-fA-F]{2}|\\[0-7]{3}|\\.)/unescape_one_sequence($1)/eg; return $string; } sub entity_decode { local ($_) = @_; s/'/'/g; # ' s/"/"/g; # " s/<//g; s/&/&/g; return $_; } # entity_encode: (string) # # Encode the given string to XML format (encode '<' etc). sub entity_encode { my ($pre_encoded) = @_; my @list_of_chars = unpack ('C*', $pre_encoded); # with UTF-8 we only encode minimalistic return join ('', map (&entity_encode_int_minimalist, @list_of_chars)); } sub entity_encode_int_minimalist { return """ if $_ == 34; return "&" if $_ == 38; return "'" if $_ == 39; return "<" if $_ == 60; return ">" if $_ == 62; return chr $_; } sub entity_encoded_translation { my ($lang, $string) = @_; my $translation = $translations{$lang, $string}; return $string if !$translation; return entity_encode ($translation); } ## XML (bonobo-activation specific) merge code sub ba_merge_translations { my $source; { local $/; # slurp mode open INPUT, "<$FILE" or die "can't open $FILE: $!"; $source = ; close INPUT; } open OUTPUT, ">$OUTFILE" or die "can't open $OUTFILE: $!"; # Binmode so that selftest works ok if using a native Win32 Perl... binmode (OUTPUT) if $^O eq 'MSWin32'; while ($source =~ s|^(.*?)([ \t]*<\s*$w+\s+($w+\s*=\s*"$q"\s*)+/?>)([ \t]*\n)?||s) { print OUTPUT $1; my $node = $2 . "\n"; my @strings = (); $_ = $node; while (s/(\s)_($w+\s*=\s*"($q)")/$1$2/s) { push @strings, entity_decode($3); } print OUTPUT; my %langs; for my $string (@strings) { for my $lang (keys %po_files_by_lang) { $langs{$lang} = 1 if $translations{$lang, $string}; } } for my $lang (sort keys %langs) { $_ = $node; s/(\sname\s*=\s*)"($q)"/$1"$2-$lang"/s; s/(\s)_($w+\s*=\s*")($q)"/$1 . $2 . entity_encoded_translation($lang, $3) . '"'/seg; print OUTPUT; } } print OUTPUT $source; close OUTPUT; } ## XML (non-bonobo-activation) merge code # Process tag attributes # Only parameter is a HASH containing attributes -> values mapping sub getAttributeString { my $sub = shift; my $do_translate = shift || 0; my $language = shift || ""; my $result = ""; my $translate = shift; foreach my $e (reverse(sort(keys %{ $sub }))) { my $key = $e; my $string = $sub->{$e}; my $quote = '"'; $string =~ s/^[\s]+//; $string =~ s/[\s]+$//; if ($string =~ /^'.*'$/) { $quote = "'"; } $string =~ s/^['"]//g; $string =~ s/['"]$//g; if ($do_translate && $key =~ /^_/) { $key =~ s|^_||g; if ($language) { # Handle translation my $decode_string = entity_decode($string); my $translation = $translations{$language, $decode_string}; if ($translation) { $translation = entity_encode($translation); $string = $translation; } $$translate = 2; } else { $$translate = 2 if ($translate && (!$$translate)); # watch not to "overwrite" $translate } } $result .= " $key=$quote$string$quote"; } return $result; } # Returns a translatable string from XML node, it works on contents of every node in XML::Parser tree sub getXMLstring { my $ref = shift; my $spacepreserve = shift || 0; my @list = @{ $ref }; my $result = ""; my $count = scalar(@list); my $attrs = $list[0]; my $index = 1; $spacepreserve = 1 if ((exists $attrs->{"xml:space"}) && ($attrs->{"xml:space"} =~ /^["']?preserve["']?$/)); $spacepreserve = 0 if ((exists $attrs->{"xml:space"}) && ($attrs->{"xml:space"} =~ /^["']?default["']?$/)); while ($index < $count) { my $type = $list[$index]; my $content = $list[$index+1]; if (! $type ) { # We've got CDATA if ($content) { # lets strip the whitespace here, and *ONLY* here $content =~ s/\s+/ /gs if (!$spacepreserve); $result .= $content; } } elsif ( "$type" ne "1" ) { # We've got another element $result .= "<$type"; $result .= getAttributeString(@{$content}[0], 0); # no nested translatable elements if ($content) { my $subresult = getXMLstring($content, $spacepreserve); if ($subresult) { $result .= ">".$subresult . ""; } else { $result .= "/>"; } } else { $result .= "/>"; } } $index += 2; } return $result; } # Translate list of nodes if necessary sub translate_subnodes { my $fh = shift; my $content = shift; my $language = shift || ""; my $singlelang = shift || 0; my $spacepreserve = shift || 0; my @nodes = @{ $content }; my $count = scalar(@nodes); my $index = 0; while ($index < $count) { my $type = $nodes[$index]; my $rest = $nodes[$index+1]; if ($singlelang) { my $oldMO = $MULTIPLE_OUTPUT; $MULTIPLE_OUTPUT = 1; traverse($fh, $type, $rest, $language, $spacepreserve); $MULTIPLE_OUTPUT = $oldMO; } else { traverse($fh, $type, $rest, $language, $spacepreserve); } $index += 2; } } sub isWellFormedXmlFragment { my $ret = eval 'require XML::Parser'; if(!$ret) { die "You must have XML::Parser installed to run $0\n\n"; } my $fragment = shift; return 0 if (!$fragment); $fragment = "$fragment"; my $xp = new XML::Parser(Style => 'Tree'); my $tree = 0; eval { $tree = $xp->parse($fragment); }; return $tree; } sub traverse { my $fh = shift; my $nodename = shift; my $content = shift; my $language = shift || ""; my $spacepreserve = shift || 0; if (!$nodename) { if ($content =~ /^[\s]*$/) { $leading_space .= $content; } print $fh $content; } else { # element my @all = @{ $content }; my $attrs = shift @all; my $translate = 0; my $outattr = getAttributeString($attrs, 1, $language, \$translate); if ($nodename =~ /^_/) { $translate = 1; $nodename =~ s/^_//; } my $lookup = ''; $spacepreserve = 0 if ((exists $attrs->{"xml:space"}) && ($attrs->{"xml:space"} =~ /^["']?default["']?$/)); $spacepreserve = 1 if ((exists $attrs->{"xml:space"}) && ($attrs->{"xml:space"} =~ /^["']?preserve["']?$/)); print $fh "<$nodename", $outattr; if ($translate) { $lookup = getXMLstring($content, $spacepreserve); if (!$spacepreserve) { $lookup =~ s/^\s+//s; $lookup =~ s/\s+$//s; } if ($lookup || $translate == 2) { my $translation = $translations{$language, $lookup} if isWellFormedXmlFragment($translations{$language, $lookup}); if ($MULTIPLE_OUTPUT && ($translation || $translate == 2)) { $translation = $lookup if (!$translation); print $fh " xml:lang=\"", $language, "\"" if $language; print $fh ">"; if ($translate == 2) { translate_subnodes($fh, \@all, $language, 1, $spacepreserve); } else { print $fh $translation; } print $fh ""; return; # this means there will be no same translation with xml:lang="$language"... # if we want them both, just remove this "return" } else { print $fh ">"; if ($translate == 2) { translate_subnodes($fh, \@all, $language, 1, $spacepreserve); } else { print $fh $lookup; } print $fh ""; } } else { print $fh "/>"; } for my $lang (sort keys %po_files_by_lang) { if ($MULTIPLE_OUTPUT && $lang ne "$language") { next; } if ($lang) { # Handle translation # my $translate = 0; my $localattrs = getAttributeString($attrs, 1, $lang, \$translate); my $translation = $translations{$lang, $lookup} if isWellFormedXmlFragment($translations{$lang, $lookup}); if ($translate && !$translation) { $translation = $lookup; } if ($translation || $translate) { print $fh "\n"; $leading_space =~ s/.*\n//g; print $fh $leading_space; print $fh "<", $nodename, " xml:lang=\"", $lang, "\"", $localattrs, ">"; if ($translate == 2) { translate_subnodes($fh, \@all, $lang, 1, $spacepreserve); } else { print $fh $translation; } print $fh ""; } } } } else { my $count = scalar(@all); if ($count > 0) { print $fh ">"; my $index = 0; while ($index < $count) { my $type = $all[$index]; my $rest = $all[$index+1]; traverse($fh, $type, $rest, $language, $spacepreserve); $index += 2; } print $fh ""; } else { print $fh "/>"; } } } } sub intltool_tree_comment { my $expat = shift; my $data = shift; my $clist = $expat->{Curlist}; my $pos = $#$clist; push @$clist, 1 => $data; } sub intltool_tree_cdatastart { my $expat = shift; my $clist = $expat->{Curlist}; my $pos = $#$clist; push @$clist, 0 => $expat->original_string(); } sub intltool_tree_cdataend { my $expat = shift; my $clist = $expat->{Curlist}; my $pos = $#$clist; $clist->[$pos] .= $expat->original_string(); } sub intltool_tree_char { my $expat = shift; my $text = shift; my $clist = $expat->{Curlist}; my $pos = $#$clist; # Use original_string so that we retain escaped entities # in CDATA sections. # if ($pos > 0 and $clist->[$pos - 1] eq '0') { $clist->[$pos] .= $expat->original_string(); } else { push @$clist, 0 => $expat->original_string(); } } sub intltool_tree_start { my $expat = shift; my $tag = shift; my @origlist = (); # Use original_string so that we retain escaped entities # in attribute values. We must convert the string to an # @origlist array to conform to the structure of the Tree # Style. # my @original_array = split /\x/, $expat->original_string(); my $source = $expat->original_string(); # Remove leading tag. # $source =~ s|^\s*<\s*(\S+)||s; # Grab attribute key/value pairs and push onto @origlist array. # while ($source) { if ($source =~ /^\s*([\w:-]+)\s*[=]\s*["]/) { $source =~ s|^\s*([\w:-]+)\s*[=]\s*["]([^"]*)["]||s; push @origlist, $1; push @origlist, '"' . $2 . '"'; } elsif ($source =~ /^\s*([\w:-]+)\s*[=]\s*[']/) { $source =~ s|^\s*([\w:-]+)\s*[=]\s*[']([^']*)[']||s; push @origlist, $1; push @origlist, "'" . $2 . "'"; } else { last; } } my $ol = [ { @origlist } ]; push @{ $expat->{Lists} }, $expat->{Curlist}; push @{ $expat->{Curlist} }, $tag => $ol; $expat->{Curlist} = $ol; } sub readXml { my $filename = shift || return; if(!-f $filename) { die "ERROR Cannot find filename: $filename\n"; } my $ret = eval 'require XML::Parser'; if(!$ret) { die "You must have XML::Parser installed to run $0\n\n"; } my $xp = new XML::Parser(Style => 'Tree'); $xp->setHandlers(Char => \&intltool_tree_char); $xp->setHandlers(Start => \&intltool_tree_start); $xp->setHandlers(CdataStart => \&intltool_tree_cdatastart); $xp->setHandlers(CdataEnd => \&intltool_tree_cdataend); my $tree = $xp->parsefile($filename); # Hello thereHowdydo # would be: # [foo, [{}, head, [{id => "a"}, 0, "Hello ", em, [{}, 0, "there"]], bar, [{}, # 0, "Howdy", ref, [{}]], 0, "do" ] ] return $tree; } sub print_header { my $infile = shift; my $fh = shift; my $source; if(!-f $infile) { die "ERROR Cannot find filename: $infile\n"; } print $fh qq{\n}; { local $/; open DOCINPUT, "<${FILE}" or die; $source = ; close DOCINPUT; } if ($source =~ /()/s) { print $fh "$1\n"; } elsif ($source =~ /(]*>)/s) { print $fh "$1\n"; } } sub parseTree { my $fh = shift; my $ref = shift; my $language = shift || ""; my $name = shift @{ $ref }; my $cont = shift @{ $ref }; while (!$name || "$name" eq "1") { $name = shift @{ $ref }; $cont = shift @{ $ref }; } my $spacepreserve = 0; my $attrs = @{$cont}[0]; $spacepreserve = 1 if ((exists $attrs->{"xml:space"}) && ($attrs->{"xml:space"} =~ /^["']?preserve["']?$/)); traverse($fh, $name, $cont, $language, $spacepreserve); } sub xml_merge_output { my $source; if ($MULTIPLE_OUTPUT) { for my $lang (sort keys %po_files_by_lang) { if ( ! -d $lang ) { mkdir $lang or -d $lang or die "Cannot create subdirectory $lang: $!\n"; } open OUTPUT, ">$lang/$OUTFILE" or die "Cannot open $lang/$OUTFILE: $!\n"; binmode (OUTPUT) if $^O eq 'MSWin32'; my $tree = readXml($FILE); print_header($FILE, \*OUTPUT); parseTree(\*OUTPUT, $tree, $lang); close OUTPUT; print "CREATED $lang/$OUTFILE\n" unless $QUIET_ARG; } if ( ! -d "C" ) { mkdir "C" or -d "C" or die "Cannot create subdirectory C: $!\n"; } open OUTPUT, ">C/$OUTFILE" or die "Cannot open C/$OUTFILE: $!\n"; binmode (OUTPUT) if $^O eq 'MSWin32'; my $tree = readXml($FILE); print_header($FILE, \*OUTPUT); parseTree(\*OUTPUT, $tree); close OUTPUT; print "CREATED C/$OUTFILE\n" unless $QUIET_ARG; } else { open OUTPUT, ">$OUTFILE" or die "Cannot open $OUTFILE: $!\n"; binmode (OUTPUT) if $^O eq 'MSWin32'; my $tree = readXml($FILE); print_header($FILE, \*OUTPUT); parseTree(\*OUTPUT, $tree); close OUTPUT; print "CREATED $OUTFILE\n" unless $QUIET_ARG; } } sub keys_merge_translation { my ($lang) = @_; if ( ! -d $lang && $MULTIPLE_OUTPUT) { mkdir $lang or -d $lang or die "Cannot create subdirectory $lang: $!\n"; } open INPUT, "<${FILE}" or die "Cannot open ${FILE}: $!\n"; open OUTPUT, ">$lang/$OUTFILE" or die "Cannot open $lang/$OUTFILE: $!\n"; binmode (OUTPUT) if $^O eq 'MSWin32'; while () { if (s/^(\s*)_(\w+=(.*))/$1$2/) { my $string = $3; if (!$MULTIPLE_OUTPUT) { print OUTPUT; my $non_translated_line = $_; for my $lang (sort keys %po_files_by_lang) { my $translation = $translations{$lang, $string}; next if !$translation; $_ = $non_translated_line; s/(\w+)=.*/[$lang]$1=$translation/; print OUTPUT; } } else { my $non_translated_line = $_; my $translation = $translations{$lang, $string}; $translation = $string if !$translation; $_ = $non_translated_line; s/(\w+)=.*/$1=$translation/; print OUTPUT; } } else { print OUTPUT; } } close OUTPUT; close INPUT; print "CREATED $lang/$OUTFILE\n" unless $QUIET_ARG; } sub keys_merge_translations { if ($MULTIPLE_OUTPUT) { for my $lang (sort keys %po_files_by_lang) { keys_merge_translation ($lang); } keys_merge_translation ("C"); } else { keys_merge_translation ("."); } } sub desktop_merge_translations { open INPUT, "<${FILE}" or die; open OUTPUT, ">${OUTFILE}" or die; binmode (OUTPUT) if $^O eq 'MSWin32'; while () { if (s/^(\s*)_(\w+=(.*))/$1$2/) { my $string = $3; print OUTPUT; my $non_translated_line = $_; for my $lang (sort keys %po_files_by_lang) { my $translation = $translations{$lang, $string}; next if !$translation; $_ = $non_translated_line; s/(\w+)=.*/${1}[$lang]=$translation/; print OUTPUT; } } else { print OUTPUT; } } close OUTPUT; close INPUT; } sub schemas_merge_translations { my $source; { local $/; # slurp mode open INPUT, "<$FILE" or die "can't open $FILE: $!"; $source = ; close INPUT; } open OUTPUT, ">$OUTFILE" or die; binmode (OUTPUT) if $^O eq 'MSWin32'; # FIXME: support attribute translations # Empty nodes never need translation, so unmark all of them. # For example, <_foo/> is just replaced by . $source =~ s|<\s*_($w+)\s*/>|<$1/>|g; while ($source =~ s/ (.*?) (\s+)((\s*) (\s*(?:\s*)?(.*?)\s*<\/default>)?(\s*) (\s*(?:\s*)?(.*?)\s*<\/short>)?(\s*) (\s*(?:\s*)?(.*?)\s*<\/long>)?(\s*) <\/locale>) //sx) { print OUTPUT $1; my $locale_start_spaces = $2 ? $2 : ''; my $default_spaces = $4 ? $4 : ''; my $short_spaces = $7 ? $7 : ''; my $long_spaces = $10 ? $10 : ''; my $locale_end_spaces = $13 ? $13 : ''; my $c_default_block = $3 ? $3 : ''; my $default_string = $6 ? $6 : ''; my $short_string = $9 ? $9 : ''; my $long_string = $12 ? $12 : ''; print OUTPUT "$locale_start_spaces$c_default_block"; $default_string =~ s/\s+/ /g; $default_string = entity_decode($default_string); $short_string =~ s/\s+/ /g; $short_string = entity_decode($short_string); $long_string =~ s/\s+/ /g; $long_string = entity_decode($long_string); for my $lang (sort keys %po_files_by_lang) { my $default_translation = $translations{$lang, $default_string}; my $short_translation = $translations{$lang, $short_string}; my $long_translation = $translations{$lang, $long_string}; next if (!$default_translation && !$short_translation && !$long_translation); print OUTPUT "\n$locale_start_spaces"; print OUTPUT "$default_spaces"; if ($default_translation) { $default_translation = entity_encode($default_translation); print OUTPUT "$default_translation"; } print OUTPUT "$short_spaces"; if ($short_translation) { $short_translation = entity_encode($short_translation); print OUTPUT "$short_translation"; } print OUTPUT "$long_spaces"; if ($long_translation) { $long_translation = entity_encode($long_translation); print OUTPUT "$long_translation"; } print OUTPUT "$locale_end_spaces"; } } print OUTPUT $source; close OUTPUT; } sub rfc822deb_merge_translations { my %encodings = (); for my $lang (keys %po_files_by_lang) { $encodings{$lang} = ($UTF8_ARG ? 'UTF-8' : get_po_encoding($po_files_by_lang{$lang})); } my $source; $Text::Wrap::huge = 'overflow'; $Text::Wrap::break = qr/\n|\s(?=\S)/; { local $/; # slurp mode open INPUT, "<$FILE" or die "can't open $FILE: $!"; $source = ; close INPUT; } open OUTPUT, ">${OUTFILE}" or die; binmode (OUTPUT) if $^O eq 'MSWin32'; while ($source =~ /(^|\n+)(_*)([^:\s]+)(:[ \t]*)(.*?)(?=\n[\S\n]|$)/sg) { my $sep = $1; my $non_translated_line = $3.$4; my $string = $5; my $underscore = length($2); next if $underscore eq 0 && $non_translated_line =~ /^#/; # Remove [] dummy strings my $stripped = $string; $stripped =~ s/\[\s[^\[\]]*\],/,/g if $underscore eq 2; $stripped =~ s/\[\s[^\[\]]*\]$//; $non_translated_line .= $stripped; print OUTPUT $sep.$non_translated_line; if ($underscore) { my @str_list = rfc822deb_split($underscore, $string); for my $lang (sort keys %po_files_by_lang) { my $is_translated = 1; my $str_translated = ''; my $first = 1; for my $str (@str_list) { my $translation = $translations{$lang, $str}; if (!$translation) { $is_translated = 0; last; } # $translation may also contain [] dummy # strings, mostly to indicate an empty string $translation =~ s/\[\s[^\[\]]*\]$//; if ($first) { if ($underscore eq 2) { $str_translated .= $translation; } else { $str_translated .= Text::Tabs::expand($translation) . "\n"; } } else { if ($underscore eq 2) { $str_translated .= ', ' . $translation; } else { $str_translated .= Text::Tabs::expand( Text::Wrap::wrap(' ', ' ', $translation)) . "\n .\n"; } } $first = 0; # To fix some problems with Text::Wrap::wrap $str_translated =~ s/(\n )+\n/\n .\n/g; } next unless $is_translated; $str_translated =~ s/\n \.\n$//; $str_translated =~ s/\s+$//; $_ = $non_translated_line; s/^(\w+):\s*.*/$sep${1}-$lang.$encodings{$lang}: $str_translated/s; print OUTPUT; } } } print OUTPUT "\n"; close OUTPUT; close INPUT; } sub rfc822deb_split { # Debian defines a special way to deal with rfc822-style files: # when a value contain newlines, it consists of # 1. a short form (first line) # 2. a long description, all lines begin with a space, # and paragraphs are separated by a single dot on a line # This routine returns an array of all paragraphs, and reformat # them. # When first argument is 2, the string is a comma separated list of # values. my $type = shift; my $text = shift; $text =~ s/^[ \t]//mg; return (split(/, */, $text, 0)) if $type ne 1; return ($text) if $text !~ /\n/; $text =~ s/([^\n]*)\n//; my @list = ($1); my $str = ''; for my $line (split (/\n/, $text)) { chomp $line; if ($line =~ /^\.\s*$/) { # New paragraph $str =~ s/\s*$//; push(@list, $str); $str = ''; } elsif ($line =~ /^\s/) { # Line which must not be reformatted $str .= "\n" if length ($str) && $str !~ /\n$/; $line =~ s/\s+$//; $str .= $line."\n"; } else { # Continuation line, remove newline $str .= " " if length ($str) && $str !~ /\n$/; $str .= $line; } } $str =~ s/\s*$//; push(@list, $str) if length ($str); return @list; } sub quoted_translation { my ($xml_mode, $lang, $string) = @_; $string = entity_decode($string) if $xml_mode; $string =~ s/\\\"/\"/g; my $translation = $translations{$lang, $string}; $translation = $string if !$translation; $translation = entity_encode($translation) if $xml_mode; $translation =~ s/\"/\\\"/g; return $translation } sub quoted_merge_translations { my ($xml_mode) = @_; if (!$MULTIPLE_OUTPUT) { print "Quoted only supports Multiple Output.\n"; exit(1); } for my $lang (sort keys %po_files_by_lang) { if ( ! -d $lang ) { mkdir $lang or -d $lang or die "Cannot create subdirectory $lang: $!\n"; } open INPUT, "<${FILE}" or die; open OUTPUT, ">$lang/$OUTFILE" or die "Cannot open $lang/$OUTFILE: $!\n"; binmode (OUTPUT) if $^O eq 'MSWin32'; while () { s/\"(([^\"]|\\\")*[^\\\"])\"/"\"" . "ed_translation($xml_mode, $lang, $1) . "\""/ge; print OUTPUT; } close OUTPUT; close INPUT; } } parcellite-1.2.1/rel.sh0000755000175000017500000000543313041603201013055 0ustar hlehle#!/bin/bash # Copyright (C) 2011-2013 by rickyrockrat # # This file is part of Parcellite. # # Parcellite is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # Parcellite is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # This script should be run from an uptodate SVN checkout of trunk # Run from trunk, it creates directories in the parent. # # Notes: # Do a svn cp: # svn cp -m"prep for 1.0.2rc3" https://parcellite.svn.sourceforge.net/svnroot/parcellite/trunk https://parcellite.svn.sourceforge.net/svnroot/parcellite/tags/1.0.2rc3 # Do a svn co: # svn co https://parcellite.svn.sourceforge.net/svnroot/parcellite/tags/1.0.2rc3 # Remove svnversion.sh # Change the configure.ac to the new version: # AC_INIT([parcellite], [1.0.2rc2], [gpib@rickyrockrat.com]) # Update ChangeLog # Run the autogen: # gettextize # intltoolize # aclocal # autoheader # automake # autoconf # Create the tar ball: # tar --exclude .svn -cjf 1.0.2rc3.tar.bz2 1.0.2rc3 # mkdir build # cd build # tar -xjf ../1.0.2rc3.tar.bz2 # mv 1.0.2rc3 parcellite-1.0.2rc3 # tar -czf parcellite-1.0.2rc3.tar.gz parcellite-1.0.2rc3 # Test tarball: # cd parcellite-1.0.2rc3 # ./configure # ./make # src/parcellite & # Post the news to http://parcellite.sourceforge.net/ # Edit the existing, change display to HTML, then create new post, set it to HTML, then copy # the links: # The source can be downloaded here. # # Here are the debian binaries (.deb) files: # i386 # amd64. # # Then dump the top of the changelog # # Then build the debs: # sudo apt-get install dh-make # tar -xzf parcellite-1.0.2rc3.tar.gz # cd parcellite-1.0.2rc3 # ./build-debpkg.sh ../parcellite-1.0.2rc3.tar.gz . ./rel.common #BEGIN Script set_abs_path cd "$CDIR" set_scm_local check_local check_translations scm_cp_to_tag update_pot #tag="1.0.2rc7Beta" #turl="$BURL/tags/$tag" #CODIR="$ASVN/test.$tag" rel_deb remote_i386 copy_files_to_sourceforge parcellite-1.2.1/rel.common0000644000175000017500000003524413041603201013733 0ustar hlehle# Copyright (C) 2011-2013 by rickyrockrat # # This file is part of Parcellite. # # Parcellite is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # Parcellite is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # description check_err () { if [ $? -ne 0 ]; then log "$1 Failed. Abort" exit 1 fi } # Make sure we are checked in. check_local () { echo "$FUNCNAME" case $SCM_NAME in svn) M=$(svn st|grep -c "^M");; git) M=$(git status |grep -c 'modified: ') if [ "$M" = "0" ]; then M=$(git status |grep -c 'by [0-9]* commit') else echo "Locally modified files" fi;; *) echo "Unknown SCM name '$SCM_NAME'" exit 1;; esac if [ "$M" != "0" ]; then echo "local is not up to date with remote" if [ "$1" = "1" ]; then return fi exit 1 fi } # log () { echo "$1" |tee -a "$LOGF" #echo "$1" >> "$LOGF" } # Ask user what version # just set vars if it was passed in. ask_version () { echo "$FUNCNAME" if [ -n "$tag" ]; then return fi if [ -z "$1" ]; then echo "Tag to operate on (create or build deb from)?" read tag else tag="$1" fi turl="$BURL/tags/$tag" tdir="parcellite-$tag" CODIR="$ASVN/test.$tag" LOGF="$CODIR/build.log" debdir="parcellite_$tag" } # Ask username for sourceforge ask_user () { log "$FUNCNAME" if [ -n "$user" ]; then return fi log "username?" read user } # Copy the trunk to tag scm_cp_to_tag () { echo "$FUNCNAME" ask_version case $SCM_NAME in svn) E=$(svn ls $turl --depth empty 2>&1|grep -c "non-exist");; git) E=$(git tag -l $tag|grep -c $tag) if [ "1" = "$E" ]; then E="0"; else E="1"; fi;; *) echo "Unknown version control '$SCM_NAME'" exit 1;; esac if [ "$E" = "0" ]; then echo "$tag exists." exit 1 fi if [ -e "$CODIR" ]; then echo "$CODIR exists. Refusing to overwrite." exit 1 fi echo "Description for tag?" read desc ask_user case $SCM_NAME in svn) echo "Contacting $PURL for svn cp" svn cp --username "$user" -m"$desc" $BURL/trunk $turl;; git) echo "Tagging '$tag'" git tag -a -m"$desc" $tag check_err "scm local tag" git push origin git push origin --tags check_err "git push origin";; *) echo "Never get here" exit 1;; esac check_err "scm tag" } scm_tag () { echo "$FUNCNAME" ask_version } # Set us up so we are either GIT or SVN. #Check to be sure we have the correct directory orientation set_scm_local (){ echo "$FUNCNAME" if [ -e "$CDIR/.git" ]; then # see if we are GIT SCM_NAME="git" SCM_DIR=".git" BURL=$(grep -A2 '\[remote' "$CDIR/.git/config" |grep -A2 '"origin"'|grep url|sed 's!.*=[ ]*!!') elif [ -e "$CDIR/.svn" ]; then # see if we are SVN SCM_DIR=".svn" SCM_NAME="svn" PURL="https://svn.code.sf.net" BURL="$PURL/p/parcellite/code" STERM=$(echo "$BURL"|sed 's!.*://!!') S=$(grep -c "$STERM" "$CDIR/.svn/entries") if [ "$S" = "0" ]; then echo "$CDIR is not svn, and we did not find git. " echo "$CDIR does not appear to be a working local copy" exit 1 fi fi ASVN=$(dirname "$CDIR") if [ -e "$ASVN/$SCM_DIR" ]; then echo "directory '$ASVN should NOT be under $SCM_NAME" exit 1 fi } #Fix configure.ac to reflect version and do autogen. # assume we are in the top directory # version is in $1 fix_configure_ac (){ rm scmversion.sh check_err "rm svnver" sed -i "s/\(AC_INIT.*\)m4_.*)\(.*rickyrockrat.*\)/\1[$1]\2/" configure.ac check_err "update configure.ac" ./autogen.sh } # make check out dir and and check out tag test_tag_co () { echo "$FUNCNAME" mkdir -p "$CODIR" check_err "mkdir co" cd "$CODIR" if [ -e $CODIR/$tag/$SCM_DIR ] ; then log "$CODIR/$tag already exists. Not re-checking out" return fi case $SCM_NAME in svn) log "performing svn co $turl" svn co "$turl";; git) log "performing git clone $BURL" git clone --single-branch --branch $tag --depth 1 $BURL $tag;; *) echo "unknown SCM type '$SCM_NAME'" exit 1;; esac check_err "scm co" cp -a $tag $tdir check_err "mv $tag $tdir" cd $tdir check_err "cd $tdir" fix_configure_ac "$tag" } # Make the tarball make_tarball () { log "$FUNCNAME" cd "$CODIR" check_err "cd $CODIR" tar --exclude $SCM_DIR -czf $tdir.tar.gz $tdir check_err "tar -c" } # test the tar ball test_tarball() { log "$FUNCNAME" cd "$CODIR" check_err "cd dir" mkdir tar_test check_err "mkdir tar_test" cd tar_test tar -xzf ../$tdir.tar.gz check_err "untar" cd "$tdir" check_err "cd tardir" ./configure check_err "config" make check_err "make" } # build the rules file # first arg is y for libappind # y/n fname build_rules () { echo "#!/usr/bin/make -f" > "$2" echo "# -*- makefile -*-">> "$2" echo "# Built by rel.common" "$2" echo "# Uncomment this to turn on verbose mode.">> "$2" echo "#export DH_VERBOSE=1">> "$2" if [ "$1" = "y" ]; then CFG_FLG="--enable-appindicator=yes" else CFG_FLG="--enable-appindicator=no" fi # echo "DEB_CONFIGURE_EXTRA_FLAGS += $CFG_FLG">> "$2" # echo "export DEB_CONFIGURE_EXTRA_FLAGS" >> "$2" echo " ">> "$2" echo "%:">> "$2" echo -n -e '\t'>> "$2" echo 'dh $@ '>> "$2" echo " ">> "$2" echo "override_dh_auto_configure:" >> "$2" echo -n -e '\t'>> "$2" echo "dh_auto_configure -- $CFG_FLG" >> "$2" } # build the deb package files # the arg is configure options passed to the deb build, i.e. # --enable-appindicator=no build_deb () { log "$FUNCNAME" cd "$CODIR/tar_test/$tdir" check_err "cd tar_test" AI="n" if [ -n "$1" ]; then _COPT="-c $1" AI=$(echo "$1"|grep -c "=yes") if [ "$AI" = "0" ]; then AI="n" else AI="y" fi fi build_rules "$AI" "$CODIR/tar_test/rules" log "build_deb: got '$1', copt='$_COPT'" "$CDIR/build-debpkg.sh" -t "$tag" -p ../../$tdir.tar.gz $_COPT check_err "build deb" cd .. mv *.deb .. cd .. # rename the appind thingy apind=$(echo "$1"|grep appindicator|grep -c "yes") if [ "$apind" = "1" ]; then d=$(ls *.deb); n=$(ls *.deb|sed 's!\.deb!-appind.deb!') mv $d $n fi } # set our absolute path (or try to) set_abs_path () { CDIR=$(dirname $0) T=$(dirname $CDIR) if [ "$T" = "$CDIR" ]; then # ./ invocation CDIR=$(pwd) fi echo "Using '$CDIR'" } # Select gpg keys select_gpg_keys () { if [ -n "$KEYID" ]; then return fi gpg --list-keys log "Which key? 2048R/ABCDEF12 - just need the ABC part" read KEYID G_FULL=$(gpg --fingerprint $KEYID|grep "^uid"|sed -e 's!uid\W*!!') GNAME=$(echo "$G_FULL"|sed 's!\(.*\) <.*!\1!') GEMAIL=$(echo "$G_FULL"|sed 's!.* \(.*\)!\1!'|tr -d '<>') } #Figure out last revision... # tag like 1.1.6 last_revision () { _first=$(echo "$1"|sed 's!\(.\).*!\1!') _second=$(echo "$1"|sed 's!..\(.\).*!\1!') _third=$(echo "$1"|sed 's!.*\.!!') if [ $_third -eq 0 ]; then if [ $_second -eq 0 ]; then let _first=_first-1 let _second=9 else let _second=_second-1 fi let _third=9 else let _third=_third-1 fi last_rev="$_first.$_second.$_third" log "$1 -1 = $last_rev" } # setup the directories, build, and send to launchpad finish_ppa () { #set up the directory if [ "$oldtag" != "$tag" ]; then PDIR="$PDIR-$tag" fi cd "$CODIR" check_err "CD $CODIR" mkdir -p "$PDIR/t/debian" cp -a "$oldtag" "$PDIR/$debdir" cd "$PDIR" check_err "mkdir/cd $PDIR" cd "$debdir" fix_configure_ac "$AVER" cd .. tar --exclude $SCM_DIR -czf "$debdir.orig.tar.gz" "$debdir" check_err "tar for ppa" cp "$debdir"/deb/* t/debian #build changelog last_revision "$ntag" echo "parcellite (${tag}-1ppa${PPANO}) $SERIES; urgency=low" > t/debian/changelog cat "$debdir"/ChangeLog |while read line; do if [ $(echo "$line"|grep -c V$last_rev) -gt 0 ]; then break else echo "$line"| sed 's!^.*+! - !;s!^V! * V!'|grep -v Changes>> t/debian/changelog fi done DATE=$(date -R) echo " -- Doug Springer $DATE" >> t/debian/changelog # setup control sed -i 's!ADD_ARCH_HERE!any!' t/debian/control if [ "$AI" = "y" ]; then sed -i 's!\(^Build-Depends:.*\)!\1, libappindicator-dev!' t/debian/control sed -i 's!\(^Depends:.*\)!\1, libappindicator1 (>= 0.2.4)!' t/debian/control fi #do compat echo 5 > t/debian/compat #build rules build_rules "$AI" "t/debian/rules" cd t select_gpg_keys echo "Upload source Note: if you dont' currently erros out? (y/n)" read YN if [ "$YN" = "y" ]; then debuild -S -sa "-k $KEYID" else debuild -S -sd "-k $KEYID" mv "../${debdir}-1ppa$PPANO.dsc" "../${debdir}-1ppa${PPANO}.dsc.orig" gpg --output ../dsc.orig "../${debdir}-1ppa${PPANO}.dsc.orig" grep -v orig.tar.gz ../dsc.orig >../dsc.new gpg --clearsign < ../dsc.new > "../${debdir}-1ppa${PPANO}.dsc" fi check_err "debuild" cd .. echo "Do you want to send the ppa to launchpad for building? (y/n)" read YN if [ "$YN" = "y" ]; then echo "Sending to $PPA" dput $PPA "${debdir}-1ppa${PPANO}_source.changes" check_err "dput" fi } # build the ppa & send it to launchpad # Add this to depends # libappindicator-dev setup_ppa (){ echo "$FUNCNAME" echo "Set ppa to something different than $tag? (If multiple series set below, auto-adds ~series" read NT oldtag="$tag" if [ "$NT" = "y" ]; then echo "full tag number (replaces '$tag')?" read tag fi echo "Build with libappindicator? (y/n)" read AI SUPPORTEDSERIES="utopic trusty precise lucid" echo "What series does this apply to? (i.e. $SUPPORTEDSERIES etc)" echo " For multiple series, put spaces between series (enter just uses all)" read MSERIES if [ -z "$MSERIES" ]; then echo "Selecting all.." MSERIES="$SUPPORTEDSERIES" fi echo "What ppa number should we use? (1 for the first, etc.)" read PPANO let i=0 for x in $MSERIES; do let i=i+1 done ntag="$tag" for SERIES in $MSERIES; do if [ $i -gt 1 ]; then tag="${ntag}~${SERIES}" fi debdir="parcellite_$tag" AVER="$tag-ppa" #build our about version number if [ "$AI" = "y" ]; then AVER="$AVER-app" PPA="ppa:rickyrockrat/parcellite-appindicator" PDIR="ppa-app" else PPA="ppa:rickyrockrat/parcellite" PDIR="ppa" fi finish_ppa done } # show the links for the user to copy. show_links () { FN=$CODIR/sourcforge.txt echo "$tag is Released" > "$FN" echo " ">>"$FN" echo "Change Log:" >> "$FN" echo " " >> "$FN" X=$(grep -n -m1 '^$' "$CDIR/ChangeLog" | sed 's#:##') echo "$X" let X=X-1 grep -m $X '.' "$CDIR/ChangeLog" |sed 's!!\>\;!g' >> "$FN" echo " " >> "$FN" echo "Source Forge Links" >> "$FN" echo "The files can be found here:" >> "$FN" echo "The source can be downloaded here." >> "$FN" echo " " >> "$FN" echo "Non-Unity Debs" >> "$FN" echo " " >> "$FN" echo "i386" >> "$FN" echo "amd64." >> "$FN" echo " " >> "$FN" echo "Unity debs" >> "$FN" echo " " >> "$FN" echo "amd64-appind." >> "$FN" echo "i386-appind." >> "$FN" cat "$FN" echo "File is $FN" } # Finish testing of our svn tag rel_deb () { test_tag_co make_tarball cp -a $CODIR $CODIR.sav test_tarball # so Unity is a pain... build_deb "--enable-appindicator=yes" mv $CODIR $CODIR.appind mv $CODIR.sav $CODIR mv $CODIR.appind/*.deb $CODIR test_tarball # for everyone else build_deb "--enable-appindicator=no" echo "output in $CODIR" show_links } #update the .pot file for translators update_pot () { _PO="parcellite.pot" cp $CDIR/po/$_PO $CDIR/_$_PO $CDIR/extract_strings.sh "$tag" _DIFF=$(diff -q $CDIR/_$_PO $CDIR/po/$_PO|grep -c differ) if [ "0" != "$_DIFF" ]; then case $SCM_NAME in svn) svn ci -m"Updated $_PO";; git) git commit -m"Updated $_PO" po ;; *) echo "Unknown SCM name '$SCM_NAME'" exit 1;; esac fi rm $CDIR/_$_PO } #Check the translations for errors check_translations () { let err=0 for f in $(ls po/*.po); do MSG=$(msgfmt -o _tmp_po $f 2>&1) POE=$(echo "MSG"|grep -ic error) if [ "0" != "$POE" ]; then echo "Error on '$f':" echo "$MSG" let err=err+1 fi rm _tmp_po done if [ $err -ne 0 ]; then echo "Errors in Translation files. Abort." exit 1 fi } # copy_files_to_sourceforge () { ask_version for f in amd64 amd64-appind i386 i386-appind; do flist="$flist parcellite_${tag}-1_${f}.deb" done let i=0 for f in $flist; do if [ -e $CODIR/$f ]; then echo "Found $f" let i=i+1 else echo "$CODIR/$f does not exist" fi done if [ $i -lt 4 ]; then echo "File list is not complete. Continue anyway?" read YN if [ "$YN" != "y" ]; then echo "User aborted." exit 1 fi fi echo -n "Username for sourceforge: " ask_user # Send the command to create a shell echo "When you get to command line, type exit" ssh -t $user,parcellite@shell.sourceforge.net create TO_DIR="/home/frs/project/parcellite/parcellite" NDIR="$TO_DIR/parcellite-$tag" echo "Creating directory $NDIR" ssh $user@shell.sourceforge.net mkdir $NDIR for f in $flist; do tlist="$tlist $CODIR/$f" done cp $CDIR/ChangeLog $CODIR/README.txt tlist="$tlist $CODIR/README.txt $CODIR/parcellite-${tag}.tar.gz" echo "Copy files $tlist" echo "To $NDIR" scp $tlist $user@shell.sourceforge.net:$NDIR } remote_i386 () { ask_version echo "Build deb files on remote machine?" read YN if [ "$YN" != "y" ]; then echo "User aborted remote build" exit 1 fi echo "user@machine for ssh?(note remote machine needs correct gpg key & /src/parcellite directory)." read userat case $SCM_NAME in svn) scm_cmd="svn co http://svn.code.sf.net/p/parcellite/code/tags/$tag $tag-i386";; git) scm_cmd="git clone --depth=1 -b $tag $BURL $tag-i386";; *) echo "Unknown SCM name '$SCM_NAME'" exit 1;; esac ssh -t $userat "cd /src/parcellite; $scm_cmd; cd $tag-i386;./rel.deb.sh $tag" echo "Copying deb files from remote" scp ${userat}:/src/parcellite/test.$tag/*.deb $CDIR/Changelog $CODIR } parcellite-1.2.1/INSTALL0000644000175000017500000002260413041603201012764 0ustar hlehleInstallation Instructions ************************* Please see README for instructions specific to this install. The instructions below were auto-generated. Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005 Free Software Foundation, Inc. This file is free documentation; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. Basic Installation ================== These are generic installation instructions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). It can also use an optional file (typically called `config.cache' and enabled with `--cache-file=config.cache' or simply `-C') that saves the results of its tests to speed up reconfiguring. (Caching is disabled by default to prevent problems with accidental use of stale cache files.) If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If you are using the cache, and at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.ac' (or `configure.in') is used to create `configure' by a program called `autoconf'. You only need `configure.ac' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. If you're using `csh' on an old version of System V, you might need to type `sh ./configure' instead to prevent `csh' from trying to execute `configure' itself. Running `configure' takes awhile. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package. 4. Type `make install' to install the programs and any data files and documentation. 5. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. Run `./configure --help' for details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here is an example: ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you must use a version of `make' that supports the `VPATH' variable, such as GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. If you have to use a `make' that does not support the `VPATH' variable, you have to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. Installation Names ================== By default, `make install' installs the package's commands under `/usr/local/bin', include files under `/usr/local/include', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PREFIX'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you pass the option `--exec-prefix=PREFIX' to `configure', the package uses PREFIX as the prefix for installing programs and libraries. Documentation and other data files still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=DIR' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Optional Features ================= Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Specifying the System Type ========================== There may be some features `configure' cannot figure out automatically, but needs to determine by the type of machine the package will run on. Usually, assuming the package is built to be run on the _same_ architectures, `configure' can figure that out, but if it prints a message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM where SYSTEM can have one of these forms: OS KERNEL-OS See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the machine type. If you are _building_ compiler tools for cross-compiling, you should use the option `--target=TYPE' to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the "host" platform (i.e., that on which the generated programs will eventually be run) with `--host=TYPE'. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Defining Variables ================== Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set them in the `configure' command line, using `VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc causes the specified `gcc' to be used as the C compiler (unless it is overridden in the site shell script). Here is a another example: /bin/bash ./configure CONFIG_SHELL=/bin/bash Here the `CONFIG_SHELL=/bin/bash' operand causes subsequent configuration-related scripts to be executed by `/bin/bash'. `configure' Invocation ====================== `configure' recognizes the following options to control how it operates. `--help' `-h' Print a summary of the options to `configure', and exit. `--version' `-V' Print the version of Autoconf used to generate the `configure' script, and exit. `--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, traditionally `config.cache'. FILE defaults to `/dev/null' to disable caching. `--config-cache' `-C' Alias for `--cache-file=config.cache'. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. parcellite-1.2.1/rel.deb.sh0000755000175000017500000000152113041603201013600 0ustar hlehle#!/bin/bash # Copyright (C) 2011-2013 by rickyrockrat # # This file is part of Parcellite. # # Parcellite is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # Parcellite is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . . ./rel.common set_abs_path cd "$CDIR" set_scm_local check_local 1 ask_version "$1" rel_deb