pax_global_header00006660000000000000000000000064147625665250014534gustar00rootroot0000000000000052 comment=42768953d697c225b90ee01ab7dcf59fa9b4708b lxhotkey-0.1.2/000077500000000000000000000000001476256652500134035ustar00rootroot00000000000000lxhotkey-0.1.2/.gitignore000066400000000000000000000005111476256652500153700ustar00rootroot00000000000000m4/ Makefile Makefile.in aclocal.m4 autom4te.cache/ compile config.guess config.h config.h.in config.log config.status config.sub configure depcomp install-sh libtool ltmain.sh missing stamp-* po/Makefile.in.in po/POTFILES po/LINGUAS .deps/ .libs/ .dirstamp *~ *.o *.lo *.la lxhotkey *.pc *.tar.xz man/lxhotkey.1 *.desktop *.gmo lxhotkey-0.1.2/CONCEPT000066400000000000000000000017541476256652500144300ustar00rootroot00000000000000- should work both GUI and commandline - plugins for each WM (using FmModule) * key is WM ID - func(conf) [re]load config - func(conf) save config - func(conf,mask) get desc/keys for global binding(s) - func(conf,action,data) set keys for a global binding - func(conf) get list of possible global actions - func(conf,mask) get exec/[desk]/key for app binding(s) - func(conf,name,data) set exec/desc/key for an app binding - if change exec then remove old and add new - commandline is like lxkeys global desktop2 <-- show bound key(s) for action desktop2 lxkeys app <-- show all keys bound to applications lxkeys app xfrun4 Alt+F2,Win+Return "Execute a command" <-- bind a key lxkeys show Win+Space <-- show which action/application is bound to the key - commandline action syntax: action1[:attr1=val1:attr2=val2][&action2] - commandline exec syntax: exec line[&startupnotify=yes[:attr1=val1]][&action=val] - do special window parameters as well??? lxhotkey-0.1.2/COPYING000066400000000000000000000355641476256652500144530ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) 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 this service 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 make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. 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. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), 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 distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the 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 a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE 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. END OF TERMS AND CONDITIONS lxhotkey-0.1.2/ChangeLog000066400000000000000000000007201476256652500151540ustar00rootroot000000000000000.1.2 ------------------------------------------------------------------------- * Improved error and help messages. * Added a tooltip to explain how to define a hotkey. * Added a check for the X server's socket. * Updated translations. 0.1.1 ------------------------------------------------------------------------- * Added detection for LXDE-pi session. * Fixed using '' keyword by recent GTK+. * Added optional scrollbars if there is not enough space. lxhotkey-0.1.2/Makefile.am000066400000000000000000000004021476256652500154330ustar00rootroot00000000000000## Process this file with automake to produce Makefile.in ACLOCAL_AMFLAGS= -I m4 SUBDIRS = src plugins po pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = lxhotkey.pc man_MANS = man/lxhotkey.1 EXTRA_DIST = autogen.sh lxhotkey.pc.in man/lxhotkey.1.in lxhotkey-0.1.2/autogen.sh000077500000000000000000000005651476256652500154120ustar00rootroot00000000000000#!/bin/sh test -d m4 || mkdir m4 AUTOMAKE=${AUTOMAKE:-automake} set -ex ${ACLOCAL:-aclocal$AM_VERSION} ${ACLOCAL_ARG} ${AUTOHEADER:-autoheader$AC_VERSION} --force AUTOMAKE=$AUTOMAKE libtoolize -c --automake --force AUTOMAKE=$AUTOMAKE intltoolize -c --automake --force $AUTOMAKE --add-missing --copy --include-deps ${AUTOCONF:-autoconf$AC_VERSION} rm -rf autom4te.cache lxhotkey-0.1.2/configure.ac000066400000000000000000000062401476256652500156730ustar00rootroot00000000000000AC_PREREQ(2.53) AC_INIT(lxhotkey, 0.1.2, http://lxde.org/) AM_INIT_AUTOMAKE([-Wall foreign subdir-objects no-dist-gzip dist-xz]) AC_CONFIG_HEADER([config.h]) AC_CONFIG_MACRO_DIR([m4]) # Support silent build rules. Disable by either passing --disable-silent-rules # to configure or passing V=1 to make AM_SILENT_RULES([yes]) # Force to dynamic AC_DISABLE_STATIC # Checks for programs. AC_PROG_CC AC_PROG_INSTALL AC_PROG_LN_S IT_PROG_INTLTOOL([0.40.0], [no-xml]) AM_PROG_CC_C_O m4_ifdef([AM_PROG_AR], [AM_PROG_AR]) # Initialize libtool LT_PREREQ([2.2]) LT_INIT # International support GETTEXT_PACKAGE=lxhotkey AC_SUBST(GETTEXT_PACKAGE) AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE,"$GETTEXT_PACKAGE", [Gettext package.]) AM_GLIB_GNU_GETTEXT # Generate po/LINGUAS for available PO files rm -f $srcdir/po/LINGUAS for po_file in `ls $srcdir/po/*.po | sort`; do lang=`echo "$po_file" | sed "s|.*/po/\(.*\)\.po|\1|g"` echo $lang >> $srcdir/po/LINGUAS done # Handle --enable-debug option AC_ARG_ENABLE(debug, [AC_HELP_STRING([--enable-debug], [enable debug support @<:@default=no@:>@])], [enable_debug="${enableval}"], [enable_debug=no] ) if test "$enable_debug" = "yes"; then # turn on debug and disable optimization CPPFLAGS="$CPPFLAGS -DG_ENABLE_DEBUG -O0 -g" case "$CC" in gcc*) CPPFLAGS="$CPPFLAGS -Wall -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Werror=implicit-function-declaration" ;; *) ;; esac dnl Be more strict on portability #CPPFLAGS="$CPPFLAGS -D_POSIX_C_SOURCE=200112L -D_XOPEN_SOURCE=700" else # turn off glib debug checks CPPFLAGS="$CPPFLAGS -DG_DISABLE_ASSERT -DG_DISABLE_CHECKS -DG_DISABLE_CAST_CHECKS" fi dnl Test for required libraries pkg_modules="libfm >= 1.2.0 x11" PKG_CHECK_MODULES(PACKAGE, [$pkg_modules]) AC_SUBST(PACKAGE_CFLAGS) AC_SUBST(PACKAGE_LIBS) dnl GTK+ stuff AC_ARG_WITH(gtk, [AC_HELP_STRING([--with-gtk=VER], [build 'gtk' GUI, choose GTK+ version for build]) AC_HELP_STRING([--without-gtk], [disable 'gtk' GUI build @<:@default@:>@])], [ac_with_gtk="${withval}"], [ac_with_gtk=no] ) if test x"$ac_with_gtk" != xno; then case "$ac_with_gtk" in 3|3.*) pkg_modules="gtk+-3.0" ;; *) pkg_modules="gtk+-2.0 >= 2.18.0" ;; esac PKG_CHECK_MODULES(GTK, [$pkg_modules], [with_gtk=yes], [with_gtk=no]) if test "$with_gtk" = "yes" -a "$pkg_modules" = "gtk+-3.0"; then CFLAGS="$CFLAGS -Wno-deprecated-declarations" fi fi AM_CONDITIONAL(WITH_GTK, [test x$with_gtk = xyes]) AC_SUBST(GTK_CFLAGS) AC_SUBST(GTK_LIBS) dnl Test for libunistring for correct UTF-8 printf AC_CHECK_LIB(unistring, ulc_fprintf) dnl Supress extra linking AC_MSG_CHECKING([whether $LD accepts --as-needed]) case `$LD --as-needed -v 2>&1 = 1.2.0 Version: @VERSION@ Libs: Cflags: -I${includedir} lxhotkey-0.1.2/man/000077500000000000000000000000001476256652500141565ustar00rootroot00000000000000lxhotkey-0.1.2/man/lxhotkey.1.in000066400000000000000000000021651476256652500165200ustar00rootroot00000000000000.\" Process this file with .\" groff -man -Tascii lxhotkey.1 .\" .TH LXHotkey 1 "March 2016" "@PACKAGE@ @VERSION@" "User Manuals" .SH NAME LXHotkey \- A lightweight global keyboard shortcuts configurator .SH SYNOPSIS .B lxhotkey [ command ] .SH DESCRIPTION \fBLXHotkey\fP is an universal application for the Lightweight X11 Desktop Environment (\fBLXDE\fP) which allows view and change global keyboard shortcuts for Window Manager actions, including ones to start applications. .SH OPTIONS .SS Command line interface: .TP 20 .BI global " \fR[\fIaction\fR]" show keys bound to \fIaction\fP(s) .TP .BI global " action key" bind a \fIkey\fP to the \fIaction\fP .TP .BI app " \fR[\fIexec\fR]" show keys bound to \fIexec\fR line .TP .BI app " exec key" bind a \fIkey\fR to some \fIexec\fR line .TP .BI app " exec" " \-\^\-" unbind all keys from \fIexec\fR line .TP .BI show " key" show the action bound to a \fIkey\fR .SS Graphic interface: .TP 20 .BI "\-\^\-gui=" " type" start with GUI of \fItype\fR .SH SUPPORTED WINDOW MANAGERS .PD 0 .TP .I Openbox .SH AUTHOR Initial version of LXHotkey is written by Andriy Grytsenko . lxhotkey-0.1.2/plugins/000077500000000000000000000000001476256652500150645ustar00rootroot00000000000000lxhotkey-0.1.2/plugins/Makefile.am000066400000000000000000000021571476256652500171250ustar00rootroot00000000000000## Process this file with automake to produce Makefile.in ## common flags for all plugins AM_CPPFLAGS = \ -I$(top_srcdir) \ -I$(top_srcdir)/src \ $(PACKAGE_CFLAGS) AM_LDFLAGS = \ -module -avoid-version -shared -export-dynamic -no-undefined \ -rpath $(libdir)/lxhotkey $(PACKAGE_LIBS) ## modules list pkglibdir = $(libdir)/lxhotkey pkglib_LTLIBRARIES = ob.la if WITH_GTK pkglib_LTLIBRARIES += gtk.la endif ## Openbox module ob_la_SOURCES = openbox/openbox.c ob_la_LIBADD = -lfm-extra # GTK module gtk_la_SOURCES = gtk/gtk.c gtk/edit.c gtk_la_CFLAGS = $(GTK_CFLAGS) gtk_la_LIBADD = $(GTK_LIBS) # .desktop files desktopdir=$(datadir)/applications desktop_in_files = if WITH_GTK desktop_in_files += gtk/lxhotkey-gtk.desktop.in endif desktop_DATA = $(desktop_in_files:.desktop.in=.desktop) @INTLTOOL_DESKTOP_RULE@ EXTRA_DIST = \ gtk/lxhotkey-gtk.desktop.in gtk/lxhotkey-gtk.desktop \ gtk/edit.h DISTCLEANFILES = gtk/lxhotkey-gtk.desktop install-exec-hook: rm -f $(DESTDIR)$(pkglibdir)/*.la PLUGINS_INSTALLED = $(pkglib_LTLIBRARIES:.la=.so) uninstall-hook: cd $(DESTDIR)$(pkglibdir) && rm -f $(PLUGINS_INSTALLED) || true lxhotkey-0.1.2/plugins/gtk/000077500000000000000000000000001476256652500156515ustar00rootroot00000000000000lxhotkey-0.1.2/plugins/gtk/edit.c000066400000000000000000001401131476256652500167420ustar00rootroot00000000000000/* * Copyright (C) 2016-2021 Andriy Grytsenko * 2023 Ingo Brückl * * This file is a part of LXHotkey project. * * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #define WANT_OPTIONS_EQUAL #include "lxhotkey.h" #include "edit.h" #include #include #include #include #if !GTK_CHECK_VERSION(2, 21, 0) # define GDK_KEY_Tab GDK_Tab # define GDK_KEY_BackSpace GDK_BackSpace # define GDK_KEY_Escape GDK_Escape # define GDK_KEY_space GDK_space #endif enum { EDIT_MODE_NONE, EDIT_MODE_ADD, /* add action */ EDIT_MODE_EDIT, /* change selected */ EDIT_MODE_OPTION /* add suboption */ }; static const LXHotkeyAttr *find_template_for_option(GtkTreeModel *model, GtkTreeIter *iter, const GList *t_list) { const LXHotkeyAttr *opt, *tmpl; gtk_tree_model_get(model, iter, 2, &opt, -1); while (t_list) { tmpl = t_list->data; if (g_strcmp0(tmpl->name, opt->name) == 0) return tmpl; t_list = t_list->next; } return NULL; } static const GList *get_options_from_template(const LXHotkeyAttr *tmpl, PluginData *data) { if (tmpl == NULL) return NULL; else if (tmpl->has_actions) return data->edit_template; else return tmpl->subopts; } static const GList *get_parent_template_list(GtkTreeModel *model, GtkTreeIter *iter, PluginData *data) { const GList *tmpl_list; GtkTreeIter parent_iter; const LXHotkeyAttr *parent; if (!gtk_tree_model_iter_parent(model, &parent_iter, iter)) return data->edit_template; /* get list for parent of parent first - recursion is here */ tmpl_list = get_parent_template_list(model, &parent_iter, data); /* now find parent in that list */ parent = find_template_for_option(model, &parent_iter, tmpl_list); return get_options_from_template(parent, data); } static void fill_edit_frame(PluginData *data, const LXHotkeyAttr *opt, const GList *subopts, const GList *exempt) { GtkListStore *names_store; const LXHotkeyAttr *sub; const GList *l; int i = 0; names_store = GTK_LIST_STORE(gtk_list_store_new(3, G_TYPE_STRING, /* description */ G_TYPE_STRING, /* name */ G_TYPE_POINTER)); /* template */ while (subopts) { sub = subopts->data; /* ignore existing opts */ for (l = exempt; l; l = l->next) if (strcmp(sub->name, ((LXHotkeyAttr *)l->data)->name) == 0) break; if (l == NULL) gtk_list_store_insert_with_values(names_store, NULL, i++, 0, _(sub->name), 1, sub->name, 2, sub, -1); subopts = subopts->next; } gtk_combo_box_set_model(data->edit_actions, GTK_TREE_MODEL(names_store)); g_object_unref(names_store); gtk_combo_box_set_active(data->edit_actions, 0); /* values box will be set by changing active callback */ gtk_widget_set_visible(GTK_WIDGET(data->edit_actions), opt == NULL); /* visible on add */ gtk_widget_set_visible(data->edit_option_name, opt != NULL); /* visible on edit */ if (opt) gtk_label_set_text(GTK_LABEL(data->edit_option_name), _(opt->name)); } static void update_edit_toolbar(PluginData *data) { const LXHotkeyAttr *opt, *tmpl; const GList *tmpl_list; GtkTreeModel *model; GtkTreeIter iter; gboolean is_action; /* update AddOption button -- exec only */ if (gtk_action_get_visible(data->add_option_button)) { /* make not clickable if no more options to add */ gtk_action_set_sensitive(data->add_option_button, g_list_length((GList *)data->edit_template) != g_list_length(data->edit_options_copy)); } /* update Remove button */ if (!gtk_tree_selection_get_selected(gtk_tree_view_get_selection(data->edit_tree), &model, &iter)) { gtk_action_set_sensitive(data->rm_option_button, FALSE); gtk_action_set_sensitive(data->edit_option_button, FALSE); gtk_action_set_sensitive(data->add_suboption_button, FALSE); return; } gtk_action_set_sensitive(data->rm_option_button, TRUE); gtk_tree_model_get(model, &iter, 2, &opt, -1); tmpl_list = get_parent_template_list(model, &iter, data); is_action = (data->current_page == data->acts && tmpl_list == data->edit_template); while (tmpl_list) { tmpl = tmpl_list->data; if (g_strcmp0(tmpl->name, opt->name) == 0) break; tmpl_list = tmpl_list->next; } if (G_UNLIKELY(tmpl_list == NULL)) { /* option isn't supported, probably deprecated one */ gtk_action_set_sensitive(data->edit_option_button, FALSE); gtk_action_set_sensitive(data->add_suboption_button, FALSE); return; } gtk_action_set_sensitive(data->edit_option_button, !is_action && (tmpl->subopts == NULL || tmpl->has_value)); gtk_action_set_sensitive(data->add_suboption_button, (tmpl->has_actions || g_list_length(tmpl->subopts) != g_list_length(opt->subopts))); } static void on_cancel(GtkAction *action, PluginData *data) { gtk_widget_destroy(GTK_WIDGET(data->edit_window)); } static void on_save(GtkAction *action, PluginData *data) { GError *error = NULL; LXHotkeyGlobal *act = NULL; LXHotkeyApp *app = NULL; GtkTreeModel *model; GtkTreeIter iter; LXHotkeyGlobal new_act; LXHotkeyApp new_app; gboolean ok = FALSE; if (data->current_page == data->acts) { /* it's global */ new_act.accel1 = g_object_get_data(G_OBJECT(data->edit_key1), "accelerator_name"); new_act.accel2 = g_object_get_data(G_OBJECT(data->edit_key2), "accelerator_name"); if (new_act.accel1 == NULL || new_act.accel1[0] == 0) { new_act.accel1 = new_act.accel2; new_act.accel2 = NULL; } new_act.actions = data->edit_options_copy; if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(data->acts), &model, &iter)) gtk_tree_model_get(model, &iter, 4, &act, -1); if (act) { /* global edited */ if (!options_equal(act->actions, new_act.actions)) { /* actions list changed, remove old binding and add new */ LXHotkeyGlobal rem_act = *act; rem_act.accel1 = rem_act.accel2 = NULL; if (!data->cb->set_wm_key(*data->config, &rem_act, &error)) goto _exit; } else if (g_strcmp0(act->accel1, new_act.accel1) == 0 && g_strcmp0(act->accel2, new_act.accel2) == 0) /* nothing was changed */ goto _exit; } /* else it was added */ ok = data->cb->set_wm_key(*data->config, &new_act, &error); } else { /* it's application */ new_app.accel1 = g_object_get_data(G_OBJECT(data->edit_key1), "accelerator_name"); new_app.accel2 = g_object_get_data(G_OBJECT(data->edit_key2), "accelerator_name"); if (new_app.accel1 == NULL || new_app.accel1[0] == 0) { new_app.accel1 = new_app.accel2; new_app.accel2 = NULL; } new_app.exec = (char *)gtk_entry_get_text(data->edit_exec); new_app.options = data->edit_options_copy; if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(data->apps), &model, &iter)) gtk_tree_model_get(model, &iter, 3, &app, -1); if (app) { /* app edited */ if (g_strcmp0(app->exec, new_app.exec) != 0 || !options_equal(app->options, new_app.options)) { /* exec line or options list changed, remove old binding and add new */ LXHotkeyApp rem_app = *app; rem_app.accel1 = rem_app.accel2 = NULL; if (!data->cb->set_app_key(*data->config, &rem_app, &error)) goto _exit; } else if (g_strcmp0(app->accel1, new_app.accel1) == 0 && g_strcmp0(app->accel2, new_app.accel2) == 0) /* nothing was changed */ goto _exit; } /* else it was added */ ok = data->cb->set_app_key(*data->config, &new_app, &error); } _exit: if (error) { _show_error(_("Apply error: "), error); g_error_free(error); } /* update main window */ if (ok) gtk_action_set_sensitive(data->save_action, TRUE); gtk_widget_destroy(GTK_WIDGET(data->edit_window)); if (ok) _main_refresh(data); } static void on_add_action(GtkAction *action, PluginData *data) { /* fill frame with empty data, set choices from data->edit_template, hide value */ data->edit_mode = EDIT_MODE_ADD; gtk_frame_set_label(GTK_FRAME(data->edit_frame), _("Add action")); fill_edit_frame(data, NULL, data->edit_template, NULL); gtk_widget_hide(GTK_WIDGET(data->edit_values)); gtk_widget_hide(GTK_WIDGET(data->edit_value)); gtk_widget_show(data->edit_frame); gtk_widget_grab_focus(data->edit_frame); } static void on_add_option(GtkAction *act, PluginData *data) { /* fill frame with empty data, set choices from data->edit_template */ data->edit_mode = EDIT_MODE_ADD; gtk_frame_set_label(GTK_FRAME(data->edit_frame), _("Add option")); fill_edit_frame(data, NULL, data->edit_template, data->edit_options_copy); gtk_widget_show(data->edit_frame); gtk_widget_grab_focus(data->edit_frame); } #define free_options(acts) g_list_free_full(acts, (GDestroyNotify)option_free) static void option_free(LXHotkeyAttr *attr) { g_free(attr->name); g_list_free_full(attr->values, g_free); free_options(attr->subopts); g_free(attr->desc); g_slice_free(LXHotkeyAttr, attr); } static void on_remove(GtkAction *act, PluginData *data) { LXHotkeyAttr *opt, *parent; GtkTreeModel *model; GtkTreeIter iter, parent_iter; if (!gtk_tree_selection_get_selected(gtk_tree_view_get_selection(data->edit_tree), &model, &iter)) /* no item selected */ return; /* find and remove option from data->edit_options_copy */ gtk_tree_model_get(model, &iter, 2, &opt, -1); if (gtk_tree_model_iter_parent(model, &parent_iter, &iter)) { gtk_tree_model_get(model, &parent_iter, 2, &parent, -1); parent->subopts = g_list_remove(parent->subopts, opt); } else data->edit_options_copy = g_list_remove(data->edit_options_copy, opt); option_free(opt); /* remove selected row from model */ gtk_tree_store_remove(GTK_TREE_STORE(model), &iter); gtk_action_set_sensitive(data->edit_apply_button, TRUE); } static void start_edit(GtkTreeModel *model, GtkTreeIter *iter, PluginData *data) { const LXHotkeyAttr *opt; const GList *tmpl_list; GList single = { .prev = NULL, .next = NULL }; /* name - only current from selection */ gtk_tree_model_get(model, iter, 2, &opt, -1); /* values - from template */ tmpl_list = get_parent_template_list(model, iter, data); if (data->current_page == data->acts && tmpl_list == data->edit_template) /* it's action */ return; single.data = (gpointer)find_template_for_option(model, iter, tmpl_list); if (single.data == NULL) { g_warning("no template found for option '%s'", opt->name); return; } /* fill frame from selection */ data->edit_mode = EDIT_MODE_EDIT; gtk_frame_set_label(GTK_FRAME(data->edit_frame), _("Change option")); fill_edit_frame(data, opt, &single, NULL); gtk_widget_show(data->edit_frame); gtk_widget_grab_focus(data->edit_frame); } static void on_edit(GtkAction *act, PluginData *data) { GtkTreeModel *model; GtkTreeIter iter; if (!gtk_tree_selection_get_selected(gtk_tree_view_get_selection(data->edit_tree), &model, &iter)) /* no item selected */ return; start_edit(model, &iter, data); } static void on_add_suboption(GtkAction *act, PluginData *data) { const LXHotkeyAttr *opt, *tmpl; const GList *tmpl_list; GtkTreeModel *model; GtkTreeIter iter; if (!gtk_tree_selection_get_selected(gtk_tree_view_get_selection(data->edit_tree), &model, &iter)) /* no item selected */ return; tmpl_list = get_parent_template_list(model, &iter, data); tmpl = find_template_for_option(model, &iter, tmpl_list); if (tmpl == NULL) /* no options found */ return; tmpl_list = get_options_from_template(tmpl, data); gtk_tree_model_get(model, &iter, 2, &opt, -1); data->edit_mode = EDIT_MODE_OPTION; /* fill frame with empty data and set name choices from selection's subopts */ if (tmpl->has_actions) gtk_frame_set_label(GTK_FRAME(data->edit_frame), _("Add action")); else gtk_frame_set_label(GTK_FRAME(data->edit_frame), _("Add option")); fill_edit_frame(data, NULL, tmpl_list, opt->subopts); gtk_widget_show(data->edit_frame); gtk_widget_grab_focus(data->edit_frame); } static const char edit_xml[] = "" "" "" "" "" "" "" "" "" "" /* "" "" */ ""; static GtkActionEntry actions[] = { { "Cancel", GTK_STOCK_CANCEL, NULL, NULL, N_("Discard changes"), G_CALLBACK(on_cancel) }, { "Save", GTK_STOCK_APPLY, NULL, NULL, N_("Accept changes"), G_CALLBACK(on_save) }, { "AddAction", GTK_STOCK_NEW, NULL, NULL, N_("Add an action"), G_CALLBACK(on_add_action) }, { "AddOption", GTK_STOCK_ADD, NULL, NULL, N_("Add an option to this command"), G_CALLBACK(on_add_option) }, { "Remove", GTK_STOCK_DELETE, NULL, "", N_("Remove selection"), G_CALLBACK(on_remove) }, { "Change", GTK_STOCK_EDIT, NULL, NULL, N_("Change selected option"), G_CALLBACK(on_edit) }, { "AddSubOption", GTK_STOCK_ADD, NULL, NULL, N_("Add an option to selection"), G_CALLBACK(on_add_suboption) } }; /* Button for keybinding click - taken from LXPanel, simplified a bit */ static void on_focus_in_event(GtkButton *test, GdkEvent *event, PluginData *data) { gdk_keyboard_grab(gtk_widget_get_window(GTK_WIDGET(test)), TRUE, GDK_CURRENT_TIME); } static void on_focus_out_event(GtkButton *test, GdkEvent *event, PluginData *data) { gdk_keyboard_ungrab(GDK_CURRENT_TIME); } static gboolean on_key_event(GtkButton *test, GdkEventKey *event, PluginData *data) { GdkModifierType state; char *text; const char *label; /* ignore Tab completely so user can leave focus */ if (event->keyval == GDK_KEY_Tab) return FALSE; /* request mods directly, event->state isn't updated yet */ gdk_window_get_pointer(gtk_widget_get_window(GTK_WIDGET(test)), NULL, NULL, &state); /* special support for Win key, it doesn't work sometimes */ if ((state & GDK_SUPER_MASK) == 0 && (state & GDK_MOD4_MASK) != 0) state |= GDK_SUPER_MASK; state &= gtk_accelerator_get_default_mod_mask(); /* if mod key event then update test label and go */ if (event->is_modifier) { if (state != 0) { text = gtk_accelerator_get_label(0, state); gtk_button_set_label(test, text); g_free(text); } /* if no modifiers currently then show original state */ else gtk_button_set_label(test, g_object_get_data(G_OBJECT(test), "original_label")); return FALSE; } /* if not keypress query then ignore key press */ if (event->type != GDK_KEY_PRESS) return FALSE; /* if Escape pressed then reset to last saved */ if (state == 0 && event->keyval == GDK_KEY_Escape) { gtk_button_set_label(test, g_object_get_data(G_OBJECT(test), "original_label")); goto _done; } /* if BackSpace pressed then just clear the button */ if (state == 0 && event->keyval == GDK_KEY_BackSpace) { gtk_button_set_label(test, ""); g_object_set_data(G_OBJECT(test), "accelerator_name", NULL); g_object_set_data(G_OBJECT(test), "original_label", NULL); _done: gtk_action_set_sensitive(data->edit_apply_button, ((label = gtk_button_get_label(GTK_BUTTON(data->edit_key1))) && label[0]) || ((gtk_button_get_label(GTK_BUTTON(data->edit_key2))) && label[0])); if (data->edit_exec) gtk_widget_grab_focus(GTK_WIDGET(data->edit_exec)); else gtk_widget_grab_focus(GTK_WIDGET(data->edit_tree)); return FALSE; } /* update the label now */ text = gtk_accelerator_get_label(event->keyval, state); gtk_button_set_label(test, text); /* drop single printable and printable with single Shift, Ctrl, Alt */ if (event->length != 0 && (state == 0 || state == GDK_SHIFT_MASK || state == GDK_CONTROL_MASK || state == GDK_MOD1_MASK) && /* but make an exception for Alt+Space, it should be acceptable */ (event->keyval != GDK_KEY_space || state != GDK_MOD1_MASK)) { GtkWidget* dlg; dlg = gtk_message_dialog_new(NULL, 0, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("Key combination '%s' cannot be used as" " a global hotkey, sorry."), text); g_free(text); gtk_window_set_title(GTK_WINDOW(dlg), _("Error")); gtk_window_set_keep_above(GTK_WINDOW(dlg), TRUE); gtk_dialog_run(GTK_DIALOG(dlg)); gtk_widget_destroy(dlg); gtk_button_set_label(test, g_object_get_data(G_OBJECT(test), "original_label")); gtk_action_set_sensitive(data->edit_apply_button, ((label = gtk_button_get_label(GTK_BUTTON(data->edit_key1))) && label[0]) || ((gtk_button_get_label(GTK_BUTTON(data->edit_key2))) && label[0])); return FALSE; } /* save new value now */ g_object_set_data_full(G_OBJECT(test), "original_label", text, g_free); text = gtk_accelerator_name(event->keyval, state); if (data->use_primary) { /* convert to now */ char *subtext = strstr(text, ""); if (subtext != NULL) strncpy(subtext, "edit_apply_button, TRUE); /* change focus onto exec line or actions tree now */ if (data->edit_exec) gtk_widget_grab_focus(GTK_WIDGET(data->edit_exec)); else gtk_widget_grab_focus(GTK_WIDGET(data->edit_tree)); return FALSE; } static GtkWidget *key_button_new(PluginData *data, const char *hotkey) { GtkWidget *w; char *label; guint keyval = 0; GdkModifierType state = 0; if (hotkey) { if (data->use_primary) { /* convert to now */ char *newkey = g_strdup(hotkey); char *subkey = strstr(newkey, ""); if (subkey != NULL) strncpy(subkey, "data, user_data)); list = list->next; } return g_list_reverse(copy); } #endif /* used by edit_action() to be able to edit */ static GList *copy_options(GList *orig) { GList *copy = NULL; /* copy contents recursively */ while (orig) { LXHotkeyAttr *attr = g_slice_new(LXHotkeyAttr); LXHotkeyAttr *attr_orig = orig->data; attr->name = g_strdup(attr_orig->name); attr->values = g_list_copy_deep(attr_orig->values, (GCopyFunc)g_strdup, NULL); attr->subopts = copy_options(attr_orig->subopts); attr->desc = g_strdup(attr_orig->desc); attr->has_actions = FALSE; attr->has_value = FALSE; copy = g_list_prepend(copy, attr); orig = orig->next; } return g_list_reverse(copy); } static void add_options_to_tree(GtkTreeStore *store, GtkTreeIter *parent_iter, GList *list) { LXHotkeyAttr *opt; GtkTreeIter iter; const char *val; while (list) { opt = list->data; val = opt->values ? opt->values->data : NULL; gtk_tree_store_insert_with_values(store, &iter, parent_iter, -1, 0, opt->name, 1, val, 2, opt, 3, _(opt->name), 4, (val && val[0]) ? _(val) : NULL, -1); if (opt->subopts) add_options_to_tree(store, &iter, opt->subopts); list = list->next; } } static void update_options_tree(PluginData *data) { GtkTreeStore *store = gtk_tree_store_new(5, G_TYPE_STRING, /* option name */ G_TYPE_STRING, /* option value */ G_TYPE_POINTER, /* LXHotkeyAttr */ G_TYPE_STRING, /* shown name */ G_TYPE_STRING); /* shown value */ add_options_to_tree(store, NULL, data->edit_options_copy); gtk_tree_view_set_model(data->edit_tree, GTK_TREE_MODEL(store)); gtk_tree_view_expand_all(data->edit_tree); g_object_unref(store); } #define edit_is_active(data) (data->edit_mode != EDIT_MODE_NONE) static void cancel_edit(PluginData *data) { data->edit_mode = EDIT_MODE_NONE; gtk_widget_hide(data->edit_frame); } static void on_exec_changed(GtkEntry *exec, PluginData *data) { const char *value; //FIXME: compare with original exec? is that too heavy? if (((value = gtk_button_get_label(GTK_BUTTON(data->edit_key1))) == NULL || value[0] == 0) && ((value = gtk_button_get_label(GTK_BUTTON(data->edit_key2))) == NULL || value[0] == 0)) gtk_action_set_sensitive(data->edit_apply_button, FALSE); else gtk_action_set_sensitive(data->edit_apply_button, TRUE); } static void on_row_activated(GtkTreeView *view, GtkTreePath *path, GtkTreeViewColumn *column, PluginData *data) { GtkTreeModel *model; GtkTreeIter iter; model = gtk_tree_view_get_model(view); if (!gtk_tree_model_get_iter(model, &iter, path)) /* invalid path */ return; start_edit(model, &iter, data); } static void on_selection_changed(GtkTreeSelection *selection, PluginData *data) { if (edit_is_active(data)) //FIXME: ask confirmation and revert, is that possible? cancel_edit(data); //update toolbar buttons visibility update_edit_toolbar(data); } static void on_option_changed(GtkComboBox *box, PluginData *data) { const LXHotkeyAttr *opt, *tmpl; const GList *values; GtkTreeModel *model; GtkListStore *values_store; GtkTreeIter iter; int i, sel; gboolean is_action = FALSE; /* g_debug("on_option_changed"); */ opt = NULL; if (data->edit_mode == EDIT_MODE_ADD) is_action = (data->current_page == data->acts); else if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(data->edit_tree), &model, &iter)) { if (data->edit_mode == EDIT_MODE_EDIT) { gtk_tree_model_get(model, &iter, 2, &opt, -1); if (data->current_page == data->acts) is_action = (get_parent_template_list(model, &iter, data) == data->edit_template); } else /* EDIT_MODE_OPTION */ { tmpl = find_template_for_option(model, &iter, get_parent_template_list(model, &iter, data)); if (tmpl) is_action = tmpl->has_actions; } } if (!gtk_combo_box_get_active_iter(box, &iter)) /* no item selected */ return; gtk_tree_model_get(gtk_combo_box_get_model(box), &iter, 2, &tmpl, -1); if (tmpl->has_actions || is_action || (tmpl->subopts != NULL && !tmpl->has_value)) { /* either it's action, or option has suboptions instead of values */ gtk_widget_hide(data->edit_value_label); gtk_widget_hide(GTK_WIDGET(data->edit_value)); gtk_widget_hide(GTK_WIDGET(data->edit_values)); gtk_widget_hide(data->edit_value_num); gtk_widget_hide(data->edit_value_num_label); } else if ((values = tmpl->values) != NULL) { values_store = GTK_LIST_STORE(gtk_list_store_new(2, G_TYPE_STRING, /* description */ G_TYPE_STRING)); /* value */ for (sel = 0, i = 0; values; values = values->next, i++) { gtk_list_store_insert_with_values(values_store, NULL, i, 0, _(values->data), 1, values->data, -1); if (opt && opt->values) { if (((char *)values->data)[0] == '#') { size_t len = strspn(opt->values->data, "0123456789"); /* test if value is an integer number */ if (len == strlen(opt->values->data)) sel = i; } else if (((char *)values->data)[0] == '%') { const char *str = opt->values->data; size_t len = strspn(str, "0123456789"); /* test if value is either a fraction or a percent value */ if (len > 0 && (str[len] == '%' || str[len] == '/')) sel = i; } else if (g_strcmp0(opt->values->data, values->data) == 0) sel = i; } } gtk_combo_box_set_model(data->edit_values, GTK_TREE_MODEL(values_store)); g_object_unref(values_store); gtk_combo_box_set_active(data->edit_values, sel); gtk_widget_show(data->edit_value_label); gtk_widget_show(GTK_WIDGET(data->edit_values)); gtk_widget_hide(GTK_WIDGET(data->edit_value)); } else { gtk_widget_show(data->edit_value_label); gtk_widget_hide(data->edit_value_num); gtk_widget_hide(data->edit_value_num_label); gtk_widget_hide(GTK_WIDGET(data->edit_values)); gtk_widget_show(GTK_WIDGET(data->edit_value)); if (opt && opt->values) gtk_entry_set_text(data->edit_value, opt->values->data); else gtk_entry_set_text(data->edit_value, ""); } } static void on_value_changed(GtkComboBox *box, PluginData *data) { LXHotkeyAttr *opt; const char *value; GtkTreeModel *model; GtkTreeIter iter; gdouble num = 0; long div; model = gtk_combo_box_get_model(box); if (!gtk_combo_box_get_active_iter(box, &iter)) /* no value chosen */ goto _general; gtk_tree_model_get(model, &iter, 1, &value, -1); if (!value) /* illegal really */ goto _general; if (value[0] == '#') { /* if value is # then show data->edit_value_num */ gtk_spin_button_set_range(GTK_SPIN_BUTTON(data->edit_value_num), -1000.0, +1000.0); if (data->edit_mode == EDIT_MODE_EDIT && gtk_tree_selection_get_selected(gtk_tree_view_get_selection(data->edit_tree), &model, &iter)) { gtk_tree_model_get(model, &iter, 2, &opt, -1); if (opt && opt->values) num = strtol(opt->values->data, NULL, 10); } gtk_spin_button_set_value(GTK_SPIN_BUTTON(data->edit_value_num), num); gtk_widget_show(data->edit_value_num); gtk_widget_hide(data->edit_value_num_label); } else if (value[0] == '%') { /* if value is % then show data->edit_value_num with label "%" */ gtk_spin_button_set_range(GTK_SPIN_BUTTON(data->edit_value_num), 0.0, +100.0); if (data->edit_mode == EDIT_MODE_EDIT && gtk_tree_selection_get_selected(gtk_tree_view_get_selection(data->edit_tree), &model, &iter)) { gtk_tree_model_get(model, &iter, 2, &opt, -1); if (opt && opt->values) { value = opt->values->data; num = strtol(value, (char **)&value, 10); if (*value == '/') { /* convert fraction into percent */ div = strtol(value + 1, NULL, 10); div = MAX(div, 1); num *= 100 / div; } } } gtk_spin_button_set_value(GTK_SPIN_BUTTON(data->edit_value_num), num); gtk_widget_show(data->edit_value_num); gtk_label_set_text(GTK_LABEL(data->edit_value_num_label), "%"); gtk_widget_show(data->edit_value_num_label); } else { _general: /* else hide both data->edit_value_num and label */ gtk_widget_hide(data->edit_value_num); gtk_widget_hide(data->edit_value_num_label); } } static void apply_options(PluginData *data, LXHotkeyAttr *opt) { GtkTreeModel *model; GtkTreeIter iter; char *name, *_value = NULL; const char *value = NULL; gboolean changed = FALSE; /* process name */ if (gtk_widget_get_visible(GTK_WIDGET(data->edit_actions)) && gtk_combo_box_get_active_iter(data->edit_actions, &iter)) { model = gtk_combo_box_get_model(data->edit_actions); gtk_tree_model_get(model, &iter, 1, &name, -1); if (g_strcmp0(opt->name, name) == 0) g_free(name); else { g_free(opt->name); opt->name = name; changed = TRUE; } } /* process value */ if (gtk_widget_get_visible(data->edit_value_num)) { gdouble num_val = gtk_spin_button_get_value(GTK_SPIN_BUTTON(data->edit_value_num)); if (gtk_widget_get_visible(data->edit_value_num_label)) value = _value = g_strdup_printf("%d%s", (int)num_val, gtk_label_get_text(GTK_LABEL(data->edit_value_num_label))); else value = _value = g_strdup_printf("%d", (int)num_val); } else if (gtk_widget_get_visible(GTK_WIDGET(data->edit_values)) && gtk_combo_box_get_active_iter(data->edit_values, &iter)) { model = gtk_combo_box_get_model(data->edit_values); gtk_tree_model_get(model, &iter, 1, &_value, -1); value = _value; } else if (gtk_widget_get_visible(GTK_WIDGET(data->edit_value))) { value = gtk_entry_get_text(data->edit_value); } if (opt->values && g_strcmp0(opt->values->data, value) == 0) g_free(_value); else { if (_value == NULL) value = g_strdup(value); if (opt->values == NULL) opt->values = g_list_prepend(NULL, (gpointer)value); else { g_free(opt->values->data); opt->values->data = (gpointer)value; } changed = TRUE; } /* process changed state */ if (((value = gtk_button_get_label(GTK_BUTTON(data->edit_key1))) == NULL || value[0] == 0) && ((value = gtk_button_get_label(GTK_BUTTON(data->edit_key2))) == NULL || value[0] == 0)) gtk_action_set_sensitive(data->edit_apply_button, FALSE); else if (changed) gtk_action_set_sensitive(data->edit_apply_button, TRUE); } static void on_apply_button(GtkButton *btn, PluginData *data) { LXHotkeyAttr *opt; GtkTreeModel *model; GtkTreeIter iter; const char *val; switch (data->edit_mode) { case EDIT_MODE_ADD: opt = g_slice_new0(LXHotkeyAttr); apply_options(data, opt); /* insert new option/action */ data->edit_options_copy = g_list_append(data->edit_options_copy, opt); model = gtk_tree_view_get_model(data->edit_tree); /* update the tree */ val = opt->values ? opt->values->data : NULL; gtk_tree_store_insert_with_values(GTK_TREE_STORE(model), NULL, NULL, -1, 0, opt->name, 1, val, 2, opt, 3, _(opt->name), 4, (val && val[0]) ? _(val) : NULL, -1); /* update toolbar */ update_edit_toolbar(data); break; case EDIT_MODE_EDIT: if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(data->edit_tree), &model, &iter)) { gtk_tree_model_get(model, &iter, 2, &opt, -1); apply_options(data, opt); val = opt->values ? opt->values->data : NULL; gtk_tree_store_set(GTK_TREE_STORE(model), &iter, 1, val, 4, (val && val[0]) ? _(val) : NULL, -1); update_edit_toolbar(data); } break; case EDIT_MODE_OPTION: if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(data->edit_tree), &model, &iter)) { LXHotkeyAttr *parent; gtk_tree_model_get(model, &iter, 2, &parent, -1); opt = g_slice_new0(LXHotkeyAttr); apply_options(data, opt); parent->subopts = g_list_append(parent->subopts, opt); model = gtk_tree_view_get_model(data->edit_tree); val = opt->values ? opt->values->data : NULL; gtk_tree_store_insert_with_values(GTK_TREE_STORE(model), NULL, &iter, -1, 0, opt->name, 1, val, 2, opt, 3, _(opt->name), 4, (val && val[0]) ? _(val) : NULL, -1); gtk_tree_view_expand_all(data->edit_tree); update_edit_toolbar(data); } break; case EDIT_MODE_NONE: default: break; } cancel_edit(data); } static void on_cancel_button(GtkButton *btn, PluginData *data) { cancel_edit(data); } /* free all allocated data */ void _edit_cleanup(PluginData *data) { if (data->edit_window) { cancel_edit(data); g_object_remove_weak_pointer(G_OBJECT(data->edit_window), (gpointer)&data->edit_window); gtk_widget_destroy(GTK_WIDGET(data->edit_window)); data->edit_window = NULL; } if (data->edit_options_copy) { free_options(data->edit_options_copy); data->edit_options_copy = NULL; } } void _edit_action(PluginData *data, GError **error) { LXHotkeyGlobal *act = NULL; LXHotkeyApp *app = NULL; const char *accel1 = NULL, *accel2 = NULL; GtkBox *vbox, *xbox; GtkUIManager *ui; GtkActionGroup *act_grp; GtkAccelGroup *accel_grp; GtkWidget *widget, *align; GtkToolbar *toolbar; GtkCellRenderer *column; GtkTreeModel *model; GtkTreeIter iter; gboolean is_action = FALSE; if (data->edit_window) { /* OOPS, another edit is still opened */ return; } /* do cleanup */ _edit_cleanup(data); /* get a template */ if (data->current_page == data->acts) { if (data->cb->get_wm_actions == NULL) /* not available for edit */ return; if (data->cb->set_wm_key == NULL) /* not available for save */ return; data->edit_template = data->cb->get_wm_actions(*data->config, NULL); //FIXME: test for error is_action = TRUE; if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(data->acts), &model, &iter)) gtk_tree_model_get(model, &iter, 4, &act, -1); if (act) { /* if there is a selection then copy its options */ data->edit_options_copy = copy_options(act->actions); accel1 = act->accel1; accel2 = act->accel2; } } else { if (data->cb->get_app_options == NULL) /* not available for edit */ return; if (data->cb->set_app_key == NULL) /* not available for save */ return; data->edit_template = data->cb->get_app_options(*data->config, NULL); //FIXME: test for error if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(data->apps), &model, &iter)) gtk_tree_model_get(model, &iter, 3, &app, -1); if (app) { /* if there is a selection then copy its options */ data->edit_options_copy = copy_options(app->options); accel1 = app->accel1; accel2 = app->accel2; } } /* create a window with a GtkVBox inside */ data->edit_window = GTK_WINDOW(gtk_window_new(GTK_WINDOW_TOPLEVEL)); gtk_window_set_default_size(data->edit_window, 240, 10); gtk_window_set_transient_for(data->edit_window, GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(data->notebook)))); g_object_add_weak_pointer(G_OBJECT(data->edit_window), (gpointer)&data->edit_window); vbox = (GtkBox *)gtk_vbox_new(FALSE, 0); /* add the toolbar */ ui = gtk_ui_manager_new(); act_grp = gtk_action_group_new("Edit"); gtk_action_group_set_translation_domain(act_grp, NULL); gtk_action_group_add_actions(act_grp, actions, G_N_ELEMENTS(actions), data); accel_grp = gtk_ui_manager_get_accel_group(ui); gtk_window_add_accel_group(GTK_WINDOW(data->edit_window), accel_grp); gtk_ui_manager_insert_action_group(ui, act_grp, 0); gtk_ui_manager_add_ui_from_string(ui, edit_xml, -1, NULL); g_object_unref(act_grp); widget = gtk_ui_manager_get_widget(ui, "/toolbar"); toolbar = GTK_TOOLBAR(widget); //TODO: 'Change' -- also 2click and Enter gtk_toolbar_set_icon_size(toolbar, GTK_ICON_SIZE_SMALL_TOOLBAR); gtk_toolbar_set_style(toolbar, GTK_TOOLBAR_ICONS); gtk_toolbar_set_show_arrow(toolbar, FALSE); data->edit_apply_button = gtk_ui_manager_get_action(ui, "/toolbar/Save"); data->add_option_button = gtk_ui_manager_get_action(ui, "/toolbar/AddOption"); data->rm_option_button = gtk_ui_manager_get_action(ui, "/toolbar/Remove"); data->edit_option_button = gtk_ui_manager_get_action(ui, "/toolbar/Change"); data->add_suboption_button = gtk_ui_manager_get_action(ui, "/toolbar/AddSubOption"); gtk_action_set_sensitive(data->edit_apply_button, FALSE); gtk_box_pack_start(vbox, widget, FALSE, TRUE, 0); /* add frames for accel1 and accel2 */ xbox = (GtkBox *)gtk_hbox_new(TRUE, 0); widget = gtk_frame_new(_("Hotkey 1")); data->edit_key1 = key_button_new(data, accel1); gtk_container_add(GTK_CONTAINER(widget), data->edit_key1); gtk_box_pack_start(xbox, widget, TRUE, TRUE, 0); widget = gtk_frame_new(_("Hotkey 2")); data->edit_key2 = key_button_new(data, accel2); gtk_container_add(GTK_CONTAINER(widget), data->edit_key2); gtk_box_pack_start(xbox, widget, TRUE, TRUE, 0); gtk_box_pack_start(vbox, GTK_WIDGET(xbox), FALSE, TRUE, 0); /* add frame with all options */ widget = gtk_frame_new(NULL); gtk_frame_set_shadow_type(GTK_FRAME(widget), GTK_SHADOW_IN); xbox = (GtkBox *)gtk_vbox_new(FALSE, 0); if (is_action) { align = gtk_alignment_new(0.0, 0.0, 0.0, 0.0); gtk_container_add(GTK_CONTAINER(align), gtk_label_new(_("Actions:"))); gtk_box_pack_start(xbox, align, FALSE, TRUE, 0); data->edit_exec = NULL; } else { /* for application add a GtkEntry for exec line */ align = gtk_alignment_new(0.0, 0.0, 0.0, 0.0); gtk_container_add(GTK_CONTAINER(align), gtk_label_new(_("Command line:"))); gtk_box_pack_start(xbox, align, FALSE, TRUE, 0); data->edit_exec = GTK_ENTRY(gtk_entry_new()); g_signal_connect(data->edit_exec, "changed", G_CALLBACK(on_exec_changed), data); if (app && app->exec) gtk_entry_set_text(data->edit_exec, app->exec); align = gtk_alignment_new(0.0, 0.0, 1.0, 1.0); gtk_alignment_set_padding(GTK_ALIGNMENT(align), 0, 0, 4, 0); gtk_container_add(GTK_CONTAINER(align), GTK_WIDGET(data->edit_exec)); gtk_box_pack_start(xbox, align, FALSE, TRUE, 0); align = gtk_alignment_new(0.0, 0.0, 0.0, 0.0); gtk_container_add(GTK_CONTAINER(align), gtk_label_new(_("Options:"))); gtk_box_pack_start(xbox, align, FALSE, TRUE, 0); } data->edit_tree = GTK_TREE_VIEW(gtk_tree_view_new()); gtk_box_pack_start(xbox, GTK_WIDGET(data->edit_tree), TRUE, TRUE, 0); gtk_container_add(GTK_CONTAINER(widget), GTK_WIDGET(xbox)); gtk_box_pack_start(vbox, widget, FALSE, TRUE, 0); gtk_tree_view_insert_column_with_attributes(data->edit_tree, 0, NULL, gtk_cell_renderer_text_new(), "text", 3, NULL); gtk_tree_view_insert_column_with_attributes(data->edit_tree, 1, NULL, gtk_cell_renderer_text_new(), "text", 4, NULL); gtk_tree_view_set_headers_visible(data->edit_tree, FALSE); g_signal_connect(data->edit_tree, "row-activated", G_CALLBACK(on_row_activated), data); /* frame with fields for editing, hidden for now */ data->edit_frame = gtk_frame_new(NULL); xbox = (GtkBox *)gtk_vbox_new(FALSE, 0); /* combobox for option/action name */ align = gtk_alignment_new(0.0, 0.0, 0.0, 0.0); widget = gtk_label_new(NULL); gtk_label_set_markup(GTK_LABEL(widget), _("Name:")); gtk_container_add(GTK_CONTAINER(align), widget); gtk_box_pack_start(xbox, align, FALSE, TRUE, 0); align = gtk_alignment_new(0.0, 0.0, 1.0, 1.0); gtk_alignment_set_padding(GTK_ALIGNMENT(align), 0, 0, 4, 0); widget = gtk_hbox_new(FALSE, 0); data->edit_option_name = gtk_label_new(NULL); gtk_box_pack_start(GTK_BOX(widget), data->edit_option_name, FALSE, TRUE, 0); data->edit_actions = (GtkComboBox *)gtk_combo_box_new(); g_signal_connect(data->edit_actions, "changed", G_CALLBACK(on_option_changed), data); column = gtk_cell_renderer_text_new(); gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(data->edit_actions), column, TRUE); gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(data->edit_actions), column, "text", 0, NULL); gtk_box_pack_start(GTK_BOX(widget), GTK_WIDGET(data->edit_actions), TRUE, TRUE, 0); gtk_container_add(GTK_CONTAINER(align), widget); gtk_box_pack_start(xbox, align, FALSE, TRUE, 0); /* entry or combobox for option value */ data->edit_value_label = gtk_alignment_new(0.0, 0.0, 0.0, 0.0); widget = gtk_label_new(NULL); gtk_label_set_markup(GTK_LABEL(widget), _("Value:")); gtk_container_add(GTK_CONTAINER(data->edit_value_label), widget); gtk_box_pack_start(xbox, data->edit_value_label, FALSE, TRUE, 0); align = gtk_alignment_new(0.0, 0.0, 1.0, 1.0); gtk_alignment_set_padding(GTK_ALIGNMENT(align), 0, 0, 4, 0); widget = gtk_hbox_new(FALSE, 0); data->edit_value = (GtkEntry *)gtk_entry_new(); gtk_box_pack_start(GTK_BOX(widget), GTK_WIDGET(data->edit_value), TRUE, TRUE, 0); data->edit_values = (GtkComboBox *)gtk_combo_box_new(); column = gtk_cell_renderer_text_new(); gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(data->edit_values), column, TRUE); gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(data->edit_values), column, "text", 0, NULL); gtk_box_pack_start(GTK_BOX(widget), GTK_WIDGET(data->edit_values), TRUE, TRUE, 0); g_signal_connect(data->edit_values, "changed", G_CALLBACK(on_value_changed), data); data->edit_value_num = gtk_spin_button_new_with_range(-1000.0, +1000.0, 1.0); gtk_box_pack_start(GTK_BOX(widget), GTK_WIDGET(data->edit_value_num), FALSE, TRUE, 0); data->edit_value_num_label = gtk_label_new(NULL); gtk_box_pack_start(GTK_BOX(widget), GTK_WIDGET(data->edit_value_num_label), FALSE, TRUE, 0); gtk_container_add(GTK_CONTAINER(align), widget); gtk_box_pack_start(xbox, align, FALSE, TRUE, 0); /* buttons 'Cancel' and 'Apply' */ align = gtk_alignment_new(1.0, 0.0, 0.0, 0.0); gtk_box_pack_start(xbox, align, FALSE, TRUE, 0); widget = gtk_hbox_new(TRUE, 4); gtk_container_add(GTK_CONTAINER(align), widget); align = gtk_button_new_from_stock(GTK_STOCK_APPLY); /* reuse align */ g_signal_connect(align, "clicked", G_CALLBACK(on_apply_button), data); gtk_box_pack_end(GTK_BOX(widget), align, FALSE, TRUE, 0); align = gtk_button_new_from_stock(GTK_STOCK_CANCEL); /* reuse align */ g_signal_connect(align, "clicked", G_CALLBACK(on_cancel_button), data); gtk_box_pack_end(GTK_BOX(widget), align, FALSE, TRUE, 0); gtk_container_add(GTK_CONTAINER(data->edit_frame), GTK_WIDGET(xbox)); gtk_box_pack_start(vbox, data->edit_frame, TRUE, TRUE, 0); gtk_widget_show_all(GTK_WIDGET(vbox)); gtk_widget_hide(data->edit_frame); /* hide one of AddAction or AddOption */ if (is_action) { /* AddOption is visible for exec only */ gtk_action_set_visible(data->add_option_button, FALSE); } else { /* AddAction is visible for action only */ GtkAction *act = gtk_ui_manager_get_action(ui, "/toolbar/AddAction"); gtk_action_set_visible(act, FALSE); } gtk_container_add(GTK_CONTAINER(data->edit_window), GTK_WIDGET(vbox)); g_signal_connect(gtk_tree_view_get_selection(data->edit_tree), "changed", G_CALLBACK(on_selection_changed), data); update_options_tree(data); update_edit_toolbar(data); gtk_window_present(data->edit_window); gtk_widget_grab_focus(GTK_WIDGET(data->edit_tree)); } lxhotkey-0.1.2/plugins/gtk/edit.h000066400000000000000000000044041476256652500167510ustar00rootroot00000000000000/* * Copyright (C) 2016-2021 Andriy Grytsenko * * This file is a part of LXHotkey project. * * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef _EDIT_H_ #define _EDIT_H_ 1 #include typedef struct { /* general data */ const gchar *wm; const LXHotkeyPluginInit *cb; gpointer *config; /* main window elements */ GtkNotebook *notebook; GtkTreeView *acts, *apps; GtkAction *save_action; GtkAction *add_action; GtkAction *del_action; GtkAction *edit_action; GtkTreeView *current_page; /* edit window elements */ GtkWindow *edit_window; GList *edit_options_copy; const GList *edit_template; GtkWidget *edit_key1, *edit_key2; GtkEntry *edit_exec; GtkTreeView *edit_tree; /* edit window toolbar elements */ GtkAction *edit_apply_button; GtkAction *add_option_button; GtkAction *rm_option_button; GtkAction *edit_option_button; GtkAction *add_suboption_button; /* edit frame elements */ GtkWidget *edit_frame; GtkComboBox *edit_actions; GtkWidget *edit_option_name; //GtkLabel GtkWidget *edit_value_label; GtkEntry *edit_value; GtkComboBox *edit_values; GtkWidget *edit_value_num; //GtkSpinButton GtkWidget *edit_value_num_label; //GtkLabel gint edit_mode; gboolean use_primary; } PluginData; #define LXHOTKEY_ICON "preferences-desktop-keyboard" void _main_refresh(PluginData *data); void _edit_action(PluginData *data, GError **error); void _edit_cleanup(PluginData *data); void _show_error(const char *prefix, GError *error); #endif /* _EDIT_H_ */ lxhotkey-0.1.2/plugins/gtk/gtk.c000066400000000000000000000466721476256652500166210ustar00rootroot00000000000000/* * Copyright (C) 2016-2021 Andriy Grytsenko * * This file is a part of LXHotkey project. * * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include "lxhotkey.h" #include "edit.h" #include #include static int inited = 0; static const char menu_xml[] = "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""; static void set_actions_list(PluginData *data); static void set_apps_list(PluginData *data); void _main_refresh(PluginData *data) { set_actions_list(data); set_apps_list(data); } static void on_reload(GtkAction *act, PluginData *data) { GError *error = NULL; *data->config = data->cb->load(*data->config, &error); if (error) { _show_error(_("Problems loading configuration: "), error); g_error_free(error); } _main_refresh(data); gtk_action_set_sensitive(data->save_action, FALSE); } static void on_save(GtkAction *act, PluginData *data) { GError *error = NULL; if (data->cb->save(*data->config, &error)) gtk_action_set_sensitive(data->save_action, FALSE); else { _show_error(_("Problems saving configuration: "), error); g_error_free(error); } } static void on_quit(GtkAction *act, PluginData *data) { gtk_main_quit(); } static void on_new(GtkAction *act, PluginData *data) { gtk_tree_selection_unselect_all(gtk_tree_view_get_selection(data->current_page)); _edit_action(data, NULL); } static void on_del(GtkAction *act, PluginData *data) { LXHotkeyGlobal *gl = NULL; LXHotkeyApp *app = NULL; GError *error = NULL; GtkTreeModel *model; GtkTreeIter iter; _edit_cleanup(data); if (data->current_page == data->acts) { /* global */ if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(data->acts), &model, &iter)) gtk_tree_model_get(model, &iter, 4, &gl, -1); if (gl) { LXHotkeyGlobal rem_act = *gl; rem_act.accel1 = rem_act.accel2 = NULL; if (data->cb->set_wm_key(*data->config, &rem_act, &error)) { gtk_action_set_sensitive(data->save_action, TRUE); _main_refresh(data); } else { _show_error(_("Cannot delete keybinding: "), error); g_error_free(error); } } } else { /* application */ if (gtk_tree_selection_get_selected(gtk_tree_view_get_selection(data->apps), &model, &iter)) gtk_tree_model_get(model, &iter, 3, &app, -1); if (act) { LXHotkeyApp rem_app = *app; rem_app.accel1 = rem_app.accel2 = NULL; if (data->cb->set_app_key(*data->config, &rem_app, &error)) { gtk_action_set_sensitive(data->save_action, TRUE); _main_refresh(data); } else { _show_error(_("Cannot delete keybinding: "), error); g_error_free(error); } } } } static void on_edit(GtkAction *act, PluginData *data) { _edit_action(data, NULL); } static void on_about(GtkAction *act, PluginData *data) { GtkAboutDialog *about; const gchar *authors[] = { "Andriy Grytsenko ", NULL }; /* TRANSLATORS: Replace this string with your names, one name per line. */ gchar *translators = _("translator-credits"); about = GTK_ABOUT_DIALOG(gtk_about_dialog_new()); gtk_window_set_icon_name(GTK_WINDOW(about), LXHOTKEY_ICON); gtk_about_dialog_set_version(about, VERSION); gtk_about_dialog_set_program_name(about, "LXHotkey"); //FIXME: translated? gtk_about_dialog_set_logo_icon_name(about, LXHOTKEY_ICON); gtk_about_dialog_set_copyright(about, _("Copyright (C) 2016-2025")); gtk_about_dialog_set_comments(about, _( "Keyboard shortcuts configurator")); gtk_about_dialog_set_license(about, "This program is free software; you can redistribute it and/or\n" "modify it under the terms of the GNU General Public License\n" "as published by the Free Software Foundation; either version 2\n" "of the License, or (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, write to the Free Software Foundation,\n" "Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA."); gtk_about_dialog_set_website(about, "http://lxde.org/"); gtk_about_dialog_set_authors(about, authors); gtk_about_dialog_set_translator_credits(about, translators); gtk_dialog_run(GTK_DIALOG(about)); gtk_widget_destroy(GTK_WIDGET(about)); } static GtkActionEntry actions[] = { { "FileMenu", NULL, N_("_File"), NULL, NULL, NULL }, { "Reload", GTK_STOCK_UNDO, N_("_Reload"), NULL, N_("Drop all unsaved changes and reload all keys from Window Manager configuration"), G_CALLBACK(on_reload) }, { "Save", GTK_STOCK_SAVE, NULL, NULL, N_("Save all changes and apply them to Window Manager configuration"), G_CALLBACK(on_save) }, { "Quit", GTK_STOCK_QUIT, NULL, NULL, N_("Exit the application without saving"), G_CALLBACK(on_quit) }, { "EditMenu", NULL, N_("_Edit"), NULL, NULL, NULL }, { "New", GTK_STOCK_NEW, NULL, NULL, N_("Create new action"), G_CALLBACK(on_new) }, { "Del", GTK_STOCK_DELETE, NULL, "", N_("Remove selected action"), G_CALLBACK(on_del) }, { "Edit", GTK_STOCK_EDIT, NULL, NULL, N_("Change selected action"), G_CALLBACK(on_edit) }, { "HelpMenu", NULL, N_("_Help"), NULL, NULL, NULL }, { "About", GTK_STOCK_ABOUT, NULL, NULL, NULL, G_CALLBACK(on_about) } }; static void on_notebook_switch_page(GtkNotebook *nb, GtkTreeView *page, guint num, PluginData *data) { gboolean has_selection; gboolean can_edit; _edit_cleanup(data); /* abort edit */ data->current_page = page; has_selection = gtk_tree_selection_get_selected(gtk_tree_view_get_selection(page), NULL, NULL); if (page == data->acts) can_edit = (data->cb->set_wm_key != NULL); else /* apps page */ can_edit = (data->cb->set_app_key != NULL); gtk_action_set_sensitive(data->del_action, has_selection && can_edit); gtk_action_set_sensitive(data->edit_action, has_selection && can_edit); gtk_action_set_sensitive(data->add_action, can_edit); } static void on_selection_changed(GtkTreeSelection *selection, PluginData *data) { gboolean has_selection; if (gtk_tree_view_get_selection(data->current_page) != selection) return; _edit_cleanup(data); /* abort edit */ has_selection = gtk_tree_selection_get_selected(selection, NULL, NULL); gtk_action_set_sensitive(data->del_action, has_selection); gtk_action_set_sensitive(data->edit_action, has_selection); } static void on_row_activated(GtkTreeView *view, GtkTreePath *path, GtkTreeViewColumn *column, PluginData *data) { _edit_action(data, NULL); } static void set_actions_list(PluginData *data) { GtkListStore *model = gtk_list_store_new(5, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER); GList *acts = data->cb->get_wm_keys(*data->config, "*", NULL); GList *l; LXHotkeyGlobal *act; LXHotkeyAttr *attr, *opt; char *val, *_val; GtkTreeIter iter; for (l = acts; l; l = l->next) { act = l->data; if (act->actions == NULL) continue; attr = act->actions->data; _val = val = NULL; opt = NULL; if (attr->subopts) { opt = attr->subopts->data; if (opt->values) { if (attr->subopts->next) _val = val = g_strdup_printf("%s:%s, ...", _(opt->name), _((char *)opt->values->data)); else _val = val = g_strdup_printf("%s:%s", _(opt->name), _((char *)opt->values->data)); } else if (attr->subopts->next) _val = val = g_strdup_printf("%s, ...", _(opt->name)); else val = _(opt->name); } gtk_list_store_insert_with_values(model, &iter, -1, 0, _(attr->name), 1, val, 2, act->accel1, 3, act->accel2, 4, act, -1); g_free(_val); //FIXME: this is a stub, it should show something better than just first action } g_list_free(acts); gtk_tree_view_set_model(data->acts, GTK_TREE_MODEL(model)); g_object_unref(model); } static void set_apps_list(PluginData *data) { GtkListStore *model = gtk_list_store_new(4, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER); GList *apps = data->cb->get_app_keys(*data->config, "*", NULL); GList *l; LXHotkeyApp *app; GtkTreeIter iter; for (l = apps; l; l = l->next) { app = l->data; gtk_list_store_insert_with_values(model, &iter, -1, 0, app->exec, 1, app->accel1, 2, app->accel2, 3, app, -1); } g_list_free(apps); gtk_tree_view_set_model(data->apps, GTK_TREE_MODEL(model)); g_object_unref(model); } static void module_gtk_run(const gchar *wm, const LXHotkeyPluginInit *cb, gpointer *config, GError **error) { GtkUIManager *ui; GtkActionGroup *act_grp; GtkAccelGroup *accel_grp; GtkWidget *win, *menubar; GtkToolbar *toolbar; GtkBox *vbox; GtkScrolledWindow *scrwin; PluginData data; if (!inited) gtk_init(&inited, NULL); inited = 1; /* force style for GtkComboBox, it's ugly when list reaches screen bottom */ #if GTK_CHECK_VERSION(3, 0, 0) GtkCssProvider *provider = gtk_css_provider_new(); if (gtk_css_provider_load_from_data(provider, "#gtk-widget {\n" "-GtkComboBox-appears-as-list : 1;\n" "}\n", -1, NULL)) gtk_style_context_add_provider_for_screen(gdk_screen_get_default(), GTK_STYLE_PROVIDER(provider), GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); g_object_unref(provider); #else gtk_rc_parse_string("style 'default-style'\n" "{\n" " GtkComboBox::appears-as-list = 1\n" "}\n" "class 'GtkWidget' style 'default-style'"); #endif memset(&data, 0, sizeof(data)); data.wm = wm; data.cb = cb; data.config = config; #if GTK_CHECK_VERSION(3, 0, 0) if (gtk_get_major_version() > 3 || gtk_get_minor_version() >= 2) data.use_primary = TRUE; #else if (gtk_check_version(2, 24, 0) == NULL) data.use_primary = TRUE; #endif win = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_default_size(GTK_WINDOW(win), 800, 480); gtk_window_set_icon_name(GTK_WINDOW(win), LXHOTKEY_ICON); g_signal_connect(win, "unmap", G_CALLBACK(gtk_main_quit), NULL); vbox = (GtkBox *)gtk_vbox_new(FALSE, 0); /* create menu bar and toolbar */ ui = gtk_ui_manager_new(); act_grp = gtk_action_group_new("Main"); gtk_action_group_set_translation_domain(act_grp, NULL); gtk_action_group_add_actions(act_grp, actions, G_N_ELEMENTS(actions), &data); accel_grp = gtk_ui_manager_get_accel_group(ui); gtk_window_add_accel_group(GTK_WINDOW(win), accel_grp); gtk_ui_manager_insert_action_group(ui, act_grp, 0); gtk_ui_manager_add_ui_from_string(ui, menu_xml, -1, NULL); g_object_unref(act_grp); menubar = gtk_ui_manager_get_widget(ui, "/menubar"); toolbar = GTK_TOOLBAR(gtk_ui_manager_get_widget(ui, "/toolbar")); data.save_action = gtk_ui_manager_get_action(ui, "/menubar/FileMenu/Save"); gtk_action_set_sensitive(data.save_action, FALSE); data.add_action = gtk_ui_manager_get_action(ui, "/menubar/EditMenu/New"); data.del_action = gtk_ui_manager_get_action(ui, "/menubar/EditMenu/Del"); data.edit_action = gtk_ui_manager_get_action(ui, "/menubar/EditMenu/Edit"); gtk_action_set_sensitive(data.del_action, FALSE); gtk_action_set_sensitive(data.edit_action, FALSE); /* FIXME: use some style? */ gtk_toolbar_set_icon_size(toolbar, GTK_ICON_SIZE_SMALL_TOOLBAR); gtk_toolbar_set_style(toolbar, GTK_TOOLBAR_ICONS); gtk_box_pack_start(vbox, menubar, FALSE, TRUE, 0); gtk_box_pack_start(vbox, GTK_WIDGET(toolbar), FALSE, TRUE, 0); /* notebook - it contains two tabs: Actions and Programs */ data.notebook = (GtkNotebook*)gtk_notebook_new(); gtk_notebook_set_scrollable(data.notebook, TRUE); gtk_container_set_border_width(GTK_CONTAINER(data.notebook), 0); g_signal_connect_after(data.notebook, "switch-page", G_CALLBACK(on_notebook_switch_page), &data); /* notebook should be in a scrolled window if there is no enough space */ scrwin = (GtkScrolledWindow *)gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_add_with_viewport(scrwin, GTK_WIDGET(data.notebook)); gtk_scrolled_window_set_policy(scrwin, GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_box_pack_start(vbox, GTK_WIDGET(scrwin), TRUE, TRUE, 0); /* setup notebook */ if (cb->get_wm_keys) { data.acts = GTK_TREE_VIEW(gtk_tree_view_new()); gtk_tree_view_insert_column_with_attributes(data.acts, 0, _("Action"), gtk_cell_renderer_text_new(), "text", 0, NULL); gtk_tree_view_insert_column_with_attributes(data.acts, 1, _("Option"), gtk_cell_renderer_text_new(), "text", 1, NULL); gtk_tree_view_insert_column_with_attributes(data.acts, 2, _("Hotkey 1"), gtk_cell_renderer_text_new(), "text", 2, NULL); gtk_tree_view_insert_column_with_attributes(data.acts, 3, _("Hotkey 2"), gtk_cell_renderer_text_new(), "text", 3, NULL); set_actions_list(&data); g_signal_connect(data.acts, "row-activated", G_CALLBACK(on_row_activated), &data); g_signal_connect(gtk_tree_view_get_selection(data.acts), "changed", G_CALLBACK(on_selection_changed), &data); gtk_notebook_append_page(data.notebook, GTK_WIDGET(data.acts), gtk_label_new(_("Actions"))); } if (cb->get_app_keys) { data.apps = GTK_TREE_VIEW(gtk_tree_view_new()); gtk_tree_view_insert_column_with_attributes(data.apps, 0, _("Command"), gtk_cell_renderer_text_new(), "text", 0, NULL); gtk_tree_view_insert_column_with_attributes(data.apps, 1, _("Hotkey 1"), gtk_cell_renderer_text_new(), "text", 1, NULL); gtk_tree_view_insert_column_with_attributes(data.apps, 2, _("Hotkey 2"), gtk_cell_renderer_text_new(), "text", 2, NULL); set_apps_list(&data); g_signal_connect(data.apps, "row-activated", G_CALLBACK(on_row_activated), &data); g_signal_connect(gtk_tree_view_get_selection(data.apps), "changed", G_CALLBACK(on_selection_changed), &data); gtk_notebook_append_page(data.notebook, GTK_WIDGET(data.apps), gtk_label_new(_("Programs"))); } /* and finally run it all */ data.current_page = (GtkTreeView *)gtk_notebook_get_nth_page(data.notebook, 0); gtk_container_add(GTK_CONTAINER(win), GTK_WIDGET(vbox)); gtk_widget_show_all(win); gtk_main(); _edit_cleanup(&data); } void _show_error(const char *prefix, GError *error) { GtkWidget *dlg; if (error && error->message) { dlg = gtk_message_dialog_new(NULL, 0, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "%s%s", prefix, error->message); gtk_window_set_title(GTK_WINDOW(dlg), _("Error")); gtk_window_set_keep_above(GTK_WINDOW(dlg), TRUE); gtk_dialog_run(GTK_DIALOG(dlg)); gtk_widget_destroy(dlg); } } static void module_gtk_alert(GError *error) { _show_error("", error); } static void module_gtk_init(int argc, char **argv) { if (!inited) gtk_init(&argc, &argv); inited = 1; } FM_DEFINE_MODULE(lxhotkey_gui, gtk) LXHotkeyGUIPluginInit fm_module_init_lxhotkey_gui = { .run = module_gtk_run, .alert = module_gtk_alert, .init = module_gtk_init }; lxhotkey-0.1.2/plugins/gtk/lxhotkey-gtk.desktop.in000066400000000000000000000005031476256652500223010ustar00rootroot00000000000000[Desktop Entry] Type=Application Icon=preferences-desktop-keyboard _Name=Setup Hot Keys _Comment=View and change Window Manager global shortcuts _Keywords=hotkey;shortcut;system;settings; Categories=DesktopSettings;Settings;Core;GTK; NotShowIn=GNOME;KDE;XFCE;MATE; Exec=lxhotkey --gui=gtk StartupNotify=true Terminal=false lxhotkey-0.1.2/plugins/openbox/000077500000000000000000000000001476256652500165365ustar00rootroot00000000000000lxhotkey-0.1.2/plugins/openbox/openbox.c000066400000000000000000001546111476256652500203640ustar00rootroot00000000000000/* * Copyright (C) 2016 Andriy Grytsenko * Copyright (C) 2020 durapensa * * This file is a part of LXHotkey project. * * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #define WANT_OPTIONS_EQUAL #include "lxhotkey.h" #include #include #include #include #include #define LXKEYS_OB_ERROR lxhotkey_ob_error_quark() static GQuark lxhotkey_ob_error_quark(void) { static GQuark q = 0; if G_UNLIKELY(q == 0) q = g_quark_from_static_string("lxhotkey-ob-error"); return q; } enum LXHotkeyObError { LXKEYS_FILE_ERROR, LXKEYS_PARSE_ERROR }; /* simple functions to manage LXHotkeyAttr data type */ static inline LXHotkeyAttr *lxhotkey_attr_new(void) { return g_slice_new0(LXHotkeyAttr); } #define free_options(acts) g_list_free_full(acts, (GDestroyNotify)lkxeys_attr_free) static void lkxeys_attr_free(LXHotkeyAttr *data) { g_free(data->name); g_list_free_full(data->values, g_free); free_options(data->subopts); g_slice_free(LXHotkeyAttr, data); } static void lkxeys_action_free(LXHotkeyGlobal *data) { free_options(data->actions); g_free(data->accel1); g_free(data->accel2); g_free(data); } static void lkxeys_app_free(LXHotkeyApp *data) { g_free(data->exec); free_options(data->options); g_free(data->accel1); g_free(data->accel2); g_free(data); } /* convert from OB format (A-Return) into GDK format (Return) */ static gchar *obkey_to_key(const gchar *obkey) { GString *str = g_string_sized_new(16); while (*obkey) { if (obkey[1] == '-') switch(obkey[0]) { case 'S': g_string_append(str, ""); break; case 'C': g_string_append(str, ""); break; case 'A': g_string_append(str, ""); break; case 'W': g_string_append(str, ""); break; case 'M': g_string_append(str, ""); break; case 'H': g_string_append(str, ""); break; default: goto _add_rest; } else _add_rest: break; obkey += 2; } g_string_append(str, obkey); return g_string_free(str, FALSE); } /* convert from GDK format (Return) into OB format (A-Return) */ static gchar *key_to_obkey(const gchar *key) { GString *str = g_string_sized_new(16); gboolean in_lt = FALSE; while (*key) { if (in_lt) { if (*key++ == '>') in_lt = FALSE; } else if (*key == '<') { key++; in_lt = TRUE; if (strncmp(key, "Shift", 5) == 0) { g_string_append(str, "S-"); key += 5; } else if (strncmp(key, "Contr", 5) == 0 || strncmp(key, "Ctr", 3) == 0) { g_string_append(str, "C-"); key += 3; } else if (strncmp(key, "Alt", 3) == 0) { g_string_append(str, "A-"); key += 3; } else if (strncmp(key, "Super", 5) == 0) { g_string_append(str, "W-"); key += 5; } else if (strncmp(key, "Meta", 4) == 0) { g_string_append(str, "M-"); key += 4; } else if (strncmp(key, "Hyper", 5) == 0) { g_string_append(str, "H-"); key += 5; } } else g_string_append_c(str, *key++); } return g_string_free(str, FALSE); } static gboolean restart_openbox(GError **error) { Display *dpy = XOpenDisplay(NULL); XEvent ce; gboolean ret = TRUE; ce.xclient.type = ClientMessage; ce.xclient.message_type = XInternAtom(dpy, "_OB_CONTROL", True); ce.xclient.display = dpy; ce.xclient.window = RootWindow(dpy, DefaultScreen(dpy)); ce.xclient.format = 32; ce.xclient.data.l[0] = 1; /* reconfigure */ ce.xclient.data.l[1] = 0; ce.xclient.data.l[2] = 0; ce.xclient.data.l[3] = 0; ce.xclient.data.l[4] = 0; if (ce.xclient.message_type == None || XSendEvent(dpy, ce.xclient.window, False, SubstructureNotifyMask | SubstructureRedirectMask, &ce) == 0) { g_set_error_literal(error, LXKEYS_OB_ERROR, LXKEYS_FILE_ERROR, _("Failed to reconfigure Openbox.")); ret = FALSE; } XCloseDisplay(dpy); return ret; } /* * Actions/options list supported by Openbox. * * This array is a bit tricky since it does not contain GList pointers, but * those pointers will be expanded on demand. */ #define TO_BE_CONVERTED(a) (GList *)(a) #define TO_BE_PREVIOUS TO_BE_CONVERTED(1) /* reuse GList */ #define BOOLEAN_VALUES TO_BE_CONVERTED(2) /* reuse GList */ static char * values_enabled[] = { N_("yes"), N_("no"), NULL }; static LXHotkeyAttr options_startupnotify[] = { { N_("enabled"), BOOLEAN_VALUES, NULL, NULL, FALSE }, { N_("wmclass"), NULL, NULL, NULL, FALSE }, { N_("name"), NULL, NULL, NULL, FALSE }, { N_("icon"), NULL, NULL, NULL, FALSE }, { NULL } }; static LXHotkeyAttr options_Execute[] = { { N_("command"), NULL, NULL, NULL, FALSE }, { N_("prompt"), NULL, NULL, NULL, FALSE }, { N_("startupnotify"), NULL, TO_BE_CONVERTED(options_startupnotify), NULL, FALSE }, { NULL } }; static char * values_x[] = { "#", "%", N_("center"), NULL }; static char * values_monitor[] = { N_("default"), N_("primary"), N_("mouse"), N_("active"), N_("all"), "#", NULL }; static LXHotkeyAttr options_position[] = { { "x", TO_BE_CONVERTED(values_x), NULL, NULL, FALSE }, { "y", TO_BE_PREVIOUS, NULL, NULL, FALSE }, { N_("monitor"), TO_BE_CONVERTED(values_monitor), NULL, NULL, FALSE }, { NULL } }; static LXHotkeyAttr options_ShowMenu[] = { { N_("menu"), NULL, NULL, NULL, FALSE }, { N_("position"), NULL, TO_BE_CONVERTED(options_position), NULL, FALSE }, { NULL } }; static char * values_dialog[] = { N_("list"), N_("icons"), N_("none"), NULL }; static LXHotkeyAttr options_NextWindow[] = { { N_("dialog"), TO_BE_CONVERTED(values_dialog), NULL, NULL, FALSE }, { N_("bar"), BOOLEAN_VALUES, NULL, NULL, FALSE }, { N_("raise"), BOOLEAN_VALUES, NULL, NULL, FALSE }, { N_("allDesktops"), BOOLEAN_VALUES, NULL, NULL, FALSE }, { N_("panels"), BOOLEAN_VALUES, NULL, NULL, FALSE }, { N_("desktop"), BOOLEAN_VALUES, NULL, NULL, FALSE }, { N_("linear"), BOOLEAN_VALUES, NULL, NULL, FALSE }, { N_("interactive"), BOOLEAN_VALUES, NULL, NULL, FALSE }, /* TRANSLATORS: finalactions means actions when done */ { N_("finalactions"), NULL, NULL, NULL, TRUE }, { NULL } }; static char * values_direction[] = { N_("north"), N_("northeast"), N_("east"), N_("southeast"), N_("south"), N_("southwest"), N_("west"), N_("northwest"), NULL }; static LXHotkeyAttr options_DirectionalCycleWindows[] = { { N_("direction"), TO_BE_CONVERTED(values_direction), NULL, NULL, FALSE }, { N_("dialog"), BOOLEAN_VALUES, NULL, NULL, FALSE }, { N_("bar"), BOOLEAN_VALUES, NULL, NULL, FALSE }, { N_("raise"), BOOLEAN_VALUES, NULL, NULL, FALSE }, { N_("panels"), BOOLEAN_VALUES, NULL, NULL, FALSE }, { N_("desktops"), BOOLEAN_VALUES, NULL, NULL, FALSE }, { N_("finalactions"), NULL, NULL, NULL, TRUE }, { NULL } }; /* TRANSLATORS: these values are in regard to desktop */ static char * values_to[] = { "#", N_("current"), N_("next"), N_("previous"), N_("last"), N_("north"), N_("up"), N_("south"), N_("down"), N_("west"), N_("left"), N_("east"), N_("right"), NULL }; static LXHotkeyAttr options_GoToDesktop[] = { { N_("to"), TO_BE_CONVERTED(values_to), NULL, NULL, FALSE }, { N_("wrap"), BOOLEAN_VALUES, NULL, NULL, FALSE }, { NULL } }; static char * values_where[] = { N_("current"), N_("last"), NULL }; static LXHotkeyAttr options_AddDesktop[] = { { N_("where"), TO_BE_CONVERTED(values_where), NULL, NULL, FALSE }, { NULL } }; static LXHotkeyAttr options_ToggleShowDesktop[] = { { N_("strict"), BOOLEAN_VALUES, NULL, NULL, FALSE }, { NULL } }; static LXHotkeyAttr options_Restart[] = { { N_("command"), NULL, NULL, NULL, FALSE }, { NULL } }; static LXHotkeyAttr options_Exit[] = { { N_("prompt"), BOOLEAN_VALUES, NULL, NULL, FALSE }, { NULL } }; static char * values_directionM[] = { N_("both"), N_("horizontal"), N_("vertical"), NULL }; static LXHotkeyAttr options_ToggleMaximize[] = { { N_("direction"), TO_BE_CONVERTED(values_directionM), NULL, NULL, FALSE }, { NULL } }; static char * values_toS[] = { "#", N_("current"), N_("next"), N_("previous"), N_("last"), N_("north"), N_("up"), N_("south"), N_("down"), N_("west"), N_("left"), N_("east"), N_("right"), NULL }; static LXHotkeyAttr options_SendToDesktop[] = { { N_("to"), TO_BE_CONVERTED(values_toS), NULL, NULL, FALSE }, { N_("wrap"), BOOLEAN_VALUES, NULL, NULL, FALSE }, { N_("follow"), BOOLEAN_VALUES, NULL, NULL, FALSE }, { NULL } }; static char * values_edge[] = { N_("top"), N_("left"), N_("right"), N_("bottom"), N_("topleft"), N_("topright"), N_("bottomleft"), N_("bottomright"), NULL }; static LXHotkeyAttr options_Resize[] = { { N_("edge"), TO_BE_CONVERTED(values_edge), NULL, NULL, FALSE }, { NULL } }; static char * values_xM[] = { N_("#"), N_("current"), N_("center"), NULL }; /* TRANSLATORS: % in config means some fraction value, usually measured in percents */ static char * values_width[] = { "#", N_("%"), "current", NULL }; static char * values_monitorM[] = { "#", N_("current"), N_("all"), N_("next"), N_("prev"), NULL }; static LXHotkeyAttr options_MoveResizeTo[] = { { "x", TO_BE_CONVERTED(values_xM), NULL, NULL, FALSE }, { "y", TO_BE_PREVIOUS, NULL, NULL, FALSE }, { N_("width"), TO_BE_CONVERTED(values_width), NULL, NULL, FALSE }, { N_("height"), TO_BE_PREVIOUS, NULL, NULL, FALSE }, { N_("monitor"), TO_BE_CONVERTED(values_monitorM), NULL, NULL, FALSE }, { NULL } }; /* TRANSLATORS: # in config means either pixels, or monitor number */ static char * values_xR[] = { N_("#"), NULL }; static LXHotkeyAttr options_MoveRelative[] = { { "x", TO_BE_CONVERTED(values_xR), NULL, NULL, FALSE }, { "y", TO_BE_PREVIOUS, NULL, NULL, FALSE }, { NULL } }; static char * values_xRR[] = { "#", NULL }; static LXHotkeyAttr options_ResizeRelative[] = { { N_("left"), TO_BE_CONVERTED(values_xRR), NULL, NULL, FALSE }, { N_("right"), TO_BE_PREVIOUS, NULL, NULL, FALSE }, { N_("top"), TO_BE_PREVIOUS, NULL, NULL, FALSE }, { N_("bottom"), TO_BE_PREVIOUS, NULL, NULL, FALSE }, { NULL } }; static char * values_directionE[] = { N_("north"), N_("south"), N_("west"), N_("east"), NULL }; static LXHotkeyAttr options_MoveToEdge[] = { { N_("direction"), TO_BE_CONVERTED(values_directionE), NULL, NULL, FALSE }, { NULL } }; static char * values_layer[] = { N_("top"), N_("normal"), N_("bottom"), NULL }; static LXHotkeyAttr options_SendToLayer[] = { { N_("layer"), TO_BE_CONVERTED(values_layer), NULL, NULL, FALSE }, { NULL } }; static LXHotkeyAttr list_actions[] = { /* global actions */ { N_("Execute"), NULL, TO_BE_CONVERTED(options_Execute), NULL, FALSE }, { N_("ShowMenu"), NULL, TO_BE_CONVERTED(options_ShowMenu), NULL, FALSE }, { N_("NextWindow"), NULL, TO_BE_CONVERTED(options_NextWindow), NULL, FALSE }, { N_("PreviousWindow"), NULL, TO_BE_PREVIOUS, NULL, FALSE }, { N_("DirectionalCycleWindows"), NULL, TO_BE_CONVERTED(options_DirectionalCycleWindows), NULL, FALSE }, { N_("DirectionalTargetWindow"), NULL, TO_BE_PREVIOUS, NULL, FALSE }, { N_("GoToDesktop"), NULL, TO_BE_CONVERTED(options_GoToDesktop), NULL, FALSE }, { N_("AddDesktop"), NULL, TO_BE_CONVERTED(options_AddDesktop), NULL, FALSE }, { N_("RemoveDesktop"), NULL, TO_BE_PREVIOUS, NULL, FALSE }, { N_("ToggleShowDesktop"), NULL, TO_BE_CONVERTED(options_ToggleShowDesktop), NULL, FALSE }, { N_("ToggleDockAutohide"), NULL, NULL, NULL, FALSE }, { N_("Reconfigure"), NULL, NULL, NULL, FALSE }, { N_("Restart"), NULL, TO_BE_CONVERTED(options_Restart), NULL, FALSE }, { N_("Exit"), NULL, TO_BE_CONVERTED(options_Exit), NULL, FALSE }, /* windows actions */ { N_("Focus"), NULL, NULL, NULL, FALSE }, { N_("Raise"), NULL, NULL, NULL, FALSE }, { N_("Lower"), NULL, NULL, NULL, FALSE }, { N_("RaiseLower"), NULL, NULL, NULL, FALSE }, { N_("Unfocus"), NULL, NULL, NULL, FALSE }, { N_("FocusToBottom"), NULL, NULL, NULL, FALSE }, { N_("Iconify"), NULL, NULL, NULL, FALSE }, { N_("Close"), NULL, NULL, NULL, FALSE }, { N_("ToggleShade"), NULL, NULL, NULL, FALSE }, { N_("Shade"), NULL, NULL, NULL, FALSE }, { N_("Unshade"), NULL, NULL, NULL, FALSE }, { N_("ToggleOmnipresent"), NULL, NULL, NULL, FALSE }, { N_("ToggleMaximize"), NULL, TO_BE_CONVERTED(options_ToggleMaximize), NULL, FALSE }, { N_("Maximize"), NULL, TO_BE_PREVIOUS, NULL, FALSE }, { N_("Unmaximize"), NULL, TO_BE_PREVIOUS, NULL, FALSE }, { N_("ToggleFullscreen"), NULL, NULL, NULL, FALSE }, { N_("ToggleDecorations"), NULL, NULL, NULL, FALSE }, { N_("Decorate"), NULL, NULL, NULL, FALSE }, { N_("Undecorate"), NULL, NULL, NULL, FALSE }, { N_("SendToDesktop"), NULL, TO_BE_CONVERTED(options_SendToDesktop), NULL, FALSE }, { N_("Move"), NULL, NULL, NULL, FALSE }, { N_("Resize"), NULL, TO_BE_CONVERTED(options_Resize), NULL, FALSE }, { N_("MoveResizeTo"), NULL, TO_BE_CONVERTED(options_MoveResizeTo), NULL, FALSE }, { N_("MoveRelative"), NULL, TO_BE_CONVERTED(options_MoveRelative), NULL, FALSE }, { N_("ResizeRelative"), NULL, TO_BE_CONVERTED(options_ResizeRelative), NULL, FALSE }, { N_("MoveToEdge"), NULL, TO_BE_CONVERTED(options_MoveToEdge), NULL, FALSE }, { N_("GrowToEdge"), NULL, TO_BE_PREVIOUS, NULL, FALSE }, { N_("ShrinkToEdge"), NULL, TO_BE_PREVIOUS, NULL, FALSE }, { N_("GrowToFill"), NULL, NULL, NULL, FALSE }, { N_("ToggleAlwaysOnTop"), NULL, NULL, NULL, FALSE }, { N_("ToggleAlwaysOnBottom"), NULL, NULL, NULL, FALSE }, { N_("SendToLayer"), NULL, TO_BE_CONVERTED(options_SendToLayer), NULL, FALSE }, // FIXME: support for If/ForEach/Stop ? { NULL } }; static GList *boolean_values = NULL; static GList *available_wm_actions = NULL; static GList *available_app_options = NULL; static GList *convert_values(gpointer data) { char ** array; GList *list = NULL; for (array = data; array[0] != NULL; array++) { /* g_debug("creating GList for string '%s'", array[0]); */ list = g_list_prepend(list, array[0]); } return g_list_reverse(list); } static GList *convert_options(gpointer data) { LXHotkeyAttr *array, *last = NULL; GList *list = NULL; for (array = data; array->name != NULL; array++) { list = g_list_prepend(list, array); if (last && array->values == TO_BE_PREVIOUS) array->values = last->values; else if (array->values == BOOLEAN_VALUES) { if (boolean_values == NULL) boolean_values = convert_values(values_enabled); array->values = boolean_values; } else if (array->values != NULL) array->values = convert_values(array->values); if (last && array->subopts == TO_BE_PREVIOUS) array->subopts = last->subopts; else if (array->subopts != NULL) { if (array->subopts == TO_BE_CONVERTED(options_Execute)) array->subopts = available_app_options = convert_options(array->subopts); else array->subopts = convert_options(array->subopts); } last = array; } return g_list_reverse(list); } typedef struct { FmXmlFileItem *parent; /* R/O */ GList *list; /* contains LXHotkeyAttr items for finished actions */ } ObActionsList; typedef struct { char *path; FmXmlFile *xml; FmXmlFileItem *keyboard; /* the section */ GList *actions; /* no-exec actions, in reverse order */ GList *execs; /* exec-only actions, in reverse order */ GList *stack; /* only for build - elements are ObActionsList */ GList *added_tags; /* only for edit */ } ObXmlFile; static FmXmlFileTag ObXmlFile_keyboard; /* section that we work on */ static FmXmlFileTag ObXmlFile_keybind; /* subsection, for each binding */ static FmXmlFileTag ObXmlFile_action; /* may be multiple for a binding */ static FmXmlFileTag ObXmlFile_command; /* for */ static FmXmlFileTag ObXmlFile_execute; /* obsolete alias for command */ static inline void clear_stack(ObXmlFile *cfg) { while (cfg->stack != NULL) { free_options(((ObActionsList *)cfg->stack->data)->list); g_free(cfg->stack->data); cfg->stack = g_list_delete_link(cfg->stack, cfg->stack); } } static gboolean tag_handler_keyboard(FmXmlFileItem *item, GList *children, char * const *attribute_names, char * const *attribute_values, guint n_attributes, gint line, gint pos, GError **error, gpointer user_data) { ObXmlFile *cfg = user_data; if (cfg->keyboard) { /* FIXME: merge duplicate section? */ g_set_error_literal(error, LXKEYS_OB_ERROR, LXKEYS_PARSE_ERROR, _("Duplicate section in the rc.xml file.")); return FALSE; } cfg->keyboard = item; return TRUE; } static gboolean tag_handler_keybind(FmXmlFileItem *item, GList *children, char * const *attribute_names, char * const *attribute_values, guint n_attributes, gint line, gint pos, GError **error, gpointer user_data) { ObXmlFile *cfg = user_data; ObActionsList *oblist; GList *actions, *l; gchar *key; const char *exec_line = NULL; LXHotkeyAttr *action; LXHotkeyApp *app = NULL; LXHotkeyGlobal *act; guint i; if (!cfg->stack) { /* empty keybind tag, just ignore it and remove */ g_warning("Openbox config: empty keybind tag in rc.xml, going to remove it"); fm_xml_file_item_destroy(item); return TRUE; } oblist = cfg->stack->data; if (oblist->parent != item) { /* corruption! */ g_set_error_literal(error, LXKEYS_OB_ERROR, LXKEYS_PARSE_ERROR, _("Internal error.")); return FALSE; } /* just remove top stack item, all actions are already there */ actions = oblist->list; g_free(oblist); cfg->stack = g_list_delete_link(cfg->stack, cfg->stack); /* and clear junk if there were actions there - e.g. from mouse section */ clear_stack(cfg); action = actions->data; /* decide where to put: execs or actions */ if (children && !children->next && /* exactly one child which is an action */ fm_xml_file_item_get_tag(children->data) == ObXmlFile_action) { if (strcmp(action->name, "Execute") == 0) { /* and action is Execute */ FmXmlFileItem *exec = fm_xml_file_item_find_child(children->data, ObXmlFile_command); if (!exec) exec = fm_xml_file_item_find_child(children->data, ObXmlFile_execute); /* if exec is NULL then it's invalid action after all */ if (exec) { /* not empty exec line was verified in the handler */ exec_line = fm_xml_file_item_get_data(fm_xml_file_item_find_child(exec, FM_XML_FILE_TEXT), NULL); for (l = cfg->execs; l; l = l->next) /* if exec line is equal to one gathered already */ if (strcmp(((LXHotkeyApp *)l->data)->exec, exec_line) == 0 && /* and it has no secondary keybinding */ ((LXHotkeyApp *)l->data)->accel2 == NULL && /* and options are also equal */ options_equal(((LXHotkeyApp *)l->data)->options, action->subopts)) { /* then just add this keybinding to found one */ app = (LXHotkeyApp *)l->data; break; } } } } /* find a "key" attribute and save its value as accel1 */ for (i = 0; i < n_attributes; i++) if (g_strcmp0(attribute_names[i], "key") == 0) break; if (i == n_attributes) { /* no name in XML! */ g_set_error_literal(error, LXKEYS_OB_ERROR, LXKEYS_PARSE_ERROR, _("rc.xml error: no key is set for a keybind.")); free_options(actions); return FALSE; } else key = obkey_to_key(attribute_values[i]); /* if that exec already exists then reuse it and set as accel2 */ if (app) { app->accel2 = key; app->data2 = item; /* otherwise create LXHotkeyApp or LXHotkeyGlobal and add it to the list */ } else if (exec_line) { app = g_new0(LXHotkeyApp, 1); app->accel1 = key; app->exec = g_strdup(exec_line); app->data1 = item; app->options = action->subopts; /* remove exec line from options, it should be in XML but not in LXHotkeyApp */ for (l = app->options; l; ) { LXHotkeyAttr *opt = l->data; l = l->next; if (strcmp(opt->name, "command") == 0 || strcmp(opt->name, "execute") == 0) { app->options = g_list_remove(app->options, opt); lkxeys_attr_free(opt); } } action->subopts = NULL; cfg->execs = g_list_prepend(cfg->execs, app); } else { for (l = cfg->actions; l; l = l->next) /* if the same actions list was gathered already */ if (options_equal((act = l->data)->actions, actions) /* and it has no secondary keybinding */ && act->accel2 == NULL) break; if (l == NULL) { act = g_new0(LXHotkeyGlobal, 1); act->accel1 = key; act->data1 = item; act->actions = actions; actions = NULL; cfg->actions = g_list_prepend(cfg->actions, act); } else { /* actions exist in list so reuse it adding a second keybinding */ act->accel2 = key; act->data2 = item; } } free_options(actions); return TRUE; } /* collect all children of FmXmlFileItem into LXHotkeyAttr list removing from stack if found there since actions cannot be mixed with options, just ignore anything not collected into any ObActionsList */ static GList *resolve_item(GList **stack, GList *children, GList **value, GError **error) { GList *child, *l, *items = NULL; ObActionsList *act; /* stack item */ FmXmlFileItem *item; /* child item */ LXHotkeyAttr *data; for (child = children; child; child = child->next) { item = child->data; if (fm_xml_file_item_get_tag(item) == FM_XML_FILE_TEXT) { /* value! */ *value = g_list_prepend(*value, g_strdup(fm_xml_file_item_get_data(item, NULL))); continue; } if (fm_xml_file_item_get_tag(item) == ObXmlFile_action) { /* stray action? */ g_set_error_literal(error, LXKEYS_OB_ERROR, LXKEYS_PARSE_ERROR, _("Invalid rc.xml: action with a sub-action.")); free_options(items); return NULL; } data = lxhotkey_attr_new(); data->name = g_strdup(fm_xml_file_item_get_tag_name(item)); /* find if item is in stack, then remove from there and use ready list */ for (l = *stack; l; l = l->next) { act = l->data; if (act->parent == item) { *stack = g_list_delete_link(*stack, l); data->subopts = act->list; data->has_actions = TRUE; g_free(act); /* release the ObActionsList */ break; } } /* otherwise collect children by recursive call */ if (l == NULL) { GError *err = NULL; l = fm_xml_file_item_get_children(item); data->subopts = resolve_item(stack, l, &data->values, &err); g_list_free(l); if (err) { g_propagate_error(error, err); free_options(items); lkxeys_attr_free(data); return NULL; } } /* add the item to the list */ items = g_list_prepend(items, data); } return g_list_reverse(items); } static gboolean is_on_stack(GList *stack, FmXmlFileItem *item) { while (stack) { if (((ObActionsList *)stack->data)->parent == item) return TRUE; stack = stack->next; } return FALSE; } /* push new item on the stack, return top item */ static ObActionsList *put_on_stack_top(ObXmlFile *cfg, FmXmlFileItem *parent) { ObActionsList *oblist = g_new0(ObActionsList, 1); oblist->parent = parent; cfg->stack = g_list_prepend(cfg->stack, oblist); return oblist; } /* (parent/children) stack (changes) = (f/-) f (+f) + => (x/-) f x:4 (+x) + => (x/-) f x:45 () + => (f/x:45) f:3-x:45 (-x) + => (k/f:3) k:1-f:3 (-f +k) + => (t/-) k:1 t:8 (+t) + => (h/t:8) k:1 h:7-t:8 (-t +h) + => (k/h:7) k:16-h:7 (-h) + => (g/-) k:16 g:z (+g) + => (d/e-g:z) k:16 d:0-e-g:z (-g +d) + => (k/b-c-d:0) k:169-b-c-d:0 (-d) + => (m/-) k:169 m:y (+m) + => (n/o) k:169 m:y n:2-o (+n) + => (k/l-{m:y|n:2}) k:1693-l-{m:y|n:2} (-m -n) + => (-/1693) - (-k) */ static gboolean tag_handler_action(FmXmlFileItem *item, GList *children, char * const *attribute_names, char * const *attribute_values, guint n_attributes, gint line, gint pos, GError **error, gpointer user_data) { /* if parent is on top of stack then it's another action of the same parent */ /* if parent exists deeper on stack after resolving then it's curruption */ /* if parent doesn't exist on stack but some of children is then that child is finished, replace with this parent on stack after resolving children */ /* if parent doesn't exist on stack neither any child is then it got deeper so just add it on stack */ ObXmlFile *cfg = user_data; LXHotkeyAttr *data; ObActionsList *oblist; FmXmlFileItem *parent; GError *err = NULL; guint i; /* if section keyboard already finished then ignore this */ if (cfg->keyboard) { /* see notes in tag_handler_keyboard() as well */ return TRUE; } /* create a LXHotkeyAttr */ data = lxhotkey_attr_new(); //data->has_actions = FALSE; /* action can have only options, not sub-actions! */ /* resolve all children of this action, clearing from stack */ data->subopts = resolve_item(&cfg->stack, children, &data->values, &err); if (err) { g_propagate_error(error, err); lkxeys_attr_free(data); return FALSE; } /* find a "name" attribute and set it as name */ for (i = 0; i < n_attributes; i++) if (g_strcmp0(attribute_names[i], "name") == 0) break; if (i == n_attributes) { /* no name in XML! */ g_set_error_literal(error, LXKEYS_OB_ERROR, LXKEYS_PARSE_ERROR, _("rc.xml error: no name is set for action.")); lkxeys_attr_free(data); return FALSE; } else data->name = g_strdup(attribute_values[i]); /* add this action to the parent's list */ parent = fm_xml_file_item_get_parent(item); if (!is_on_stack(cfg->stack, parent)) oblist = put_on_stack_top(cfg, parent); else if ((oblist = cfg->stack->data)->parent != parent) { /* corruption */ g_set_error_literal(error, LXKEYS_OB_ERROR, LXKEYS_PARSE_ERROR, _("Internal error.")); lkxeys_attr_free(data); return FALSE; } oblist->list = g_list_append(oblist->list, data); return TRUE; } static gboolean tag_handler_command(FmXmlFileItem *item, GList *children, char * const *attribute_names, char * const *attribute_values, guint n_attributes, gint line, gint pos, GError **error, gpointer user_data) { FmXmlFileItem *text = fm_xml_file_item_find_child(item, FM_XML_FILE_TEXT); if (text == NULL) { /* check if value is not empty */ g_set_error(error, LXKEYS_OB_ERROR, LXKEYS_PARSE_ERROR, _("rc.xml error: empty tag <%s> is prohibited."), fm_xml_file_item_get_tag_name(item)); return FALSE; } return TRUE; } static void obcfg_free(gpointer config) { ObXmlFile *cfg = (ObXmlFile *)config; g_free(cfg->path); g_object_unref(cfg->xml); g_list_free_full(cfg->actions, (GDestroyNotify)lkxeys_action_free); g_list_free_full(cfg->execs, (GDestroyNotify)lkxeys_app_free); clear_stack(cfg); g_list_free(cfg->added_tags); g_free(cfg); } static gpointer obcfg_load(gpointer config, GError **error) { ObXmlFile *cfg = (ObXmlFile *)config; gchar *contents = NULL; GError *err = NULL; gsize len; if (config) { /* just discard any changes if any exist */ FmXmlFile *old_xml = cfg->xml; cfg->xml = fm_xml_file_new(old_xml); g_object_unref(old_xml); g_list_free_full(cfg->actions, (GDestroyNotify)lkxeys_action_free); g_list_free_full(cfg->execs, (GDestroyNotify)lkxeys_app_free); cfg->actions = NULL; cfg->execs = NULL; cfg->keyboard = NULL; } else { const char *session; /* prepare data */ cfg = g_new0(ObXmlFile, 1); cfg->xml = fm_xml_file_new(NULL); /* register handlers */ ObXmlFile_keyboard = fm_xml_file_set_handler(cfg->xml, "keyboard", &tag_handler_keyboard, FALSE, NULL); ObXmlFile_keybind = fm_xml_file_set_handler(cfg->xml, "keybind", &tag_handler_keybind, FALSE, NULL); ObXmlFile_action = fm_xml_file_set_handler(cfg->xml, "action", &tag_handler_action, FALSE, NULL); ObXmlFile_command = fm_xml_file_set_handler(cfg->xml, "command", &tag_handler_command, FALSE, NULL); ObXmlFile_execute = fm_xml_file_set_handler(cfg->xml, "execute", &tag_handler_command, FALSE, NULL); /* let try to detect rc.xml file currently in use: with Lubuntu it's lubuntu-rc.xml, with lxde session it's lxde-rc.xml */ session = g_getenv("DESKTOP_SESSION"); if (session == NULL) session = g_getenv("GDMSESSION"); if (session == NULL) session = g_getenv("XDG_CURRENT_DESKTOP"); if (g_strcmp0(session, "Lubuntu") == 0) cfg->path = g_build_filename(g_get_user_config_dir(), "openbox", "lubuntu-rc.xml", NULL); else if (g_strcmp0(session, "LXDE") == 0) cfg->path = g_build_filename(g_get_user_config_dir(), "openbox", "lxde-rc.xml", NULL); else if (g_strcmp0(session, "LXDE-pi") == 0) cfg->path = g_build_filename(g_get_user_config_dir(), "openbox", "lxde-pi-rc.xml", NULL); else cfg->path = g_build_filename(g_get_user_config_dir(), "openbox", "rc.xml", NULL); } /* try to load ~/.config/openbox/$xml */ if (!g_file_get_contents(cfg->path, &contents, &len, NULL)) { /* if it does not exist then try to load $XDG_SYSTEM_CONFDIR/openbox/rc.xml */ const gchar * const *dirs; char *path = NULL; for (dirs = g_get_system_config_dirs(); dirs[0]; dirs++) { path = g_build_filename(dirs[0], "openbox", "rc.xml", NULL); if (g_file_get_contents(path, &contents, &len, NULL)) break; g_free(path); path = NULL; } if (path == NULL) { /* failed to load */ g_set_error_literal(error, LXKEYS_OB_ERROR, LXKEYS_FILE_ERROR, _("Could not find the rc.xml file anywhere.")); obcfg_free(cfg); return NULL; } g_free(path); } /* parse the found rc.xml file */ if (!fm_xml_file_parse_data(cfg->xml, contents, len, &err, cfg) || fm_xml_file_finish_parse(cfg->xml, &err) == NULL) { g_propagate_error(error, err); g_free(contents); obcfg_free(cfg); return NULL; } g_free(contents); return cfg; } static gboolean obcfg_save(gpointer config, GError **error) { ObXmlFile *cfg = (ObXmlFile *)config; char *contents; gsize len; gboolean ret = FALSE; /* save as ~/.config/openbox/$xml */ contents = fm_xml_file_to_data(cfg->xml, &len, error); if (contents) { /* workaround on libfm-extra bug on save data without DTD */ if (contents[0] == '\n') ret = g_file_set_contents(cfg->path, contents+1, len-1, error); else ret = g_file_set_contents(cfg->path, contents, len, error); g_free(contents); } if (ret) ret = restart_openbox(error); return ret; } static GList *obcfg_get_wm_keys(gpointer config, const char *mask, GError **error) { ObXmlFile *cfg = (ObXmlFile *)config; GList *list = NULL, *l; LXHotkeyGlobal *data; if (cfg == NULL) g_set_error_literal(error, LXKEYS_OB_ERROR, LXKEYS_FILE_ERROR, _("No WM configuration is available.")); else for (l = cfg->actions; l; l = l->next) { data = l->data; if (mask == NULL || fnmatch(mask, data->accel1, 0) == 0 || (data->accel2 != NULL && fnmatch(mask, data->accel2, 0) == 0)) list = g_list_prepend(list, data); } return list; } static gboolean tag_null_handler(FmXmlFileItem *item, GList *children, char * const *attribute_names, char * const *attribute_values, guint n_attributes, gint line, gint pos, GError **error, gpointer user_data) { return TRUE; } /* if opts==NULL then don't copy any LXHotkeyAttr below it */ static FmXmlFileItem *make_new_xml_item(ObXmlFile *cfg, LXHotkeyAttr *opt, GList **opts, gboolean is_action) { FmXmlFileItem *item, *sub; GList *l; LXHotkeyAttr *act = NULL; if (is_action) { item = fm_xml_file_item_new(ObXmlFile_action); fm_xml_file_item_set_attribute(item, "name", opt->name); } else { FmXmlFileTag tag = FM_XML_FILE_TAG_NOT_HANDLED; /* find a tag in list by opt->name */ for (l = cfg->added_tags; l; l = l->next) if (g_strcmp0(fm_xml_file_get_tag_name(cfg->xml, GPOINTER_TO_UINT(l->data)), opt->name) == 0) break; if (l == NULL) { /* if not found then add to list */ tag = fm_xml_file_set_handler(cfg->xml, opt->name, &tag_null_handler, FALSE, NULL); cfg->added_tags = g_list_prepend(cfg->added_tags, GUINT_TO_POINTER(tag)); } else tag = GPOINTER_TO_UINT(l->data); item = fm_xml_file_item_new(tag); if (opt->values) fm_xml_file_item_append_text(item, opt->values->data, -1, FALSE); } if (opts != NULL) { /* make a copy if requested */ act = lxhotkey_attr_new(); act->name = g_strdup(opt->name); if (opt->values) act->values = g_list_prepend(NULL, g_strdup(opt->values->data)); act->has_actions = opt->has_actions; *opts = g_list_append(*opts, act); } for (l = opt->subopts; l; l = l->next) { sub = make_new_xml_item(cfg, l->data, act ? &act->subopts : NULL, opt->has_actions); fm_xml_file_item_append_child(item, sub); } return item; } /* if opts==NULL then don't make any LXHotkeyAttr below it */ static FmXmlFileItem *make_new_xml_binding(ObXmlFile *cfg, GList *actions, const gchar *accel, GList **opts, const gchar *exec) { FmXmlFileItem *binding = fm_xml_file_item_new(ObXmlFile_keybind); FmXmlFileItem *item, *opt; char *obkey = key_to_obkey(accel); fm_xml_file_item_set_attribute(binding, "key", obkey); g_free(obkey); fm_xml_file_item_append_child(cfg->keyboard, binding); if (exec) { /* make exec..opts.. instead of .... */ item = fm_xml_file_item_new(ObXmlFile_action); fm_xml_file_item_set_attribute(item, "name", "Execute"); fm_xml_file_item_append_child(binding, item); opt = fm_xml_file_item_new(ObXmlFile_command); fm_xml_file_item_append_text(opt, exec, -1, FALSE); fm_xml_file_item_append_child(item, opt); } else item = binding; for (; actions; actions = actions->next) { opt = make_new_xml_item(cfg, actions->data, opts, (exec == NULL)); fm_xml_file_item_append_child(item, opt); } return binding; } static inline void replace_key(FmXmlFileItem *item, const char *key, char **kptr) { char *obkey = key_to_obkey(key); fm_xml_file_item_set_attribute(item, "key", obkey); g_free(obkey); g_free(*kptr); *kptr = g_strdup(key); } static gboolean obcfg_set_wm_key(gpointer config, LXHotkeyGlobal *data, GError **error) { ObXmlFile *cfg = (ObXmlFile *)config; GList *l, *ll; LXHotkeyGlobal *act = NULL; if (cfg == NULL) { g_set_error_literal(error, LXKEYS_OB_ERROR, LXKEYS_FILE_ERROR, _("No WM configuration is available.")); return FALSE; } else if (data->actions == NULL) { g_set_error_literal(error, LXKEYS_OB_ERROR, LXKEYS_PARSE_ERROR, _("Keybinding should activate at least one action.")); return FALSE; } /* find if that action(s) is present */ for (ll = cfg->actions; ll; ll = ll->next) if (options_equal((act = ll->data)->actions, data->actions)) break; /* find if those keys are already bound elsewhere */ for (l = cfg->actions; l; l = l->next) { if (l == ll) /* it's our action */ continue; if (data->accel1) { if (strcmp(data->accel1, ((LXHotkeyGlobal *)l->data)->accel1) == 0 || g_strcmp0(data->accel1, ((LXHotkeyGlobal *)l->data)->accel2) == 0) goto _accel1_bound; } if (data->accel2) { if (g_strcmp0(data->accel2, ((LXHotkeyGlobal *)l->data)->accel1) == 0 || g_strcmp0(data->accel2, ((LXHotkeyGlobal *)l->data)->accel2) == 0) goto _accel2_bound; } } for (l = cfg->execs; l; l = l->next) { if (data->accel1) { if (strcmp(data->accel1, ((LXHotkeyApp *)l->data)->accel1) == 0 || g_strcmp0(data->accel1, ((LXHotkeyApp *)l->data)->accel2) == 0) { _accel1_bound: g_set_error(error, LXKEYS_OB_ERROR, LXKEYS_FILE_ERROR, _("Hotkey '%s' is already bound to an action."), data->accel1); return FALSE; } } if (data->accel2) { if (g_strcmp0(data->accel2, ((LXHotkeyApp *)l->data)->accel1) == 0 || g_strcmp0(data->accel2, ((LXHotkeyApp *)l->data)->accel2) == 0) { _accel2_bound: g_set_error(error, LXKEYS_OB_ERROR, LXKEYS_FILE_ERROR, _("Hotkey '%s' is already bound to an action."), data->accel2); return FALSE; } } } /* if found then either change keys or remove the keybinding */ if (ll != NULL) { if (data->accel1 == NULL) { /* removal requested */ if (act->data1) fm_xml_file_item_destroy(act->data1); if (act->data2) fm_xml_file_item_destroy(act->data2); lkxeys_action_free(act); cfg->actions = g_list_delete_link(cfg->actions, ll); } else { if (data->accel2 == NULL) { /* new data contains only one binding */ if (g_strcmp0(act->accel1, data->accel1) == 0) { /* accel1 not changed, just clear accel2 */ if (act->data2) fm_xml_file_item_destroy(act->data2); g_free(act->accel2); act->accel2 = NULL; } else if (g_strcmp0(act->accel2, data->accel1) == 0) { /* accel1 was removed */ if (act->data1) fm_xml_file_item_destroy(act->data1); g_free(act->accel1); act->accel1 = act->accel2; act->accel2 = NULL; } else { /* full change */ replace_key(act->data1, data->accel1, &act->accel1); if (act->data2) fm_xml_file_item_destroy(act->data2); g_free(act->accel2); act->accel2 = NULL; } } else if (act->accel2 == NULL) { /* new data has two bindings and old data has 1 */ if (g_strcmp0(act->accel1, data->accel1) == 0) { /* add data->accel2 */ act->data2 = make_new_xml_binding(cfg, data->actions, data->accel2, NULL, NULL); act->accel2 = g_strdup(data->accel2); } else if (g_strcmp0(act->accel1, data->accel2) == 0) { /* add data->accel1 */ act->data2 = make_new_xml_binding(cfg, data->actions, data->accel1, NULL, NULL); act->accel2 = g_strdup(data->accel1); } else { /* replace key act->accel1 and add data->accel2 */ replace_key(act->data1, data->accel1, &act->accel1); act->data2 = make_new_xml_binding(cfg, data->actions, data->accel2, NULL, NULL); act->accel2 = g_strdup(data->accel2); } } else { /* both keys are present in old and new data */ if (g_strcmp0(act->accel1, data->accel1) == 0) { if (g_strcmp0(act->accel2, data->accel2) != 0) /* just accel2 is changed */ replace_key(act->data2, data->accel2, &act->accel2); /* else nothing changed */ } else if (g_strcmp0(act->accel1, data->accel2) == 0) { if (g_strcmp0(act->accel2, data->accel1) != 0) /* replace accel2 with data->accel1 */ replace_key(act->data2, data->accel1, &act->accel2); /* else keys just swapped */ } else if (g_strcmp0(act->accel2, data->accel2) == 0) { /* just accel1 is changed */ replace_key(act->data1, data->accel1, &act->accel1); } else if (g_strcmp0(act->accel2, data->accel1) == 0) { /* replace accel1 with data->accel2 */ replace_key(act->data1, data->accel2, &act->accel1); } else { /* both keys changed */ replace_key(act->data1, data->accel1, &act->accel1); replace_key(act->data2, data->accel2, &act->accel2); } } } /* if not found then add a new keybinding */ } else if (data->accel1) { act = g_new0(LXHotkeyGlobal, 1); act->data1 = make_new_xml_binding(cfg, data->actions, data->accel1, &act->actions, NULL); act->accel1 = g_strdup(data->accel1); /* do the same for accel2 if requested */ if (data->accel2) { act->data2 = make_new_xml_binding(cfg, data->actions, data->accel2, NULL, NULL); act->accel2 = g_strdup(data->accel2); } cfg->actions = g_list_prepend(cfg->actions, act); } return TRUE; } static GList *obcfg_get_app_keys(gpointer config, const char *mask, GError **error) { ObXmlFile *cfg = (ObXmlFile *)config; GList *list = NULL, *l; LXHotkeyApp *data; if (cfg == NULL) g_set_error_literal(error, LXKEYS_OB_ERROR, LXKEYS_FILE_ERROR, _("No WM configuration is available.")); else for (l = cfg->execs; l; l = l->next) { data = l->data; if (mask == NULL || fnmatch(mask, data->accel1, 0) == 0 || (data->accel2 != NULL && fnmatch(mask, data->accel2, 0) == 0)) list = g_list_prepend(list, data); } return list; } static gboolean obcfg_set_app_key(gpointer config, LXHotkeyApp *data, GError **error) { ObXmlFile *cfg = (ObXmlFile *)config; GList *l, *ll; LXHotkeyApp *app = NULL; if (cfg == NULL) { g_set_error_literal(error, LXKEYS_OB_ERROR, LXKEYS_FILE_ERROR, _("No WM configuration is available.")); return FALSE; } else if (data->exec == NULL || data->exec[0] == '\0') { g_set_error_literal(error, LXKEYS_OB_ERROR, LXKEYS_PARSE_ERROR, _("The exec line cannot be empty.")); return FALSE; } /* find if that action(s) is present */ for (ll = cfg->execs; ll; ll = ll->next) if (g_strcmp0((app = ll->data)->exec, data->exec) == 0 && options_equal(app->options, data->options)) break; /* find if those keys are already bound elsewhere */ for (l = cfg->actions; l; l = l->next) { if (data->accel1) { if (strcmp(data->accel1, ((LXHotkeyGlobal *)l->data)->accel1) == 0 || g_strcmp0(data->accel1, ((LXHotkeyGlobal *)l->data)->accel2) == 0) goto _accel1_bound; } if (data->accel2) { if (g_strcmp0(data->accel2, ((LXHotkeyGlobal *)l->data)->accel1) == 0 || g_strcmp0(data->accel2, ((LXHotkeyGlobal *)l->data)->accel2) == 0) goto _accel2_bound; } } for (l = cfg->execs; l; l = l->next) { if (l == ll) /* it's our action */ continue; if (data->accel1) { if (strcmp(data->accel1, ((LXHotkeyApp *)l->data)->accel1) == 0 || g_strcmp0(data->accel1, ((LXHotkeyApp *)l->data)->accel2) == 0) { _accel1_bound: g_set_error(error, LXKEYS_OB_ERROR, LXKEYS_FILE_ERROR, _("Hotkey '%s' is already bound to an action."), data->accel1); return FALSE; } } if (data->accel2) { if (g_strcmp0(data->accel2, ((LXHotkeyApp *)l->data)->accel1) == 0 || g_strcmp0(data->accel2, ((LXHotkeyApp *)l->data)->accel2) == 0) { _accel2_bound: g_set_error(error, LXKEYS_OB_ERROR, LXKEYS_FILE_ERROR, _("Hotkey '%s' is already bound to an action."), data->accel2); return FALSE; } } } /* if found then either change keys or remove the keybinding */ if (ll != NULL) { if (data->accel1 == NULL) { /* removal requested */ if (app->data1) fm_xml_file_item_destroy(app->data1); if (app->data2) fm_xml_file_item_destroy(app->data2); lkxeys_app_free(app); cfg->execs = g_list_delete_link(cfg->execs, ll); } else { if (data->accel2 == NULL) { /* new data contains only one binding */ if (g_strcmp0(app->accel1, data->accel1) == 0) { /* accel1 not changed, just clear accel2 */ if (app->data2) fm_xml_file_item_destroy(app->data2); g_free(app->accel2); app->accel2 = NULL; } else if (g_strcmp0(app->accel2, data->accel1) == 0) { /* accel1 was removed */ if (app->data1) fm_xml_file_item_destroy(app->data1); g_free(app->accel1); app->accel1 = app->accel2; app->accel2 = NULL; } else { /* full change */ replace_key(app->data1, data->accel1, &app->accel1); if (app->data2) fm_xml_file_item_destroy(app->data2); g_free(app->accel2); app->accel2 = NULL; } } else if (app->accel2 == NULL) { /* new data has two bindings and old data has 1 */ if (g_strcmp0(app->accel1, data->accel1) == 0) { /* add data->accel2 */ app->data2 = make_new_xml_binding(cfg, data->options, data->accel2, NULL, data->exec); app->accel2 = g_strdup(data->accel2); } else if (g_strcmp0(app->accel1, data->accel2) == 0) { /* add data->accel1 */ app->data2 = make_new_xml_binding(cfg, data->options, data->accel1, NULL, data->exec); app->accel2 = g_strdup(data->accel1); } else { /* replace key app->accel1 and add data->accel2 */ replace_key(app->data1, data->accel1, &app->accel1); app->data2 = make_new_xml_binding(cfg, data->options, data->accel2, NULL, data->exec); app->accel2 = g_strdup(data->accel2); } } else { /* both keys are present in old and new data */ if (g_strcmp0(app->accel1, data->accel1) == 0) { if (g_strcmp0(app->accel2, data->accel2) != 0) /* just accel2 is changed */ replace_key(app->data2, data->accel2, &app->accel2); /* else nothing changed */ } else if (g_strcmp0(app->accel1, data->accel2) == 0) { if (g_strcmp0(app->accel2, data->accel1) != 0) /* replace accel2 with data->accel1 */ replace_key(app->data2, data->accel1, &app->accel2); /* else keys just swapped */ } else if (g_strcmp0(app->accel2, data->accel2) == 0) { /* just accel1 is changed */ replace_key(app->data1, data->accel1, &app->accel1); } else if (g_strcmp0(app->accel2, data->accel1) == 0) { /* replace accel1 with data->accel2 */ replace_key(app->data1, data->accel2, &app->accel1); } else { /* both keys changed */ replace_key(app->data1, data->accel1, &app->accel1); replace_key(app->data2, data->accel2, &app->accel2); } } } /* if not found then add a new keybinding */ } else if (data->accel1) { app = g_new0(LXHotkeyApp, 1); app->exec = g_strdup(data->exec); app->data1 = make_new_xml_binding(cfg, data->options, data->accel1, &app->options, data->exec); app->accel1 = g_strdup(data->accel1); /* do the same for accel2 if requested */ if (data->accel2) { app->data2 = make_new_xml_binding(cfg, data->options, data->accel2, NULL, data->exec); app->accel2 = g_strdup(data->accel2); } cfg->execs = g_list_prepend(cfg->execs, app); } return TRUE; } static GList *obcfg_get_wm_actions(gpointer config, GError **error) { if (!available_wm_actions) available_wm_actions = convert_options(list_actions); return available_wm_actions; } static GList *obcfg_get_app_options(gpointer config, GError **error) { if (!available_wm_actions) { GList *l, *opts = NULL; LXHotkeyAttr *opt; available_wm_actions = convert_options(list_actions); for (l = available_app_options; l; l = l->next) { opt = l->data; if (strcmp(opt->name, "command") != 0) /* remove exec line from available options, it's App->exec */ opts = g_list_prepend(opts, l->data); } available_app_options = g_list_reverse(opts); } return available_app_options; } FM_DEFINE_MODULE(lxhotkey, Openbox) LXHotkeyPluginInit fm_module_init_lxhotkey = { .load = obcfg_load, .save = obcfg_save, .free = obcfg_free, .get_wm_keys = obcfg_get_wm_keys, .set_wm_key = obcfg_set_wm_key, .get_wm_actions = obcfg_get_wm_actions, .get_app_keys = obcfg_get_app_keys, .set_app_key = obcfg_set_app_key, .get_app_options = obcfg_get_app_options }; lxhotkey-0.1.2/po/000077500000000000000000000000001476256652500140215ustar00rootroot00000000000000lxhotkey-0.1.2/po/POTFILES.in000066400000000000000000000001621476256652500155750ustar00rootroot00000000000000src/lxhotkey.c plugins/openbox/openbox.c plugins/gtk/gtk.c plugins/gtk/lxhotkey-gtk.desktop.in plugins/gtk/edit.c lxhotkey-0.1.2/po/cs.po000066400000000000000000000517771476256652500150070ustar00rootroot00000000000000# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Pavel Fric , 2016. msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-09-18 15:23+0200\n" "PO-Revision-Date: 2016-11-03 10:33+0100\n" "Last-Translator: Pavel Fric \n" "Language-Team: Czech \n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" "X-Generator: Lokalize 1.5\n" #: ../src/lxhotkey.c:244 msgid "Usage: %s global [] - show keys bound to action(s)\n" msgstr "" "Použití: %s global [] - ukázat přiřazení kláves k činnosti(em)\n" #: ../src/lxhotkey.c:245 #, c-format msgid " %s global - bind a key to the action\n" msgstr " %s global - přiřadit klávesu k činnosti\n" #: ../src/lxhotkey.c:246 msgid " %s app [] - show keys bound to exec line\n" msgstr "" " %s app [] - ukázat přiřazení kláves k řádku s " "příkazem pro spuštění\n" #: ../src/lxhotkey.c:247 #, c-format msgid " %s app - bind a key to some exec line\n" msgstr "" " %s app - přiřadit klávesu k řádku s příkazem pro " "spuštění\n" "\n" #: ../src/lxhotkey.c:248 #, c-format msgid " %s app -- - unbind all keys from exec line\n" msgstr "" " %s app [] - zrušit přiřazení kláves k řádku s " "příkazem pro spuštění\n" #: ../src/lxhotkey.c:250 #, c-format msgid " %s --gui= - start with GUI\n" msgstr " %s --gui= - spustit s uživatelským rozhraním\n" #: ../src/lxhotkey.c:345 msgid "empty option name." msgstr "Prázdný název volby." #: ../src/lxhotkey.c:348 msgid "empty action name." msgstr "Prázdný název činnosti." #: ../src/lxhotkey.c:380 #, c-format msgid "no matching option '%s' found for action '%s'." msgstr "Pro činnost '%s' nenalezena žádná odpovídající volba '%s'." #: ../src/lxhotkey.c:384 #, c-format msgid "action '%s' isn't supported by WM %s." msgstr "Činnost '%s' není podporována okenním správcem %s." #: ../src/lxhotkey.c:401 #, c-format msgid "value '%s' is not supported for option '%s'." msgstr "Hodnota '%s' není podporována pro volbu '%s'." #: ../src/lxhotkey.c:405 #, c-format msgid "value '%s' is not supported for action '%s'." msgstr "Hodnota 's' není podporována pro činnost '%s'." #: ../src/lxhotkey.c:418 #, c-format msgid "action '%s' does not support options." msgstr "Činnost '%s' nepodporuje volby." #: ../src/lxhotkey.c:500 msgid "Sorry, cannot configure keys remotely." msgstr "Promiňte. Klávesy nelze nastavit vzdáleně." #: ../src/lxhotkey.c:508 msgid "Could not determine window manager running." msgstr "Nepodařilo se určit běžícího správce oken." #: ../src/lxhotkey.c:516 #, fuzzy, c-format #| msgid "Could not determine window manager running." msgid "Could not find a plugin for window manager %s." msgstr "Nepodařilo se určit běžícího správce oken." #: ../src/lxhotkey.c:523 ../plugins/gtk/gtk.c:75 msgid "Problems loading configuration: " msgstr "Potíže při nahrávání nastavení: " #: ../src/lxhotkey.c:532 #, c-format msgid "GUI type %s currently isn't supported." msgstr "Typ uživatelského rozhraní %s v současnosti není podporován." #: ../src/lxhotkey.c:549 ../src/lxhotkey.c:625 msgid "Invalid request: " msgstr "Neplatný požadavek: " #: ../src/lxhotkey.c:559 ../src/lxhotkey.c:637 ../plugins/gtk/gtk.c:90 msgid "Problems saving configuration: " msgstr "Potíže při ukládání nastavení: " #: ../src/lxhotkey.c:576 msgid "ACTION(s)" msgstr "Činnost)" #: ../src/lxhotkey.c:576 ../src/lxhotkey.c:654 msgid "KEY(s)" msgstr "Klávesa" #: ../src/lxhotkey.c:654 msgid "EXEC" msgstr "Spouštěcí příkaz" #: ../src/lxhotkey.c:676 msgid "Requested operation isn't supported." msgstr "Požadovaná operace není podporována." #: ../plugins/openbox/openbox.c:185 msgid "Failed to reconfigure Openbox." msgstr "Nepodařilo se přenastavit Openbox." #: ../plugins/openbox/openbox.c:204 msgid "yes" msgstr "Ano" #: ../plugins/openbox/openbox.c:204 msgid "no" msgstr "Ne" #: ../plugins/openbox/openbox.c:207 msgid "enabled" msgstr "Povoleno" #: ../plugins/openbox/openbox.c:208 msgid "wmclass" msgstr "Třída okenního správce" #: ../plugins/openbox/openbox.c:209 msgid "name" msgstr "Název" #: ../plugins/openbox/openbox.c:210 msgid "icon" msgstr "Ikona" #: ../plugins/openbox/openbox.c:215 ../plugins/openbox/openbox.c:294 msgid "command" msgstr "Příkaz" #: ../plugins/openbox/openbox.c:216 ../plugins/openbox/openbox.c:299 msgid "prompt" msgstr "Výzva" #: ../plugins/openbox/openbox.c:217 msgid "startupnotify" msgstr "Oznámení při spuštění" #: ../plugins/openbox/openbox.c:221 ../plugins/openbox/openbox.c:331 msgid "center" msgstr "Střed" #: ../plugins/openbox/openbox.c:222 msgid "default" msgstr "Výchozí" #: ../plugins/openbox/openbox.c:222 msgid "primary" msgstr "Primární" #: ../plugins/openbox/openbox.c:222 msgid "mouse" msgstr "Myš" #: ../plugins/openbox/openbox.c:223 msgid "active" msgstr "Činné" #: ../plugins/openbox/openbox.c:223 ../plugins/openbox/openbox.c:334 msgid "all" msgstr "Vše" #: ../plugins/openbox/openbox.c:228 ../plugins/openbox/openbox.c:341 msgid "monitor" msgstr "Sledování" #: ../plugins/openbox/openbox.c:233 msgid "menu" msgstr "Nabídka" #: ../plugins/openbox/openbox.c:234 msgid "position" msgstr "Poloha" #: ../plugins/openbox/openbox.c:238 msgid "list" msgstr "Seznam" #: ../plugins/openbox/openbox.c:238 msgid "icons" msgstr "Ikony" #: ../plugins/openbox/openbox.c:238 msgid "none" msgstr "Žádný" #: ../plugins/openbox/openbox.c:241 ../plugins/openbox/openbox.c:260 msgid "dialog" msgstr "Dialog" #: ../plugins/openbox/openbox.c:242 ../plugins/openbox/openbox.c:261 msgid "bar" msgstr "Pruh" #: ../plugins/openbox/openbox.c:243 ../plugins/openbox/openbox.c:262 msgid "raise" msgstr "Pozvednutí" #: ../plugins/openbox/openbox.c:244 msgid "allDesktops" msgstr "Všechny plochy" #: ../plugins/openbox/openbox.c:245 ../plugins/openbox/openbox.c:263 msgid "panels" msgstr "Panely" #: ../plugins/openbox/openbox.c:246 msgid "desktop" msgstr "Pracovní plocha" #: ../plugins/openbox/openbox.c:247 msgid "linear" msgstr "Přímý" #: ../plugins/openbox/openbox.c:248 msgid "interactive" msgstr "Interaktivní" #. TRANSLATORS: finalactions means actions when done #: ../plugins/openbox/openbox.c:250 ../plugins/openbox/openbox.c:265 msgid "finalactions" msgstr "Poslední činnosti" #: ../plugins/openbox/openbox.c:254 ../plugins/openbox/openbox.c:271 #: ../plugins/openbox/openbox.c:311 ../plugins/openbox/openbox.c:364 msgid "north" msgstr "Sever" #: ../plugins/openbox/openbox.c:254 msgid "northeast" msgstr "Severovýchod" #: ../plugins/openbox/openbox.c:254 ../plugins/openbox/openbox.c:272 #: ../plugins/openbox/openbox.c:312 ../plugins/openbox/openbox.c:364 msgid "east" msgstr "Východ" #: ../plugins/openbox/openbox.c:255 msgid "southeast" msgstr "Jihovýchod" #: ../plugins/openbox/openbox.c:255 ../plugins/openbox/openbox.c:271 #: ../plugins/openbox/openbox.c:311 ../plugins/openbox/openbox.c:364 msgid "south" msgstr "Jih" #: ../plugins/openbox/openbox.c:255 msgid "southwest" msgstr "Jihozápad" #: ../plugins/openbox/openbox.c:256 ../plugins/openbox/openbox.c:272 #: ../plugins/openbox/openbox.c:312 ../plugins/openbox/openbox.c:364 msgid "west" msgstr "Západ" #: ../plugins/openbox/openbox.c:256 msgid "northwest" msgstr "Severozápad" #: ../plugins/openbox/openbox.c:259 ../plugins/openbox/openbox.c:306 #: ../plugins/openbox/openbox.c:367 msgid "direction" msgstr "Směr" #: ../plugins/openbox/openbox.c:264 msgid "desktops" msgstr "Pracovní plochy" #. TRANSLATORS: these values are in regard to desktop #: ../plugins/openbox/openbox.c:270 ../plugins/openbox/openbox.c:281 #: ../plugins/openbox/openbox.c:310 ../plugins/openbox/openbox.c:331 #: ../plugins/openbox/openbox.c:334 msgid "current" msgstr "Nynější" #: ../plugins/openbox/openbox.c:270 ../plugins/openbox/openbox.c:310 #: ../plugins/openbox/openbox.c:334 msgid "next" msgstr "Další" #: ../plugins/openbox/openbox.c:270 ../plugins/openbox/openbox.c:310 msgid "previous" msgstr "Předchozí" #: ../plugins/openbox/openbox.c:271 ../plugins/openbox/openbox.c:281 #: ../plugins/openbox/openbox.c:311 msgid "last" msgstr "Poslední" #: ../plugins/openbox/openbox.c:271 ../plugins/openbox/openbox.c:311 msgid "up" msgstr "Nahoru" #: ../plugins/openbox/openbox.c:272 ../plugins/openbox/openbox.c:312 msgid "down" msgstr "Dolů" #: ../plugins/openbox/openbox.c:272 ../plugins/openbox/openbox.c:312 #: ../plugins/openbox/openbox.c:322 ../plugins/openbox/openbox.c:357 msgid "left" msgstr "Vlevo" #: ../plugins/openbox/openbox.c:273 ../plugins/openbox/openbox.c:313 #: ../plugins/openbox/openbox.c:322 ../plugins/openbox/openbox.c:358 msgid "right" msgstr "Vpravo" #: ../plugins/openbox/openbox.c:276 ../plugins/openbox/openbox.c:316 msgid "to" msgstr "do" #: ../plugins/openbox/openbox.c:277 ../plugins/openbox/openbox.c:317 msgid "wrap" msgstr "Zalomit" #: ../plugins/openbox/openbox.c:284 msgid "where" msgstr "kde" #: ../plugins/openbox/openbox.c:289 msgid "strict" msgstr "" #: ../plugins/openbox/openbox.c:303 msgid "both" msgstr "Oba" #: ../plugins/openbox/openbox.c:303 msgid "horizontal" msgstr "Vodorovně" #: ../plugins/openbox/openbox.c:303 msgid "vertical" msgstr "Svisle" #: ../plugins/openbox/openbox.c:318 msgid "follow" msgstr "Sledovat" #: ../plugins/openbox/openbox.c:322 ../plugins/openbox/openbox.c:359 #: ../plugins/openbox/openbox.c:371 msgid "top" msgstr "Nahoře" #: ../plugins/openbox/openbox.c:322 ../plugins/openbox/openbox.c:360 #: ../plugins/openbox/openbox.c:371 msgid "bottom" msgstr "Dole" #: ../plugins/openbox/openbox.c:323 msgid "topleft" msgstr "Nahoře vlevo" #: ../plugins/openbox/openbox.c:323 msgid "topright" msgstr "Nahoře vpravo" #: ../plugins/openbox/openbox.c:323 msgid "bottomleft" msgstr "Dole vlevo" #: ../plugins/openbox/openbox.c:324 msgid "bottomright" msgstr "Dole vpravo" #: ../plugins/openbox/openbox.c:327 msgid "edge" msgstr "Okraj" #. TRANSLATORS: # in config means either pixels, or monitor number #: ../plugins/openbox/openbox.c:331 ../plugins/openbox/openbox.c:346 msgid "#" msgstr "#" #. TRANSLATORS: % in config means some fraction value, usually measured in percents #: ../plugins/openbox/openbox.c:333 msgid "%" msgstr "%" #: ../plugins/openbox/openbox.c:334 msgid "prev" msgstr "Předchozí" #: ../plugins/openbox/openbox.c:339 msgid "width" msgstr "Šířka" #: ../plugins/openbox/openbox.c:340 msgid "height" msgstr "Výška" #: ../plugins/openbox/openbox.c:371 msgid "normal" msgstr "Normální" #: ../plugins/openbox/openbox.c:374 msgid "layer" msgstr "Vrstva" #: ../plugins/openbox/openbox.c:380 msgid "Execute" msgstr "Spustit" #: ../plugins/openbox/openbox.c:381 msgid "ShowMenu" msgstr "Ukázat nabídku" #: ../plugins/openbox/openbox.c:382 msgid "NextWindow" msgstr "Další okno" #: ../plugins/openbox/openbox.c:383 msgid "PreviousWindow" msgstr "Předchozí okno" #: ../plugins/openbox/openbox.c:384 msgid "DirectionalCycleWindows" msgstr "Směrově kroužit okna" #: ../plugins/openbox/openbox.c:385 msgid "DirectionalTargetWindow" msgstr "Směrově zaměřit okno" #: ../plugins/openbox/openbox.c:386 msgid "GoToDesktop" msgstr "Jít na plochu" #: ../plugins/openbox/openbox.c:387 msgid "AddDesktop" msgstr "Přidat plochu" #: ../plugins/openbox/openbox.c:388 msgid "RemoveDesktop" msgstr "Odstranit plochu" #: ../plugins/openbox/openbox.c:389 #, fuzzy #| msgid "ToggleShade" msgid "ToggleShowDesktop" msgstr "Přepnout stínování" #: ../plugins/openbox/openbox.c:390 msgid "ToggleDockAutohide" msgstr "Přepnout automatické skrytí panelu" #: ../plugins/openbox/openbox.c:391 msgid "Reconfigure" msgstr "Přenastavit" #: ../plugins/openbox/openbox.c:392 msgid "Restart" msgstr "Spustit znovu" #: ../plugins/openbox/openbox.c:393 msgid "Exit" msgstr "Ukončit" #: ../plugins/openbox/openbox.c:395 msgid "Focus" msgstr "Zaměřit" #: ../plugins/openbox/openbox.c:396 msgid "Raise" msgstr "Dát nahoru" #: ../plugins/openbox/openbox.c:397 msgid "Lower" msgstr "Dát dolů" #: ../plugins/openbox/openbox.c:398 msgid "RaiseLower" msgstr "Dát nahoru/dolů" #: ../plugins/openbox/openbox.c:399 msgid "Unfocus" msgstr "Zrušit zaměření" #: ../plugins/openbox/openbox.c:400 msgid "FocusToBottom" msgstr "Zaměřit dolů" #: ../plugins/openbox/openbox.c:401 msgid "Iconify" msgstr "Změnit na ikony" #: ../plugins/openbox/openbox.c:402 msgid "Close" msgstr "Zavřít" #: ../plugins/openbox/openbox.c:403 msgid "ToggleShade" msgstr "Přepnout stínování" #: ../plugins/openbox/openbox.c:404 msgid "Shade" msgstr "Stínovat" #: ../plugins/openbox/openbox.c:405 msgid "Unshade" msgstr "Zrušit stínování" #: ../plugins/openbox/openbox.c:406 msgid "ToggleOmnipresent" msgstr "Přepnout všudypřítomnost" #: ../plugins/openbox/openbox.c:407 msgid "ToggleMaximize" msgstr "Přepnout zvětšení" #: ../plugins/openbox/openbox.c:408 msgid "Maximize" msgstr "Zvětšit" #: ../plugins/openbox/openbox.c:409 msgid "Unmaximize" msgstr "Zrušit zvětšení" #: ../plugins/openbox/openbox.c:410 msgid "ToggleFullscreen" msgstr "Přepnout na celou obrazovku" #: ../plugins/openbox/openbox.c:411 msgid "ToggleDecorations" msgstr "Přepnout dekorace" #: ../plugins/openbox/openbox.c:412 msgid "Decorate" msgstr "Zdobení" #: ../plugins/openbox/openbox.c:413 msgid "Undecorate" msgstr "Zrušit zdobení" #: ../plugins/openbox/openbox.c:414 msgid "SendToDesktop" msgstr "Poslat na plochu" #: ../plugins/openbox/openbox.c:415 msgid "Move" msgstr "Přesunout" #: ../plugins/openbox/openbox.c:416 msgid "Resize" msgstr "Změnit velikost" #: ../plugins/openbox/openbox.c:417 msgid "MoveResizeTo" msgstr "Přesunout a změnit velikost" #: ../plugins/openbox/openbox.c:418 msgid "MoveRelative" msgstr "Přesunout poměrně" #: ../plugins/openbox/openbox.c:419 msgid "ResizeRelative" msgstr "Změnit velikost poměrně" #: ../plugins/openbox/openbox.c:420 msgid "MoveToEdge" msgstr "Přesunout k okraji" #: ../plugins/openbox/openbox.c:421 msgid "GrowToEdge" msgstr "Zvětšit se k okraji" #: ../plugins/openbox/openbox.c:422 msgid "ShrinkToEdge" msgstr "Zmenšit se k okraji" #: ../plugins/openbox/openbox.c:423 msgid "GrowToFill" msgstr "Zvětšit se po naplnění" #: ../plugins/openbox/openbox.c:424 msgid "ToggleAlwaysOnTop" msgstr "Přepnout vždy nahoře" #: ../plugins/openbox/openbox.c:425 msgid "ToggleAlwaysOnBottom" msgstr "Přepnout vždy dole" #: ../plugins/openbox/openbox.c:426 msgid "SendToLayer" msgstr "Poslat na vrstvu" #: ../plugins/openbox/openbox.c:517 msgid "Duplicate section in the rc.xml file." msgstr "Zdvojit sekci v souboru rc.xml." #: ../plugins/openbox/openbox.c:548 ../plugins/openbox/openbox.c:790 msgid "Internal error." msgstr "Vnitřní chyba." #: ../plugins/openbox/openbox.c:592 msgid "rc.xml error: no key is set for a keybind." msgstr "Chyba rc.xml: klávesová zkratka nemá nastavenu žádnou klávesu." #: ../plugins/openbox/openbox.c:663 msgid "Invalid rc.xml: action with a sub-action." msgstr "Neplatné rc.xml: činnost s podřízenou činností." #: ../plugins/openbox/openbox.c:779 msgid "rc.xml error: no name is set for action." msgstr "Chyba rc.xml: činnost nemá nastaven žádný název." #: ../plugins/openbox/openbox.c:809 #, c-format msgid "rc.xml error: empty tag <%s> is prohibited." msgstr "Chyba rc.xml: je zakázáno mít prázdnou značku <%s>." #: ../plugins/openbox/openbox.c:901 msgid "Could not find the rc.xml file anywhere." msgstr "Nikde se nepodařilo najít soubor rc.xml." #: ../plugins/openbox/openbox.c:949 ../plugins/openbox/openbox.c:1063 #: ../plugins/openbox/openbox.c:1210 ../plugins/openbox/openbox.c:1228 msgid "No WM configuration is available." msgstr "Není dostupné žádné nastavení správce oken." #: ../plugins/openbox/openbox.c:1067 msgid "Keybinding should activate at least one action." msgstr "Klávesová zkratka by měla spustit alespoň jednu činnost." #: ../plugins/openbox/openbox.c:1096 ../plugins/openbox/openbox.c:1106 #: ../plugins/openbox/openbox.c:1262 ../plugins/openbox/openbox.c:1272 #, c-format msgid "Hotkey '%s' is already bound to an action." msgstr "Klávesová zkratka '%s' je již přiřazena činnosti." #: ../plugins/openbox/openbox.c:1232 msgid "The exec line cannot be empty." msgstr "Řádek s příkazem pro spuštění nemůže být prázdný." #: ../plugins/gtk/gtk.c:133 ../plugins/gtk/gtk.c:156 msgid "Cannot delete keybinding: " msgstr "Nelze smazat klávesovou zkratku: " #. TRANSLATORS: Replace this string with your names, one name per line. #: ../plugins/gtk/gtk.c:176 msgid "translator-credits" msgstr "www.fripohled.blogspot.com" #: ../plugins/gtk/gtk.c:184 msgid "Copyright (C) 2016-2025" msgstr "Autorské právo (C) 2016-2025" #: ../plugins/gtk/gtk.c:185 msgid "Keyboard shortcuts configurator" msgstr "Nastavovač klávesových zkratek" #: ../plugins/gtk/gtk.c:208 msgid "_File" msgstr "_Soubor" #: ../plugins/gtk/gtk.c:209 msgid "_Reload" msgstr "Nahrát _znovu" #: ../plugins/gtk/gtk.c:210 msgid "" "Drop all unsaved changes and reload all keys from Window Manager " "configuration" msgstr "" "Zahodit všechny neuložené změny a nahrát znovu všechny klávesy z nastavení " "okenního správce" #: ../plugins/gtk/gtk.c:213 msgid "Save all changes and apply them to Window Manager configuration" msgstr "Uložit všechny změny a použít je na nastavení okenního správce" #: ../plugins/gtk/gtk.c:216 msgid "Exit the application without saving" msgstr "Ukončit program bez uložení" #: ../plugins/gtk/gtk.c:217 msgid "_Edit" msgstr "Úp_ravy" #: ../plugins/gtk/gtk.c:218 msgid "Create new action" msgstr "Vytvořit novou činnost" #: ../plugins/gtk/gtk.c:220 msgid "Remove selected action" msgstr "Odstranit vybranou činnost" #: ../plugins/gtk/gtk.c:222 msgid "Change selected action" msgstr "Změnit vybranou činnost" #: ../plugins/gtk/gtk.c:224 msgid "_Help" msgstr "_Nápověda" #: ../plugins/gtk/gtk.c:441 msgid "Action" msgstr "Činnost" #: ../plugins/gtk/gtk.c:444 msgid "Option" msgstr "Volba" #: ../plugins/gtk/gtk.c:447 ../plugins/gtk/gtk.c:467 ../plugins/gtk/edit.c:1111 msgid "Hotkey 1" msgstr "Klávesová zkratka 1" #: ../plugins/gtk/gtk.c:450 ../plugins/gtk/gtk.c:470 ../plugins/gtk/edit.c:1115 msgid "Hotkey 2" msgstr "Klávesová zkratka 2" #: ../plugins/gtk/gtk.c:458 msgid "Actions" msgstr "Činnosti" #: ../plugins/gtk/gtk.c:464 msgid "Command" msgstr "Příkaz" #: ../plugins/gtk/gtk.c:478 msgid "Programs" msgstr "Programy" #: ../plugins/gtk/gtk.c:497 ../plugins/gtk/edit.c:511 msgid "Error" msgstr "Chyba" #: ../plugins/gtk/lxhotkey-gtk.desktop.in.h:1 msgid "Setup Hot Keys" msgstr "Nastavit klávesové zkratky" #: ../plugins/gtk/lxhotkey-gtk.desktop.in.h:2 msgid "View and change Window Manager global shortcuts" msgstr "Zobrazit a změnit celkové klávesové zkratky správce oken" #: ../plugins/gtk/lxhotkey-gtk.desktop.in.h:3 msgid "hotkey;shortcut;system;settings;" msgstr "zkratka;klávesová zkratka;systém;nastavení;" #: ../plugins/gtk/edit.c:266 msgid "Apply error: " msgstr "Použít chybu: " #: ../plugins/gtk/edit.c:281 ../plugins/gtk/edit.c:395 msgid "Add action" msgstr "Přidat činnost" #: ../plugins/gtk/edit.c:293 ../plugins/gtk/edit.c:397 msgid "Add option" msgstr "Přidat volbu" #: ../plugins/gtk/edit.c:355 msgid "Change option" msgstr "Změnit volbu" #: ../plugins/gtk/edit.c:420 msgid "Discard changes" msgstr "Zahodit změny" #: ../plugins/gtk/edit.c:421 msgid "Accept changes" msgstr "Přijmout změny" #: ../plugins/gtk/edit.c:422 msgid "Add an action" msgstr "Přidat činnost" #: ../plugins/gtk/edit.c:423 msgid "Add an option to this command" msgstr "Přidat volbu do tohoto příkazu" #: ../plugins/gtk/edit.c:425 msgid "Remove selection" msgstr "Odstranit výběr" #: ../plugins/gtk/edit.c:426 msgid "Change selected option" msgstr "Změnit vybranou volbu" #: ../plugins/gtk/edit.c:427 msgid "Add an option to selection" msgstr "Přidat volbu do výběru" #: ../plugins/gtk/edit.c:508 #, c-format msgid "Key combination '%s' cannot be used as a global hotkey, sorry." msgstr "" "Spojení kláves '%s' nelze použít jako celkovou (všeobecnou) zkratku. " "Promiňte." #: ../plugins/gtk/edit.c:571 msgid "Click to select, then press a key" msgstr "" #: ../plugins/gtk/edit.c:1128 msgid "Actions:" msgstr "Činnosti:" #: ../plugins/gtk/edit.c:1136 msgid "Command line:" msgstr "Příkazový řádek:" #: ../plugins/gtk/edit.c:1147 msgid "Options:" msgstr "Volby:" #: ../plugins/gtk/edit.c:1169 msgid "Name:" msgstr "Název:" #: ../plugins/gtk/edit.c:1190 msgid "Value:" msgstr "Hodnota:" #, c-format #~ msgid " %s show - show the action bound to a key\n" #~ msgstr "" #~ " %s show - ukázat činnost spojenou s klávesou\n" #, c-format #~ msgid "Window manager %s isn't supported now, sorry." #~ msgstr "Správce oken %s nyní není podporován. Promiňte." lxhotkey-0.1.2/po/de.po000066400000000000000000000452751476256652500147660ustar00rootroot00000000000000# German lxhotkey translation # Copyright (C) 2016 The LXDE Team # This file is distributed under the same license as the PACKAGE package. # Ingo Brückl, 2023. # msgid "" msgstr "" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-09-18 15:23+0200\n" "PO-Revision-Date: 2023-09-18 21:05+0200\n" "Last-Translator: Ingo Brückl \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../src/lxhotkey.c:244 #, c-format msgid "Usage: %s global [] - show keys bound to action(s)\n" msgstr "Aufruf: %s global [] - Aktion für die Taste anzeigen\n" #: ../src/lxhotkey.c:245 #, c-format msgid " %s global - bind a key to the action\n" msgstr " %s global - Taste für die Aktion festlegen\n" #: ../src/lxhotkey.c:246 #, c-format msgid " %s app [] - show keys bound to exec line\n" msgstr " %s app [] - Befehl für die Taste anzeigen\n" #: ../src/lxhotkey.c:247 #, c-format msgid " %s app - bind a key to some exec line\n" msgstr " %s app - Taste für den Befehl festlegen\n" #: ../src/lxhotkey.c:248 #, c-format msgid " %s app -- - unbind all keys from exec line\n" msgstr "" " %s app -- - Tastenzuordnung zum Befehl löschen\n" #: ../src/lxhotkey.c:250 #, c-format msgid " %s --gui= - start with GUI\n" msgstr " %s --gui= - mit GUI starten\n" #: ../src/lxhotkey.c:345 msgid "empty option name." msgstr "leere Option." #: ../src/lxhotkey.c:348 msgid "empty action name." msgstr "leere Aktion." #: ../src/lxhotkey.c:380 #, c-format msgid "no matching option '%s' found for action '%s'." msgstr "keine passende Option »%s« für Aktion »%s« gefunden." #: ../src/lxhotkey.c:384 #, c-format msgid "action '%s' isn't supported by WM %s." msgstr "Aktion »%s« wird vom Fenstermanager %s nicht unterstützt." #: ../src/lxhotkey.c:401 #, c-format msgid "value '%s' is not supported for option '%s'." msgstr "Argument »%s« wird für Option »%s« nicht unterstützt." #: ../src/lxhotkey.c:405 #, c-format msgid "value '%s' is not supported for action '%s'." msgstr "Argument »%s« wird für Aktion »%s« nicht unterstützt." #: ../src/lxhotkey.c:418 #, c-format msgid "action '%s' does not support options." msgstr "Aktion »%s« unterstützt keine Optionen." #: ../src/lxhotkey.c:500 msgid "Sorry, cannot configure keys remotely." msgstr "" "Leider können Tasten nicht von einem fernen Rechner aus konfiguriert werden." #: ../src/lxhotkey.c:508 msgid "Could not determine window manager running." msgstr "Es konnte nicht festgestellt werden, welcher Fenstermanager läuft." #: ../src/lxhotkey.c:516 #, c-format msgid "Could not find a plugin for window manager %s." msgstr "Es konnte kein Plugin für den Fenstermanager %s gefunden werden." #: ../src/lxhotkey.c:523 ../plugins/gtk/gtk.c:75 msgid "Problems loading configuration: " msgstr "Probleme beim Laden der Konfiguration: " #: ../src/lxhotkey.c:532 #, c-format msgid "GUI type %s currently isn't supported." msgstr "Der GUI-Typ %s wird derzeit nicht unterstützt." #: ../src/lxhotkey.c:549 ../src/lxhotkey.c:625 msgid "Invalid request: " msgstr "Ungültige Anforderung: " #: ../src/lxhotkey.c:559 ../src/lxhotkey.c:637 ../plugins/gtk/gtk.c:90 msgid "Problems saving configuration: " msgstr "Probleme beim Speichern der Konfiguration: " #: ../src/lxhotkey.c:576 msgid "ACTION(s)" msgstr "AKTION(EN)" #: ../src/lxhotkey.c:576 ../src/lxhotkey.c:654 msgid "KEY(s)" msgstr "TASTE(N)" #: ../src/lxhotkey.c:654 msgid "EXEC" msgstr "BEFEHL" #: ../src/lxhotkey.c:676 msgid "Requested operation isn't supported." msgstr "Der angeforderte Vorgang wird nicht unterstützt." #: ../plugins/openbox/openbox.c:185 msgid "Failed to reconfigure Openbox." msgstr "" #: ../plugins/openbox/openbox.c:204 msgid "yes" msgstr "" #: ../plugins/openbox/openbox.c:204 msgid "no" msgstr "" #: ../plugins/openbox/openbox.c:207 msgid "enabled" msgstr "" #: ../plugins/openbox/openbox.c:208 msgid "wmclass" msgstr "" #: ../plugins/openbox/openbox.c:209 msgid "name" msgstr "" #: ../plugins/openbox/openbox.c:210 msgid "icon" msgstr "" #: ../plugins/openbox/openbox.c:215 ../plugins/openbox/openbox.c:294 msgid "command" msgstr "" #: ../plugins/openbox/openbox.c:216 ../plugins/openbox/openbox.c:299 msgid "prompt" msgstr "" #: ../plugins/openbox/openbox.c:217 msgid "startupnotify" msgstr "" #: ../plugins/openbox/openbox.c:221 ../plugins/openbox/openbox.c:331 msgid "center" msgstr "" #: ../plugins/openbox/openbox.c:222 msgid "default" msgstr "" #: ../plugins/openbox/openbox.c:222 msgid "primary" msgstr "" #: ../plugins/openbox/openbox.c:222 msgid "mouse" msgstr "" #: ../plugins/openbox/openbox.c:223 msgid "active" msgstr "" #: ../plugins/openbox/openbox.c:223 ../plugins/openbox/openbox.c:334 msgid "all" msgstr "" #: ../plugins/openbox/openbox.c:228 ../plugins/openbox/openbox.c:341 msgid "monitor" msgstr "" #: ../plugins/openbox/openbox.c:233 msgid "menu" msgstr "" #: ../plugins/openbox/openbox.c:234 msgid "position" msgstr "" #: ../plugins/openbox/openbox.c:238 msgid "list" msgstr "" #: ../plugins/openbox/openbox.c:238 msgid "icons" msgstr "" #: ../plugins/openbox/openbox.c:238 msgid "none" msgstr "" #: ../plugins/openbox/openbox.c:241 ../plugins/openbox/openbox.c:260 msgid "dialog" msgstr "" #: ../plugins/openbox/openbox.c:242 ../plugins/openbox/openbox.c:261 msgid "bar" msgstr "" #: ../plugins/openbox/openbox.c:243 ../plugins/openbox/openbox.c:262 msgid "raise" msgstr "" #: ../plugins/openbox/openbox.c:244 msgid "allDesktops" msgstr "" #: ../plugins/openbox/openbox.c:245 ../plugins/openbox/openbox.c:263 msgid "panels" msgstr "" #: ../plugins/openbox/openbox.c:246 msgid "desktop" msgstr "" #: ../plugins/openbox/openbox.c:247 msgid "linear" msgstr "" #: ../plugins/openbox/openbox.c:248 msgid "interactive" msgstr "" #. TRANSLATORS: finalactions means actions when done #: ../plugins/openbox/openbox.c:250 ../plugins/openbox/openbox.c:265 msgid "finalactions" msgstr "" #: ../plugins/openbox/openbox.c:254 ../plugins/openbox/openbox.c:271 #: ../plugins/openbox/openbox.c:311 ../plugins/openbox/openbox.c:364 msgid "north" msgstr "" #: ../plugins/openbox/openbox.c:254 msgid "northeast" msgstr "" #: ../plugins/openbox/openbox.c:254 ../plugins/openbox/openbox.c:272 #: ../plugins/openbox/openbox.c:312 ../plugins/openbox/openbox.c:364 msgid "east" msgstr "" #: ../plugins/openbox/openbox.c:255 msgid "southeast" msgstr "" #: ../plugins/openbox/openbox.c:255 ../plugins/openbox/openbox.c:271 #: ../plugins/openbox/openbox.c:311 ../plugins/openbox/openbox.c:364 msgid "south" msgstr "" #: ../plugins/openbox/openbox.c:255 msgid "southwest" msgstr "" #: ../plugins/openbox/openbox.c:256 ../plugins/openbox/openbox.c:272 #: ../plugins/openbox/openbox.c:312 ../plugins/openbox/openbox.c:364 msgid "west" msgstr "" #: ../plugins/openbox/openbox.c:256 msgid "northwest" msgstr "" #: ../plugins/openbox/openbox.c:259 ../plugins/openbox/openbox.c:306 #: ../plugins/openbox/openbox.c:367 msgid "direction" msgstr "" #: ../plugins/openbox/openbox.c:264 msgid "desktops" msgstr "" #. TRANSLATORS: these values are in regard to desktop #: ../plugins/openbox/openbox.c:270 ../plugins/openbox/openbox.c:281 #: ../plugins/openbox/openbox.c:310 ../plugins/openbox/openbox.c:331 #: ../plugins/openbox/openbox.c:334 msgid "current" msgstr "" #: ../plugins/openbox/openbox.c:270 ../plugins/openbox/openbox.c:310 #: ../plugins/openbox/openbox.c:334 msgid "next" msgstr "" #: ../plugins/openbox/openbox.c:270 ../plugins/openbox/openbox.c:310 msgid "previous" msgstr "" #: ../plugins/openbox/openbox.c:271 ../plugins/openbox/openbox.c:281 #: ../plugins/openbox/openbox.c:311 msgid "last" msgstr "" #: ../plugins/openbox/openbox.c:271 ../plugins/openbox/openbox.c:311 msgid "up" msgstr "" #: ../plugins/openbox/openbox.c:272 ../plugins/openbox/openbox.c:312 msgid "down" msgstr "" #: ../plugins/openbox/openbox.c:272 ../plugins/openbox/openbox.c:312 #: ../plugins/openbox/openbox.c:322 ../plugins/openbox/openbox.c:357 msgid "left" msgstr "" #: ../plugins/openbox/openbox.c:273 ../plugins/openbox/openbox.c:313 #: ../plugins/openbox/openbox.c:322 ../plugins/openbox/openbox.c:358 msgid "right" msgstr "" #: ../plugins/openbox/openbox.c:276 ../plugins/openbox/openbox.c:316 msgid "to" msgstr "" #: ../plugins/openbox/openbox.c:277 ../plugins/openbox/openbox.c:317 msgid "wrap" msgstr "" #: ../plugins/openbox/openbox.c:284 msgid "where" msgstr "" #: ../plugins/openbox/openbox.c:289 msgid "strict" msgstr "" #: ../plugins/openbox/openbox.c:303 msgid "both" msgstr "" #: ../plugins/openbox/openbox.c:303 msgid "horizontal" msgstr "" #: ../plugins/openbox/openbox.c:303 msgid "vertical" msgstr "" #: ../plugins/openbox/openbox.c:318 msgid "follow" msgstr "" #: ../plugins/openbox/openbox.c:322 ../plugins/openbox/openbox.c:359 #: ../plugins/openbox/openbox.c:371 msgid "top" msgstr "" #: ../plugins/openbox/openbox.c:322 ../plugins/openbox/openbox.c:360 #: ../plugins/openbox/openbox.c:371 msgid "bottom" msgstr "" #: ../plugins/openbox/openbox.c:323 msgid "topleft" msgstr "" #: ../plugins/openbox/openbox.c:323 msgid "topright" msgstr "" #: ../plugins/openbox/openbox.c:323 msgid "bottomleft" msgstr "" #: ../plugins/openbox/openbox.c:324 msgid "bottomright" msgstr "" #: ../plugins/openbox/openbox.c:327 msgid "edge" msgstr "" #. TRANSLATORS: # in config means either pixels, or monitor number #: ../plugins/openbox/openbox.c:331 ../plugins/openbox/openbox.c:346 msgid "#" msgstr "" #. TRANSLATORS: % in config means some fraction value, usually measured in percents #: ../plugins/openbox/openbox.c:333 msgid "%" msgstr "" #: ../plugins/openbox/openbox.c:334 msgid "prev" msgstr "" #: ../plugins/openbox/openbox.c:339 msgid "width" msgstr "" #: ../plugins/openbox/openbox.c:340 msgid "height" msgstr "" #: ../plugins/openbox/openbox.c:371 msgid "normal" msgstr "" #: ../plugins/openbox/openbox.c:374 msgid "layer" msgstr "" #: ../plugins/openbox/openbox.c:380 msgid "Execute" msgstr "" #: ../plugins/openbox/openbox.c:381 msgid "ShowMenu" msgstr "" #: ../plugins/openbox/openbox.c:382 msgid "NextWindow" msgstr "" #: ../plugins/openbox/openbox.c:383 msgid "PreviousWindow" msgstr "" #: ../plugins/openbox/openbox.c:384 msgid "DirectionalCycleWindows" msgstr "" #: ../plugins/openbox/openbox.c:385 msgid "DirectionalTargetWindow" msgstr "" #: ../plugins/openbox/openbox.c:386 msgid "GoToDesktop" msgstr "" #: ../plugins/openbox/openbox.c:387 msgid "AddDesktop" msgstr "" #: ../plugins/openbox/openbox.c:388 msgid "RemoveDesktop" msgstr "" #: ../plugins/openbox/openbox.c:389 msgid "ToggleShowDesktop" msgstr "" #: ../plugins/openbox/openbox.c:390 msgid "ToggleDockAutohide" msgstr "" #: ../plugins/openbox/openbox.c:391 msgid "Reconfigure" msgstr "" #: ../plugins/openbox/openbox.c:392 msgid "Restart" msgstr "" #: ../plugins/openbox/openbox.c:393 msgid "Exit" msgstr "" #: ../plugins/openbox/openbox.c:395 msgid "Focus" msgstr "" #: ../plugins/openbox/openbox.c:396 msgid "Raise" msgstr "" #: ../plugins/openbox/openbox.c:397 msgid "Lower" msgstr "" #: ../plugins/openbox/openbox.c:398 msgid "RaiseLower" msgstr "" #: ../plugins/openbox/openbox.c:399 msgid "Unfocus" msgstr "" #: ../plugins/openbox/openbox.c:400 msgid "FocusToBottom" msgstr "" #: ../plugins/openbox/openbox.c:401 msgid "Iconify" msgstr "" #: ../plugins/openbox/openbox.c:402 msgid "Close" msgstr "" #: ../plugins/openbox/openbox.c:403 msgid "ToggleShade" msgstr "" #: ../plugins/openbox/openbox.c:404 msgid "Shade" msgstr "" #: ../plugins/openbox/openbox.c:405 msgid "Unshade" msgstr "" #: ../plugins/openbox/openbox.c:406 msgid "ToggleOmnipresent" msgstr "" #: ../plugins/openbox/openbox.c:407 msgid "ToggleMaximize" msgstr "" #: ../plugins/openbox/openbox.c:408 msgid "Maximize" msgstr "" #: ../plugins/openbox/openbox.c:409 msgid "Unmaximize" msgstr "" #: ../plugins/openbox/openbox.c:410 msgid "ToggleFullscreen" msgstr "" #: ../plugins/openbox/openbox.c:411 msgid "ToggleDecorations" msgstr "" #: ../plugins/openbox/openbox.c:412 msgid "Decorate" msgstr "" #: ../plugins/openbox/openbox.c:413 msgid "Undecorate" msgstr "" #: ../plugins/openbox/openbox.c:414 msgid "SendToDesktop" msgstr "" #: ../plugins/openbox/openbox.c:415 msgid "Move" msgstr "" #: ../plugins/openbox/openbox.c:416 msgid "Resize" msgstr "" #: ../plugins/openbox/openbox.c:417 msgid "MoveResizeTo" msgstr "" #: ../plugins/openbox/openbox.c:418 msgid "MoveRelative" msgstr "" #: ../plugins/openbox/openbox.c:419 msgid "ResizeRelative" msgstr "" #: ../plugins/openbox/openbox.c:420 msgid "MoveToEdge" msgstr "" #: ../plugins/openbox/openbox.c:421 msgid "GrowToEdge" msgstr "" #: ../plugins/openbox/openbox.c:422 msgid "ShrinkToEdge" msgstr "" #: ../plugins/openbox/openbox.c:423 msgid "GrowToFill" msgstr "" #: ../plugins/openbox/openbox.c:424 msgid "ToggleAlwaysOnTop" msgstr "" #: ../plugins/openbox/openbox.c:425 msgid "ToggleAlwaysOnBottom" msgstr "" #: ../plugins/openbox/openbox.c:426 msgid "SendToLayer" msgstr "" #: ../plugins/openbox/openbox.c:517 msgid "Duplicate section in the rc.xml file." msgstr "" #: ../plugins/openbox/openbox.c:548 ../plugins/openbox/openbox.c:790 msgid "Internal error." msgstr "" #: ../plugins/openbox/openbox.c:592 msgid "rc.xml error: no key is set for a keybind." msgstr "" #: ../plugins/openbox/openbox.c:663 msgid "Invalid rc.xml: action with a sub-action." msgstr "" #: ../plugins/openbox/openbox.c:779 msgid "rc.xml error: no name is set for action." msgstr "" #: ../plugins/openbox/openbox.c:809 #, c-format msgid "rc.xml error: empty tag <%s> is prohibited." msgstr "" #: ../plugins/openbox/openbox.c:901 msgid "Could not find the rc.xml file anywhere." msgstr "" #: ../plugins/openbox/openbox.c:949 ../plugins/openbox/openbox.c:1063 #: ../plugins/openbox/openbox.c:1210 ../plugins/openbox/openbox.c:1228 msgid "No WM configuration is available." msgstr "" #: ../plugins/openbox/openbox.c:1067 msgid "Keybinding should activate at least one action." msgstr "" #: ../plugins/openbox/openbox.c:1096 ../plugins/openbox/openbox.c:1106 #: ../plugins/openbox/openbox.c:1262 ../plugins/openbox/openbox.c:1272 #, c-format msgid "Hotkey '%s' is already bound to an action." msgstr "" #: ../plugins/openbox/openbox.c:1232 msgid "The exec line cannot be empty." msgstr "" #: ../plugins/gtk/gtk.c:133 ../plugins/gtk/gtk.c:156 msgid "Cannot delete keybinding: " msgstr "Tastenkombination kann nicht gelöscht werden: " #. TRANSLATORS: Replace this string with your names, one name per line. #: ../plugins/gtk/gtk.c:176 msgid "translator-credits" msgstr "Ingo Brückl" #: ../plugins/gtk/gtk.c:184 msgid "Copyright (C) 2016-2025" msgstr "Copyright © 2016–2025" #: ../plugins/gtk/gtk.c:185 msgid "Keyboard shortcuts configurator" msgstr "Konfigurator für Tastenkombinationen" #: ../plugins/gtk/gtk.c:208 msgid "_File" msgstr "_Datei" #: ../plugins/gtk/gtk.c:209 msgid "_Reload" msgstr "_Neu laden" #: ../plugins/gtk/gtk.c:210 msgid "" "Drop all unsaved changes and reload all keys from Window Manager " "configuration" msgstr "" "Alle ungesicherten Änderungen verwerfen und die Konfiguration des " "Fenstermanagers neu laden" #: ../plugins/gtk/gtk.c:213 msgid "Save all changes and apply them to Window Manager configuration" msgstr "Alle Änderungen speichern und den Fenstermanager so konfigurieren" #: ../plugins/gtk/gtk.c:216 msgid "Exit the application without saving" msgstr "Programm ohne Speichern beenden" #: ../plugins/gtk/gtk.c:217 msgid "_Edit" msgstr "_Bearbeiten" #: ../plugins/gtk/gtk.c:218 msgid "Create new action" msgstr "Neue Aktion erstellen" #: ../plugins/gtk/gtk.c:220 msgid "Remove selected action" msgstr "Ausgewählte Aktion entfernen" #: ../plugins/gtk/gtk.c:222 msgid "Change selected action" msgstr "Ausgewählte Aktion ändern" #: ../plugins/gtk/gtk.c:224 msgid "_Help" msgstr "_Hilfe" #: ../plugins/gtk/gtk.c:441 msgid "Action" msgstr "Aktion" #: ../plugins/gtk/gtk.c:444 msgid "Option" msgstr "Option" #: ../plugins/gtk/gtk.c:447 ../plugins/gtk/gtk.c:467 ../plugins/gtk/edit.c:1111 msgid "Hotkey 1" msgstr "Tastenkombination 1" #: ../plugins/gtk/gtk.c:450 ../plugins/gtk/gtk.c:470 ../plugins/gtk/edit.c:1115 msgid "Hotkey 2" msgstr "Tastenkombination 2" #: ../plugins/gtk/gtk.c:458 msgid "Actions" msgstr "Aktionen" #: ../plugins/gtk/gtk.c:464 msgid "Command" msgstr "Befehl" #: ../plugins/gtk/gtk.c:478 msgid "Programs" msgstr "Programme" #: ../plugins/gtk/gtk.c:497 ../plugins/gtk/edit.c:511 msgid "Error" msgstr "Fehler" #: ../plugins/gtk/lxhotkey-gtk.desktop.in.h:1 msgid "Setup Hot Keys" msgstr "Tastenkombinationen" #: ../plugins/gtk/lxhotkey-gtk.desktop.in.h:2 msgid "View and change Window Manager global shortcuts" msgstr "" "Anzeige und Änderung der globalen Tastenkombinationen des Fenstermanagers" #: ../plugins/gtk/lxhotkey-gtk.desktop.in.h:3 msgid "hotkey;shortcut;system;settings;" msgstr "Tastenkombination;Tastenkürzel;System;Einstellungen" #: ../plugins/gtk/edit.c:266 msgid "Apply error: " msgstr "Fehler bei der Übernahme: " #: ../plugins/gtk/edit.c:281 ../plugins/gtk/edit.c:395 msgid "Add action" msgstr "Aktion hinzufügen" #: ../plugins/gtk/edit.c:293 ../plugins/gtk/edit.c:397 msgid "Add option" msgstr "Option hinzufügen" #: ../plugins/gtk/edit.c:355 msgid "Change option" msgstr "Option ändern" #: ../plugins/gtk/edit.c:420 msgid "Discard changes" msgstr "Änderungen verwerfen" #: ../plugins/gtk/edit.c:421 msgid "Accept changes" msgstr "Änderungen übernehmen" #: ../plugins/gtk/edit.c:422 msgid "Add an action" msgstr "Eine Aktion hinzufügen" #: ../plugins/gtk/edit.c:423 msgid "Add an option to this command" msgstr "Diesem Befehl eine Option hinzufügen" #: ../plugins/gtk/edit.c:425 msgid "Remove selection" msgstr "Auswahl entfernen" #: ../plugins/gtk/edit.c:426 msgid "Change selected option" msgstr "Ausgewählte Option ändern" #: ../plugins/gtk/edit.c:427 msgid "Add an option to selection" msgstr "Option zur Auswahl hinzufügen" #: ../plugins/gtk/edit.c:508 #, c-format msgid "Key combination '%s' cannot be used as a global hotkey, sorry." msgstr "" "Die Tastenkombination »%s« kann leider nicht als globale Tastenkombination " "verwendet werden." #: ../plugins/gtk/edit.c:571 msgid "Click to select, then press a key" msgstr "Zum Auswählen anklicken, dann eine Taste drücken" #: ../plugins/gtk/edit.c:1128 msgid "Actions:" msgstr "Aktionen:" #: ../plugins/gtk/edit.c:1136 msgid "Command line:" msgstr "Befehlszeile:" #: ../plugins/gtk/edit.c:1147 msgid "Options:" msgstr "Optionen:" #: ../plugins/gtk/edit.c:1169 msgid "Name:" msgstr "Name:" #: ../plugins/gtk/edit.c:1190 msgid "Value:" msgstr "Argument:" #~ msgid " %s show - show the action bound to a key\n" #~ msgstr " %s show - Taste für die Aktion anzeigen\n" lxhotkey-0.1.2/po/fr.po000066400000000000000000000524161476256652500150000ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-09-18 15:23+0200\n" "PO-Revision-Date: 2017-01-03 16:25+0100\n" "Last-Translator: Yvan Masson \n" "Language-Team: \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 1.8.11\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: ../src/lxhotkey.c:244 msgid "Usage: %s global [] - show keys bound to action(s)\n" msgstr "" "Usage : %s global [] - afficher les touches associées à " "l'action\n" #: ../src/lxhotkey.c:245 #, c-format msgid " %s global - bind a key to the action\n" msgstr "" " %s global - associer une touche à l'action\n" #: ../src/lxhotkey.c:246 msgid " %s app [] - show keys bound to exec line\n" msgstr "" " %s app [] - afficher les touches associées à la " "ligne d'exécution\n" #: ../src/lxhotkey.c:247 #, c-format msgid " %s app - bind a key to some exec line\n" msgstr "" " %s app - associer une touche a une ligne de " "commande\n" #: ../src/lxhotkey.c:248 #, c-format msgid " %s app -- - unbind all keys from exec line\n" msgstr "" " %s app -- - supprimer l'association de touches " "avec la ligne d'exécution\n" #: ../src/lxhotkey.c:250 #, c-format msgid " %s --gui= - start with GUI\n" msgstr "" " %s --gui= - démarrer avec l'interface graphique\n" #: ../src/lxhotkey.c:345 msgid "empty option name." msgstr "nom d'option vide." #: ../src/lxhotkey.c:348 msgid "empty action name." msgstr "nom d'action vide." #: ../src/lxhotkey.c:380 #, c-format msgid "no matching option '%s' found for action '%s'." msgstr "pas d'option « %s » trouvée pour l'action « %s »." #: ../src/lxhotkey.c:384 #, c-format msgid "action '%s' isn't supported by WM %s." msgstr "" "l'action « %s » n'est pas supportée par le gestionnaire de fenêtres %s." #: ../src/lxhotkey.c:401 #, c-format msgid "value '%s' is not supported for option '%s'." msgstr "la valeur « %s » n'est pas supportée pour l'option « %s »." #: ../src/lxhotkey.c:405 #, c-format msgid "value '%s' is not supported for action '%s'." msgstr "la valeur « %s » n'est pas supportée pour l'action « %s »." #: ../src/lxhotkey.c:418 #, c-format msgid "action '%s' does not support options." msgstr "l'action « %s » n'a pas d'option." #: ../src/lxhotkey.c:500 msgid "Sorry, cannot configure keys remotely." msgstr "Désolé, il n'est pas possible de configurer les raccourcis à distance." #: ../src/lxhotkey.c:508 msgid "Could not determine window manager running." msgstr "Impossible d'identifier le gestionnaire de fenêtre utilisé." #: ../src/lxhotkey.c:516 #, fuzzy, c-format #| msgid "Could not determine window manager running." msgid "Could not find a plugin for window manager %s." msgstr "Impossible d'identifier le gestionnaire de fenêtre utilisé." #: ../src/lxhotkey.c:523 ../plugins/gtk/gtk.c:75 msgid "Problems loading configuration: " msgstr "Problèmes au chargement de la configuration : " #: ../src/lxhotkey.c:532 #, c-format msgid "GUI type %s currently isn't supported." msgstr "Le type d'interface graphique %s n'est actuellement pas supporté." #: ../src/lxhotkey.c:549 ../src/lxhotkey.c:625 msgid "Invalid request: " msgstr "Requête invalide : " #: ../src/lxhotkey.c:559 ../src/lxhotkey.c:637 ../plugins/gtk/gtk.c:90 msgid "Problems saving configuration: " msgstr "Problèmes à l'enregistrement de la configuration : " #: ../src/lxhotkey.c:576 msgid "ACTION(s)" msgstr "ACTION(s)" #: ../src/lxhotkey.c:576 ../src/lxhotkey.c:654 msgid "KEY(s)" msgstr "TOUCHE(s)" #: ../src/lxhotkey.c:654 msgid "EXEC" msgstr "EXEC" #: ../src/lxhotkey.c:676 msgid "Requested operation isn't supported." msgstr "L'opération demandée n'est pas supportée." #: ../plugins/openbox/openbox.c:185 msgid "Failed to reconfigure Openbox." msgstr "Impossible de reconfigurer Openbox." #: ../plugins/openbox/openbox.c:204 msgid "yes" msgstr "oui" #: ../plugins/openbox/openbox.c:204 msgid "no" msgstr "non" #: ../plugins/openbox/openbox.c:207 msgid "enabled" msgstr "activé" #: ../plugins/openbox/openbox.c:208 msgid "wmclass" msgstr "wmclass" #: ../plugins/openbox/openbox.c:209 msgid "name" msgstr "nom" #: ../plugins/openbox/openbox.c:210 msgid "icon" msgstr "icône" #: ../plugins/openbox/openbox.c:215 ../plugins/openbox/openbox.c:294 msgid "command" msgstr "commande" #: ../plugins/openbox/openbox.c:216 ../plugins/openbox/openbox.c:299 msgid "prompt" msgstr "validation" #: ../plugins/openbox/openbox.c:217 msgid "startupnotify" msgstr "notification de démarrage" #: ../plugins/openbox/openbox.c:221 ../plugins/openbox/openbox.c:331 msgid "center" msgstr "centré" #: ../plugins/openbox/openbox.c:222 msgid "default" msgstr "défaut" #: ../plugins/openbox/openbox.c:222 msgid "primary" msgstr "primaire" #: ../plugins/openbox/openbox.c:222 msgid "mouse" msgstr "souris" #: ../plugins/openbox/openbox.c:223 msgid "active" msgstr "actif" #: ../plugins/openbox/openbox.c:223 ../plugins/openbox/openbox.c:334 msgid "all" msgstr "tout" #: ../plugins/openbox/openbox.c:228 ../plugins/openbox/openbox.c:341 msgid "monitor" msgstr "écran" #: ../plugins/openbox/openbox.c:233 msgid "menu" msgstr "menu" #: ../plugins/openbox/openbox.c:234 msgid "position" msgstr "position" #: ../plugins/openbox/openbox.c:238 msgid "list" msgstr "liste" #: ../plugins/openbox/openbox.c:238 msgid "icons" msgstr "icônes" #: ../plugins/openbox/openbox.c:238 msgid "none" msgstr "aucun" #: ../plugins/openbox/openbox.c:241 ../plugins/openbox/openbox.c:260 msgid "dialog" msgstr "dialogue" #: ../plugins/openbox/openbox.c:242 ../plugins/openbox/openbox.c:261 msgid "bar" msgstr "barre" #: ../plugins/openbox/openbox.c:243 ../plugins/openbox/openbox.c:262 msgid "raise" msgstr "réhausser" #: ../plugins/openbox/openbox.c:244 msgid "allDesktops" msgstr "tous les bureaux" #: ../plugins/openbox/openbox.c:245 ../plugins/openbox/openbox.c:263 msgid "panels" msgstr "panneaux" #: ../plugins/openbox/openbox.c:246 msgid "desktop" msgstr "bureau" #: ../plugins/openbox/openbox.c:247 msgid "linear" msgstr "linéaire" #: ../plugins/openbox/openbox.c:248 msgid "interactive" msgstr "interactif" #. TRANSLATORS: finalactions means actions when done #: ../plugins/openbox/openbox.c:250 ../plugins/openbox/openbox.c:265 msgid "finalactions" msgstr "action finale" #: ../plugins/openbox/openbox.c:254 ../plugins/openbox/openbox.c:271 #: ../plugins/openbox/openbox.c:311 ../plugins/openbox/openbox.c:364 msgid "north" msgstr "nord" #: ../plugins/openbox/openbox.c:254 msgid "northeast" msgstr "nord-est" #: ../plugins/openbox/openbox.c:254 ../plugins/openbox/openbox.c:272 #: ../plugins/openbox/openbox.c:312 ../plugins/openbox/openbox.c:364 msgid "east" msgstr "est" #: ../plugins/openbox/openbox.c:255 msgid "southeast" msgstr "sud-est" #: ../plugins/openbox/openbox.c:255 ../plugins/openbox/openbox.c:271 #: ../plugins/openbox/openbox.c:311 ../plugins/openbox/openbox.c:364 msgid "south" msgstr "sud" #: ../plugins/openbox/openbox.c:255 msgid "southwest" msgstr "sud-ouest" #: ../plugins/openbox/openbox.c:256 ../plugins/openbox/openbox.c:272 #: ../plugins/openbox/openbox.c:312 ../plugins/openbox/openbox.c:364 msgid "west" msgstr "ouest" #: ../plugins/openbox/openbox.c:256 msgid "northwest" msgstr "nord-ouest" #: ../plugins/openbox/openbox.c:259 ../plugins/openbox/openbox.c:306 #: ../plugins/openbox/openbox.c:367 msgid "direction" msgstr "direction" #: ../plugins/openbox/openbox.c:264 msgid "desktops" msgstr "bureaux" #. TRANSLATORS: these values are in regard to desktop #: ../plugins/openbox/openbox.c:270 ../plugins/openbox/openbox.c:281 #: ../plugins/openbox/openbox.c:310 ../plugins/openbox/openbox.c:331 #: ../plugins/openbox/openbox.c:334 msgid "current" msgstr "actuel" #: ../plugins/openbox/openbox.c:270 ../plugins/openbox/openbox.c:310 #: ../plugins/openbox/openbox.c:334 msgid "next" msgstr "suivant" #: ../plugins/openbox/openbox.c:270 ../plugins/openbox/openbox.c:310 msgid "previous" msgstr "précédent" #: ../plugins/openbox/openbox.c:271 ../plugins/openbox/openbox.c:281 #: ../plugins/openbox/openbox.c:311 msgid "last" msgstr "dernier" #: ../plugins/openbox/openbox.c:271 ../plugins/openbox/openbox.c:311 msgid "up" msgstr "au-dessus" #: ../plugins/openbox/openbox.c:272 ../plugins/openbox/openbox.c:312 msgid "down" msgstr "en-dessous" #: ../plugins/openbox/openbox.c:272 ../plugins/openbox/openbox.c:312 #: ../plugins/openbox/openbox.c:322 ../plugins/openbox/openbox.c:357 msgid "left" msgstr "gauche" #: ../plugins/openbox/openbox.c:273 ../plugins/openbox/openbox.c:313 #: ../plugins/openbox/openbox.c:322 ../plugins/openbox/openbox.c:358 msgid "right" msgstr "droite" #: ../plugins/openbox/openbox.c:276 ../plugins/openbox/openbox.c:316 msgid "to" msgstr "vers" #: ../plugins/openbox/openbox.c:277 ../plugins/openbox/openbox.c:317 msgid "wrap" msgstr "en boucle" #: ../plugins/openbox/openbox.c:284 msgid "where" msgstr "où" #: ../plugins/openbox/openbox.c:289 msgid "strict" msgstr "strict" #: ../plugins/openbox/openbox.c:303 msgid "both" msgstr "les deux" #: ../plugins/openbox/openbox.c:303 msgid "horizontal" msgstr "horizontal" #: ../plugins/openbox/openbox.c:303 msgid "vertical" msgstr "vertical" #: ../plugins/openbox/openbox.c:318 msgid "follow" msgstr "suivre" #: ../plugins/openbox/openbox.c:322 ../plugins/openbox/openbox.c:359 #: ../plugins/openbox/openbox.c:371 msgid "top" msgstr "haut" #: ../plugins/openbox/openbox.c:322 ../plugins/openbox/openbox.c:360 #: ../plugins/openbox/openbox.c:371 msgid "bottom" msgstr "bas" #: ../plugins/openbox/openbox.c:323 msgid "topleft" msgstr "haut-gauche" #: ../plugins/openbox/openbox.c:323 msgid "topright" msgstr "haut-droit" #: ../plugins/openbox/openbox.c:323 msgid "bottomleft" msgstr "bas-gauche" #: ../plugins/openbox/openbox.c:324 msgid "bottomright" msgstr "bas-droite" #: ../plugins/openbox/openbox.c:327 msgid "edge" msgstr "bord" #. TRANSLATORS: # in config means either pixels, or monitor number #: ../plugins/openbox/openbox.c:331 ../plugins/openbox/openbox.c:346 msgid "#" msgstr "#" #. TRANSLATORS: % in config means some fraction value, usually measured in percents #: ../plugins/openbox/openbox.c:333 msgid "%" msgstr "%" #: ../plugins/openbox/openbox.c:334 msgid "prev" msgstr "précédent" #: ../plugins/openbox/openbox.c:339 msgid "width" msgstr "largeur" #: ../plugins/openbox/openbox.c:340 msgid "height" msgstr "hauteur" #: ../plugins/openbox/openbox.c:371 msgid "normal" msgstr "normal" #: ../plugins/openbox/openbox.c:374 msgid "layer" msgstr "couche" #: ../plugins/openbox/openbox.c:380 msgid "Execute" msgstr "Exécuter" #: ../plugins/openbox/openbox.c:381 msgid "ShowMenu" msgstr "Afficher le menu" #: ../plugins/openbox/openbox.c:382 msgid "NextWindow" msgstr "Fenêtre suivante" #: ../plugins/openbox/openbox.c:383 msgid "PreviousWindow" msgstr "Fenêtre précédente" #: ../plugins/openbox/openbox.c:384 msgid "DirectionalCycleWindows" msgstr "Changer de fenêtre dans une direction" #: ../plugins/openbox/openbox.c:385 msgid "DirectionalTargetWindow" msgstr "Changer de fenêtre dans une direction directement" #: ../plugins/openbox/openbox.c:386 msgid "GoToDesktop" msgstr "Aller au bureau" #: ../plugins/openbox/openbox.c:387 msgid "AddDesktop" msgstr "Ajouter un bureau" #: ../plugins/openbox/openbox.c:388 msgid "RemoveDesktop" msgstr "Supprimer un bureau" #: ../plugins/openbox/openbox.c:389 msgid "ToggleShowDesktop" msgstr "Basculer l'affichage du bureau" #: ../plugins/openbox/openbox.c:390 msgid "ToggleDockAutohide" msgstr "Basculer le masquage automatique du dock" #: ../plugins/openbox/openbox.c:391 msgid "Reconfigure" msgstr "Reconfigurer" #: ../plugins/openbox/openbox.c:392 msgid "Restart" msgstr "Redémarrer" #: ../plugins/openbox/openbox.c:393 msgid "Exit" msgstr "Quitter" #: ../plugins/openbox/openbox.c:395 msgid "Focus" msgstr "Focus" #: ../plugins/openbox/openbox.c:396 msgid "Raise" msgstr "Afficher" #: ../plugins/openbox/openbox.c:397 msgid "Lower" msgstr "Masquer" #: ../plugins/openbox/openbox.c:398 msgid "RaiseLower" msgstr "Afficher ou masquer" #: ../plugins/openbox/openbox.c:399 msgid "Unfocus" msgstr "Enlever le focus" #: ../plugins/openbox/openbox.c:400 msgid "FocusToBottom" msgstr "Mettre le focus en dernier" #: ../plugins/openbox/openbox.c:401 msgid "Iconify" msgstr "Iconifier" #: ../plugins/openbox/openbox.c:402 msgid "Close" msgstr "Fermer" #: ../plugins/openbox/openbox.c:403 msgid "ToggleShade" msgstr "Basculer l'enroulement" #: ../plugins/openbox/openbox.c:404 msgid "Shade" msgstr "Enrouler" #: ../plugins/openbox/openbox.c:405 msgid "Unshade" msgstr "Dérouler" #: ../plugins/openbox/openbox.c:406 msgid "ToggleOmnipresent" msgstr "Basculer l'omniprésence" #: ../plugins/openbox/openbox.c:407 msgid "ToggleMaximize" msgstr "Basculer la maximisation" #: ../plugins/openbox/openbox.c:408 msgid "Maximize" msgstr "Maximiser" #: ../plugins/openbox/openbox.c:409 msgid "Unmaximize" msgstr "Dé-maximiser" #: ../plugins/openbox/openbox.c:410 msgid "ToggleFullscreen" msgstr "Basculer l'affichage plein écran" #: ../plugins/openbox/openbox.c:411 msgid "ToggleDecorations" msgstr "Basculer l'affichage des décorations" #: ../plugins/openbox/openbox.c:412 msgid "Decorate" msgstr "Décorer" #: ../plugins/openbox/openbox.c:413 msgid "Undecorate" msgstr "Enlever les décorations" #: ../plugins/openbox/openbox.c:414 msgid "SendToDesktop" msgstr "Envoyer vers le bureau" #: ../plugins/openbox/openbox.c:415 msgid "Move" msgstr "Déplacer" #: ../plugins/openbox/openbox.c:416 msgid "Resize" msgstr "Redimensionner" #: ../plugins/openbox/openbox.c:417 msgid "MoveResizeTo" msgstr "Déplacer et redimensionner vers" #: ../plugins/openbox/openbox.c:418 msgid "MoveRelative" msgstr "Déplacer relativement" #: ../plugins/openbox/openbox.c:419 msgid "ResizeRelative" msgstr "Redimensionner relativement" #: ../plugins/openbox/openbox.c:420 msgid "MoveToEdge" msgstr "Déplacer jusqu'au bord" #: ../plugins/openbox/openbox.c:421 msgid "GrowToEdge" msgstr "Agrandir jusqu'au bord" #: ../plugins/openbox/openbox.c:422 msgid "ShrinkToEdge" msgstr "Réduire jusqu'au bord" #: ../plugins/openbox/openbox.c:423 msgid "GrowToFill" msgstr "Agrandir pour remplir" #: ../plugins/openbox/openbox.c:424 msgid "ToggleAlwaysOnTop" msgstr "Basculer toujours devant" #: ../plugins/openbox/openbox.c:425 msgid "ToggleAlwaysOnBottom" msgstr "Basculer toujours derrière" #: ../plugins/openbox/openbox.c:426 msgid "SendToLayer" msgstr "Envoyer vers la couche" #: ../plugins/openbox/openbox.c:517 msgid "Duplicate section in the rc.xml file." msgstr "La section est présente deux fois dans le fichier rc.xml." #: ../plugins/openbox/openbox.c:548 ../plugins/openbox/openbox.c:790 msgid "Internal error." msgstr "Erreur interne." #: ../plugins/openbox/openbox.c:592 msgid "rc.xml error: no key is set for a keybind." msgstr "Erreur dans rc.xml : aucune clé n'est définie pour un raccourci." #: ../plugins/openbox/openbox.c:663 msgid "Invalid rc.xml: action with a sub-action." msgstr "Fichier rc.xml invalide : action avec une sous-action." #: ../plugins/openbox/openbox.c:779 msgid "rc.xml error: no name is set for action." msgstr "Erreur dans rc.xml : aucun nom n'est défini pour l'action." #: ../plugins/openbox/openbox.c:809 #, c-format msgid "rc.xml error: empty tag <%s> is prohibited." msgstr "Erreur dans rc.xml : la balise vide <%s> est interdite." #: ../plugins/openbox/openbox.c:901 msgid "Could not find the rc.xml file anywhere." msgstr "Impossible de trouver le fichier rc.xml." #: ../plugins/openbox/openbox.c:949 ../plugins/openbox/openbox.c:1063 #: ../plugins/openbox/openbox.c:1210 ../plugins/openbox/openbox.c:1228 msgid "No WM configuration is available." msgstr "La configuration du gestionnaire de fenêtres n'est disponible." #: ../plugins/openbox/openbox.c:1067 msgid "Keybinding should activate at least one action." msgstr "Le raccourci doit activer au moins une action." #: ../plugins/openbox/openbox.c:1096 ../plugins/openbox/openbox.c:1106 #: ../plugins/openbox/openbox.c:1262 ../plugins/openbox/openbox.c:1272 #, c-format msgid "Hotkey '%s' is already bound to an action." msgstr "Le raccourci « %s » est déjà associé à une action." #: ../plugins/openbox/openbox.c:1232 msgid "The exec line cannot be empty." msgstr "La ligne de commande ne peut pas être vide." #: ../plugins/gtk/gtk.c:133 ../plugins/gtk/gtk.c:156 msgid "Cannot delete keybinding: " msgstr "Impossible de supprimer le raccourci :" #. TRANSLATORS: Replace this string with your names, one name per line. #: ../plugins/gtk/gtk.c:176 msgid "translator-credits" msgstr "Yvan Masson" #: ../plugins/gtk/gtk.c:184 msgid "Copyright (C) 2016-2025" msgstr "Copyright (C) 2016-2025" #: ../plugins/gtk/gtk.c:185 msgid "Keyboard shortcuts configurator" msgstr "Outil de configuration des raccourcis clavier" #: ../plugins/gtk/gtk.c:208 msgid "_File" msgstr "_Fichier" #: ../plugins/gtk/gtk.c:209 msgid "_Reload" msgstr "_Recharger" #: ../plugins/gtk/gtk.c:210 msgid "" "Drop all unsaved changes and reload all keys from Window Manager " "configuration" msgstr "" "Annuler les modifications non sauvegardées et recharger les raccourcis " "depuis la configuration du gestionnaire de fenêtres" #: ../plugins/gtk/gtk.c:213 msgid "Save all changes and apply them to Window Manager configuration" msgstr "" "Sauvegarder les modifications et les appliquer à la configuration du " "gestionnaire de fenêtres" #: ../plugins/gtk/gtk.c:216 msgid "Exit the application without saving" msgstr "Quitter l'application sans enregistrer" #: ../plugins/gtk/gtk.c:217 msgid "_Edit" msgstr "_Édition" #: ../plugins/gtk/gtk.c:218 msgid "Create new action" msgstr "Créer une nouvelle action" #: ../plugins/gtk/gtk.c:220 msgid "Remove selected action" msgstr "Supprimer l'action sélectionnée" #: ../plugins/gtk/gtk.c:222 msgid "Change selected action" msgstr "Modifier l'action sélectionnée" #: ../plugins/gtk/gtk.c:224 msgid "_Help" msgstr "_Aide" #: ../plugins/gtk/gtk.c:441 msgid "Action" msgstr "Action" #: ../plugins/gtk/gtk.c:444 msgid "Option" msgstr "Option" #: ../plugins/gtk/gtk.c:447 ../plugins/gtk/gtk.c:467 ../plugins/gtk/edit.c:1111 msgid "Hotkey 1" msgstr "Raccourci 1" #: ../plugins/gtk/gtk.c:450 ../plugins/gtk/gtk.c:470 ../plugins/gtk/edit.c:1115 msgid "Hotkey 2" msgstr "Raccourci 2" #: ../plugins/gtk/gtk.c:458 msgid "Actions" msgstr "Actions" #: ../plugins/gtk/gtk.c:464 msgid "Command" msgstr "Commandes" #: ../plugins/gtk/gtk.c:478 msgid "Programs" msgstr "Programmes" #: ../plugins/gtk/gtk.c:497 ../plugins/gtk/edit.c:511 msgid "Error" msgstr "Erreur" #: ../plugins/gtk/lxhotkey-gtk.desktop.in.h:1 msgid "Setup Hot Keys" msgstr "Configurer les raccourcis clavier" #: ../plugins/gtk/lxhotkey-gtk.desktop.in.h:2 msgid "View and change Window Manager global shortcuts" msgstr "Voir et modifier les raccourcis globaux du gestionnaire de fenêtres" #: ../plugins/gtk/lxhotkey-gtk.desktop.in.h:3 msgid "hotkey;shortcut;system;settings;" msgstr "hotkey;shortcut;system;settings;" #: ../plugins/gtk/edit.c:266 msgid "Apply error: " msgstr "Erreur lors de l'application : " #: ../plugins/gtk/edit.c:281 ../plugins/gtk/edit.c:395 msgid "Add action" msgstr "Ajouter une action" #: ../plugins/gtk/edit.c:293 ../plugins/gtk/edit.c:397 msgid "Add option" msgstr "Ajouter une option" #: ../plugins/gtk/edit.c:355 msgid "Change option" msgstr "Modifier l'option" #: ../plugins/gtk/edit.c:420 msgid "Discard changes" msgstr "Annuler les changements" #: ../plugins/gtk/edit.c:421 msgid "Accept changes" msgstr "Accepter les changements" #: ../plugins/gtk/edit.c:422 msgid "Add an action" msgstr "Ajouter une action" #: ../plugins/gtk/edit.c:423 msgid "Add an option to this command" msgstr "Ajouter une option à cette commande" #: ../plugins/gtk/edit.c:425 msgid "Remove selection" msgstr "Supprimer la sélection" #: ../plugins/gtk/edit.c:426 msgid "Change selected option" msgstr "Modifier l'option sélectionnée" #: ../plugins/gtk/edit.c:427 msgid "Add an option to selection" msgstr "Ajouter une option à la sélection" #: ../plugins/gtk/edit.c:508 #, c-format msgid "Key combination '%s' cannot be used as a global hotkey, sorry." msgstr "" "La combinaison de touches « %s » ne peut pas être utilisée comme raccourci " "global, désolé." #: ../plugins/gtk/edit.c:571 msgid "Click to select, then press a key" msgstr "" #: ../plugins/gtk/edit.c:1128 msgid "Actions:" msgstr "Actions :" #: ../plugins/gtk/edit.c:1136 msgid "Command line:" msgstr "Ligne de commande :" #: ../plugins/gtk/edit.c:1147 msgid "Options:" msgstr "Options :" #: ../plugins/gtk/edit.c:1169 msgid "Name:" msgstr "Nom :" #: ../plugins/gtk/edit.c:1190 msgid "Value:" msgstr "Valeur :" #, c-format #~ msgid " %s show - show the action bound to a key\n" #~ msgstr "" #~ " %s show - afficher l'action associée à une " #~ "touche\n" #, c-format #~ msgid "Window manager %s isn't supported now, sorry." #~ msgstr "" #~ "Le gestionnaire de fenêtres %s n'est pas supporté pour l'instant, désolé." lxhotkey-0.1.2/po/gl.po000066400000000000000000000520241476256652500147660ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Miguel Anxo Bouzada , 2016. msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-09-18 15:23+0200\n" "PO-Revision-Date: 2016-11-06 17:45+0200\n" "Last-Translator: Miguel Anxo Bouzada \n" "Language-Team: Galician \n" "Language: gl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Virtaal 0.7.0\n" #: ../src/lxhotkey.c:244 msgid "Usage: %s global [] - show keys bound to action(s)\n" msgstr "" "Uso: %s global [] - amosa as teclas ligadas a acción(s)\n" #: ../src/lxhotkey.c:245 #, c-format msgid " %s global - bind a key to the action\n" msgstr " %s global - liga unha tecla a unha acción\n" #: ../src/lxhotkey.c:246 msgid " %s app [] - show keys bound to exec line\n" msgstr "" " %s app [] - amosa as teclas ligadas a unha liña de " "execución\n" #: ../src/lxhotkey.c:247 #, c-format msgid " %s app - bind a key to some exec line\n" msgstr "" " %s app - liga unha tecla a unha liña de execución\n" #: ../src/lxhotkey.c:248 #, c-format msgid " %s app -- - unbind all keys from exec line\n" msgstr "" " %s app -- - desliga todas as teclas dunha liña de " "execución\n" #: ../src/lxhotkey.c:250 #, c-format msgid " %s --gui= - start with GUI\n" msgstr " %s --gui= - iniciar coa IGU\n" #: ../src/lxhotkey.c:345 msgid "empty option name." msgstr "O nome da opción está baleiro." #: ../src/lxhotkey.c:348 msgid "empty action name." msgstr "O nome da acción está baleiro." #: ../src/lxhotkey.c:380 #, c-format msgid "no matching option '%s' found for action '%s'." msgstr "Non se atopou ningunha opción «%s» correspondente coa acción «%s»." #: ../src/lxhotkey.c:384 #, c-format msgid "action '%s' isn't supported by WM %s." msgstr "A acción «%s» non está admitida polo xestor de xanelas %s." #: ../src/lxhotkey.c:401 #, c-format msgid "value '%s' is not supported for option '%s'." msgstr "Non se admite o valor «%s» para a opción «%s»." #: ../src/lxhotkey.c:405 #, c-format msgid "value '%s' is not supported for action '%s'." msgstr "Non se admite o valor «%s» para a acción «%s»." #: ../src/lxhotkey.c:418 #, c-format msgid "action '%s' does not support options." msgstr "A acción «%s» non admite opcións." #: ../src/lxhotkey.c:500 msgid "Sorry, cannot configure keys remotely." msgstr "Non é posíbel configurar as teclas de xeito remoto" #: ../src/lxhotkey.c:508 msgid "Could not determine window manager running." msgstr "Non foi posíbel determinar o xestor de xanelas en execución." #: ../src/lxhotkey.c:516 #, fuzzy, c-format #| msgid "Could not determine window manager running." msgid "Could not find a plugin for window manager %s." msgstr "Non foi posíbel determinar o xestor de xanelas en execución." #: ../src/lxhotkey.c:523 ../plugins/gtk/gtk.c:75 msgid "Problems loading configuration: " msgstr "Problemas cargando a configuración:" #: ../src/lxhotkey.c:532 #, c-format msgid "GUI type %s currently isn't supported." msgstr "As IGU do tipo %s non son compatíbeis." #: ../src/lxhotkey.c:549 ../src/lxhotkey.c:625 msgid "Invalid request: " msgstr "Solicitude incorrecta:" #: ../src/lxhotkey.c:559 ../src/lxhotkey.c:637 ../plugins/gtk/gtk.c:90 msgid "Problems saving configuration: " msgstr "Problemas gardando a configuración:" #: ../src/lxhotkey.c:576 msgid "ACTION(s)" msgstr "ACCIÓN(s)" #: ../src/lxhotkey.c:576 ../src/lxhotkey.c:654 msgid "KEY(s)" msgstr "TECLA(s)" #: ../src/lxhotkey.c:654 msgid "EXEC" msgstr "EXECUTAR" #: ../src/lxhotkey.c:676 msgid "Requested operation isn't supported." msgstr "A operación solicitada non está admitida." #: ../plugins/openbox/openbox.c:185 msgid "Failed to reconfigure Openbox." msgstr "Produciuse un fallo ao reconfigurar Openbox." #: ../plugins/openbox/openbox.c:204 msgid "yes" msgstr "si" #: ../plugins/openbox/openbox.c:204 msgid "no" msgstr "non" #: ../plugins/openbox/openbox.c:207 msgid "enabled" msgstr "activado" #: ../plugins/openbox/openbox.c:208 msgid "wmclass" msgstr "wmclass" #: ../plugins/openbox/openbox.c:209 msgid "name" msgstr "nome" #: ../plugins/openbox/openbox.c:210 msgid "icon" msgstr "icona" #: ../plugins/openbox/openbox.c:215 ../plugins/openbox/openbox.c:294 msgid "command" msgstr "orde" #: ../plugins/openbox/openbox.c:216 ../plugins/openbox/openbox.c:299 msgid "prompt" msgstr "indicador" #: ../plugins/openbox/openbox.c:217 msgid "startupnotify" msgstr "inicio da notificación" #: ../plugins/openbox/openbox.c:221 ../plugins/openbox/openbox.c:331 msgid "center" msgstr "centro" #: ../plugins/openbox/openbox.c:222 msgid "default" msgstr "predeterminado" #: ../plugins/openbox/openbox.c:222 msgid "primary" msgstr "primario" #: ../plugins/openbox/openbox.c:222 msgid "mouse" msgstr "rato" #: ../plugins/openbox/openbox.c:223 msgid "active" msgstr "activo" #: ../plugins/openbox/openbox.c:223 ../plugins/openbox/openbox.c:334 msgid "all" msgstr "todo" #: ../plugins/openbox/openbox.c:228 ../plugins/openbox/openbox.c:341 msgid "monitor" msgstr "monitor" #: ../plugins/openbox/openbox.c:233 msgid "menu" msgstr "menú" #: ../plugins/openbox/openbox.c:234 msgid "position" msgstr "posición" #: ../plugins/openbox/openbox.c:238 msgid "list" msgstr "lista" #: ../plugins/openbox/openbox.c:238 msgid "icons" msgstr "iconas" #: ../plugins/openbox/openbox.c:238 msgid "none" msgstr "ningún" #: ../plugins/openbox/openbox.c:241 ../plugins/openbox/openbox.c:260 msgid "dialog" msgstr "diálogo" #: ../plugins/openbox/openbox.c:242 ../plugins/openbox/openbox.c:261 msgid "bar" msgstr "barra" #: ../plugins/openbox/openbox.c:243 ../plugins/openbox/openbox.c:262 msgid "raise" msgstr "incrementar" #: ../plugins/openbox/openbox.c:244 msgid "allDesktops" msgstr "todos os escritorios" #: ../plugins/openbox/openbox.c:245 ../plugins/openbox/openbox.c:263 msgid "panels" msgstr "paneis" #: ../plugins/openbox/openbox.c:246 msgid "desktop" msgstr "escritorio" #: ../plugins/openbox/openbox.c:247 msgid "linear" msgstr "lineal" #: ../plugins/openbox/openbox.c:248 msgid "interactive" msgstr "interactivo" #. TRANSLATORS: finalactions means actions when done #: ../plugins/openbox/openbox.c:250 ../plugins/openbox/openbox.c:265 msgid "finalactions" msgstr "accións finais" #: ../plugins/openbox/openbox.c:254 ../plugins/openbox/openbox.c:271 #: ../plugins/openbox/openbox.c:311 ../plugins/openbox/openbox.c:364 msgid "north" msgstr "norte" #: ../plugins/openbox/openbox.c:254 msgid "northeast" msgstr "nordés" #: ../plugins/openbox/openbox.c:254 ../plugins/openbox/openbox.c:272 #: ../plugins/openbox/openbox.c:312 ../plugins/openbox/openbox.c:364 msgid "east" msgstr "leste" #: ../plugins/openbox/openbox.c:255 msgid "southeast" msgstr "sueste" #: ../plugins/openbox/openbox.c:255 ../plugins/openbox/openbox.c:271 #: ../plugins/openbox/openbox.c:311 ../plugins/openbox/openbox.c:364 msgid "south" msgstr "sur" #: ../plugins/openbox/openbox.c:255 msgid "southwest" msgstr "suroeste" #: ../plugins/openbox/openbox.c:256 ../plugins/openbox/openbox.c:272 #: ../plugins/openbox/openbox.c:312 ../plugins/openbox/openbox.c:364 msgid "west" msgstr "oeste" #: ../plugins/openbox/openbox.c:256 msgid "northwest" msgstr "noroeste" #: ../plugins/openbox/openbox.c:259 ../plugins/openbox/openbox.c:306 #: ../plugins/openbox/openbox.c:367 msgid "direction" msgstr "dirección" #: ../plugins/openbox/openbox.c:264 msgid "desktops" msgstr "escritorios" #. TRANSLATORS: these values are in regard to desktop #: ../plugins/openbox/openbox.c:270 ../plugins/openbox/openbox.c:281 #: ../plugins/openbox/openbox.c:310 ../plugins/openbox/openbox.c:331 #: ../plugins/openbox/openbox.c:334 msgid "current" msgstr "actual" #: ../plugins/openbox/openbox.c:270 ../plugins/openbox/openbox.c:310 #: ../plugins/openbox/openbox.c:334 msgid "next" msgstr "seguinte" #: ../plugins/openbox/openbox.c:270 ../plugins/openbox/openbox.c:310 msgid "previous" msgstr "anterior" #: ../plugins/openbox/openbox.c:271 ../plugins/openbox/openbox.c:281 #: ../plugins/openbox/openbox.c:311 msgid "last" msgstr "último" #: ../plugins/openbox/openbox.c:271 ../plugins/openbox/openbox.c:311 msgid "up" msgstr "subir" #: ../plugins/openbox/openbox.c:272 ../plugins/openbox/openbox.c:312 msgid "down" msgstr "baixar" #: ../plugins/openbox/openbox.c:272 ../plugins/openbox/openbox.c:312 #: ../plugins/openbox/openbox.c:322 ../plugins/openbox/openbox.c:357 msgid "left" msgstr "esquerda" #: ../plugins/openbox/openbox.c:273 ../plugins/openbox/openbox.c:313 #: ../plugins/openbox/openbox.c:322 ../plugins/openbox/openbox.c:358 msgid "right" msgstr "dereita" #: ../plugins/openbox/openbox.c:276 ../plugins/openbox/openbox.c:316 msgid "to" msgstr "a" #: ../plugins/openbox/openbox.c:277 ../plugins/openbox/openbox.c:317 msgid "wrap" msgstr "envolver" #: ../plugins/openbox/openbox.c:284 msgid "where" msgstr "aquí" #: ../plugins/openbox/openbox.c:289 msgid "strict" msgstr "" #: ../plugins/openbox/openbox.c:303 msgid "both" msgstr "ambos" #: ../plugins/openbox/openbox.c:303 msgid "horizontal" msgstr "horizontal" #: ../plugins/openbox/openbox.c:303 msgid "vertical" msgstr "vertical" #: ../plugins/openbox/openbox.c:318 msgid "follow" msgstr "seguir" #: ../plugins/openbox/openbox.c:322 ../plugins/openbox/openbox.c:359 #: ../plugins/openbox/openbox.c:371 msgid "top" msgstr "arriba" #: ../plugins/openbox/openbox.c:322 ../plugins/openbox/openbox.c:360 #: ../plugins/openbox/openbox.c:371 msgid "bottom" msgstr "abaixo" #: ../plugins/openbox/openbox.c:323 msgid "topleft" msgstr "arriba á esquerda" #: ../plugins/openbox/openbox.c:323 msgid "topright" msgstr "arriba á dereita" #: ../plugins/openbox/openbox.c:323 msgid "bottomleft" msgstr "abaixo á esquerda" #: ../plugins/openbox/openbox.c:324 msgid "bottomright" msgstr "abaixo á dereita" #: ../plugins/openbox/openbox.c:327 msgid "edge" msgstr "bordo" #. TRANSLATORS: # in config means either pixels, or monitor number #: ../plugins/openbox/openbox.c:331 ../plugins/openbox/openbox.c:346 msgid "#" msgstr "núm." #. TRANSLATORS: % in config means some fraction value, usually measured in percents #: ../plugins/openbox/openbox.c:333 msgid "%" msgstr "%" #: ../plugins/openbox/openbox.c:334 msgid "prev" msgstr "prev." #: ../plugins/openbox/openbox.c:339 msgid "width" msgstr "largo" #: ../plugins/openbox/openbox.c:340 msgid "height" msgstr "alto" #: ../plugins/openbox/openbox.c:371 msgid "normal" msgstr "normal" #: ../plugins/openbox/openbox.c:374 msgid "layer" msgstr "capa" #: ../plugins/openbox/openbox.c:380 msgid "Execute" msgstr "Executar" #: ../plugins/openbox/openbox.c:381 msgid "ShowMenu" msgstr "Amosar o menú" #: ../plugins/openbox/openbox.c:382 msgid "NextWindow" msgstr "Seguinte xanela" #: ../plugins/openbox/openbox.c:383 msgid "PreviousWindow" msgstr "Xanela anterior" #: ../plugins/openbox/openbox.c:384 msgid "DirectionalCycleWindows" msgstr "Xanelas con ciclo direccional" #: ../plugins/openbox/openbox.c:385 msgid "DirectionalTargetWindow" msgstr "Xanelas direccional de destino" #: ../plugins/openbox/openbox.c:386 msgid "GoToDesktop" msgstr "Ir ao escritorio" #: ../plugins/openbox/openbox.c:387 msgid "AddDesktop" msgstr "Engadir escritorio" #: ../plugins/openbox/openbox.c:388 msgid "RemoveDesktop" msgstr "Retirar escritorio" #: ../plugins/openbox/openbox.c:389 #, fuzzy #| msgid "ToggleShade" msgid "ToggleShowDesktop" msgstr "Alternar a sombra" #: ../plugins/openbox/openbox.c:390 msgid "ToggleDockAutohide" msgstr "Alternar o agochado automático da doca" #: ../plugins/openbox/openbox.c:391 msgid "Reconfigure" msgstr "Reconfigurar" #: ../plugins/openbox/openbox.c:392 msgid "Restart" msgstr "Reiniciar" #: ../plugins/openbox/openbox.c:393 msgid "Exit" msgstr "Saír" #: ../plugins/openbox/openbox.c:395 msgid "Focus" msgstr "En foco" #: ../plugins/openbox/openbox.c:396 msgid "Raise" msgstr "Incrementar" #: ../plugins/openbox/openbox.c:397 msgid "Lower" msgstr "Inferior" #: ../plugins/openbox/openbox.c:398 msgid "RaiseLower" msgstr "Incremento inferior" #: ../plugins/openbox/openbox.c:399 msgid "Unfocus" msgstr "Sen foco" #: ../plugins/openbox/openbox.c:400 msgid "FocusToBottom" msgstr "Foco cara abaixo" #: ../plugins/openbox/openbox.c:401 msgid "Iconify" msgstr "Iconificar" #: ../plugins/openbox/openbox.c:402 msgid "Close" msgstr "Pechar" #: ../plugins/openbox/openbox.c:403 msgid "ToggleShade" msgstr "Alternar a sombra" #: ../plugins/openbox/openbox.c:404 msgid "Shade" msgstr "Sombra" #: ../plugins/openbox/openbox.c:405 msgid "Unshade" msgstr "Sen sombra" #: ../plugins/openbox/openbox.c:406 msgid "ToggleOmnipresent" msgstr "Alternar a omnipresencia" #: ../plugins/openbox/openbox.c:407 msgid "ToggleMaximize" msgstr "Alternar o maximizado" #: ../plugins/openbox/openbox.c:408 msgid "Maximize" msgstr "Maximizar" #: ../plugins/openbox/openbox.c:409 msgid "Unmaximize" msgstr "Desmaximizar" #: ../plugins/openbox/openbox.c:410 msgid "ToggleFullscreen" msgstr "Alternar a pantalla completa" #: ../plugins/openbox/openbox.c:411 msgid "ToggleDecorations" msgstr "Alternar a decoración" #: ../plugins/openbox/openbox.c:412 msgid "Decorate" msgstr "Decorado" #: ../plugins/openbox/openbox.c:413 msgid "Undecorate" msgstr "Sen decorado" #: ../plugins/openbox/openbox.c:414 msgid "SendToDesktop" msgstr "Enviara ao escritorio" #: ../plugins/openbox/openbox.c:415 msgid "Move" msgstr "Desprazar" #: ../plugins/openbox/openbox.c:416 msgid "Resize" msgstr "Axustar tamaño" #: ../plugins/openbox/openbox.c:417 msgid "MoveResizeTo" msgstr "Desprazar o axuste de tamaño a" #: ../plugins/openbox/openbox.c:418 msgid "MoveRelative" msgstr "Desprazamento relativo" #: ../plugins/openbox/openbox.c:419 msgid "ResizeRelative" msgstr "Axuste de tamaño relativo" #: ../plugins/openbox/openbox.c:420 msgid "MoveToEdge" msgstr "Desprazar ata o bordo" #: ../plugins/openbox/openbox.c:421 msgid "GrowToEdge" msgstr "Aumentar ata o bordo" #: ../plugins/openbox/openbox.c:422 msgid "ShrinkToEdge" msgstr "Reducir ata o bordo" #: ../plugins/openbox/openbox.c:423 msgid "GrowToFill" msgstr "Aumentar ata encher" #: ../plugins/openbox/openbox.c:424 msgid "ToggleAlwaysOnTop" msgstr "Alternar sempre arriba" #: ../plugins/openbox/openbox.c:425 msgid "ToggleAlwaysOnBottom" msgstr "Alternar sempre abaixo" #: ../plugins/openbox/openbox.c:426 msgid "SendToLayer" msgstr "Enviar á capa" #: ../plugins/openbox/openbox.c:517 msgid "Duplicate section in the rc.xml file." msgstr "Duplicar a sección (teclado) no ficheiro rc.xml." #: ../plugins/openbox/openbox.c:548 ../plugins/openbox/openbox.c:790 msgid "Internal error." msgstr "Produciuse un erro interno." #: ../plugins/openbox/openbox.c:592 msgid "rc.xml error: no key is set for a keybind." msgstr "Erro en rc.xml: non estabeleceu ningunha tecla para un atallo." #: ../plugins/openbox/openbox.c:663 msgid "Invalid rc.xml: action with a sub-action." msgstr "Erro en rc.xml: acción cunha subacción." #: ../plugins/openbox/openbox.c:779 msgid "rc.xml error: no name is set for action." msgstr "Erro en rc.xml: non estabeleceu ningún nome para unha acción." #: ../plugins/openbox/openbox.c:809 #, c-format msgid "rc.xml error: empty tag <%s> is prohibited." msgstr "Erro en rc.xml: as etiquetas baleiras <%s> están prohibidas." #: ../plugins/openbox/openbox.c:901 msgid "Could not find the rc.xml file anywhere." msgstr "Non foi posíbel atopar o ficheiro rc.xml en ningures. " #: ../plugins/openbox/openbox.c:949 ../plugins/openbox/openbox.c:1063 #: ../plugins/openbox/openbox.c:1210 ../plugins/openbox/openbox.c:1228 msgid "No WM configuration is available." msgstr "Non hai unha configuración de xestor de xanelas dispoñíbel." #: ../plugins/openbox/openbox.c:1067 msgid "Keybinding should activate at least one action." msgstr "O atallo de teclado debe activar a lo menos unha acción." #: ../plugins/openbox/openbox.c:1096 ../plugins/openbox/openbox.c:1106 #: ../plugins/openbox/openbox.c:1262 ../plugins/openbox/openbox.c:1272 #, c-format msgid "Hotkey '%s' is already bound to an action." msgstr "O acceso directo «%s» xa está ligado a unha acción." #: ../plugins/openbox/openbox.c:1232 msgid "The exec line cannot be empty." msgstr "A liña de execución non pode estar baleira." #: ../plugins/gtk/gtk.c:133 ../plugins/gtk/gtk.c:156 msgid "Cannot delete keybinding: " msgstr "Non é posíbel eliminar o atallo:" #. TRANSLATORS: Replace this string with your names, one name per line. #: ../plugins/gtk/gtk.c:176 msgid "translator-credits" msgstr "" "Miguel Anxo Bouzada , 2016\n" "Proxecto Trasno " #: ../plugins/gtk/gtk.c:184 msgid "Copyright (C) 2016-2025" msgstr "Copyright (C) 2016-2025" #: ../plugins/gtk/gtk.c:185 msgid "Keyboard shortcuts configurator" msgstr "Configurador de atallos de teclado" #: ../plugins/gtk/gtk.c:208 msgid "_File" msgstr "_Ficheiro" #: ../plugins/gtk/gtk.c:209 msgid "_Reload" msgstr "_Volver cargar" #: ../plugins/gtk/gtk.c:210 msgid "" "Drop all unsaved changes and reload all keys from Window Manager " "configuration" msgstr "" "Omitir todos os cambios non gardados e volver cargar todas as teclas da " "configuración do xestor de xanelas" #: ../plugins/gtk/gtk.c:213 msgid "Save all changes and apply them to Window Manager configuration" msgstr "" "Gardar todos os cambios e aplicalos á configuración do xestor de xanelas" #: ../plugins/gtk/gtk.c:216 msgid "Exit the application without saving" msgstr "Saír da aplicación sen gardar" #: ../plugins/gtk/gtk.c:217 msgid "_Edit" msgstr "_Editar" #: ../plugins/gtk/gtk.c:218 msgid "Create new action" msgstr "Crear unha nova acción" #: ../plugins/gtk/gtk.c:220 msgid "Remove selected action" msgstr "Retirar a acción seleccionada" #: ../plugins/gtk/gtk.c:222 msgid "Change selected action" msgstr "Cambiar a acción seleccionada" #: ../plugins/gtk/gtk.c:224 msgid "_Help" msgstr "A_xuda" #: ../plugins/gtk/gtk.c:441 msgid "Action" msgstr "Acción" #: ../plugins/gtk/gtk.c:444 msgid "Option" msgstr "Opción" #: ../plugins/gtk/gtk.c:447 ../plugins/gtk/gtk.c:467 ../plugins/gtk/edit.c:1111 msgid "Hotkey 1" msgstr "Acceso directo 1" #: ../plugins/gtk/gtk.c:450 ../plugins/gtk/gtk.c:470 ../plugins/gtk/edit.c:1115 msgid "Hotkey 2" msgstr "Acceso directo 2" #: ../plugins/gtk/gtk.c:458 msgid "Actions" msgstr "Accións" #: ../plugins/gtk/gtk.c:464 msgid "Command" msgstr "Orde" #: ../plugins/gtk/gtk.c:478 msgid "Programs" msgstr "Programas" #: ../plugins/gtk/gtk.c:497 ../plugins/gtk/edit.c:511 msgid "Error" msgstr "Erro" #: ../plugins/gtk/lxhotkey-gtk.desktop.in.h:1 msgid "Setup Hot Keys" msgstr "Configurar teclas de acceso directo" #: ../plugins/gtk/lxhotkey-gtk.desktop.in.h:2 msgid "View and change Window Manager global shortcuts" msgstr "Ver e cambiar os atallos de teclado globais do xestor de xanelas" #: ../plugins/gtk/lxhotkey-gtk.desktop.in.h:3 msgid "hotkey;shortcut;system;settings;" msgstr "hotkey;shortcut;system;settings;" #: ../plugins/gtk/edit.c:266 msgid "Apply error: " msgstr "Aplicar o erro: " #: ../plugins/gtk/edit.c:281 ../plugins/gtk/edit.c:395 msgid "Add action" msgstr "Engadir acción" #: ../plugins/gtk/edit.c:293 ../plugins/gtk/edit.c:397 msgid "Add option" msgstr "Engadir opción" #: ../plugins/gtk/edit.c:355 msgid "Change option" msgstr "Cambiar opción" #: ../plugins/gtk/edit.c:420 msgid "Discard changes" msgstr "Desbotar cambios" #: ../plugins/gtk/edit.c:421 msgid "Accept changes" msgstr "Aceptar os cambios" #: ../plugins/gtk/edit.c:422 msgid "Add an action" msgstr "Engadir unha acción" #: ../plugins/gtk/edit.c:423 msgid "Add an option to this command" msgstr "Engadir unha opción a esta orde" #: ../plugins/gtk/edit.c:425 msgid "Remove selection" msgstr "Retirar o seleccionado" #: ../plugins/gtk/edit.c:426 msgid "Change selected option" msgstr "Cambiar a opción seleccionada" #: ../plugins/gtk/edit.c:427 msgid "Add an option to selection" msgstr "Engadir unha opción ao seleccionado" #: ../plugins/gtk/edit.c:508 #, c-format msgid "Key combination '%s' cannot be used as a global hotkey, sorry." msgstr "" "Non é posíbel empregar a combinación de teclas «%s» como una tecla de acceso " "directo global." #: ../plugins/gtk/edit.c:571 msgid "Click to select, then press a key" msgstr "" #: ../plugins/gtk/edit.c:1128 msgid "Actions:" msgstr "Accións:" #: ../plugins/gtk/edit.c:1136 msgid "Command line:" msgstr "Liña de ordes:" #: ../plugins/gtk/edit.c:1147 msgid "Options:" msgstr "Opcións:" #: ../plugins/gtk/edit.c:1169 msgid "Name:" msgstr "Nome:" #: ../plugins/gtk/edit.c:1190 msgid "Value:" msgstr "Valor:" #, c-format #~ msgid " %s show - show the action bound to a key\n" #~ msgstr "" #~ " %s show - amosa a acción ligada a unha tecla\n" #, c-format #~ msgid "Window manager %s isn't supported now, sorry." #~ msgstr "O xestor de xanelas %s non é compatíbel polo momento." lxhotkey-0.1.2/po/lxhotkey.pot000066400000000000000000000406611476256652500164230ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-09-18 15:23+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" #: ../src/lxhotkey.c:244 #, c-format msgid "Usage: %s global [] - show keys bound to action(s)\n" msgstr "" #: ../src/lxhotkey.c:245 #, c-format msgid " %s global - bind a key to the action\n" msgstr "" #: ../src/lxhotkey.c:246 #, c-format msgid " %s app [] - show keys bound to exec line\n" msgstr "" #: ../src/lxhotkey.c:247 #, c-format msgid " %s app - bind a key to some exec line\n" msgstr "" #: ../src/lxhotkey.c:248 #, c-format msgid " %s app -- - unbind all keys from exec line\n" msgstr "" #: ../src/lxhotkey.c:250 #, c-format msgid " %s --gui= - start with GUI\n" msgstr "" #: ../src/lxhotkey.c:345 msgid "empty option name." msgstr "" #: ../src/lxhotkey.c:348 msgid "empty action name." msgstr "" #: ../src/lxhotkey.c:380 #, c-format msgid "no matching option '%s' found for action '%s'." msgstr "" #: ../src/lxhotkey.c:384 #, c-format msgid "action '%s' isn't supported by WM %s." msgstr "" #: ../src/lxhotkey.c:401 #, c-format msgid "value '%s' is not supported for option '%s'." msgstr "" #: ../src/lxhotkey.c:405 #, c-format msgid "value '%s' is not supported for action '%s'." msgstr "" #: ../src/lxhotkey.c:418 #, c-format msgid "action '%s' does not support options." msgstr "" #: ../src/lxhotkey.c:500 msgid "Sorry, cannot configure keys remotely." msgstr "" #: ../src/lxhotkey.c:508 msgid "Could not determine window manager running." msgstr "" #: ../src/lxhotkey.c:516 #, c-format msgid "Could not find a plugin for window manager %s." msgstr "" #: ../src/lxhotkey.c:523 ../plugins/gtk/gtk.c:75 msgid "Problems loading configuration: " msgstr "" #: ../src/lxhotkey.c:532 #, c-format msgid "GUI type %s currently isn't supported." msgstr "" #: ../src/lxhotkey.c:549 ../src/lxhotkey.c:625 msgid "Invalid request: " msgstr "" #: ../src/lxhotkey.c:559 ../src/lxhotkey.c:637 ../plugins/gtk/gtk.c:90 msgid "Problems saving configuration: " msgstr "" #: ../src/lxhotkey.c:576 msgid "ACTION(s)" msgstr "" #: ../src/lxhotkey.c:576 ../src/lxhotkey.c:654 msgid "KEY(s)" msgstr "" #: ../src/lxhotkey.c:654 msgid "EXEC" msgstr "" #: ../src/lxhotkey.c:676 msgid "Requested operation isn't supported." msgstr "" #: ../plugins/openbox/openbox.c:185 msgid "Failed to reconfigure Openbox." msgstr "" #: ../plugins/openbox/openbox.c:204 msgid "yes" msgstr "" #: ../plugins/openbox/openbox.c:204 msgid "no" msgstr "" #: ../plugins/openbox/openbox.c:207 msgid "enabled" msgstr "" #: ../plugins/openbox/openbox.c:208 msgid "wmclass" msgstr "" #: ../plugins/openbox/openbox.c:209 msgid "name" msgstr "" #: ../plugins/openbox/openbox.c:210 msgid "icon" msgstr "" #: ../plugins/openbox/openbox.c:215 ../plugins/openbox/openbox.c:294 msgid "command" msgstr "" #: ../plugins/openbox/openbox.c:216 ../plugins/openbox/openbox.c:299 msgid "prompt" msgstr "" #: ../plugins/openbox/openbox.c:217 msgid "startupnotify" msgstr "" #: ../plugins/openbox/openbox.c:221 ../plugins/openbox/openbox.c:331 msgid "center" msgstr "" #: ../plugins/openbox/openbox.c:222 msgid "default" msgstr "" #: ../plugins/openbox/openbox.c:222 msgid "primary" msgstr "" #: ../plugins/openbox/openbox.c:222 msgid "mouse" msgstr "" #: ../plugins/openbox/openbox.c:223 msgid "active" msgstr "" #: ../plugins/openbox/openbox.c:223 ../plugins/openbox/openbox.c:334 msgid "all" msgstr "" #: ../plugins/openbox/openbox.c:228 ../plugins/openbox/openbox.c:341 msgid "monitor" msgstr "" #: ../plugins/openbox/openbox.c:233 msgid "menu" msgstr "" #: ../plugins/openbox/openbox.c:234 msgid "position" msgstr "" #: ../plugins/openbox/openbox.c:238 msgid "list" msgstr "" #: ../plugins/openbox/openbox.c:238 msgid "icons" msgstr "" #: ../plugins/openbox/openbox.c:238 msgid "none" msgstr "" #: ../plugins/openbox/openbox.c:241 ../plugins/openbox/openbox.c:260 msgid "dialog" msgstr "" #: ../plugins/openbox/openbox.c:242 ../plugins/openbox/openbox.c:261 msgid "bar" msgstr "" #: ../plugins/openbox/openbox.c:243 ../plugins/openbox/openbox.c:262 msgid "raise" msgstr "" #: ../plugins/openbox/openbox.c:244 msgid "allDesktops" msgstr "" #: ../plugins/openbox/openbox.c:245 ../plugins/openbox/openbox.c:263 msgid "panels" msgstr "" #: ../plugins/openbox/openbox.c:246 msgid "desktop" msgstr "" #: ../plugins/openbox/openbox.c:247 msgid "linear" msgstr "" #: ../plugins/openbox/openbox.c:248 msgid "interactive" msgstr "" #. TRANSLATORS: finalactions means actions when done #: ../plugins/openbox/openbox.c:250 ../plugins/openbox/openbox.c:265 msgid "finalactions" msgstr "" #: ../plugins/openbox/openbox.c:254 ../plugins/openbox/openbox.c:271 #: ../plugins/openbox/openbox.c:311 ../plugins/openbox/openbox.c:364 msgid "north" msgstr "" #: ../plugins/openbox/openbox.c:254 msgid "northeast" msgstr "" #: ../plugins/openbox/openbox.c:254 ../plugins/openbox/openbox.c:272 #: ../plugins/openbox/openbox.c:312 ../plugins/openbox/openbox.c:364 msgid "east" msgstr "" #: ../plugins/openbox/openbox.c:255 msgid "southeast" msgstr "" #: ../plugins/openbox/openbox.c:255 ../plugins/openbox/openbox.c:271 #: ../plugins/openbox/openbox.c:311 ../plugins/openbox/openbox.c:364 msgid "south" msgstr "" #: ../plugins/openbox/openbox.c:255 msgid "southwest" msgstr "" #: ../plugins/openbox/openbox.c:256 ../plugins/openbox/openbox.c:272 #: ../plugins/openbox/openbox.c:312 ../plugins/openbox/openbox.c:364 msgid "west" msgstr "" #: ../plugins/openbox/openbox.c:256 msgid "northwest" msgstr "" #: ../plugins/openbox/openbox.c:259 ../plugins/openbox/openbox.c:306 #: ../plugins/openbox/openbox.c:367 msgid "direction" msgstr "" #: ../plugins/openbox/openbox.c:264 msgid "desktops" msgstr "" #. TRANSLATORS: these values are in regard to desktop #: ../plugins/openbox/openbox.c:270 ../plugins/openbox/openbox.c:281 #: ../plugins/openbox/openbox.c:310 ../plugins/openbox/openbox.c:331 #: ../plugins/openbox/openbox.c:334 msgid "current" msgstr "" #: ../plugins/openbox/openbox.c:270 ../plugins/openbox/openbox.c:310 #: ../plugins/openbox/openbox.c:334 msgid "next" msgstr "" #: ../plugins/openbox/openbox.c:270 ../plugins/openbox/openbox.c:310 msgid "previous" msgstr "" #: ../plugins/openbox/openbox.c:271 ../plugins/openbox/openbox.c:281 #: ../plugins/openbox/openbox.c:311 msgid "last" msgstr "" #: ../plugins/openbox/openbox.c:271 ../plugins/openbox/openbox.c:311 msgid "up" msgstr "" #: ../plugins/openbox/openbox.c:272 ../plugins/openbox/openbox.c:312 msgid "down" msgstr "" #: ../plugins/openbox/openbox.c:272 ../plugins/openbox/openbox.c:312 #: ../plugins/openbox/openbox.c:322 ../plugins/openbox/openbox.c:357 msgid "left" msgstr "" #: ../plugins/openbox/openbox.c:273 ../plugins/openbox/openbox.c:313 #: ../plugins/openbox/openbox.c:322 ../plugins/openbox/openbox.c:358 msgid "right" msgstr "" #: ../plugins/openbox/openbox.c:276 ../plugins/openbox/openbox.c:316 msgid "to" msgstr "" #: ../plugins/openbox/openbox.c:277 ../plugins/openbox/openbox.c:317 msgid "wrap" msgstr "" #: ../plugins/openbox/openbox.c:284 msgid "where" msgstr "" #: ../plugins/openbox/openbox.c:289 msgid "strict" msgstr "" #: ../plugins/openbox/openbox.c:303 msgid "both" msgstr "" #: ../plugins/openbox/openbox.c:303 msgid "horizontal" msgstr "" #: ../plugins/openbox/openbox.c:303 msgid "vertical" msgstr "" #: ../plugins/openbox/openbox.c:318 msgid "follow" msgstr "" #: ../plugins/openbox/openbox.c:322 ../plugins/openbox/openbox.c:359 #: ../plugins/openbox/openbox.c:371 msgid "top" msgstr "" #: ../plugins/openbox/openbox.c:322 ../plugins/openbox/openbox.c:360 #: ../plugins/openbox/openbox.c:371 msgid "bottom" msgstr "" #: ../plugins/openbox/openbox.c:323 msgid "topleft" msgstr "" #: ../plugins/openbox/openbox.c:323 msgid "topright" msgstr "" #: ../plugins/openbox/openbox.c:323 msgid "bottomleft" msgstr "" #: ../plugins/openbox/openbox.c:324 msgid "bottomright" msgstr "" #: ../plugins/openbox/openbox.c:327 msgid "edge" msgstr "" #. TRANSLATORS: # in config means either pixels, or monitor number #: ../plugins/openbox/openbox.c:331 ../plugins/openbox/openbox.c:346 msgid "#" msgstr "" #. TRANSLATORS: % in config means some fraction value, usually measured in percents #: ../plugins/openbox/openbox.c:333 msgid "%" msgstr "" #: ../plugins/openbox/openbox.c:334 msgid "prev" msgstr "" #: ../plugins/openbox/openbox.c:339 msgid "width" msgstr "" #: ../plugins/openbox/openbox.c:340 msgid "height" msgstr "" #: ../plugins/openbox/openbox.c:371 msgid "normal" msgstr "" #: ../plugins/openbox/openbox.c:374 msgid "layer" msgstr "" #: ../plugins/openbox/openbox.c:380 msgid "Execute" msgstr "" #: ../plugins/openbox/openbox.c:381 msgid "ShowMenu" msgstr "" #: ../plugins/openbox/openbox.c:382 msgid "NextWindow" msgstr "" #: ../plugins/openbox/openbox.c:383 msgid "PreviousWindow" msgstr "" #: ../plugins/openbox/openbox.c:384 msgid "DirectionalCycleWindows" msgstr "" #: ../plugins/openbox/openbox.c:385 msgid "DirectionalTargetWindow" msgstr "" #: ../plugins/openbox/openbox.c:386 msgid "GoToDesktop" msgstr "" #: ../plugins/openbox/openbox.c:387 msgid "AddDesktop" msgstr "" #: ../plugins/openbox/openbox.c:388 msgid "RemoveDesktop" msgstr "" #: ../plugins/openbox/openbox.c:389 msgid "ToggleShowDesktop" msgstr "" #: ../plugins/openbox/openbox.c:390 msgid "ToggleDockAutohide" msgstr "" #: ../plugins/openbox/openbox.c:391 msgid "Reconfigure" msgstr "" #: ../plugins/openbox/openbox.c:392 msgid "Restart" msgstr "" #: ../plugins/openbox/openbox.c:393 msgid "Exit" msgstr "" #: ../plugins/openbox/openbox.c:395 msgid "Focus" msgstr "" #: ../plugins/openbox/openbox.c:396 msgid "Raise" msgstr "" #: ../plugins/openbox/openbox.c:397 msgid "Lower" msgstr "" #: ../plugins/openbox/openbox.c:398 msgid "RaiseLower" msgstr "" #: ../plugins/openbox/openbox.c:399 msgid "Unfocus" msgstr "" #: ../plugins/openbox/openbox.c:400 msgid "FocusToBottom" msgstr "" #: ../plugins/openbox/openbox.c:401 msgid "Iconify" msgstr "" #: ../plugins/openbox/openbox.c:402 msgid "Close" msgstr "" #: ../plugins/openbox/openbox.c:403 msgid "ToggleShade" msgstr "" #: ../plugins/openbox/openbox.c:404 msgid "Shade" msgstr "" #: ../plugins/openbox/openbox.c:405 msgid "Unshade" msgstr "" #: ../plugins/openbox/openbox.c:406 msgid "ToggleOmnipresent" msgstr "" #: ../plugins/openbox/openbox.c:407 msgid "ToggleMaximize" msgstr "" #: ../plugins/openbox/openbox.c:408 msgid "Maximize" msgstr "" #: ../plugins/openbox/openbox.c:409 msgid "Unmaximize" msgstr "" #: ../plugins/openbox/openbox.c:410 msgid "ToggleFullscreen" msgstr "" #: ../plugins/openbox/openbox.c:411 msgid "ToggleDecorations" msgstr "" #: ../plugins/openbox/openbox.c:412 msgid "Decorate" msgstr "" #: ../plugins/openbox/openbox.c:413 msgid "Undecorate" msgstr "" #: ../plugins/openbox/openbox.c:414 msgid "SendToDesktop" msgstr "" #: ../plugins/openbox/openbox.c:415 msgid "Move" msgstr "" #: ../plugins/openbox/openbox.c:416 msgid "Resize" msgstr "" #: ../plugins/openbox/openbox.c:417 msgid "MoveResizeTo" msgstr "" #: ../plugins/openbox/openbox.c:418 msgid "MoveRelative" msgstr "" #: ../plugins/openbox/openbox.c:419 msgid "ResizeRelative" msgstr "" #: ../plugins/openbox/openbox.c:420 msgid "MoveToEdge" msgstr "" #: ../plugins/openbox/openbox.c:421 msgid "GrowToEdge" msgstr "" #: ../plugins/openbox/openbox.c:422 msgid "ShrinkToEdge" msgstr "" #: ../plugins/openbox/openbox.c:423 msgid "GrowToFill" msgstr "" #: ../plugins/openbox/openbox.c:424 msgid "ToggleAlwaysOnTop" msgstr "" #: ../plugins/openbox/openbox.c:425 msgid "ToggleAlwaysOnBottom" msgstr "" #: ../plugins/openbox/openbox.c:426 msgid "SendToLayer" msgstr "" #: ../plugins/openbox/openbox.c:517 msgid "Duplicate section in the rc.xml file." msgstr "" #: ../plugins/openbox/openbox.c:548 ../plugins/openbox/openbox.c:790 msgid "Internal error." msgstr "" #: ../plugins/openbox/openbox.c:592 msgid "rc.xml error: no key is set for a keybind." msgstr "" #: ../plugins/openbox/openbox.c:663 msgid "Invalid rc.xml: action with a sub-action." msgstr "" #: ../plugins/openbox/openbox.c:779 msgid "rc.xml error: no name is set for action." msgstr "" #: ../plugins/openbox/openbox.c:809 #, c-format msgid "rc.xml error: empty tag <%s> is prohibited." msgstr "" #: ../plugins/openbox/openbox.c:901 msgid "Could not find the rc.xml file anywhere." msgstr "" #: ../plugins/openbox/openbox.c:949 ../plugins/openbox/openbox.c:1063 #: ../plugins/openbox/openbox.c:1210 ../plugins/openbox/openbox.c:1228 msgid "No WM configuration is available." msgstr "" #: ../plugins/openbox/openbox.c:1067 msgid "Keybinding should activate at least one action." msgstr "" #: ../plugins/openbox/openbox.c:1096 ../plugins/openbox/openbox.c:1106 #: ../plugins/openbox/openbox.c:1262 ../plugins/openbox/openbox.c:1272 #, c-format msgid "Hotkey '%s' is already bound to an action." msgstr "" #: ../plugins/openbox/openbox.c:1232 msgid "The exec line cannot be empty." msgstr "" #: ../plugins/gtk/gtk.c:133 ../plugins/gtk/gtk.c:156 msgid "Cannot delete keybinding: " msgstr "" #. TRANSLATORS: Replace this string with your names, one name per line. #: ../plugins/gtk/gtk.c:176 msgid "translator-credits" msgstr "" #: ../plugins/gtk/gtk.c:184 msgid "Copyright (C) 2016-2023" msgstr "" #: ../plugins/gtk/gtk.c:185 msgid "Keyboard shortcuts configurator" msgstr "" #: ../plugins/gtk/gtk.c:208 msgid "_File" msgstr "" #: ../plugins/gtk/gtk.c:209 msgid "_Reload" msgstr "" #: ../plugins/gtk/gtk.c:210 msgid "" "Drop all unsaved changes and reload all keys from Window Manager " "configuration" msgstr "" #: ../plugins/gtk/gtk.c:213 msgid "Save all changes and apply them to Window Manager configuration" msgstr "" #: ../plugins/gtk/gtk.c:216 msgid "Exit the application without saving" msgstr "" #: ../plugins/gtk/gtk.c:217 msgid "_Edit" msgstr "" #: ../plugins/gtk/gtk.c:218 msgid "Create new action" msgstr "" #: ../plugins/gtk/gtk.c:220 msgid "Remove selected action" msgstr "" #: ../plugins/gtk/gtk.c:222 msgid "Change selected action" msgstr "" #: ../plugins/gtk/gtk.c:224 msgid "_Help" msgstr "" #: ../plugins/gtk/gtk.c:441 msgid "Action" msgstr "" #: ../plugins/gtk/gtk.c:444 msgid "Option" msgstr "" #: ../plugins/gtk/gtk.c:447 ../plugins/gtk/gtk.c:467 ../plugins/gtk/edit.c:1111 msgid "Hotkey 1" msgstr "" #: ../plugins/gtk/gtk.c:450 ../plugins/gtk/gtk.c:470 ../plugins/gtk/edit.c:1115 msgid "Hotkey 2" msgstr "" #: ../plugins/gtk/gtk.c:458 msgid "Actions" msgstr "" #: ../plugins/gtk/gtk.c:464 msgid "Command" msgstr "" #: ../plugins/gtk/gtk.c:478 msgid "Programs" msgstr "" #: ../plugins/gtk/gtk.c:497 ../plugins/gtk/edit.c:511 msgid "Error" msgstr "" #: ../plugins/gtk/lxhotkey-gtk.desktop.in.h:1 msgid "Setup Hot Keys" msgstr "" #: ../plugins/gtk/lxhotkey-gtk.desktop.in.h:2 msgid "View and change Window Manager global shortcuts" msgstr "" #: ../plugins/gtk/lxhotkey-gtk.desktop.in.h:3 msgid "hotkey;shortcut;system;settings;" msgstr "" #: ../plugins/gtk/edit.c:266 msgid "Apply error: " msgstr "" #: ../plugins/gtk/edit.c:281 ../plugins/gtk/edit.c:395 msgid "Add action" msgstr "" #: ../plugins/gtk/edit.c:293 ../plugins/gtk/edit.c:397 msgid "Add option" msgstr "" #: ../plugins/gtk/edit.c:355 msgid "Change option" msgstr "" #: ../plugins/gtk/edit.c:420 msgid "Discard changes" msgstr "" #: ../plugins/gtk/edit.c:421 msgid "Accept changes" msgstr "" #: ../plugins/gtk/edit.c:422 msgid "Add an action" msgstr "" #: ../plugins/gtk/edit.c:423 msgid "Add an option to this command" msgstr "" #: ../plugins/gtk/edit.c:425 msgid "Remove selection" msgstr "" #: ../plugins/gtk/edit.c:426 msgid "Change selected option" msgstr "" #: ../plugins/gtk/edit.c:427 msgid "Add an option to selection" msgstr "" #: ../plugins/gtk/edit.c:508 #, c-format msgid "Key combination '%s' cannot be used as a global hotkey, sorry." msgstr "" #: ../plugins/gtk/edit.c:571 msgid "Click to select, then press a key" msgstr "" #: ../plugins/gtk/edit.c:1128 msgid "Actions:" msgstr "" #: ../plugins/gtk/edit.c:1136 msgid "Command line:" msgstr "" #: ../plugins/gtk/edit.c:1147 msgid "Options:" msgstr "" #: ../plugins/gtk/edit.c:1169 msgid "Name:" msgstr "" #: ../plugins/gtk/edit.c:1190 msgid "Value:" msgstr "" lxhotkey-0.1.2/po/nl.po000066400000000000000000000512541476256652500150010ustar00rootroot00000000000000# Dutch translation of the lxhotkey package. # Copyright (C) the author of the lxhotkey package. # This file is distributed under the same license as the # lxhotkey package. # Pjotr, 2016. msgid "" msgstr "" "Project-Id-Version: lxhotkey\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-09-18 15:23+0200\n" "PO-Revision-Date: 2016-11-05 17:51+0100\n" "Last-Translator: Pjotr \n" "Language-Team: Dutch\n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 1.8.7.1\n" #: ../src/lxhotkey.c:244 msgid "Usage: %s global [] - show keys bound to action(s)\n" msgstr "" "Gebruik: %s global [] - toon toetsen gebonden aan actie(s)\n" #: ../src/lxhotkey.c:245 #, c-format msgid " %s global - bind a key to the action\n" msgstr " %s global - bind een toets aan de actie\n" #: ../src/lxhotkey.c:246 msgid " %s app [] - show keys bound to exec line\n" msgstr "" " %s app [] - toon toetsen gebonden aan exec-regel\n" #: ../src/lxhotkey.c:247 #, c-format msgid " %s app - bind a key to some exec line\n" msgstr "" " %s app - bind een toets aan een exec-regel\n" #: ../src/lxhotkey.c:248 #, c-format msgid " %s app -- - unbind all keys from exec line\n" msgstr "" " %s app -- - ontkoppel alle toetsen van exec-regels\n" #: ../src/lxhotkey.c:250 #, c-format msgid " %s --gui= - start with GUI\n" msgstr " %s --gui= - start met grafische schil\n" #: ../src/lxhotkey.c:345 msgid "empty option name." msgstr "lege optienaam." #: ../src/lxhotkey.c:348 msgid "empty action name." msgstr "lege actienaam." #: ../src/lxhotkey.c:380 #, c-format msgid "no matching option '%s' found for action '%s'." msgstr "geen overeenkomende optie '%s' gevonden voor actie '%s'." #: ../src/lxhotkey.c:384 #, c-format msgid "action '%s' isn't supported by WM %s." msgstr "actie '%s' wordt niet ondersteund door vensterbeheerder %s." #: ../src/lxhotkey.c:401 #, c-format msgid "value '%s' is not supported for option '%s'." msgstr "waarde '%s' wordt niet ondersteund voor optie '%s'." #: ../src/lxhotkey.c:405 #, c-format msgid "value '%s' is not supported for action '%s'." msgstr "waarde '%s' wordt niet ondersteund voor actie '%s'." #: ../src/lxhotkey.c:418 #, c-format msgid "action '%s' does not support options." msgstr "actie '%s' ondersteunt geen opties." #: ../src/lxhotkey.c:500 msgid "Sorry, cannot configure keys remotely." msgstr "Kan helaas toetsen niet op afstand instellen." #: ../src/lxhotkey.c:508 msgid "Could not determine window manager running." msgstr "Kon geen draaiende vensterbeheerder vaststellen." #: ../src/lxhotkey.c:516 #, fuzzy, c-format #| msgid "Could not determine window manager running." msgid "Could not find a plugin for window manager %s." msgstr "Kon geen draaiende vensterbeheerder vaststellen." #: ../src/lxhotkey.c:523 ../plugins/gtk/gtk.c:75 msgid "Problems loading configuration: " msgstr "Problemen bij het laden van instellingen: " #: ../src/lxhotkey.c:532 #, c-format msgid "GUI type %s currently isn't supported." msgstr "Grafische schil type %s wordt thans niet ondersteund." #: ../src/lxhotkey.c:549 ../src/lxhotkey.c:625 msgid "Invalid request: " msgstr "Ongeldig verzoek: " #: ../src/lxhotkey.c:559 ../src/lxhotkey.c:637 ../plugins/gtk/gtk.c:90 msgid "Problems saving configuration: " msgstr "Problemen bij het opslaan van instellingen: " #: ../src/lxhotkey.c:576 msgid "ACTION(s)" msgstr "ACTIE(S)" #: ../src/lxhotkey.c:576 ../src/lxhotkey.c:654 msgid "KEY(s)" msgstr "TOETS(EN)" #: ../src/lxhotkey.c:654 msgid "EXEC" msgstr "EXEC" #: ../src/lxhotkey.c:676 msgid "Requested operation isn't supported." msgstr "Verzochte bewerking wordt niet ondersteund." #: ../plugins/openbox/openbox.c:185 msgid "Failed to reconfigure Openbox." msgstr "Kon Openbox niet opnieuw instellen." #: ../plugins/openbox/openbox.c:204 msgid "yes" msgstr "ja" #: ../plugins/openbox/openbox.c:204 msgid "no" msgstr "nee" #: ../plugins/openbox/openbox.c:207 msgid "enabled" msgstr "ingeschakeld" #: ../plugins/openbox/openbox.c:208 msgid "wmclass" msgstr "wmclass" #: ../plugins/openbox/openbox.c:209 msgid "name" msgstr "naam" #: ../plugins/openbox/openbox.c:210 msgid "icon" msgstr "pictogram" #: ../plugins/openbox/openbox.c:215 ../plugins/openbox/openbox.c:294 msgid "command" msgstr "opdracht" #: ../plugins/openbox/openbox.c:216 ../plugins/openbox/openbox.c:299 msgid "prompt" msgstr "aansporing" #: ../plugins/openbox/openbox.c:217 msgid "startupnotify" msgstr "opstartmelding" #: ../plugins/openbox/openbox.c:221 ../plugins/openbox/openbox.c:331 msgid "center" msgstr "midden" #: ../plugins/openbox/openbox.c:222 msgid "default" msgstr "standaard" #: ../plugins/openbox/openbox.c:222 msgid "primary" msgstr "primair" #: ../plugins/openbox/openbox.c:222 msgid "mouse" msgstr "muis" #: ../plugins/openbox/openbox.c:223 msgid "active" msgstr "actief" #: ../plugins/openbox/openbox.c:223 ../plugins/openbox/openbox.c:334 msgid "all" msgstr "alle" #: ../plugins/openbox/openbox.c:228 ../plugins/openbox/openbox.c:341 msgid "monitor" msgstr "beeldscherm" #: ../plugins/openbox/openbox.c:233 msgid "menu" msgstr "menu" #: ../plugins/openbox/openbox.c:234 msgid "position" msgstr "positie" #: ../plugins/openbox/openbox.c:238 msgid "list" msgstr "lijst" #: ../plugins/openbox/openbox.c:238 msgid "icons" msgstr "pictogrammen" #: ../plugins/openbox/openbox.c:238 msgid "none" msgstr "geen" #: ../plugins/openbox/openbox.c:241 ../plugins/openbox/openbox.c:260 msgid "dialog" msgstr "dialoogscherm" #: ../plugins/openbox/openbox.c:242 ../plugins/openbox/openbox.c:261 msgid "bar" msgstr "balk" #: ../plugins/openbox/openbox.c:243 ../plugins/openbox/openbox.c:262 msgid "raise" msgstr "verheffen" #: ../plugins/openbox/openbox.c:244 msgid "allDesktops" msgstr "alleWerkbladen" #: ../plugins/openbox/openbox.c:245 ../plugins/openbox/openbox.c:263 msgid "panels" msgstr "werkbalken" #: ../plugins/openbox/openbox.c:246 msgid "desktop" msgstr "bureaublad" #: ../plugins/openbox/openbox.c:247 msgid "linear" msgstr "lineair" #: ../plugins/openbox/openbox.c:248 msgid "interactive" msgstr "interactief" #. TRANSLATORS: finalactions means actions when done #: ../plugins/openbox/openbox.c:250 ../plugins/openbox/openbox.c:265 msgid "finalactions" msgstr "afsluitendeActies" #: ../plugins/openbox/openbox.c:254 ../plugins/openbox/openbox.c:271 #: ../plugins/openbox/openbox.c:311 ../plugins/openbox/openbox.c:364 msgid "north" msgstr "noord" #: ../plugins/openbox/openbox.c:254 msgid "northeast" msgstr "noordoost" #: ../plugins/openbox/openbox.c:254 ../plugins/openbox/openbox.c:272 #: ../plugins/openbox/openbox.c:312 ../plugins/openbox/openbox.c:364 msgid "east" msgstr "oost" #: ../plugins/openbox/openbox.c:255 msgid "southeast" msgstr "zuidoost" #: ../plugins/openbox/openbox.c:255 ../plugins/openbox/openbox.c:271 #: ../plugins/openbox/openbox.c:311 ../plugins/openbox/openbox.c:364 msgid "south" msgstr "zuid" #: ../plugins/openbox/openbox.c:255 msgid "southwest" msgstr "zuidwest" #: ../plugins/openbox/openbox.c:256 ../plugins/openbox/openbox.c:272 #: ../plugins/openbox/openbox.c:312 ../plugins/openbox/openbox.c:364 msgid "west" msgstr "west" #: ../plugins/openbox/openbox.c:256 msgid "northwest" msgstr "noordwest" #: ../plugins/openbox/openbox.c:259 ../plugins/openbox/openbox.c:306 #: ../plugins/openbox/openbox.c:367 msgid "direction" msgstr "richting" #: ../plugins/openbox/openbox.c:264 msgid "desktops" msgstr "werkbladen" #. TRANSLATORS: these values are in regard to desktop #: ../plugins/openbox/openbox.c:270 ../plugins/openbox/openbox.c:281 #: ../plugins/openbox/openbox.c:310 ../plugins/openbox/openbox.c:331 #: ../plugins/openbox/openbox.c:334 msgid "current" msgstr "huidig" #: ../plugins/openbox/openbox.c:270 ../plugins/openbox/openbox.c:310 #: ../plugins/openbox/openbox.c:334 msgid "next" msgstr "volgende" #: ../plugins/openbox/openbox.c:270 ../plugins/openbox/openbox.c:310 msgid "previous" msgstr "vorige" #: ../plugins/openbox/openbox.c:271 ../plugins/openbox/openbox.c:281 #: ../plugins/openbox/openbox.c:311 msgid "last" msgstr "laatste" #: ../plugins/openbox/openbox.c:271 ../plugins/openbox/openbox.c:311 msgid "up" msgstr "omhoog" #: ../plugins/openbox/openbox.c:272 ../plugins/openbox/openbox.c:312 msgid "down" msgstr "omlaag" #: ../plugins/openbox/openbox.c:272 ../plugins/openbox/openbox.c:312 #: ../plugins/openbox/openbox.c:322 ../plugins/openbox/openbox.c:357 msgid "left" msgstr "links" #: ../plugins/openbox/openbox.c:273 ../plugins/openbox/openbox.c:313 #: ../plugins/openbox/openbox.c:322 ../plugins/openbox/openbox.c:358 msgid "right" msgstr "rechts" #: ../plugins/openbox/openbox.c:276 ../plugins/openbox/openbox.c:316 msgid "to" msgstr "naar" #: ../plugins/openbox/openbox.c:277 ../plugins/openbox/openbox.c:317 msgid "wrap" msgstr "regelomloop" #: ../plugins/openbox/openbox.c:284 msgid "where" msgstr "waar" #: ../plugins/openbox/openbox.c:289 msgid "strict" msgstr "" #: ../plugins/openbox/openbox.c:303 msgid "both" msgstr "beide" #: ../plugins/openbox/openbox.c:303 msgid "horizontal" msgstr "horizontaal" #: ../plugins/openbox/openbox.c:303 msgid "vertical" msgstr "verticaal" #: ../plugins/openbox/openbox.c:318 msgid "follow" msgstr "volgen" #: ../plugins/openbox/openbox.c:322 ../plugins/openbox/openbox.c:359 #: ../plugins/openbox/openbox.c:371 msgid "top" msgstr "bovenkant" #: ../plugins/openbox/openbox.c:322 ../plugins/openbox/openbox.c:360 #: ../plugins/openbox/openbox.c:371 msgid "bottom" msgstr "onderkant" #: ../plugins/openbox/openbox.c:323 msgid "topleft" msgstr "linksboven" #: ../plugins/openbox/openbox.c:323 msgid "topright" msgstr "rechtsboven" #: ../plugins/openbox/openbox.c:323 msgid "bottomleft" msgstr "linksonder" #: ../plugins/openbox/openbox.c:324 msgid "bottomright" msgstr "rechtsonder" #: ../plugins/openbox/openbox.c:327 msgid "edge" msgstr "rand" #. TRANSLATORS: # in config means either pixels, or monitor number #: ../plugins/openbox/openbox.c:331 ../plugins/openbox/openbox.c:346 msgid "#" msgstr "#" #. TRANSLATORS: % in config means some fraction value, usually measured in percents #: ../plugins/openbox/openbox.c:333 msgid "%" msgstr "%" #: ../plugins/openbox/openbox.c:334 msgid "prev" msgstr "vorig" #: ../plugins/openbox/openbox.c:339 msgid "width" msgstr "breedte" #: ../plugins/openbox/openbox.c:340 msgid "height" msgstr "hoogte" #: ../plugins/openbox/openbox.c:371 msgid "normal" msgstr "normaal" #: ../plugins/openbox/openbox.c:374 msgid "layer" msgstr "laag" #: ../plugins/openbox/openbox.c:380 msgid "Execute" msgstr "Uitvoeren" #: ../plugins/openbox/openbox.c:381 msgid "ShowMenu" msgstr "ToonMenu" #: ../plugins/openbox/openbox.c:382 msgid "NextWindow" msgstr "VolgendVenster" #: ../plugins/openbox/openbox.c:383 msgid "PreviousWindow" msgstr "VorigVenster" #: ../plugins/openbox/openbox.c:384 msgid "DirectionalCycleWindows" msgstr "VenstersRichtinggevoeligCirculeren" #: ../plugins/openbox/openbox.c:385 msgid "DirectionalTargetWindow" msgstr "RichtinggevoeligDoelVenster" #: ../plugins/openbox/openbox.c:386 msgid "GoToDesktop" msgstr "GaNaarWerkblad" #: ../plugins/openbox/openbox.c:387 msgid "AddDesktop" msgstr "WerkbladToevoegen" #: ../plugins/openbox/openbox.c:388 msgid "RemoveDesktop" msgstr "WerkbladVerwijderen" #: ../plugins/openbox/openbox.c:389 #, fuzzy #| msgid "ToggleShade" msgid "ToggleShowDesktop" msgstr "OntrollenOmschakelen" #: ../plugins/openbox/openbox.c:390 msgid "ToggleDockAutohide" msgstr "AutomatischVerbergenDokOmschakelen" #: ../plugins/openbox/openbox.c:391 msgid "Reconfigure" msgstr "Opnieuw instellen" #: ../plugins/openbox/openbox.c:392 msgid "Restart" msgstr "Herstarten" #: ../plugins/openbox/openbox.c:393 msgid "Exit" msgstr "Sluiten" #: ../plugins/openbox/openbox.c:395 msgid "Focus" msgstr "Scherpstellen" #: ../plugins/openbox/openbox.c:396 msgid "Raise" msgstr "Verheffen" #: ../plugins/openbox/openbox.c:397 msgid "Lower" msgstr "Lager" #: ../plugins/openbox/openbox.c:398 msgid "RaiseLower" msgstr "VerhefLagere" #: ../plugins/openbox/openbox.c:399 msgid "Unfocus" msgstr "Ontscherpstellen" #: ../plugins/openbox/openbox.c:400 msgid "FocusToBottom" msgstr "ScherpstellenNaarOnderkant" #: ../plugins/openbox/openbox.c:401 msgid "Iconify" msgstr "Pictogram van maken" #: ../plugins/openbox/openbox.c:402 msgid "Close" msgstr "Sluiten" #: ../plugins/openbox/openbox.c:403 msgid "ToggleShade" msgstr "OntrollenOmschakelen" #: ../plugins/openbox/openbox.c:404 msgid "Shade" msgstr "Ontrollen" #: ../plugins/openbox/openbox.c:405 msgid "Unshade" msgstr "Oprollen" #: ../plugins/openbox/openbox.c:406 msgid "ToggleOmnipresent" msgstr "OveralAanwezigOmschakelen" #: ../plugins/openbox/openbox.c:407 msgid "ToggleMaximize" msgstr "MaximaliserenOmschakelen" #: ../plugins/openbox/openbox.c:408 msgid "Maximize" msgstr "Maximaliseren" #: ../plugins/openbox/openbox.c:409 msgid "Unmaximize" msgstr "Ontmaximaliseren" #: ../plugins/openbox/openbox.c:410 msgid "ToggleFullscreen" msgstr "VolledigSchermOmschakelen" #: ../plugins/openbox/openbox.c:411 msgid "ToggleDecorations" msgstr "VersieringenOmschakelen" #: ../plugins/openbox/openbox.c:412 msgid "Decorate" msgstr "Versieren" #: ../plugins/openbox/openbox.c:413 msgid "Undecorate" msgstr "Ontdoen van versiering" #: ../plugins/openbox/openbox.c:414 msgid "SendToDesktop" msgstr "StuurNaarBureaublad" #: ../plugins/openbox/openbox.c:415 msgid "Move" msgstr "verplaatsen" #: ../plugins/openbox/openbox.c:416 msgid "Resize" msgstr "Herschalen" #: ../plugins/openbox/openbox.c:417 msgid "MoveResizeTo" msgstr "VerplaatsenHerschalenNaar" #: ../plugins/openbox/openbox.c:418 msgid "MoveRelative" msgstr "RelatiefVerplaatsen" #: ../plugins/openbox/openbox.c:419 msgid "ResizeRelative" msgstr "RelatiefHerschalen" #: ../plugins/openbox/openbox.c:420 msgid "MoveToEdge" msgstr "VerplaatsenNaarRand" #: ../plugins/openbox/openbox.c:421 msgid "GrowToEdge" msgstr "VergrotenTotRand" #: ../plugins/openbox/openbox.c:422 msgid "ShrinkToEdge" msgstr "VerkleinenTotRand" #: ../plugins/openbox/openbox.c:423 msgid "GrowToFill" msgstr "VergrotenTotVullend" #: ../plugins/openbox/openbox.c:424 msgid "ToggleAlwaysOnTop" msgstr "AltijdBovenaanOmschakelen" #: ../plugins/openbox/openbox.c:425 msgid "ToggleAlwaysOnBottom" msgstr "AltijdOnderaanOmschakelen" #: ../plugins/openbox/openbox.c:426 msgid "SendToLayer" msgstr "StuurNaarLaag" #: ../plugins/openbox/openbox.c:517 msgid "Duplicate section in the rc.xml file." msgstr "Dubbele sectie in het bestand rc.xml." #: ../plugins/openbox/openbox.c:548 ../plugins/openbox/openbox.c:790 msgid "Internal error." msgstr "Interne fout." #: ../plugins/openbox/openbox.c:592 msgid "rc.xml error: no key is set for a keybind." msgstr "Fout in rc.xml: er is geen toets ingesteld voor een toetsenbinding." #: ../plugins/openbox/openbox.c:663 msgid "Invalid rc.xml: action with a sub-action." msgstr "Ongeldige rc.xml: actie met een subactie." #: ../plugins/openbox/openbox.c:779 msgid "rc.xml error: no name is set for action." msgstr "Fout in rc.xml: geen naam ingesteld voor actie." #: ../plugins/openbox/openbox.c:809 #, c-format msgid "rc.xml error: empty tag <%s> is prohibited." msgstr "Fout in rc.xml: leeg etiket <%s> is verboden." #: ../plugins/openbox/openbox.c:901 msgid "Could not find the rc.xml file anywhere." msgstr "Kon het bestand rc.xml nergens vinden." #: ../plugins/openbox/openbox.c:949 ../plugins/openbox/openbox.c:1063 #: ../plugins/openbox/openbox.c:1210 ../plugins/openbox/openbox.c:1228 msgid "No WM configuration is available." msgstr "Er zijn geen instellingen beschikbaar voor de vensterbeheerder." #: ../plugins/openbox/openbox.c:1067 msgid "Keybinding should activate at least one action." msgstr "Toetsbinding zou tenminste één actie moeten activeren." #: ../plugins/openbox/openbox.c:1096 ../plugins/openbox/openbox.c:1106 #: ../plugins/openbox/openbox.c:1262 ../plugins/openbox/openbox.c:1272 #, c-format msgid "Hotkey '%s' is already bound to an action." msgstr "Sneltoets '%s' is reeds gebonden aan een actie." #: ../plugins/openbox/openbox.c:1232 msgid "The exec line cannot be empty." msgstr "De exec-regel kan niet leeg zijn." #: ../plugins/gtk/gtk.c:133 ../plugins/gtk/gtk.c:156 msgid "Cannot delete keybinding: " msgstr "Kan de volgende toetsbinding niet verwijderen: " #. TRANSLATORS: Replace this string with your names, one name per line. #: ../plugins/gtk/gtk.c:176 msgid "translator-credits" msgstr "Pjotr " #: ../plugins/gtk/gtk.c:184 msgid "Copyright (C) 2016-2025" msgstr "Auteursrecht (C) 2016-2025" #: ../plugins/gtk/gtk.c:185 msgid "Keyboard shortcuts configurator" msgstr "Insteller voor sneltoetsen" #: ../plugins/gtk/gtk.c:208 msgid "_File" msgstr "_Bestand" #: ../plugins/gtk/gtk.c:209 msgid "_Reload" msgstr "Her_laden" #: ../plugins/gtk/gtk.c:210 msgid "" "Drop all unsaved changes and reload all keys from Window Manager " "configuration" msgstr "" "Wis alle niet-opgeslagen wijzigingen en herlaad alle toetsen vanuit de " "instellingen van de vensterbeheerder" #: ../plugins/gtk/gtk.c:213 msgid "Save all changes and apply them to Window Manager configuration" msgstr "Sla alle wijzigingen op en pas ze toe in de vensterbeheerder" #: ../plugins/gtk/gtk.c:216 msgid "Exit the application without saving" msgstr "Sluit de toepassing zonder op te slaan" #: ../plugins/gtk/gtk.c:217 msgid "_Edit" msgstr "Be_werken" #: ../plugins/gtk/gtk.c:218 msgid "Create new action" msgstr "Maak nieuwe actie" #: ../plugins/gtk/gtk.c:220 msgid "Remove selected action" msgstr "Verwijder gekozen actie" #: ../plugins/gtk/gtk.c:222 msgid "Change selected action" msgstr "Wijzig gekozen actie" #: ../plugins/gtk/gtk.c:224 msgid "_Help" msgstr "_Hulp" #: ../plugins/gtk/gtk.c:441 msgid "Action" msgstr "Actie" #: ../plugins/gtk/gtk.c:444 msgid "Option" msgstr "Optie" #: ../plugins/gtk/gtk.c:447 ../plugins/gtk/gtk.c:467 ../plugins/gtk/edit.c:1111 msgid "Hotkey 1" msgstr "Sneltoets 1" #: ../plugins/gtk/gtk.c:450 ../plugins/gtk/gtk.c:470 ../plugins/gtk/edit.c:1115 msgid "Hotkey 2" msgstr "Sneltoets 2" #: ../plugins/gtk/gtk.c:458 msgid "Actions" msgstr "Acties" #: ../plugins/gtk/gtk.c:464 msgid "Command" msgstr "Opdracht" #: ../plugins/gtk/gtk.c:478 msgid "Programs" msgstr "Programma's" #: ../plugins/gtk/gtk.c:497 ../plugins/gtk/edit.c:511 msgid "Error" msgstr "Fout" #: ../plugins/gtk/lxhotkey-gtk.desktop.in.h:1 msgid "Setup Hot Keys" msgstr "Sneltoetsen instellen" #: ../plugins/gtk/lxhotkey-gtk.desktop.in.h:2 msgid "View and change Window Manager global shortcuts" msgstr "Bekijk en verander systeembrede sneltoetsen van de vensterbeheerder" #: ../plugins/gtk/lxhotkey-gtk.desktop.in.h:3 msgid "hotkey;shortcut;system;settings;" msgstr "sneltoets;snelkoppeling;systeem;instellingen;" #: ../plugins/gtk/edit.c:266 msgid "Apply error: " msgstr "Toevoegen fout: " #: ../plugins/gtk/edit.c:281 ../plugins/gtk/edit.c:395 msgid "Add action" msgstr "Actie toevoegen" #: ../plugins/gtk/edit.c:293 ../plugins/gtk/edit.c:397 msgid "Add option" msgstr "Optie toevoegen" #: ../plugins/gtk/edit.c:355 msgid "Change option" msgstr "Optie wijzigen" #: ../plugins/gtk/edit.c:420 msgid "Discard changes" msgstr "Wijzigingen weggooien" #: ../plugins/gtk/edit.c:421 msgid "Accept changes" msgstr "Wijzigingen aanvaarden" #: ../plugins/gtk/edit.c:422 msgid "Add an action" msgstr "Voeg een actie toe" #: ../plugins/gtk/edit.c:423 msgid "Add an option to this command" msgstr "Voeg een optie toe aan deze opdracht" #: ../plugins/gtk/edit.c:425 msgid "Remove selection" msgstr "Selectie verwijderen" #: ../plugins/gtk/edit.c:426 msgid "Change selected option" msgstr "Wijzig gekozen optie" #: ../plugins/gtk/edit.c:427 msgid "Add an option to selection" msgstr "Voeg een optie toe aan de selectie" #: ../plugins/gtk/edit.c:508 #, c-format msgid "Key combination '%s' cannot be used as a global hotkey, sorry." msgstr "" "Toetscombinatie '%s' kan helaas niet worden gebruikt als een systeembrede " "sneltoets." #: ../plugins/gtk/edit.c:571 msgid "Click to select, then press a key" msgstr "" #: ../plugins/gtk/edit.c:1128 msgid "Actions:" msgstr "Acties:" #: ../plugins/gtk/edit.c:1136 msgid "Command line:" msgstr "Opdrachtregel:" #: ../plugins/gtk/edit.c:1147 msgid "Options:" msgstr "Opties:" #: ../plugins/gtk/edit.c:1169 msgid "Name:" msgstr "Naam:" #: ../plugins/gtk/edit.c:1190 msgid "Value:" msgstr "Waarde:" #, c-format #~ msgid " %s show - show the action bound to a key\n" #~ msgstr "" #~ " %s show - toon de actie gebonden aan een " #~ "toets\n" #, c-format #~ msgid "Window manager %s isn't supported now, sorry." #~ msgstr "Vensterbeheerder %s wordt helaas thans niet ondersteund." lxhotkey-0.1.2/po/pt.po000066400000000000000000000514331476256652500150120ustar00rootroot00000000000000# Portuguese lxhotkey translation. # Copyright (C) 2016 The LXDE Team # This file is distributed under the same license as the PACKAGE package. # Hugo Carvalho , 2024. # msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-09-18 15:23+0200\n" "PO-Revision-Date: 2024-08-17 14:51+0100\n" "Last-Translator: Hugo Carvalho \n" "Language-Team: \n" "Language: pt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.4.4\n" #: ../src/lxhotkey.c:244 #, c-format msgid "Usage: %s global [] - show keys bound to action(s)\n" msgstr "" "Utilização: %s global [] - mostra as teclas associadas à ação\n" #: ../src/lxhotkey.c:245 #, c-format msgid " %s global - bind a key to the action\n" msgstr " %s global - associa a tecla a uma ação\n" #: ../src/lxhotkey.c:246 #, c-format msgid " %s app [] - show keys bound to exec line\n" msgstr "" " %s app [] - mostra as teclas associadas a linha exec\n" #: ../src/lxhotkey.c:247 #, c-format msgid " %s app - bind a key to some exec line\n" msgstr "" " %s app - associa a tecla a uma linha exec\n" #: ../src/lxhotkey.c:248 #, c-format msgid " %s app -- - unbind all keys from exec line\n" msgstr "" " %s app -- - dissocia todas as teclas da linha exec\n" #: ../src/lxhotkey.c:250 #, c-format msgid " %s --gui= - start with GUI\n" msgstr " %s --gui= - inicia a interface gráfica\n" #: ../src/lxhotkey.c:345 msgid "empty option name." msgstr "nome de opção vazio." #: ../src/lxhotkey.c:348 msgid "empty action name." msgstr "nome de ação vazio." #: ../src/lxhotkey.c:380 #, c-format msgid "no matching option '%s' found for action '%s'." msgstr "encontrada opção não coincidente '%s' para a ação '%s'." #: ../src/lxhotkey.c:384 #, c-format msgid "action '%s' isn't supported by WM %s." msgstr "a ação '%s' não é suportada pelo gestor de janelas %s." #: ../src/lxhotkey.c:401 #, c-format msgid "value '%s' is not supported for option '%s'." msgstr "o valor '%s' não é suportado pela opção '%s'." #: ../src/lxhotkey.c:405 #, c-format msgid "value '%s' is not supported for action '%s'." msgstr "o valor '%s' não é suportado pela ação '%s'." #: ../src/lxhotkey.c:418 #, c-format msgid "action '%s' does not support options." msgstr "a ação '%s' não tem suporte a opções." #: ../src/lxhotkey.c:500 msgid "Sorry, cannot configure keys remotely." msgstr "Não pode configurar teclas de atalho remotamente." #: ../src/lxhotkey.c:508 msgid "Could not determine window manager running." msgstr "Não foi possível determinar o gestor de janelas em execução." #: ../src/lxhotkey.c:516 #, c-format msgid "Could not find a plugin for window manager %s." msgstr "Não foi possível localizar um plugin para o gestor de janelas %s." #: ../src/lxhotkey.c:523 ../plugins/gtk/gtk.c:75 msgid "Problems loading configuration: " msgstr "Problemas ao carregar a configuração: " #: ../src/lxhotkey.c:532 #, c-format msgid "GUI type %s currently isn't supported." msgstr "O tipo de GUI %s ainda não é suportado." #: ../src/lxhotkey.c:549 ../src/lxhotkey.c:625 msgid "Invalid request: " msgstr "Pedido inválido: " #: ../src/lxhotkey.c:559 ../src/lxhotkey.c:637 ../plugins/gtk/gtk.c:90 msgid "Problems saving configuration: " msgstr "Problemas ao guardar a configuração: " #: ../src/lxhotkey.c:576 msgid "ACTION(s)" msgstr "Ação/Ações" #: ../src/lxhotkey.c:576 ../src/lxhotkey.c:654 msgid "KEY(s)" msgstr "Tecla(s)" #: ../src/lxhotkey.c:654 msgid "EXEC" msgstr "EXEC" #: ../src/lxhotkey.c:676 msgid "Requested operation isn't supported." msgstr "A operação solicitada não é suportada." #: ../plugins/openbox/openbox.c:185 msgid "Failed to reconfigure Openbox." msgstr "Falha ao reconfigurar o Openbox." #: ../plugins/openbox/openbox.c:204 msgid "yes" msgstr "sim" #: ../plugins/openbox/openbox.c:204 msgid "no" msgstr "não" #: ../plugins/openbox/openbox.c:207 msgid "enabled" msgstr "ativa" #: ../plugins/openbox/openbox.c:208 msgid "wmclass" msgstr "classe do gestor de janelas" #: ../plugins/openbox/openbox.c:209 msgid "name" msgstr "nome" #: ../plugins/openbox/openbox.c:210 msgid "icon" msgstr "ícone" #: ../plugins/openbox/openbox.c:215 ../plugins/openbox/openbox.c:294 msgid "command" msgstr "comando" #: ../plugins/openbox/openbox.c:216 ../plugins/openbox/openbox.c:299 msgid "prompt" msgstr "perguntar" #: ../plugins/openbox/openbox.c:217 msgid "startupnotify" msgstr "notificação de arranque" #: ../plugins/openbox/openbox.c:221 ../plugins/openbox/openbox.c:331 msgid "center" msgstr "centrar" #: ../plugins/openbox/openbox.c:222 msgid "default" msgstr "padrão" #: ../plugins/openbox/openbox.c:222 msgid "primary" msgstr "principal" #: ../plugins/openbox/openbox.c:222 msgid "mouse" msgstr "rato" #: ../plugins/openbox/openbox.c:223 msgid "active" msgstr "ativa" #: ../plugins/openbox/openbox.c:223 ../plugins/openbox/openbox.c:334 msgid "all" msgstr "todas" #: ../plugins/openbox/openbox.c:228 ../plugins/openbox/openbox.c:341 msgid "monitor" msgstr "monitor" #: ../plugins/openbox/openbox.c:233 msgid "menu" msgstr "menu" #: ../plugins/openbox/openbox.c:234 msgid "position" msgstr "posição" #: ../plugins/openbox/openbox.c:238 msgid "list" msgstr "lista" #: ../plugins/openbox/openbox.c:238 msgid "icons" msgstr "ícones" #: ../plugins/openbox/openbox.c:238 msgid "none" msgstr "nenhuma" #: ../plugins/openbox/openbox.c:241 ../plugins/openbox/openbox.c:260 msgid "dialog" msgstr "diálogo" #: ../plugins/openbox/openbox.c:242 ../plugins/openbox/openbox.c:261 msgid "bar" msgstr "barra" #: ../plugins/openbox/openbox.c:243 ../plugins/openbox/openbox.c:262 msgid "raise" msgstr "mostrar" #: ../plugins/openbox/openbox.c:244 msgid "allDesktops" msgstr "todas as áreas de trabalho" #: ../plugins/openbox/openbox.c:245 ../plugins/openbox/openbox.c:263 msgid "panels" msgstr "painéis" #: ../plugins/openbox/openbox.c:246 msgid "desktop" msgstr "área de trabalho" #: ../plugins/openbox/openbox.c:247 msgid "linear" msgstr "linear" #: ../plugins/openbox/openbox.c:248 msgid "interactive" msgstr "interativo" #. TRANSLATORS: finalactions means actions when done #: ../plugins/openbox/openbox.c:250 ../plugins/openbox/openbox.c:265 msgid "finalactions" msgstr "ações finais" #: ../plugins/openbox/openbox.c:254 ../plugins/openbox/openbox.c:271 #: ../plugins/openbox/openbox.c:311 ../plugins/openbox/openbox.c:364 msgid "north" msgstr "norte" #: ../plugins/openbox/openbox.c:254 msgid "northeast" msgstr "nordeste" #: ../plugins/openbox/openbox.c:254 ../plugins/openbox/openbox.c:272 #: ../plugins/openbox/openbox.c:312 ../plugins/openbox/openbox.c:364 msgid "east" msgstr "este" #: ../plugins/openbox/openbox.c:255 msgid "southeast" msgstr "sudeste" #: ../plugins/openbox/openbox.c:255 ../plugins/openbox/openbox.c:271 #: ../plugins/openbox/openbox.c:311 ../plugins/openbox/openbox.c:364 msgid "south" msgstr "sul" #: ../plugins/openbox/openbox.c:255 msgid "southwest" msgstr "sudoeste" #: ../plugins/openbox/openbox.c:256 ../plugins/openbox/openbox.c:272 #: ../plugins/openbox/openbox.c:312 ../plugins/openbox/openbox.c:364 msgid "west" msgstr "oeste" #: ../plugins/openbox/openbox.c:256 msgid "northwest" msgstr "noroeste" #: ../plugins/openbox/openbox.c:259 ../plugins/openbox/openbox.c:306 #: ../plugins/openbox/openbox.c:367 msgid "direction" msgstr "direção" #: ../plugins/openbox/openbox.c:264 msgid "desktops" msgstr "áreas de trabalho" #. TRANSLATORS: these values are in regard to desktop #: ../plugins/openbox/openbox.c:270 ../plugins/openbox/openbox.c:281 #: ../plugins/openbox/openbox.c:310 ../plugins/openbox/openbox.c:331 #: ../plugins/openbox/openbox.c:334 msgid "current" msgstr "atual" #: ../plugins/openbox/openbox.c:270 ../plugins/openbox/openbox.c:310 #: ../plugins/openbox/openbox.c:334 msgid "next" msgstr "seguinte" #: ../plugins/openbox/openbox.c:270 ../plugins/openbox/openbox.c:310 msgid "previous" msgstr "anterior" #: ../plugins/openbox/openbox.c:271 ../plugins/openbox/openbox.c:281 #: ../plugins/openbox/openbox.c:311 msgid "last" msgstr "última" #: ../plugins/openbox/openbox.c:271 ../plugins/openbox/openbox.c:311 msgid "up" msgstr "subir" #: ../plugins/openbox/openbox.c:272 ../plugins/openbox/openbox.c:312 msgid "down" msgstr "descer" #: ../plugins/openbox/openbox.c:272 ../plugins/openbox/openbox.c:312 #: ../plugins/openbox/openbox.c:322 ../plugins/openbox/openbox.c:357 msgid "left" msgstr "esquerda" #: ../plugins/openbox/openbox.c:273 ../plugins/openbox/openbox.c:313 #: ../plugins/openbox/openbox.c:322 ../plugins/openbox/openbox.c:358 msgid "right" msgstr "direita" #: ../plugins/openbox/openbox.c:276 ../plugins/openbox/openbox.c:316 msgid "to" msgstr "para" #: ../plugins/openbox/openbox.c:277 ../plugins/openbox/openbox.c:317 msgid "wrap" msgstr "moldar" #: ../plugins/openbox/openbox.c:284 msgid "where" msgstr "onde" #: ../plugins/openbox/openbox.c:289 msgid "strict" msgstr "restrito" #: ../plugins/openbox/openbox.c:303 msgid "both" msgstr "ambas" #: ../plugins/openbox/openbox.c:303 msgid "horizontal" msgstr "horizontal" #: ../plugins/openbox/openbox.c:303 msgid "vertical" msgstr "vertical" #: ../plugins/openbox/openbox.c:318 msgid "follow" msgstr "seguir" #: ../plugins/openbox/openbox.c:322 ../plugins/openbox/openbox.c:359 #: ../plugins/openbox/openbox.c:371 msgid "top" msgstr "cima" #: ../plugins/openbox/openbox.c:322 ../plugins/openbox/openbox.c:360 #: ../plugins/openbox/openbox.c:371 msgid "bottom" msgstr "baixo" #: ../plugins/openbox/openbox.c:323 msgid "topleft" msgstr "cima/esquerda" #: ../plugins/openbox/openbox.c:323 msgid "topright" msgstr "cima/direita" #: ../plugins/openbox/openbox.c:323 msgid "bottomleft" msgstr "baixo/esquerda" #: ../plugins/openbox/openbox.c:324 msgid "bottomright" msgstr "baixo/direita" #: ../plugins/openbox/openbox.c:327 msgid "edge" msgstr "margem" #. TRANSLATORS: # in config means either pixels, or monitor number #: ../plugins/openbox/openbox.c:331 ../plugins/openbox/openbox.c:346 msgid "#" msgstr "#" #. TRANSLATORS: % in config means some fraction value, usually measured in percents #: ../plugins/openbox/openbox.c:333 msgid "%" msgstr "%" #: ../plugins/openbox/openbox.c:334 msgid "prev" msgstr "anterior" #: ../plugins/openbox/openbox.c:339 msgid "width" msgstr "largura" #: ../plugins/openbox/openbox.c:340 msgid "height" msgstr "altura" #: ../plugins/openbox/openbox.c:371 msgid "normal" msgstr "normal" #: ../plugins/openbox/openbox.c:374 msgid "layer" msgstr "camada" #: ../plugins/openbox/openbox.c:380 msgid "Execute" msgstr "Executar" #: ../plugins/openbox/openbox.c:381 msgid "ShowMenu" msgstr "Mostrar menu" #: ../plugins/openbox/openbox.c:382 msgid "NextWindow" msgstr "Janela seguinte" #: ../plugins/openbox/openbox.c:383 msgid "PreviousWindow" msgstr "Janela anterior" #: ../plugins/openbox/openbox.c:384 msgid "DirectionalCycleWindows" msgstr "Percorrer janelas" #: ../plugins/openbox/openbox.c:385 msgid "DirectionalTargetWindow" msgstr "Janela de destino" #: ../plugins/openbox/openbox.c:386 msgid "GoToDesktop" msgstr "Ir para área de trabalho" #: ../plugins/openbox/openbox.c:387 msgid "AddDesktop" msgstr "Adicionar área de trabalho" #: ../plugins/openbox/openbox.c:388 msgid "RemoveDesktop" msgstr "Remover área de trabalho" #: ../plugins/openbox/openbox.c:389 msgid "ToggleShowDesktop" msgstr "Mostrar área de trabalho/janelas" #: ../plugins/openbox/openbox.c:390 msgid "ToggleDockAutohide" msgstr "Alternar ocultação da doca" #: ../plugins/openbox/openbox.c:391 msgid "Reconfigure" msgstr "Reconfigurar" #: ../plugins/openbox/openbox.c:392 msgid "Restart" msgstr "Reiniciar" #: ../plugins/openbox/openbox.c:393 msgid "Exit" msgstr "Sair" #: ../plugins/openbox/openbox.c:395 msgid "Focus" msgstr "Focar" #: ../plugins/openbox/openbox.c:396 msgid "Raise" msgstr "Mostrar" #: ../plugins/openbox/openbox.c:397 msgid "Lower" msgstr "Ocultar" #: ../plugins/openbox/openbox.c:398 msgid "RaiseLower" msgstr "Mostrar/ocultar" #: ../plugins/openbox/openbox.c:399 msgid "Unfocus" msgstr "Desfocar" #: ../plugins/openbox/openbox.c:400 msgid "FocusToBottom" msgstr "Focar em baixo" #: ../plugins/openbox/openbox.c:401 msgid "Iconify" msgstr "Minimizar" #: ../plugins/openbox/openbox.c:402 msgid "Close" msgstr "Fechar" #: ../plugins/openbox/openbox.c:403 msgid "ToggleShade" msgstr "Alternar enrolar" #: ../plugins/openbox/openbox.c:404 msgid "Shade" msgstr "Enrolar" #: ../plugins/openbox/openbox.c:405 msgid "Unshade" msgstr "Desenrolar" #: ../plugins/openbox/openbox.c:406 msgid "ToggleOmnipresent" msgstr "Alternar omnipresente" #: ../plugins/openbox/openbox.c:407 msgid "ToggleMaximize" msgstr "Alternar maximização" #: ../plugins/openbox/openbox.c:408 msgid "Maximize" msgstr "Maximizar" #: ../plugins/openbox/openbox.c:409 msgid "Unmaximize" msgstr "Restaurar" #: ../plugins/openbox/openbox.c:410 msgid "ToggleFullscreen" msgstr "Alternar ecrã completo" #: ../plugins/openbox/openbox.c:411 msgid "ToggleDecorations" msgstr "Alternar decorações" #: ../plugins/openbox/openbox.c:412 msgid "Decorate" msgstr "Decorar" #: ../plugins/openbox/openbox.c:413 msgid "Undecorate" msgstr "Desdecorar" #: ../plugins/openbox/openbox.c:414 msgid "SendToDesktop" msgstr "Enviar para área de trabalho" #: ../plugins/openbox/openbox.c:415 msgid "Move" msgstr "Mover" #: ../plugins/openbox/openbox.c:416 msgid "Resize" msgstr "Redimensionar" #: ../plugins/openbox/openbox.c:417 msgid "MoveResizeTo" msgstr "Mover/redimensionar para" #: ../plugins/openbox/openbox.c:418 msgid "MoveRelative" msgstr "Mover relativamente" #: ../plugins/openbox/openbox.c:419 msgid "ResizeRelative" msgstr "Redimensionar relativamente" #: ../plugins/openbox/openbox.c:420 msgid "MoveToEdge" msgstr "Mover para a margem" #: ../plugins/openbox/openbox.c:421 msgid "GrowToEdge" msgstr "Ampliar para a margem" #: ../plugins/openbox/openbox.c:422 msgid "ShrinkToEdge" msgstr "Reduzir para a margem" #: ../plugins/openbox/openbox.c:423 msgid "GrowToFill" msgstr "Ajustar para preencher" #: ../plugins/openbox/openbox.c:424 msgid "ToggleAlwaysOnTop" msgstr "Alternar sempre na frente" #: ../plugins/openbox/openbox.c:425 msgid "ToggleAlwaysOnBottom" msgstr "Alternar sempre por trás" #: ../plugins/openbox/openbox.c:426 msgid "SendToLayer" msgstr "Enviar p/camada" #: ../plugins/openbox/openbox.c:517 msgid "Duplicate section in the rc.xml file." msgstr "Seção está duplicada no ficheiro rc.xml." #: ../plugins/openbox/openbox.c:548 ../plugins/openbox/openbox.c:790 msgid "Internal error." msgstr "Erro interno." #: ../plugins/openbox/openbox.c:592 msgid "rc.xml error: no key is set for a keybind." msgstr "Erro de rc.xml: não definiu a tecla para associar." #: ../plugins/openbox/openbox.c:663 msgid "Invalid rc.xml: action with a sub-action." msgstr "Ficheiro rc.xml inválido: ação com sub-ação." #: ../plugins/openbox/openbox.c:779 msgid "rc.xml error: no name is set for action." msgstr "Erro de rc.xml: não definiu o nome para a ação." #: ../plugins/openbox/openbox.c:809 #, c-format msgid "rc.xml error: empty tag <%s> is prohibited." msgstr "Erro de rc.xml: <%s> não é permitido." #: ../plugins/openbox/openbox.c:901 msgid "Could not find the rc.xml file anywhere." msgstr "Não foi possível encontrar o ficheiro rc.xml." #: ../plugins/openbox/openbox.c:949 ../plugins/openbox/openbox.c:1063 #: ../plugins/openbox/openbox.c:1210 ../plugins/openbox/openbox.c:1228 msgid "No WM configuration is available." msgstr "Não existe qualquer configuração do gestor de janelas." #: ../plugins/openbox/openbox.c:1067 msgid "Keybinding should activate at least one action." msgstr "A associação de teclas deve ativar, pelo menos, uma ação." #: ../plugins/openbox/openbox.c:1096 ../plugins/openbox/openbox.c:1106 #: ../plugins/openbox/openbox.c:1262 ../plugins/openbox/openbox.c:1272 #, c-format msgid "Hotkey '%s' is already bound to an action." msgstr "O atalho '%s' já está associado a uma ação." #: ../plugins/openbox/openbox.c:1232 msgid "The exec line cannot be empty." msgstr "A linha exec não pode estar vazia." #: ../plugins/gtk/gtk.c:133 ../plugins/gtk/gtk.c:156 msgid "Cannot delete keybinding: " msgstr "Não é possível eliminar a combinação de teclas: " #. TRANSLATORS: Replace this string with your names, one name per line. #: ../plugins/gtk/gtk.c:176 msgid "translator-credits" msgstr "" "Sérgio Marques \n" "Hugo Carvalho " #: ../plugins/gtk/gtk.c:184 msgid "Copyright (C) 2016-2025" msgstr "Copyright (C) 2016-2025" #: ../plugins/gtk/gtk.c:185 msgid "Keyboard shortcuts configurator" msgstr "Configuração dos atalhos de teclado" #: ../plugins/gtk/gtk.c:208 msgid "_File" msgstr "_Ficheiro" #: ../plugins/gtk/gtk.c:209 msgid "_Reload" msgstr "_Recarregar" #: ../plugins/gtk/gtk.c:210 msgid "" "Drop all unsaved changes and reload all keys from Window Manager " "configuration" msgstr "" "Rejeitar todas as alterações e recarregar as teclas de atalho definidas no " "gestor de janelas" #: ../plugins/gtk/gtk.c:213 msgid "Save all changes and apply them to Window Manager configuration" msgstr "" "Guardar todas as alterações e aplicar à configuração do gestor de janelas" #: ../plugins/gtk/gtk.c:216 msgid "Exit the application without saving" msgstr "Sair da aplicação sem guardar" #: ../plugins/gtk/gtk.c:217 msgid "_Edit" msgstr "_Editar" #: ../plugins/gtk/gtk.c:218 msgid "Create new action" msgstr "Criar nova ação" #: ../plugins/gtk/gtk.c:220 msgid "Remove selected action" msgstr "Remover a ação selecionada" #: ../plugins/gtk/gtk.c:222 msgid "Change selected action" msgstr "Alterar a ação selecionada" #: ../plugins/gtk/gtk.c:224 msgid "_Help" msgstr "Aj_uda" #: ../plugins/gtk/gtk.c:441 msgid "Action" msgstr "Ação" #: ../plugins/gtk/gtk.c:444 msgid "Option" msgstr "Opção" #: ../plugins/gtk/gtk.c:447 ../plugins/gtk/gtk.c:467 ../plugins/gtk/edit.c:1111 msgid "Hotkey 1" msgstr "Tecla de atalho 1" #: ../plugins/gtk/gtk.c:450 ../plugins/gtk/gtk.c:470 ../plugins/gtk/edit.c:1115 msgid "Hotkey 2" msgstr "Tecla de atalho 2" #: ../plugins/gtk/gtk.c:458 msgid "Actions" msgstr "Ações" #: ../plugins/gtk/gtk.c:464 msgid "Command" msgstr "Comando" #: ../plugins/gtk/gtk.c:478 msgid "Programs" msgstr "Programas" #: ../plugins/gtk/gtk.c:497 ../plugins/gtk/edit.c:511 msgid "Error" msgstr "Erro" #: ../plugins/gtk/lxhotkey-gtk.desktop.in.h:1 msgid "Setup Hot Keys" msgstr "Configurar teclas de atalho" #: ../plugins/gtk/lxhotkey-gtk.desktop.in.h:2 msgid "View and change Window Manager global shortcuts" msgstr "Ver e alterar as teclas de atalho globais do gestor de janelas" #: ../plugins/gtk/lxhotkey-gtk.desktop.in.h:3 msgid "hotkey;shortcut;system;settings;" msgstr "teclas;atalhos;sistema;definições;" #: ../plugins/gtk/edit.c:266 msgid "Apply error: " msgstr "Erro ao aplicar: " #: ../plugins/gtk/edit.c:281 ../plugins/gtk/edit.c:395 msgid "Add action" msgstr "Adicionar ação" #: ../plugins/gtk/edit.c:293 ../plugins/gtk/edit.c:397 msgid "Add option" msgstr "Adicionar opção" #: ../plugins/gtk/edit.c:355 msgid "Change option" msgstr "Alterar opção" #: ../plugins/gtk/edit.c:420 msgid "Discard changes" msgstr "Rejeitar alterações" #: ../plugins/gtk/edit.c:421 msgid "Accept changes" msgstr "Aceitar alterações" #: ../plugins/gtk/edit.c:422 msgid "Add an action" msgstr "Adicionar ação" #: ../plugins/gtk/edit.c:423 msgid "Add an option to this command" msgstr "Adicionar uma opção a este comando" #: ../plugins/gtk/edit.c:425 msgid "Remove selection" msgstr "Remover seleção" #: ../plugins/gtk/edit.c:426 msgid "Change selected option" msgstr "Alterar a opção selecionada" #: ../plugins/gtk/edit.c:427 msgid "Add an option to selection" msgstr "Adicionar uma opção à seleção" #: ../plugins/gtk/edit.c:508 #, c-format msgid "Key combination '%s' cannot be used as a global hotkey, sorry." msgstr "Não pode utilizar a combinação '%s' como tecla de atalho global." #: ../plugins/gtk/edit.c:571 msgid "Click to select, then press a key" msgstr "Clique para selecionar e, em seguida, prima uma tecla" #: ../plugins/gtk/edit.c:1128 msgid "Actions:" msgstr "Ações:" #: ../plugins/gtk/edit.c:1136 msgid "Command line:" msgstr "Linha de comandos:" #: ../plugins/gtk/edit.c:1147 msgid "Options:" msgstr "Opções:" #: ../plugins/gtk/edit.c:1169 msgid "Name:" msgstr "Nome:" #: ../plugins/gtk/edit.c:1190 msgid "Value:" msgstr "Valor:" #, c-format #~ msgid " %s show - show the action bound to a key\n" #~ msgstr "" #~ " %s show - mostra a ação associada a uma tecla\n" #, c-format #~ msgid "Window manager %s isn't supported now, sorry." #~ msgstr "O gestor de janelas %s ainda não é suportado." lxhotkey-0.1.2/po/ru.po000066400000000000000000000605751476256652500150240ustar00rootroot00000000000000# Russian translation for LXHotkey. # Copyright (C) 2016 LXDE development team. # This file is distributed under the same license as the LXHotkey package. # # Translators: # Alexey Loginov , 2016 # msgid "" msgstr "" "Project-Id-Version: LXHotkey\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-09-18 15:23+0200\n" "PO-Revision-Date: 2016-11-06 14:58+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-Generator: Poedit 1.6.9\n" #: ../src/lxhotkey.c:244 msgid "Usage: %s global [] - show keys bound to action(s)\n" msgstr "" "Использование: %s global [<клавиша>] - показать клавиши, " "привязанные к действию(ям)\n" #: ../src/lxhotkey.c:245 #, c-format msgid " %s global - bind a key to the action\n" msgstr "" " %s global <действие> <клавиша> - привязать клавишу к " "действию\n" #: ../src/lxhotkey.c:246 msgid " %s app [] - show keys bound to exec line\n" msgstr "" " %s app [<клавиша>] - показать клавиши, привязанные к " "команде\n" #: ../src/lxhotkey.c:247 #, c-format msgid " %s app - bind a key to some exec line\n" msgstr "" " %s app <команда> <клавиша> - привязать клавишу к команде\n" #: ../src/lxhotkey.c:248 #, c-format msgid " %s app -- - unbind all keys from exec line\n" msgstr "" " %s app <команда> -- - отвязать все клавиши от команды\n" #: ../src/lxhotkey.c:250 #, c-format msgid " %s --gui= - start with GUI\n" msgstr "" " %s --gui=<тип> - запустить графический интерфейс\n" #: ../src/lxhotkey.c:345 msgid "empty option name." msgstr "пустое название параметра." #: ../src/lxhotkey.c:348 msgid "empty action name." msgstr "пустое название действия." #: ../src/lxhotkey.c:380 #, c-format msgid "no matching option '%s' found for action '%s'." msgstr "не найдено подходящего параметра '%s' для действия '%s'." #: ../src/lxhotkey.c:384 #, c-format msgid "action '%s' isn't supported by WM %s." msgstr "действие '%s' не поддерживается менеджером окон %s." #: ../src/lxhotkey.c:401 #, c-format msgid "value '%s' is not supported for option '%s'." msgstr "значение '%s' не поддерживается для параметра '%s'." #: ../src/lxhotkey.c:405 #, c-format msgid "value '%s' is not supported for action '%s'." msgstr "значение '%s' не поддерживается для действия '%s'." #: ../src/lxhotkey.c:418 #, c-format msgid "action '%s' does not support options." msgstr "действие '%s' не поддерживает параметры." #: ../src/lxhotkey.c:500 msgid "Sorry, cannot configure keys remotely." msgstr "Извините, но менять привязки клавиш можно только локально." #: ../src/lxhotkey.c:508 msgid "Could not determine window manager running." msgstr "Не получилось определить запущенный менеджер окон." #: ../src/lxhotkey.c:516 #, fuzzy, c-format #| msgid "Could not determine window manager running." msgid "Could not find a plugin for window manager %s." msgstr "Не получилось определить запущенный менеджер окон." #: ../src/lxhotkey.c:523 ../plugins/gtk/gtk.c:75 msgid "Problems loading configuration: " msgstr "Проблемы загрузки конфигурации: " #: ../src/lxhotkey.c:532 #, c-format msgid "GUI type %s currently isn't supported." msgstr "Графический интерфейс %s не поддерживается." #: ../src/lxhotkey.c:549 ../src/lxhotkey.c:625 msgid "Invalid request: " msgstr "Плохой запрос: " #: ../src/lxhotkey.c:559 ../src/lxhotkey.c:637 ../plugins/gtk/gtk.c:90 msgid "Problems saving configuration: " msgstr "Проблемы сохранения конфигурации: " #: ../src/lxhotkey.c:576 msgid "ACTION(s)" msgstr "ДЕЙСТВИЕ(Я)" #: ../src/lxhotkey.c:576 ../src/lxhotkey.c:654 msgid "KEY(s)" msgstr "КЛАВИША(И)" #: ../src/lxhotkey.c:654 msgid "EXEC" msgstr "КОМАНДА" #: ../src/lxhotkey.c:676 msgid "Requested operation isn't supported." msgstr "Запрошенная операция не поддерживается." #: ../plugins/openbox/openbox.c:185 msgid "Failed to reconfigure Openbox." msgstr "Не удалось переконфигурировать Openbox." #: ../plugins/openbox/openbox.c:204 msgid "yes" msgstr "да" #: ../plugins/openbox/openbox.c:204 msgid "no" msgstr "нет" #: ../plugins/openbox/openbox.c:207 msgid "enabled" msgstr "включен" #: ../plugins/openbox/openbox.c:208 msgid "wmclass" msgstr "класс менеджера окон" #: ../plugins/openbox/openbox.c:209 msgid "name" msgstr "название" #: ../plugins/openbox/openbox.c:210 msgid "icon" msgstr "значок" #: ../plugins/openbox/openbox.c:215 ../plugins/openbox/openbox.c:294 msgid "command" msgstr "команда" #: ../plugins/openbox/openbox.c:216 ../plugins/openbox/openbox.c:299 msgid "prompt" msgstr "приглашение" #: ../plugins/openbox/openbox.c:217 msgid "startupnotify" msgstr "сообщение запуска" #: ../plugins/openbox/openbox.c:221 ../plugins/openbox/openbox.c:331 msgid "center" msgstr "центр" #: ../plugins/openbox/openbox.c:222 msgid "default" msgstr "по умолчанию" #: ../plugins/openbox/openbox.c:222 msgid "primary" msgstr "первичный" #: ../plugins/openbox/openbox.c:222 msgid "mouse" msgstr "мышь" #: ../plugins/openbox/openbox.c:223 msgid "active" msgstr "активный" #: ../plugins/openbox/openbox.c:223 ../plugins/openbox/openbox.c:334 msgid "all" msgstr "все" #: ../plugins/openbox/openbox.c:228 ../plugins/openbox/openbox.c:341 msgid "monitor" msgstr "монитор" #: ../plugins/openbox/openbox.c:233 msgid "menu" msgstr "меню" #: ../plugins/openbox/openbox.c:234 msgid "position" msgstr "позиция" #: ../plugins/openbox/openbox.c:238 msgid "list" msgstr "список" #: ../plugins/openbox/openbox.c:238 msgid "icons" msgstr "значки" #: ../plugins/openbox/openbox.c:238 msgid "none" msgstr "ни одного" #: ../plugins/openbox/openbox.c:241 ../plugins/openbox/openbox.c:260 msgid "dialog" msgstr "диалог" #: ../plugins/openbox/openbox.c:242 ../plugins/openbox/openbox.c:261 msgid "bar" msgstr "пенал" #: ../plugins/openbox/openbox.c:243 ../plugins/openbox/openbox.c:262 msgid "raise" msgstr "поднять" #: ../plugins/openbox/openbox.c:244 msgid "allDesktops" msgstr "все рабочие столы" #: ../plugins/openbox/openbox.c:245 ../plugins/openbox/openbox.c:263 msgid "panels" msgstr "панели" #: ../plugins/openbox/openbox.c:246 msgid "desktop" msgstr "рабочий стол" #: ../plugins/openbox/openbox.c:247 msgid "linear" msgstr "линейный" #: ../plugins/openbox/openbox.c:248 msgid "interactive" msgstr "интерактивний" #. TRANSLATORS: finalactions means actions when done #: ../plugins/openbox/openbox.c:250 ../plugins/openbox/openbox.c:265 msgid "finalactions" msgstr "действия по завершению" #: ../plugins/openbox/openbox.c:254 ../plugins/openbox/openbox.c:271 #: ../plugins/openbox/openbox.c:311 ../plugins/openbox/openbox.c:364 msgid "north" msgstr "север" #: ../plugins/openbox/openbox.c:254 msgid "northeast" msgstr "северо-восток" #: ../plugins/openbox/openbox.c:254 ../plugins/openbox/openbox.c:272 #: ../plugins/openbox/openbox.c:312 ../plugins/openbox/openbox.c:364 msgid "east" msgstr "восток" #: ../plugins/openbox/openbox.c:255 msgid "southeast" msgstr "юго-восток" #: ../plugins/openbox/openbox.c:255 ../plugins/openbox/openbox.c:271 #: ../plugins/openbox/openbox.c:311 ../plugins/openbox/openbox.c:364 msgid "south" msgstr "юг" #: ../plugins/openbox/openbox.c:255 msgid "southwest" msgstr "юго-запад" #: ../plugins/openbox/openbox.c:256 ../plugins/openbox/openbox.c:272 #: ../plugins/openbox/openbox.c:312 ../plugins/openbox/openbox.c:364 msgid "west" msgstr "запад" #: ../plugins/openbox/openbox.c:256 msgid "northwest" msgstr "северо-запад" #: ../plugins/openbox/openbox.c:259 ../plugins/openbox/openbox.c:306 #: ../plugins/openbox/openbox.c:367 msgid "direction" msgstr "направление" #: ../plugins/openbox/openbox.c:264 msgid "desktops" msgstr "рабочие столы" #. TRANSLATORS: these values are in regard to desktop #: ../plugins/openbox/openbox.c:270 ../plugins/openbox/openbox.c:281 #: ../plugins/openbox/openbox.c:310 ../plugins/openbox/openbox.c:331 #: ../plugins/openbox/openbox.c:334 msgid "current" msgstr "текущий" #: ../plugins/openbox/openbox.c:270 ../plugins/openbox/openbox.c:310 #: ../plugins/openbox/openbox.c:334 msgid "next" msgstr "следующий" #: ../plugins/openbox/openbox.c:270 ../plugins/openbox/openbox.c:310 msgid "previous" msgstr "предыдущий" #: ../plugins/openbox/openbox.c:271 ../plugins/openbox/openbox.c:281 #: ../plugins/openbox/openbox.c:311 msgid "last" msgstr "последний" #: ../plugins/openbox/openbox.c:271 ../plugins/openbox/openbox.c:311 msgid "up" msgstr "вверх" #: ../plugins/openbox/openbox.c:272 ../plugins/openbox/openbox.c:312 msgid "down" msgstr "вниз" #: ../plugins/openbox/openbox.c:272 ../plugins/openbox/openbox.c:312 #: ../plugins/openbox/openbox.c:322 ../plugins/openbox/openbox.c:357 msgid "left" msgstr "влево" #: ../plugins/openbox/openbox.c:273 ../plugins/openbox/openbox.c:313 #: ../plugins/openbox/openbox.c:322 ../plugins/openbox/openbox.c:358 msgid "right" msgstr "вправо" #: ../plugins/openbox/openbox.c:276 ../plugins/openbox/openbox.c:316 msgid "to" msgstr "к" #: ../plugins/openbox/openbox.c:277 ../plugins/openbox/openbox.c:317 msgid "wrap" msgstr "свернуть" #: ../plugins/openbox/openbox.c:284 msgid "where" msgstr "где" #: ../plugins/openbox/openbox.c:289 msgid "strict" msgstr "строго" #: ../plugins/openbox/openbox.c:303 msgid "both" msgstr "оба" #: ../plugins/openbox/openbox.c:303 msgid "horizontal" msgstr "горизонтально" #: ../plugins/openbox/openbox.c:303 msgid "vertical" msgstr "вертикально" #: ../plugins/openbox/openbox.c:318 msgid "follow" msgstr "следить" #: ../plugins/openbox/openbox.c:322 ../plugins/openbox/openbox.c:359 #: ../plugins/openbox/openbox.c:371 msgid "top" msgstr "верхний" #: ../plugins/openbox/openbox.c:322 ../plugins/openbox/openbox.c:360 #: ../plugins/openbox/openbox.c:371 msgid "bottom" msgstr "нижний" #: ../plugins/openbox/openbox.c:323 msgid "topleft" msgstr "верхний левый" #: ../plugins/openbox/openbox.c:323 msgid "topright" msgstr "верхний правый" #: ../plugins/openbox/openbox.c:323 msgid "bottomleft" msgstr "нижний левый" #: ../plugins/openbox/openbox.c:324 msgid "bottomright" msgstr "нижний правый" #: ../plugins/openbox/openbox.c:327 msgid "edge" msgstr "край" #. TRANSLATORS: # in config means either pixels, or monitor number #: ../plugins/openbox/openbox.c:331 ../plugins/openbox/openbox.c:346 msgid "#" msgstr "число" #. TRANSLATORS: % in config means some fraction value, usually measured in percents #: ../plugins/openbox/openbox.c:333 msgid "%" msgstr "доля" #: ../plugins/openbox/openbox.c:334 msgid "prev" msgstr "предыдущий" #: ../plugins/openbox/openbox.c:339 msgid "width" msgstr "ширина" #: ../plugins/openbox/openbox.c:340 msgid "height" msgstr "высота" #: ../plugins/openbox/openbox.c:371 msgid "normal" msgstr "нормальный" #: ../plugins/openbox/openbox.c:374 msgid "layer" msgstr "слой" #: ../plugins/openbox/openbox.c:380 msgid "Execute" msgstr "выполнить" #: ../plugins/openbox/openbox.c:381 msgid "ShowMenu" msgstr "показать меню" #: ../plugins/openbox/openbox.c:382 msgid "NextWindow" msgstr "следующее окно" #: ../plugins/openbox/openbox.c:383 msgid "PreviousWindow" msgstr "предыдущее окно" #: ../plugins/openbox/openbox.c:384 msgid "DirectionalCycleWindows" msgstr "перейти к окну в направлении" #: ../plugins/openbox/openbox.c:385 msgid "DirectionalTargetWindow" msgstr "выбрать окно в направлении" #: ../plugins/openbox/openbox.c:386 msgid "GoToDesktop" msgstr "перейти к рабочему столу" #: ../plugins/openbox/openbox.c:387 msgid "AddDesktop" msgstr "добавить рабочий стол" #: ../plugins/openbox/openbox.c:388 msgid "RemoveDesktop" msgstr "удалить рабочий стол" #: ../plugins/openbox/openbox.c:389 msgid "ToggleShowDesktop" msgstr "показать рабочий стол/окна" #: ../plugins/openbox/openbox.c:390 msgid "ToggleDockAutohide" msgstr "включить/выключить автоскрытие дока" #: ../plugins/openbox/openbox.c:391 msgid "Reconfigure" msgstr "переконфигурировать" #: ../plugins/openbox/openbox.c:392 msgid "Restart" msgstr "перезапустить" #: ../plugins/openbox/openbox.c:393 msgid "Exit" msgstr "выйти" #: ../plugins/openbox/openbox.c:395 msgid "Focus" msgstr "получить фокус" #: ../plugins/openbox/openbox.c:396 msgid "Raise" msgstr "поднять" #: ../plugins/openbox/openbox.c:397 msgid "Lower" msgstr "опустить" #: ../plugins/openbox/openbox.c:398 msgid "RaiseLower" msgstr "поднять и опустить" #: ../plugins/openbox/openbox.c:399 msgid "Unfocus" msgstr "оставить фокус" #: ../plugins/openbox/openbox.c:400 msgid "FocusToBottom" msgstr "фокус на нижнем" #: ../plugins/openbox/openbox.c:401 msgid "Iconify" msgstr "свернуть" #: ../plugins/openbox/openbox.c:402 msgid "Close" msgstr "закрыть" #: ../plugins/openbox/openbox.c:403 msgid "ToggleShade" msgstr "включить/выключить тень" #: ../plugins/openbox/openbox.c:404 msgid "Shade" msgstr "затенить" #: ../plugins/openbox/openbox.c:405 msgid "Unshade" msgstr "снять затенения" #: ../plugins/openbox/openbox.c:406 msgid "ToggleOmnipresent" msgstr "включить/выключить \"Показывать везде\"" #: ../plugins/openbox/openbox.c:407 msgid "ToggleMaximize" msgstr "включить/выключить \"Максимизировать\"" #: ../plugins/openbox/openbox.c:408 msgid "Maximize" msgstr "максимизировать" #: ../plugins/openbox/openbox.c:409 msgid "Unmaximize" msgstr "снять максимизацию" #: ../plugins/openbox/openbox.c:410 msgid "ToggleFullscreen" msgstr "включить/выключить \"Во весь экран\"" #: ../plugins/openbox/openbox.c:411 msgid "ToggleDecorations" msgstr "включить/выключить рамку" #: ../plugins/openbox/openbox.c:412 msgid "Decorate" msgstr "обрамить" #: ../plugins/openbox/openbox.c:413 msgid "Undecorate" msgstr "снять обрамление" #: ../plugins/openbox/openbox.c:414 msgid "SendToDesktop" msgstr "отправить на рабочий стол" #: ../plugins/openbox/openbox.c:415 msgid "Move" msgstr "переместить" #: ../plugins/openbox/openbox.c:416 msgid "Resize" msgstr "изменить размер" #: ../plugins/openbox/openbox.c:417 msgid "MoveResizeTo" msgstr "изменить размер и переместить" #: ../plugins/openbox/openbox.c:418 msgid "MoveRelative" msgstr "относительное перемещение" #: ../plugins/openbox/openbox.c:419 msgid "ResizeRelative" msgstr "относительное изменение размера" #: ../plugins/openbox/openbox.c:420 msgid "MoveToEdge" msgstr "переместить к краю" #: ../plugins/openbox/openbox.c:421 msgid "GrowToEdge" msgstr "расширить до края" #: ../plugins/openbox/openbox.c:422 msgid "ShrinkToEdge" msgstr "подрезать по краю" #: ../plugins/openbox/openbox.c:423 msgid "GrowToFill" msgstr "расширить до заполнения" #: ../plugins/openbox/openbox.c:424 msgid "ToggleAlwaysOnTop" msgstr "включить/выключить \"Всегда вверху\"" #: ../plugins/openbox/openbox.c:425 msgid "ToggleAlwaysOnBottom" msgstr "включить/выключить \"Всегда внизу\"" #: ../plugins/openbox/openbox.c:426 msgid "SendToLayer" msgstr "направить в слой" #: ../plugins/openbox/openbox.c:517 msgid "Duplicate section in the rc.xml file." msgstr "Двойная секция в файле rc.xml." #: ../plugins/openbox/openbox.c:548 ../plugins/openbox/openbox.c:790 msgid "Internal error." msgstr "Внутренняя ошибка." #: ../plugins/openbox/openbox.c:592 msgid "rc.xml error: no key is set for a keybind." msgstr "Ошибка в rc.xml: клавиша привязки не назначена." #: ../plugins/openbox/openbox.c:663 msgid "Invalid rc.xml: action with a sub-action." msgstr "Ошибка в rc.xml: действие внутри другого действия." #: ../plugins/openbox/openbox.c:779 msgid "rc.xml error: no name is set for action." msgstr "Ошибка в rc.xml: не назначено название для действия." #: ../plugins/openbox/openbox.c:809 #, c-format msgid "rc.xml error: empty tag <%s> is prohibited." msgstr "Ошибка в rc.xml: использование пустого тега <%s> запрещено." #: ../plugins/openbox/openbox.c:901 msgid "Could not find the rc.xml file anywhere." msgstr "Нигде не удалось найти файл rc.xml." #: ../plugins/openbox/openbox.c:949 ../plugins/openbox/openbox.c:1063 #: ../plugins/openbox/openbox.c:1210 ../plugins/openbox/openbox.c:1228 msgid "No WM configuration is available." msgstr "Не удалось получить конфигурацию менеджера окон." #: ../plugins/openbox/openbox.c:1067 msgid "Keybinding should activate at least one action." msgstr "Привязка должна активировать как минимум одно действие." #: ../plugins/openbox/openbox.c:1096 ../plugins/openbox/openbox.c:1106 #: ../plugins/openbox/openbox.c:1262 ../plugins/openbox/openbox.c:1272 #, c-format msgid "Hotkey '%s' is already bound to an action." msgstr "Клавиша '%s' уже привязана к другому действию." #: ../plugins/openbox/openbox.c:1232 msgid "The exec line cannot be empty." msgstr "Командная строка не может быть пустой." #: ../plugins/gtk/gtk.c:133 ../plugins/gtk/gtk.c:156 msgid "Cannot delete keybinding: " msgstr "Невозможно удалить привязку клавиш: " #. TRANSLATORS: Replace this string with your names, one name per line. #: ../plugins/gtk/gtk.c:176 msgid "translator-credits" msgstr "Алексей Логинов " #: ../plugins/gtk/gtk.c:184 msgid "Copyright (C) 2016-2025" msgstr "Права защищены (C) 2016-2025" #: ../plugins/gtk/gtk.c:185 msgid "Keyboard shortcuts configurator" msgstr "Изменение привязок клавиш" #: ../plugins/gtk/gtk.c:208 msgid "_File" msgstr "_Файл" #: ../plugins/gtk/gtk.c:209 msgid "_Reload" msgstr "_Перезагрузить" #: ../plugins/gtk/gtk.c:210 msgid "" "Drop all unsaved changes and reload all keys from Window Manager " "configuration" msgstr "" "Отбросить все несохранённые изменения и перезагрузить все привязки из " "конфигурации менеджера окон" #: ../plugins/gtk/gtk.c:213 msgid "Save all changes and apply them to Window Manager configuration" msgstr "Сохранить все изменения и применить их к конфигурации менеджера окон" #: ../plugins/gtk/gtk.c:216 msgid "Exit the application without saving" msgstr "Выйти из программы без сохранения" #: ../plugins/gtk/gtk.c:217 msgid "_Edit" msgstr "_Редактировать" #: ../plugins/gtk/gtk.c:218 msgid "Create new action" msgstr "Создать новое действие" #: ../plugins/gtk/gtk.c:220 msgid "Remove selected action" msgstr "Удалить выбранное действие" #: ../plugins/gtk/gtk.c:222 msgid "Change selected action" msgstr "Изменить параметры выбранного действия" #: ../plugins/gtk/gtk.c:224 msgid "_Help" msgstr "_Помощь" #: ../plugins/gtk/gtk.c:441 msgid "Action" msgstr "Действие" #: ../plugins/gtk/gtk.c:444 msgid "Option" msgstr "Параметр" #: ../plugins/gtk/gtk.c:447 ../plugins/gtk/gtk.c:467 ../plugins/gtk/edit.c:1111 msgid "Hotkey 1" msgstr "Привязка 1" #: ../plugins/gtk/gtk.c:450 ../plugins/gtk/gtk.c:470 ../plugins/gtk/edit.c:1115 msgid "Hotkey 2" msgstr "Привязка 2" #: ../plugins/gtk/gtk.c:458 msgid "Actions" msgstr "Действия" #: ../plugins/gtk/gtk.c:464 msgid "Command" msgstr "Команда" #: ../plugins/gtk/gtk.c:478 msgid "Programs" msgstr "Программы" #: ../plugins/gtk/gtk.c:497 ../plugins/gtk/edit.c:511 msgid "Error" msgstr "Ошибка" #: ../plugins/gtk/lxhotkey-gtk.desktop.in.h:1 msgid "Setup Hot Keys" msgstr "Настроить горячие клавиши" #: ../plugins/gtk/lxhotkey-gtk.desktop.in.h:2 msgid "View and change Window Manager global shortcuts" msgstr "Посмотреть или изменить глобальные привязки клавиш менеджера окон" #: ../plugins/gtk/lxhotkey-gtk.desktop.in.h:3 msgid "hotkey;shortcut;system;settings;" msgstr "привязка;горячая клавиша;рабочий стол;настройки;" #: ../plugins/gtk/edit.c:266 msgid "Apply error: " msgstr "Ошибка применения: " #: ../plugins/gtk/edit.c:281 ../plugins/gtk/edit.c:395 msgid "Add action" msgstr "Добавить действие" #: ../plugins/gtk/edit.c:293 ../plugins/gtk/edit.c:397 msgid "Add option" msgstr "Добавить параметр" #: ../plugins/gtk/edit.c:355 msgid "Change option" msgstr "Изменить параметр" #: ../plugins/gtk/edit.c:420 msgid "Discard changes" msgstr "Отбросить изменения" #: ../plugins/gtk/edit.c:421 msgid "Accept changes" msgstr "Принять изменения" #: ../plugins/gtk/edit.c:422 msgid "Add an action" msgstr "Добавить действие" #: ../plugins/gtk/edit.c:423 msgid "Add an option to this command" msgstr "Добавить параметр к этой команде" #: ../plugins/gtk/edit.c:425 msgid "Remove selection" msgstr "Удалить выбранное действие или параметр" #: ../plugins/gtk/edit.c:426 msgid "Change selected option" msgstr "Изменить выбранный параметр" #: ../plugins/gtk/edit.c:427 msgid "Add an option to selection" msgstr "Добавить параметр к выбранному действию или параметру" #: ../plugins/gtk/edit.c:508 #, c-format msgid "Key combination '%s' cannot be used as a global hotkey, sorry." msgstr "" "Извините, но комбинация клавиш '%s' не может быть использована в качестве " "глобальной." #: ../plugins/gtk/edit.c:571 msgid "Click to select, then press a key" msgstr "" #: ../plugins/gtk/edit.c:1128 msgid "Actions:" msgstr "Действия:" #: ../plugins/gtk/edit.c:1136 msgid "Command line:" msgstr "Командная строка:" #: ../plugins/gtk/edit.c:1147 msgid "Options:" msgstr "Параметры:" #: ../plugins/gtk/edit.c:1169 msgid "Name:" msgstr "Название:" #: ../plugins/gtk/edit.c:1190 msgid "Value:" msgstr "Значение:" #, c-format #~ msgid " %s show - show the action bound to a key\n" #~ msgstr "" #~ " %s <клавиша> - показать действие, привязанное " #~ "к клавише\n" #, c-format #~ msgid "Window manager %s isn't supported now, sorry." #~ msgstr "Извините, но менеджер окон %s не поддерживается." lxhotkey-0.1.2/po/sr.po000066400000000000000000000554341476256652500150200ustar00rootroot00000000000000# Serbian translation of LXHotKey package # Copyright (C) The LXDE Project # This file is distributed under the same license as the LXHotKey package. # Jay A. Fleming , 2016. # # msgid "" msgstr "" "Project-Id-Version: LXHotKey\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-09-18 15:23+0200\n" "PO-Revision-Date: 2016-11-04 10:42+0100\n" "Last-Translator: Jay Alexander Fleming \n" "Language-Team: \n" "Language: sr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\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.7.6\n" #: ../src/lxhotkey.c:244 msgid "Usage: %s global [] - show keys bound to action(s)\n" msgstr "" "Употреба:\n" " %s global [<тастер>] — приказује тастере придружене радњама(и)\n" #: ../src/lxhotkey.c:245 #, c-format msgid " %s global - bind a key to the action\n" msgstr " %s global <радња> <тастер> — придружује тастер радњи\n" #: ../src/lxhotkey.c:246 msgid " %s app [] - show keys bound to exec line\n" msgstr "" " %s app [<тастер>] — приказује тастере придружене линији " "наредбе\n" #: ../src/lxhotkey.c:247 #, c-format msgid " %s app - bind a key to some exec line\n" msgstr "" " %s app <наредба> <тастер> — придружује тастер линији наредбе\n" #: ../src/lxhotkey.c:248 #, c-format msgid " %s app -- - unbind all keys from exec line\n" msgstr "" " %s app <наредба> -- — раздружује тастер од линије наредбе\n" #: ../src/lxhotkey.c:250 #, c-format msgid " %s --gui= - start with GUI\n" msgstr "" " %s --gui=<врста> — покреће програм кроз граф. сучеље\n" #: ../src/lxhotkey.c:345 msgid "empty option name." msgstr "поставка без назива." #: ../src/lxhotkey.c:348 msgid "empty action name." msgstr "радња без назива." #: ../src/lxhotkey.c:380 #, c-format msgid "no matching option '%s' found for action '%s'." msgstr "не нађох поставку „%s“ сагласну радњи „%s“." #: ../src/lxhotkey.c:384 #, c-format msgid "action '%s' isn't supported by WM %s." msgstr "радња „%s“ није подржана у упр. прозора „%s“." #: ../src/lxhotkey.c:401 #, c-format msgid "value '%s' is not supported for option '%s'." msgstr "вредност „%s“ није подржана за поставку „%s“." #: ../src/lxhotkey.c:405 #, c-format msgid "value '%s' is not supported for action '%s'." msgstr "вредност „%s“ није подржана за радњу „%s“." #: ../src/lxhotkey.c:418 #, c-format msgid "action '%s' does not support options." msgstr "радња „%s“ не подржава поставке." #: ../src/lxhotkey.c:500 msgid "Sorry, cannot configure keys remotely." msgstr "На жалост, не познајем удаљено подешавање тастера" #: ../src/lxhotkey.c:508 msgid "Could not determine window manager running." msgstr "Не могу да одредим употребљеног управника прозора." #: ../src/lxhotkey.c:516 #, fuzzy, c-format #| msgid "Could not determine window manager running." msgid "Could not find a plugin for window manager %s." msgstr "Не могу да одредим употребљеног управника прозора." #: ../src/lxhotkey.c:523 ../plugins/gtk/gtk.c:75 msgid "Problems loading configuration: " msgstr "Проблеми при читању подешавања: " #: ../src/lxhotkey.c:532 #, c-format msgid "GUI type %s currently isn't supported." msgstr "Граф. сучеље „%s-врсте“ за сада није подржано." #: ../src/lxhotkey.c:549 ../src/lxhotkey.c:625 msgid "Invalid request: " msgstr "Захтев није ваљан: " #: ../src/lxhotkey.c:559 ../src/lxhotkey.c:637 ../plugins/gtk/gtk.c:90 msgid "Problems saving configuration: " msgstr "Проблеми при упису подешавања: " #: ../src/lxhotkey.c:576 msgid "ACTION(s)" msgstr "РАДЊА(е)" #: ../src/lxhotkey.c:576 ../src/lxhotkey.c:654 msgid "KEY(s)" msgstr "ТАСТЕР(и)" #: ../src/lxhotkey.c:654 msgid "EXEC" msgstr "НАРЕДБА" #: ../src/lxhotkey.c:676 msgid "Requested operation isn't supported." msgstr "Није подржана захтевана операција." #: ../plugins/openbox/openbox.c:185 msgid "Failed to reconfigure Openbox." msgstr "Није успело преподешавање Опенбокса." #: ../plugins/openbox/openbox.c:204 msgid "yes" msgstr "да" #: ../plugins/openbox/openbox.c:204 msgid "no" msgstr "не" #: ../plugins/openbox/openbox.c:207 msgid "enabled" msgstr "омогућено" #: ../plugins/openbox/openbox.c:208 #, fuzzy msgid "wmclass" msgstr "класа_упр.прозора" #: ../plugins/openbox/openbox.c:209 msgid "name" msgstr "назив" #: ../plugins/openbox/openbox.c:210 msgid "icon" msgstr "икона" #: ../plugins/openbox/openbox.c:215 ../plugins/openbox/openbox.c:294 msgid "command" msgstr "наредба" #: ../plugins/openbox/openbox.c:216 ../plugins/openbox/openbox.c:299 #, fuzzy msgid "prompt" msgstr "Упит" #: ../plugins/openbox/openbox.c:217 #, fuzzy msgid "startupnotify" msgstr "обавештење_при_покретању" #: ../plugins/openbox/openbox.c:221 ../plugins/openbox/openbox.c:331 msgid "center" msgstr "на средини" #: ../plugins/openbox/openbox.c:222 msgid "default" msgstr "уобичајено" #: ../plugins/openbox/openbox.c:222 msgid "primary" msgstr "главно" #: ../plugins/openbox/openbox.c:222 msgid "mouse" msgstr "миш" #: ../plugins/openbox/openbox.c:223 #, fuzzy msgid "active" msgstr "укључено" #: ../plugins/openbox/openbox.c:223 ../plugins/openbox/openbox.c:334 msgid "all" msgstr "све" #: ../plugins/openbox/openbox.c:228 ../plugins/openbox/openbox.c:341 msgid "monitor" msgstr "екран" #: ../plugins/openbox/openbox.c:233 msgid "menu" msgstr "изборник" #: ../plugins/openbox/openbox.c:234 msgid "position" msgstr "положај" #: ../plugins/openbox/openbox.c:238 msgid "list" msgstr "списак" #: ../plugins/openbox/openbox.c:238 msgid "icons" msgstr "иконе" #: ../plugins/openbox/openbox.c:238 msgid "none" msgstr "ништа" #: ../plugins/openbox/openbox.c:241 ../plugins/openbox/openbox.c:260 #, fuzzy msgid "dialog" msgstr "прозорче" #: ../plugins/openbox/openbox.c:242 ../plugins/openbox/openbox.c:261 msgid "bar" msgstr "" #: ../plugins/openbox/openbox.c:243 ../plugins/openbox/openbox.c:262 msgid "raise" msgstr "издигни" #: ../plugins/openbox/openbox.c:244 msgid "allDesktops" msgstr "све_површи" #: ../plugins/openbox/openbox.c:245 ../plugins/openbox/openbox.c:263 msgid "panels" msgstr "панели" #: ../plugins/openbox/openbox.c:246 msgid "desktop" msgstr "радна површ" #: ../plugins/openbox/openbox.c:247 msgid "linear" msgstr "равномерно" #: ../plugins/openbox/openbox.c:248 msgid "interactive" msgstr "" #. TRANSLATORS: finalactions means actions when done #: ../plugins/openbox/openbox.c:250 ../plugins/openbox/openbox.c:265 #, fuzzy msgid "finalactions" msgstr "на_крају_уради" #: ../plugins/openbox/openbox.c:254 ../plugins/openbox/openbox.c:271 #: ../plugins/openbox/openbox.c:311 ../plugins/openbox/openbox.c:364 msgid "north" msgstr "северно" #: ../plugins/openbox/openbox.c:254 msgid "northeast" msgstr "североисточно" #: ../plugins/openbox/openbox.c:254 ../plugins/openbox/openbox.c:272 #: ../plugins/openbox/openbox.c:312 ../plugins/openbox/openbox.c:364 msgid "east" msgstr "источно" #: ../plugins/openbox/openbox.c:255 msgid "southeast" msgstr "југоисточно" #: ../plugins/openbox/openbox.c:255 ../plugins/openbox/openbox.c:271 #: ../plugins/openbox/openbox.c:311 ../plugins/openbox/openbox.c:364 msgid "south" msgstr "јужно" #: ../plugins/openbox/openbox.c:255 msgid "southwest" msgstr "југозападно" #: ../plugins/openbox/openbox.c:256 ../plugins/openbox/openbox.c:272 #: ../plugins/openbox/openbox.c:312 ../plugins/openbox/openbox.c:364 msgid "west" msgstr "западно" #: ../plugins/openbox/openbox.c:256 msgid "northwest" msgstr "сецерозападно" #: ../plugins/openbox/openbox.c:259 ../plugins/openbox/openbox.c:306 #: ../plugins/openbox/openbox.c:367 msgid "direction" msgstr "правац" #: ../plugins/openbox/openbox.c:264 msgid "desktops" msgstr "радне површи" #. TRANSLATORS: these values are in regard to desktop #: ../plugins/openbox/openbox.c:270 ../plugins/openbox/openbox.c:281 #: ../plugins/openbox/openbox.c:310 ../plugins/openbox/openbox.c:331 #: ../plugins/openbox/openbox.c:334 msgid "current" msgstr "текућа" #: ../plugins/openbox/openbox.c:270 ../plugins/openbox/openbox.c:310 #: ../plugins/openbox/openbox.c:334 msgid "next" msgstr "наредна" #: ../plugins/openbox/openbox.c:270 ../plugins/openbox/openbox.c:310 msgid "previous" msgstr "претходна" #: ../plugins/openbox/openbox.c:271 ../plugins/openbox/openbox.c:281 #: ../plugins/openbox/openbox.c:311 msgid "last" msgstr "последња" #: ../plugins/openbox/openbox.c:271 ../plugins/openbox/openbox.c:311 msgid "up" msgstr "горња" #: ../plugins/openbox/openbox.c:272 ../plugins/openbox/openbox.c:312 msgid "down" msgstr "доња" #: ../plugins/openbox/openbox.c:272 ../plugins/openbox/openbox.c:312 #: ../plugins/openbox/openbox.c:322 ../plugins/openbox/openbox.c:357 msgid "left" msgstr "лева" #: ../plugins/openbox/openbox.c:273 ../plugins/openbox/openbox.c:313 #: ../plugins/openbox/openbox.c:322 ../plugins/openbox/openbox.c:358 msgid "right" msgstr "десна" #: ../plugins/openbox/openbox.c:276 ../plugins/openbox/openbox.c:316 #, fuzzy msgid "to" msgstr "у" #: ../plugins/openbox/openbox.c:277 ../plugins/openbox/openbox.c:317 #, fuzzy msgid "wrap" msgstr "преломи" #: ../plugins/openbox/openbox.c:284 #, fuzzy msgid "where" msgstr "где" #: ../plugins/openbox/openbox.c:289 msgid "strict" msgstr "" #: ../plugins/openbox/openbox.c:303 msgid "both" msgstr "обје" #: ../plugins/openbox/openbox.c:303 msgid "horizontal" msgstr "водоравно" #: ../plugins/openbox/openbox.c:303 msgid "vertical" msgstr "усправно" #: ../plugins/openbox/openbox.c:318 msgid "follow" msgstr "прати" #: ../plugins/openbox/openbox.c:322 ../plugins/openbox/openbox.c:359 #: ../plugins/openbox/openbox.c:371 msgid "top" msgstr "горе" #: ../plugins/openbox/openbox.c:322 ../plugins/openbox/openbox.c:360 #: ../plugins/openbox/openbox.c:371 msgid "bottom" msgstr "доле" #: ../plugins/openbox/openbox.c:323 msgid "topleft" msgstr "горе-лево" #: ../plugins/openbox/openbox.c:323 msgid "topright" msgstr "горе-десно" #: ../plugins/openbox/openbox.c:323 msgid "bottomleft" msgstr "доле-лево" #: ../plugins/openbox/openbox.c:324 msgid "bottomright" msgstr "доле-десно" #: ../plugins/openbox/openbox.c:327 msgid "edge" msgstr "ивица" #. TRANSLATORS: # in config means either pixels, or monitor number #: ../plugins/openbox/openbox.c:331 ../plugins/openbox/openbox.c:346 msgid "#" msgstr "?број" #. TRANSLATORS: % in config means some fraction value, usually measured in percents #: ../plugins/openbox/openbox.c:333 msgid "%" msgstr "%" #: ../plugins/openbox/openbox.c:334 msgid "prev" msgstr "претходни" #: ../plugins/openbox/openbox.c:339 msgid "width" msgstr "ширина" #: ../plugins/openbox/openbox.c:340 msgid "height" msgstr "висина" #: ../plugins/openbox/openbox.c:371 msgid "normal" msgstr "обично" #: ../plugins/openbox/openbox.c:374 msgid "layer" msgstr "слој" #: ../plugins/openbox/openbox.c:380 msgid "Execute" msgstr "Изврши" #: ../plugins/openbox/openbox.c:381 msgid "ShowMenu" msgstr "Прикажи_изборник" #: ../plugins/openbox/openbox.c:382 msgid "NextWindow" msgstr "Наредни_прозор" #: ../plugins/openbox/openbox.c:383 msgid "PreviousWindow" msgstr "Претходни_прозор" #: ../plugins/openbox/openbox.c:384 msgid "DirectionalCycleWindows" msgstr "" #: ../plugins/openbox/openbox.c:385 msgid "DirectionalTargetWindow" msgstr "" #: ../plugins/openbox/openbox.c:386 msgid "GoToDesktop" msgstr "Иди_на_површ" #: ../plugins/openbox/openbox.c:387 msgid "AddDesktop" msgstr "Додај_површ" #: ../plugins/openbox/openbox.c:388 msgid "RemoveDesktop" msgstr "Уклони_површ" #: ../plugins/openbox/openbox.c:389 #, fuzzy #| msgid "GoToDesktop" msgid "ToggleShowDesktop" msgstr "Иди_на_површ" #: ../plugins/openbox/openbox.c:390 msgid "ToggleDockAutohide" msgstr "Укљ-Искљ_Самоскривање" #: ../plugins/openbox/openbox.c:391 msgid "Reconfigure" msgstr "Преподеси" #: ../plugins/openbox/openbox.c:392 msgid "Restart" msgstr "Покрени_опет" #: ../plugins/openbox/openbox.c:393 msgid "Exit" msgstr "Изађи" #: ../plugins/openbox/openbox.c:395 msgid "Focus" msgstr "У_жижи" #: ../plugins/openbox/openbox.c:396 msgid "Raise" msgstr "Издигни" #: ../plugins/openbox/openbox.c:397 msgid "Lower" msgstr "" #: ../plugins/openbox/openbox.c:398 msgid "RaiseLower" msgstr "" #: ../plugins/openbox/openbox.c:399 msgid "Unfocus" msgstr "Ван_жиже" #: ../plugins/openbox/openbox.c:400 msgid "FocusToBottom" msgstr "" #: ../plugins/openbox/openbox.c:401 msgid "Iconify" msgstr "Умањи" #: ../plugins/openbox/openbox.c:402 msgid "Close" msgstr "Затвори" #: ../plugins/openbox/openbox.c:403 msgid "ToggleShade" msgstr "" #: ../plugins/openbox/openbox.c:404 msgid "Shade" msgstr "Замотај" #: ../plugins/openbox/openbox.c:405 msgid "Unshade" msgstr "Одмотај" #: ../plugins/openbox/openbox.c:406 msgid "ToggleOmnipresent" msgstr "" #: ../plugins/openbox/openbox.c:407 msgid "ToggleMaximize" msgstr "" #: ../plugins/openbox/openbox.c:408 msgid "Maximize" msgstr "Увећај" #: ../plugins/openbox/openbox.c:409 msgid "Unmaximize" msgstr "Врати" #: ../plugins/openbox/openbox.c:410 msgid "ToggleFullscreen" msgstr "" #: ../plugins/openbox/openbox.c:411 msgid "ToggleDecorations" msgstr "" #: ../plugins/openbox/openbox.c:412 msgid "Decorate" msgstr "Украси" #: ../plugins/openbox/openbox.c:413 msgid "Undecorate" msgstr "Не_украшавај" #: ../plugins/openbox/openbox.c:414 msgid "SendToDesktop" msgstr "Шаљи_на_површ" #: ../plugins/openbox/openbox.c:415 msgid "Move" msgstr "Помери" #: ../plugins/openbox/openbox.c:416 msgid "Resize" msgstr "Промени величину" #: ../plugins/openbox/openbox.c:417 msgid "MoveResizeTo" msgstr "" #: ../plugins/openbox/openbox.c:418 msgid "MoveRelative" msgstr "" #: ../plugins/openbox/openbox.c:419 msgid "ResizeRelative" msgstr "" #: ../plugins/openbox/openbox.c:420 msgid "MoveToEdge" msgstr "" #: ../plugins/openbox/openbox.c:421 msgid "GrowToEdge" msgstr "" #: ../plugins/openbox/openbox.c:422 msgid "ShrinkToEdge" msgstr "" #: ../plugins/openbox/openbox.c:423 msgid "GrowToFill" msgstr "" #: ../plugins/openbox/openbox.c:424 msgid "ToggleAlwaysOnTop" msgstr "" #: ../plugins/openbox/openbox.c:425 msgid "ToggleAlwaysOnBottom" msgstr "" #: ../plugins/openbox/openbox.c:426 msgid "SendToLayer" msgstr "Шаљи_на_слој" #: ../plugins/openbox/openbox.c:517 msgid "Duplicate section in the rc.xml file." msgstr "Двострука вредност одељка „“ у датотеци „rc.xml“!" #: ../plugins/openbox/openbox.c:548 ../plugins/openbox/openbox.c:790 msgid "Internal error." msgstr "Унутрашња грешка." #: ../plugins/openbox/openbox.c:592 msgid "rc.xml error: no key is set for a keybind." msgstr "Грешка у датотеци „rc.xml“: нема тастера за придруживање." #: ../plugins/openbox/openbox.c:663 msgid "Invalid rc.xml: action with a sub-action." msgstr "Није ваљана „rc.xml“ датотека: радња са под-радњом." #: ../plugins/openbox/openbox.c:779 msgid "rc.xml error: no name is set for action." msgstr "Грешка у датотеци „rc.xml“: радња је без назива." #: ../plugins/openbox/openbox.c:809 #, c-format msgid "rc.xml error: empty tag <%s> is prohibited." msgstr "Грешка у датотеци „rc.xml“: Није дозвољена празна ознака „<%s>“." #: ../plugins/openbox/openbox.c:901 msgid "Could not find the rc.xml file anywhere." msgstr "Не могу нигде да нађем датотеку „rc.xml“." #: ../plugins/openbox/openbox.c:949 ../plugins/openbox/openbox.c:1063 #: ../plugins/openbox/openbox.c:1210 ../plugins/openbox/openbox.c:1228 msgid "No WM configuration is available." msgstr "Није доступно подешавање управника прозора." #: ../plugins/openbox/openbox.c:1067 msgid "Keybinding should activate at least one action." msgstr "Придруживање мора да покреће бар једну радњу." #: ../plugins/openbox/openbox.c:1096 ../plugins/openbox/openbox.c:1106 #: ../plugins/openbox/openbox.c:1262 ../plugins/openbox/openbox.c:1272 #, fuzzy, c-format msgid "Hotkey '%s' is already bound to an action." msgstr "Пречица „%s“ је придружена другој радњи." #: ../plugins/openbox/openbox.c:1232 msgid "The exec line cannot be empty." msgstr "Линиија наредбе не може да буде празна." #: ../plugins/gtk/gtk.c:133 ../plugins/gtk/gtk.c:156 msgid "Cannot delete keybinding: " msgstr "Не могу да уклоним придруживање: " #. TRANSLATORS: Replace this string with your names, one name per line. #: ../plugins/gtk/gtk.c:176 msgid "translator-credits" msgstr "Српски — Jay A. Fleming " #: ../plugins/gtk/gtk.c:184 msgid "Copyright (C) 2016-2025" msgstr "Ауторска права — 2016-2025." #: ../plugins/gtk/gtk.c:185 msgid "Keyboard shortcuts configurator" msgstr "Управник пречица тастатуре" #: ../plugins/gtk/gtk.c:208 msgid "_File" msgstr "_Датотека" #: ../plugins/gtk/gtk.c:209 msgid "_Reload" msgstr "_Освежи" #: ../plugins/gtk/gtk.c:210 msgid "" "Drop all unsaved changes and reload all keys from Window Manager " "configuration" msgstr "" "Поништи све несачуване измене и учитај вредности из подешавања управника " "прозора" #: ../plugins/gtk/gtk.c:213 msgid "Save all changes and apply them to Window Manager configuration" msgstr "Сачувај све измене и примени их на подешавања управника прозора" #: ../plugins/gtk/gtk.c:216 msgid "Exit the application without saving" msgstr "Напусти програм без чувања измена" #: ../plugins/gtk/gtk.c:217 msgid "_Edit" msgstr "_Уреди" #: ../plugins/gtk/gtk.c:218 msgid "Create new action" msgstr "Створи нову радњу" #: ../plugins/gtk/gtk.c:220 msgid "Remove selected action" msgstr "Уклони одабрану радњу" #: ../plugins/gtk/gtk.c:222 msgid "Change selected action" msgstr "Измени одабрану радњу" #: ../plugins/gtk/gtk.c:224 msgid "_Help" msgstr "_Помоћ" #: ../plugins/gtk/gtk.c:441 msgid "Action" msgstr "Радња" #: ../plugins/gtk/gtk.c:444 msgid "Option" msgstr "Поставка" #: ../plugins/gtk/gtk.c:447 ../plugins/gtk/gtk.c:467 ../plugins/gtk/edit.c:1111 msgid "Hotkey 1" msgstr "Пречица 1" #: ../plugins/gtk/gtk.c:450 ../plugins/gtk/gtk.c:470 ../plugins/gtk/edit.c:1115 msgid "Hotkey 2" msgstr "Пречица 2" #: ../plugins/gtk/gtk.c:458 msgid "Actions" msgstr "Радње" #: ../plugins/gtk/gtk.c:464 msgid "Command" msgstr "Наредба" #: ../plugins/gtk/gtk.c:478 msgid "Programs" msgstr "Програми" #: ../plugins/gtk/gtk.c:497 ../plugins/gtk/edit.c:511 msgid "Error" msgstr "Грешка" #: ../plugins/gtk/lxhotkey-gtk.desktop.in.h:1 msgid "Setup Hot Keys" msgstr "Подешавања „врућих“ тастера" #: ../plugins/gtk/lxhotkey-gtk.desktop.in.h:2 msgid "View and change Window Manager global shortcuts" msgstr "Преглед и измена општих пречица управника прозора" #: ../plugins/gtk/lxhotkey-gtk.desktop.in.h:3 msgid "hotkey;shortcut;system;settings;" msgstr "тастер;пречица;систем;поставке;" #: ../plugins/gtk/edit.c:266 msgid "Apply error: " msgstr "" #: ../plugins/gtk/edit.c:281 ../plugins/gtk/edit.c:395 msgid "Add action" msgstr "Додај радњу" #: ../plugins/gtk/edit.c:293 ../plugins/gtk/edit.c:397 msgid "Add option" msgstr "Додај поставку" #: ../plugins/gtk/edit.c:355 msgid "Change option" msgstr "Измени поставку" #: ../plugins/gtk/edit.c:420 msgid "Discard changes" msgstr "Поништи измене" #: ../plugins/gtk/edit.c:421 msgid "Accept changes" msgstr "Сачувај промене" #: ../plugins/gtk/edit.c:422 msgid "Add an action" msgstr "Додај радњу" #: ../plugins/gtk/edit.c:423 msgid "Add an option to this command" msgstr "Додај поставку овој наредби" #: ../plugins/gtk/edit.c:425 msgid "Remove selection" msgstr "Уклони одабрано" #: ../plugins/gtk/edit.c:426 msgid "Change selected option" msgstr "Измени одабрану поставку" #: ../plugins/gtk/edit.c:427 msgid "Add an option to selection" msgstr "Додај поставку одабраном" #: ../plugins/gtk/edit.c:508 #, c-format msgid "Key combination '%s' cannot be used as a global hotkey, sorry." msgstr "Комбинација тастера „%s“ не може да се употреби као општа пречица." #: ../plugins/gtk/edit.c:571 msgid "Click to select, then press a key" msgstr "" #: ../plugins/gtk/edit.c:1128 msgid "Actions:" msgstr "Радње:" #: ../plugins/gtk/edit.c:1136 msgid "Command line:" msgstr "Линија наредбе:" #: ../plugins/gtk/edit.c:1147 msgid "Options:" msgstr "Поставке:" #: ../plugins/gtk/edit.c:1169 msgid "Name:" msgstr "Назив:" #: ../plugins/gtk/edit.c:1190 msgid "Value:" msgstr "Вредност:" #, c-format #~ msgid " %s show - show the action bound to a key\n" #~ msgstr "" #~ " %s show <тастер> — приказује радњу придружену тастеру\n" #, c-format #~ msgid "Window manager %s isn't supported now, sorry." #~ msgstr "На жалост, управник прозора „%s“ још увек није подржан." lxhotkey-0.1.2/po/sr@latin.po000066400000000000000000000507071476256652500161460ustar00rootroot00000000000000# Serbian Latin translation of LXHotKey package # Copyright (C) The LXDE Project # This file is distributed under the same license as the LXHotKey package. # Jay A. Fleming , 2016. # # msgid "" msgstr "" "Project-Id-Version: LXHotKey\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-09-18 15:23+0200\n" "PO-Revision-Date: 2016-11-04 10:55+0100\n" "Last-Translator: Jay Alexander Fleming \n" "Language-Team: \n" "Language: sr@latin\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\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.7.6\n" #: ../src/lxhotkey.c:244 msgid "Usage: %s global [] - show keys bound to action(s)\n" msgstr "" "Upotreba:\n" " %s global [] — prikazuje tastere pridružene radnjama(i)\n" #: ../src/lxhotkey.c:245 #, c-format msgid " %s global - bind a key to the action\n" msgstr " %s global — pridružuje taster radnji\n" #: ../src/lxhotkey.c:246 msgid " %s app [] - show keys bound to exec line\n" msgstr "" " %s app [] — prikazuje tastere pridružene liniji " "naredbe\n" #: ../src/lxhotkey.c:247 #, c-format msgid " %s app - bind a key to some exec line\n" msgstr "" " %s app — pridružuje taster liniji naredbe\n" #: ../src/lxhotkey.c:248 #, c-format msgid " %s app -- - unbind all keys from exec line\n" msgstr "" " %s app -- — razdružuje taster od linije naredbe\n" #: ../src/lxhotkey.c:250 #, c-format msgid " %s --gui= - start with GUI\n" msgstr "" " %s --gui= — pokreće program kroz graf. sučelje\n" #: ../src/lxhotkey.c:345 msgid "empty option name." msgstr "postavka bez naziva." #: ../src/lxhotkey.c:348 msgid "empty action name." msgstr "radnja bez naziva." #: ../src/lxhotkey.c:380 #, c-format msgid "no matching option '%s' found for action '%s'." msgstr "ne nađoh postavku „%s“ saglasnu radnji „%s“." #: ../src/lxhotkey.c:384 #, c-format msgid "action '%s' isn't supported by WM %s." msgstr "radnja „%s“ nije podržana u upr. prozora „%s“." #: ../src/lxhotkey.c:401 #, c-format msgid "value '%s' is not supported for option '%s'." msgstr "vrednost „%s“ nije podržana za postavku „%s“." #: ../src/lxhotkey.c:405 #, c-format msgid "value '%s' is not supported for action '%s'." msgstr "vrednost „%s“ nije podržana za radnju „%s“." #: ../src/lxhotkey.c:418 #, c-format msgid "action '%s' does not support options." msgstr "radnja „%s“ ne podržava postavke." #: ../src/lxhotkey.c:500 msgid "Sorry, cannot configure keys remotely." msgstr "Na žalost, ne poznajem udaljeno podešavanje tastera" #: ../src/lxhotkey.c:508 msgid "Could not determine window manager running." msgstr "Ne mogu da odredim upotrebljenog upravnika prozora." #: ../src/lxhotkey.c:516 #, fuzzy, c-format #| msgid "Could not determine window manager running." msgid "Could not find a plugin for window manager %s." msgstr "Ne mogu da odredim upotrebljenog upravnika prozora." #: ../src/lxhotkey.c:523 ../plugins/gtk/gtk.c:75 msgid "Problems loading configuration: " msgstr "Problemi pri čitanju podešavanja: " #: ../src/lxhotkey.c:532 #, c-format msgid "GUI type %s currently isn't supported." msgstr "Graf. sučelje „%s-vrste“ za sada nije podržano." #: ../src/lxhotkey.c:549 ../src/lxhotkey.c:625 msgid "Invalid request: " msgstr "Zahtev nije valjan: " #: ../src/lxhotkey.c:559 ../src/lxhotkey.c:637 ../plugins/gtk/gtk.c:90 msgid "Problems saving configuration: " msgstr "Problemi pri upisu podešavanja: " #: ../src/lxhotkey.c:576 msgid "ACTION(s)" msgstr "RADNJA(e)" #: ../src/lxhotkey.c:576 ../src/lxhotkey.c:654 msgid "KEY(s)" msgstr "TASTER(i)" #: ../src/lxhotkey.c:654 msgid "EXEC" msgstr "NAREDBA" #: ../src/lxhotkey.c:676 msgid "Requested operation isn't supported." msgstr "Nije podržana zahtevana operacija." #: ../plugins/openbox/openbox.c:185 msgid "Failed to reconfigure Openbox." msgstr "Nije uspelo prepodešavanje Openboksa." #: ../plugins/openbox/openbox.c:204 msgid "yes" msgstr "da" #: ../plugins/openbox/openbox.c:204 msgid "no" msgstr "ne" #: ../plugins/openbox/openbox.c:207 msgid "enabled" msgstr "omogućeno" #: ../plugins/openbox/openbox.c:208 #, fuzzy msgid "wmclass" msgstr "klasa_upr.prozora" #: ../plugins/openbox/openbox.c:209 msgid "name" msgstr "naziv" #: ../plugins/openbox/openbox.c:210 msgid "icon" msgstr "ikona" #: ../plugins/openbox/openbox.c:215 ../plugins/openbox/openbox.c:294 msgid "command" msgstr "naredba" #: ../plugins/openbox/openbox.c:216 ../plugins/openbox/openbox.c:299 #, fuzzy msgid "prompt" msgstr "Upit" #: ../plugins/openbox/openbox.c:217 #, fuzzy msgid "startupnotify" msgstr "obaveštenje_pri_pokretanju" #: ../plugins/openbox/openbox.c:221 ../plugins/openbox/openbox.c:331 msgid "center" msgstr "na sredini" #: ../plugins/openbox/openbox.c:222 msgid "default" msgstr "uobičajeno" #: ../plugins/openbox/openbox.c:222 msgid "primary" msgstr "glavno" #: ../plugins/openbox/openbox.c:222 msgid "mouse" msgstr "miš" #: ../plugins/openbox/openbox.c:223 #, fuzzy msgid "active" msgstr "uključeno" #: ../plugins/openbox/openbox.c:223 ../plugins/openbox/openbox.c:334 msgid "all" msgstr "sve" #: ../plugins/openbox/openbox.c:228 ../plugins/openbox/openbox.c:341 msgid "monitor" msgstr "ekran" #: ../plugins/openbox/openbox.c:233 msgid "menu" msgstr "izbornik" #: ../plugins/openbox/openbox.c:234 msgid "position" msgstr "položaj" #: ../plugins/openbox/openbox.c:238 msgid "list" msgstr "spisak" #: ../plugins/openbox/openbox.c:238 msgid "icons" msgstr "ikone" #: ../plugins/openbox/openbox.c:238 msgid "none" msgstr "ništa" #: ../plugins/openbox/openbox.c:241 ../plugins/openbox/openbox.c:260 #, fuzzy msgid "dialog" msgstr "prozorče" #: ../plugins/openbox/openbox.c:242 ../plugins/openbox/openbox.c:261 msgid "bar" msgstr "" #: ../plugins/openbox/openbox.c:243 ../plugins/openbox/openbox.c:262 msgid "raise" msgstr "izdigni" #: ../plugins/openbox/openbox.c:244 msgid "allDesktops" msgstr "sve_površi" #: ../plugins/openbox/openbox.c:245 ../plugins/openbox/openbox.c:263 msgid "panels" msgstr "paneli" #: ../plugins/openbox/openbox.c:246 msgid "desktop" msgstr "radna površ" #: ../plugins/openbox/openbox.c:247 msgid "linear" msgstr "ravnomerno" #: ../plugins/openbox/openbox.c:248 msgid "interactive" msgstr "" #. TRANSLATORS: finalactions means actions when done #: ../plugins/openbox/openbox.c:250 ../plugins/openbox/openbox.c:265 #, fuzzy msgid "finalactions" msgstr "na_kraju_uradi" #: ../plugins/openbox/openbox.c:254 ../plugins/openbox/openbox.c:271 #: ../plugins/openbox/openbox.c:311 ../plugins/openbox/openbox.c:364 msgid "north" msgstr "severno" #: ../plugins/openbox/openbox.c:254 msgid "northeast" msgstr "severoistočno" #: ../plugins/openbox/openbox.c:254 ../plugins/openbox/openbox.c:272 #: ../plugins/openbox/openbox.c:312 ../plugins/openbox/openbox.c:364 msgid "east" msgstr "istočno" #: ../plugins/openbox/openbox.c:255 msgid "southeast" msgstr "jugoistočno" #: ../plugins/openbox/openbox.c:255 ../plugins/openbox/openbox.c:271 #: ../plugins/openbox/openbox.c:311 ../plugins/openbox/openbox.c:364 msgid "south" msgstr "južno" #: ../plugins/openbox/openbox.c:255 msgid "southwest" msgstr "jugozapadno" #: ../plugins/openbox/openbox.c:256 ../plugins/openbox/openbox.c:272 #: ../plugins/openbox/openbox.c:312 ../plugins/openbox/openbox.c:364 msgid "west" msgstr "zapadno" #: ../plugins/openbox/openbox.c:256 msgid "northwest" msgstr "secerozapadno" #: ../plugins/openbox/openbox.c:259 ../plugins/openbox/openbox.c:306 #: ../plugins/openbox/openbox.c:367 msgid "direction" msgstr "pravac" #: ../plugins/openbox/openbox.c:264 msgid "desktops" msgstr "radne površi" #. TRANSLATORS: these values are in regard to desktop #: ../plugins/openbox/openbox.c:270 ../plugins/openbox/openbox.c:281 #: ../plugins/openbox/openbox.c:310 ../plugins/openbox/openbox.c:331 #: ../plugins/openbox/openbox.c:334 msgid "current" msgstr "tekuća" #: ../plugins/openbox/openbox.c:270 ../plugins/openbox/openbox.c:310 #: ../plugins/openbox/openbox.c:334 msgid "next" msgstr "naredna" #: ../plugins/openbox/openbox.c:270 ../plugins/openbox/openbox.c:310 msgid "previous" msgstr "prethodna" #: ../plugins/openbox/openbox.c:271 ../plugins/openbox/openbox.c:281 #: ../plugins/openbox/openbox.c:311 msgid "last" msgstr "poslednja" #: ../plugins/openbox/openbox.c:271 ../plugins/openbox/openbox.c:311 msgid "up" msgstr "gornja" #: ../plugins/openbox/openbox.c:272 ../plugins/openbox/openbox.c:312 msgid "down" msgstr "donja" #: ../plugins/openbox/openbox.c:272 ../plugins/openbox/openbox.c:312 #: ../plugins/openbox/openbox.c:322 ../plugins/openbox/openbox.c:357 msgid "left" msgstr "leva" #: ../plugins/openbox/openbox.c:273 ../plugins/openbox/openbox.c:313 #: ../plugins/openbox/openbox.c:322 ../plugins/openbox/openbox.c:358 msgid "right" msgstr "desna" #: ../plugins/openbox/openbox.c:276 ../plugins/openbox/openbox.c:316 #, fuzzy msgid "to" msgstr "u" #: ../plugins/openbox/openbox.c:277 ../plugins/openbox/openbox.c:317 #, fuzzy msgid "wrap" msgstr "prelomi" #: ../plugins/openbox/openbox.c:284 #, fuzzy msgid "where" msgstr "gde" #: ../plugins/openbox/openbox.c:289 msgid "strict" msgstr "" #: ../plugins/openbox/openbox.c:303 msgid "both" msgstr "obje" #: ../plugins/openbox/openbox.c:303 msgid "horizontal" msgstr "vodoravno" #: ../plugins/openbox/openbox.c:303 msgid "vertical" msgstr "uspravno" #: ../plugins/openbox/openbox.c:318 msgid "follow" msgstr "prati" #: ../plugins/openbox/openbox.c:322 ../plugins/openbox/openbox.c:359 #: ../plugins/openbox/openbox.c:371 msgid "top" msgstr "gore" #: ../plugins/openbox/openbox.c:322 ../plugins/openbox/openbox.c:360 #: ../plugins/openbox/openbox.c:371 msgid "bottom" msgstr "dole" #: ../plugins/openbox/openbox.c:323 msgid "topleft" msgstr "gore-levo" #: ../plugins/openbox/openbox.c:323 msgid "topright" msgstr "gore-desno" #: ../plugins/openbox/openbox.c:323 msgid "bottomleft" msgstr "dole-levo" #: ../plugins/openbox/openbox.c:324 msgid "bottomright" msgstr "dole-desno" #: ../plugins/openbox/openbox.c:327 msgid "edge" msgstr "ivica" #. TRANSLATORS: # in config means either pixels, or monitor number #: ../plugins/openbox/openbox.c:331 ../plugins/openbox/openbox.c:346 msgid "#" msgstr "?broj" #. TRANSLATORS: % in config means some fraction value, usually measured in percents #: ../plugins/openbox/openbox.c:333 msgid "%" msgstr "%" #: ../plugins/openbox/openbox.c:334 msgid "prev" msgstr "prethodni" #: ../plugins/openbox/openbox.c:339 msgid "width" msgstr "širina" #: ../plugins/openbox/openbox.c:340 msgid "height" msgstr "visina" #: ../plugins/openbox/openbox.c:371 msgid "normal" msgstr "obično" #: ../plugins/openbox/openbox.c:374 msgid "layer" msgstr "sloj" #: ../plugins/openbox/openbox.c:380 msgid "Execute" msgstr "Izvrši" #: ../plugins/openbox/openbox.c:381 msgid "ShowMenu" msgstr "Prikaži_izbornik" #: ../plugins/openbox/openbox.c:382 msgid "NextWindow" msgstr "Naredni_prozor" #: ../plugins/openbox/openbox.c:383 msgid "PreviousWindow" msgstr "Prethodni_prozor" #: ../plugins/openbox/openbox.c:384 msgid "DirectionalCycleWindows" msgstr "" #: ../plugins/openbox/openbox.c:385 msgid "DirectionalTargetWindow" msgstr "" #: ../plugins/openbox/openbox.c:386 msgid "GoToDesktop" msgstr "Idi_na_površ" #: ../plugins/openbox/openbox.c:387 msgid "AddDesktop" msgstr "Dodaj_površ" #: ../plugins/openbox/openbox.c:388 msgid "RemoveDesktop" msgstr "Ukloni_površ" #: ../plugins/openbox/openbox.c:389 #, fuzzy #| msgid "GoToDesktop" msgid "ToggleShowDesktop" msgstr "Idi_na_površ" #: ../plugins/openbox/openbox.c:390 msgid "ToggleDockAutohide" msgstr "Uklj-Isklj_Samoskrivanje" #: ../plugins/openbox/openbox.c:391 msgid "Reconfigure" msgstr "Prepodesi" #: ../plugins/openbox/openbox.c:392 msgid "Restart" msgstr "Pokreni_opet" #: ../plugins/openbox/openbox.c:393 msgid "Exit" msgstr "Izađi" #: ../plugins/openbox/openbox.c:395 msgid "Focus" msgstr "U_žiži" #: ../plugins/openbox/openbox.c:396 msgid "Raise" msgstr "Izdigni" #: ../plugins/openbox/openbox.c:397 msgid "Lower" msgstr "" #: ../plugins/openbox/openbox.c:398 msgid "RaiseLower" msgstr "" #: ../plugins/openbox/openbox.c:399 msgid "Unfocus" msgstr "Van_žiže" #: ../plugins/openbox/openbox.c:400 msgid "FocusToBottom" msgstr "" #: ../plugins/openbox/openbox.c:401 msgid "Iconify" msgstr "Umanji" #: ../plugins/openbox/openbox.c:402 msgid "Close" msgstr "Zatvori" #: ../plugins/openbox/openbox.c:403 msgid "ToggleShade" msgstr "" #: ../plugins/openbox/openbox.c:404 msgid "Shade" msgstr "Zamotaj" #: ../plugins/openbox/openbox.c:405 msgid "Unshade" msgstr "Odmotaj" #: ../plugins/openbox/openbox.c:406 msgid "ToggleOmnipresent" msgstr "" #: ../plugins/openbox/openbox.c:407 msgid "ToggleMaximize" msgstr "" #: ../plugins/openbox/openbox.c:408 msgid "Maximize" msgstr "Uvećaj" #: ../plugins/openbox/openbox.c:409 msgid "Unmaximize" msgstr "Vrati" #: ../plugins/openbox/openbox.c:410 msgid "ToggleFullscreen" msgstr "" #: ../plugins/openbox/openbox.c:411 msgid "ToggleDecorations" msgstr "" #: ../plugins/openbox/openbox.c:412 msgid "Decorate" msgstr "Ukrasi" #: ../plugins/openbox/openbox.c:413 msgid "Undecorate" msgstr "Ne_ukrašavaj" #: ../plugins/openbox/openbox.c:414 msgid "SendToDesktop" msgstr "Šalji_na_površ" #: ../plugins/openbox/openbox.c:415 msgid "Move" msgstr "Pomeri" #: ../plugins/openbox/openbox.c:416 msgid "Resize" msgstr "Promeni veličinu" #: ../plugins/openbox/openbox.c:417 msgid "MoveResizeTo" msgstr "" #: ../plugins/openbox/openbox.c:418 msgid "MoveRelative" msgstr "" #: ../plugins/openbox/openbox.c:419 msgid "ResizeRelative" msgstr "" #: ../plugins/openbox/openbox.c:420 msgid "MoveToEdge" msgstr "" #: ../plugins/openbox/openbox.c:421 msgid "GrowToEdge" msgstr "" #: ../plugins/openbox/openbox.c:422 msgid "ShrinkToEdge" msgstr "" #: ../plugins/openbox/openbox.c:423 msgid "GrowToFill" msgstr "" #: ../plugins/openbox/openbox.c:424 msgid "ToggleAlwaysOnTop" msgstr "" #: ../plugins/openbox/openbox.c:425 msgid "ToggleAlwaysOnBottom" msgstr "" #: ../plugins/openbox/openbox.c:426 msgid "SendToLayer" msgstr "Šalji_na_sloj" #: ../plugins/openbox/openbox.c:517 msgid "Duplicate section in the rc.xml file." msgstr "Dvostruka vrednost odeljka „“ u datoteci „rc.xml“!" #: ../plugins/openbox/openbox.c:548 ../plugins/openbox/openbox.c:790 msgid "Internal error." msgstr "Unutrašnja greška." #: ../plugins/openbox/openbox.c:592 msgid "rc.xml error: no key is set for a keybind." msgstr "Greška u datoteci „rc.xml“: nema tastera za pridruživanje." #: ../plugins/openbox/openbox.c:663 msgid "Invalid rc.xml: action with a sub-action." msgstr "Nije valjana „rc.xml“ datoteka: radnja sa pod-radnjom." #: ../plugins/openbox/openbox.c:779 msgid "rc.xml error: no name is set for action." msgstr "Greška u datoteci „rc.xml“: radnja je bez naziva." #: ../plugins/openbox/openbox.c:809 #, c-format msgid "rc.xml error: empty tag <%s> is prohibited." msgstr "Greška u datoteci „rc.xml“: Nije dozvoljena prazna oznaka „<%s>“." #: ../plugins/openbox/openbox.c:901 msgid "Could not find the rc.xml file anywhere." msgstr "Ne mogu nigde da nađem datoteku „rc.xml“." #: ../plugins/openbox/openbox.c:949 ../plugins/openbox/openbox.c:1063 #: ../plugins/openbox/openbox.c:1210 ../plugins/openbox/openbox.c:1228 msgid "No WM configuration is available." msgstr "Nije dostupno podešavanje upravnika prozora." #: ../plugins/openbox/openbox.c:1067 msgid "Keybinding should activate at least one action." msgstr "Pridruživanje mora da pokreće bar jednu radnju." #: ../plugins/openbox/openbox.c:1096 ../plugins/openbox/openbox.c:1106 #: ../plugins/openbox/openbox.c:1262 ../plugins/openbox/openbox.c:1272 #, fuzzy, c-format msgid "Hotkey '%s' is already bound to an action." msgstr "Prečica „%s“ je pridružena drugoj radnji." #: ../plugins/openbox/openbox.c:1232 msgid "The exec line cannot be empty." msgstr "Liniija naredbe ne može da bude prazna." #: ../plugins/gtk/gtk.c:133 ../plugins/gtk/gtk.c:156 msgid "Cannot delete keybinding: " msgstr "Ne mogu da uklonim pridruživanje: " #. TRANSLATORS: Replace this string with your names, one name per line. #: ../plugins/gtk/gtk.c:176 msgid "translator-credits" msgstr "Srpski — Jay A. Fleming " #: ../plugins/gtk/gtk.c:184 msgid "Copyright (C) 2016-2025" msgstr "Autorska prava — 2016-2025." #: ../plugins/gtk/gtk.c:185 msgid "Keyboard shortcuts configurator" msgstr "Upravnik prečica tastature" #: ../plugins/gtk/gtk.c:208 msgid "_File" msgstr "_Datoteka" #: ../plugins/gtk/gtk.c:209 msgid "_Reload" msgstr "_Osveži" #: ../plugins/gtk/gtk.c:210 msgid "" "Drop all unsaved changes and reload all keys from Window Manager " "configuration" msgstr "" "Poništi sve nesačuvane izmene i učitaj vrednosti iz podešavanja upravnika " "prozora" #: ../plugins/gtk/gtk.c:213 msgid "Save all changes and apply them to Window Manager configuration" msgstr "Sačuvaj sve izmene i primeni ih na podešavanja upravnika prozora" #: ../plugins/gtk/gtk.c:216 msgid "Exit the application without saving" msgstr "Napusti program bez čuvanja izmena" #: ../plugins/gtk/gtk.c:217 msgid "_Edit" msgstr "_Uredi" #: ../plugins/gtk/gtk.c:218 msgid "Create new action" msgstr "Stvori novu radnju" #: ../plugins/gtk/gtk.c:220 msgid "Remove selected action" msgstr "Ukloni odabranu radnju" #: ../plugins/gtk/gtk.c:222 msgid "Change selected action" msgstr "Izmeni odabranu radnju" #: ../plugins/gtk/gtk.c:224 msgid "_Help" msgstr "_Pomoć" #: ../plugins/gtk/gtk.c:441 msgid "Action" msgstr "Radnja" #: ../plugins/gtk/gtk.c:444 msgid "Option" msgstr "Postavka" #: ../plugins/gtk/gtk.c:447 ../plugins/gtk/gtk.c:467 ../plugins/gtk/edit.c:1111 msgid "Hotkey 1" msgstr "Prečica 1" #: ../plugins/gtk/gtk.c:450 ../plugins/gtk/gtk.c:470 ../plugins/gtk/edit.c:1115 msgid "Hotkey 2" msgstr "Prečica 2" #: ../plugins/gtk/gtk.c:458 msgid "Actions" msgstr "Radnje" #: ../plugins/gtk/gtk.c:464 msgid "Command" msgstr "Naredba" #: ../plugins/gtk/gtk.c:478 msgid "Programs" msgstr "Programi" #: ../plugins/gtk/gtk.c:497 ../plugins/gtk/edit.c:511 msgid "Error" msgstr "Greška" #: ../plugins/gtk/lxhotkey-gtk.desktop.in.h:1 msgid "Setup Hot Keys" msgstr "Podešavanja „vrućih“ tastera" #: ../plugins/gtk/lxhotkey-gtk.desktop.in.h:2 msgid "View and change Window Manager global shortcuts" msgstr "Pregled i izmena opštih prečica upravnika prozora" #: ../plugins/gtk/lxhotkey-gtk.desktop.in.h:3 msgid "hotkey;shortcut;system;settings;" msgstr "taster;prečica;sistem;postavke;" #: ../plugins/gtk/edit.c:266 msgid "Apply error: " msgstr "" #: ../plugins/gtk/edit.c:281 ../plugins/gtk/edit.c:395 msgid "Add action" msgstr "Dodaj radnju" #: ../plugins/gtk/edit.c:293 ../plugins/gtk/edit.c:397 msgid "Add option" msgstr "Dodaj postavku" #: ../plugins/gtk/edit.c:355 msgid "Change option" msgstr "Izmeni postavku" #: ../plugins/gtk/edit.c:420 msgid "Discard changes" msgstr "Poništi izmene" #: ../plugins/gtk/edit.c:421 msgid "Accept changes" msgstr "Sačuvaj promene" #: ../plugins/gtk/edit.c:422 msgid "Add an action" msgstr "Dodaj radnju" #: ../plugins/gtk/edit.c:423 msgid "Add an option to this command" msgstr "Dodaj postavku ovoj naredbi" #: ../plugins/gtk/edit.c:425 msgid "Remove selection" msgstr "Ukloni odabrano" #: ../plugins/gtk/edit.c:426 msgid "Change selected option" msgstr "Izmeni odabranu postavku" #: ../plugins/gtk/edit.c:427 msgid "Add an option to selection" msgstr "Dodaj postavku odabranom" #: ../plugins/gtk/edit.c:508 #, c-format msgid "Key combination '%s' cannot be used as a global hotkey, sorry." msgstr "Kombinacija tastera „%s“ ne može da se upotrebi kao opšta prečica." #: ../plugins/gtk/edit.c:571 msgid "Click to select, then press a key" msgstr "" #: ../plugins/gtk/edit.c:1128 msgid "Actions:" msgstr "Radnje:" #: ../plugins/gtk/edit.c:1136 msgid "Command line:" msgstr "Linija naredbe:" #: ../plugins/gtk/edit.c:1147 msgid "Options:" msgstr "Postavke:" #: ../plugins/gtk/edit.c:1169 msgid "Name:" msgstr "Naziv:" #: ../plugins/gtk/edit.c:1190 msgid "Value:" msgstr "Vrednost:" #, c-format #~ msgid " %s show - show the action bound to a key\n" #~ msgstr "" #~ " %s show — prikazuje radnju pridruženu tasteru\n" #, c-format #~ msgid "Window manager %s isn't supported now, sorry." #~ msgstr "Na žalost, upravnik prozora „%s“ još uvek nije podržan." lxhotkey-0.1.2/po/uk.po000066400000000000000000000575641476256652500150210ustar00rootroot00000000000000# Ukrainian translation for LXHotkey. # Copyright (C) 2016 LXDE development team. # This file is distributed under the same license as the LXHotkey package. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: LXHotkey 0.1.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-09-18 15:23+0200\n" "PO-Revision-Date: 2016-11-07 23:16+0200\n" "Last-Translator: Andriy Grytsenko \n" "Language: uk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../src/lxhotkey.c:244 msgid "Usage: %s global [] - show keys bound to action(s)\n" msgstr "" "Використання: %s global [<клавіша>] - показати клавіші, прив'язані до " "дії\n" #: ../src/lxhotkey.c:245 #, c-format msgid " %s global - bind a key to the action\n" msgstr " %s global <дія> <клавіша> - прив'язати клавішу до дії\n" #: ../src/lxhotkey.c:246 msgid " %s app [] - show keys bound to exec line\n" msgstr "" " %s app [<клавіша>] - показати клавіші, прив'язані до " "команди\n" #: ../src/lxhotkey.c:247 #, c-format msgid " %s app - bind a key to some exec line\n" msgstr "" " %s app <команда> <клавіша> - прив'язати клавішу до команди\n" #: ../src/lxhotkey.c:248 #, c-format msgid " %s app -- - unbind all keys from exec line\n" msgstr "" " %s app <команда> -- - від'вязати всі клавіші від " "команди\n" #: ../src/lxhotkey.c:250 #, c-format msgid " %s --gui= - start with GUI\n" msgstr "" " %s --gui=<тип> - запустити графічний інтерфейс\n" #: ../src/lxhotkey.c:345 msgid "empty option name." msgstr "порожня назва параметру." #: ../src/lxhotkey.c:348 msgid "empty action name." msgstr "порожня назва дії." #: ../src/lxhotkey.c:380 #, c-format msgid "no matching option '%s' found for action '%s'." msgstr "не знайдено підходящого параметру '%s' до дії '%s'." #: ../src/lxhotkey.c:384 #, c-format msgid "action '%s' isn't supported by WM %s." msgstr "дія '%s' не підтримується менеджером вікон %s." #: ../src/lxhotkey.c:401 #, c-format msgid "value '%s' is not supported for option '%s'." msgstr "значення '%s' не підтримується для параметру '%s'." #: ../src/lxhotkey.c:405 #, c-format msgid "value '%s' is not supported for action '%s'." msgstr "значення '%s' не підтримується для дії '%s'." #: ../src/lxhotkey.c:418 #, c-format msgid "action '%s' does not support options." msgstr "дія '%s' не має параметрів." #: ../src/lxhotkey.c:500 msgid "Sorry, cannot configure keys remotely." msgstr "Вибачте, але змінювати прив'язки клавіш можна лише локально." #: ../src/lxhotkey.c:508 msgid "Could not determine window manager running." msgstr "Не вийшло визначити запущений менеджер вікон." #: ../src/lxhotkey.c:516 #, fuzzy, c-format #| msgid "Could not determine window manager running." msgid "Could not find a plugin for window manager %s." msgstr "Не вийшло визначити запущений менеджер вікон." #: ../src/lxhotkey.c:523 ../plugins/gtk/gtk.c:75 msgid "Problems loading configuration: " msgstr "Проблеми завантаження конфігурації: " #: ../src/lxhotkey.c:532 #, c-format msgid "GUI type %s currently isn't supported." msgstr "Графічний інтерфейс %s не підтримується." #: ../src/lxhotkey.c:549 ../src/lxhotkey.c:625 msgid "Invalid request: " msgstr "Поганий запит: " #: ../src/lxhotkey.c:559 ../src/lxhotkey.c:637 ../plugins/gtk/gtk.c:90 msgid "Problems saving configuration: " msgstr "Проблеми збереження конфігурації: " #: ../src/lxhotkey.c:576 msgid "ACTION(s)" msgstr "ДІЇ" #: ../src/lxhotkey.c:576 ../src/lxhotkey.c:654 msgid "KEY(s)" msgstr "КЛАВІШІ" #: ../src/lxhotkey.c:654 msgid "EXEC" msgstr "КОМАНДА" #: ../src/lxhotkey.c:676 msgid "Requested operation isn't supported." msgstr "Запитана операція не підтримується." #: ../plugins/openbox/openbox.c:185 msgid "Failed to reconfigure Openbox." msgstr "Не вдалося переконфігурувати Openbox." #: ../plugins/openbox/openbox.c:204 msgid "yes" msgstr "так" #: ../plugins/openbox/openbox.c:204 msgid "no" msgstr "ні" #: ../plugins/openbox/openbox.c:207 msgid "enabled" msgstr "ввімкнено" #: ../plugins/openbox/openbox.c:208 msgid "wmclass" msgstr "клас менеджера вікон" #: ../plugins/openbox/openbox.c:209 msgid "name" msgstr "назва" #: ../plugins/openbox/openbox.c:210 msgid "icon" msgstr "значок" #: ../plugins/openbox/openbox.c:215 ../plugins/openbox/openbox.c:294 msgid "command" msgstr "команда" #: ../plugins/openbox/openbox.c:216 ../plugins/openbox/openbox.c:299 msgid "prompt" msgstr "запрошення" #: ../plugins/openbox/openbox.c:217 msgid "startupnotify" msgstr "повідомлення запуску" #: ../plugins/openbox/openbox.c:221 ../plugins/openbox/openbox.c:331 msgid "center" msgstr "центр" #: ../plugins/openbox/openbox.c:222 msgid "default" msgstr "за замовчанням" #: ../plugins/openbox/openbox.c:222 msgid "primary" msgstr "первинний" #: ../plugins/openbox/openbox.c:222 msgid "mouse" msgstr "миша" #: ../plugins/openbox/openbox.c:223 msgid "active" msgstr "активний" #: ../plugins/openbox/openbox.c:223 ../plugins/openbox/openbox.c:334 msgid "all" msgstr "всі" #: ../plugins/openbox/openbox.c:228 ../plugins/openbox/openbox.c:341 msgid "monitor" msgstr "монітор" #: ../plugins/openbox/openbox.c:233 msgid "menu" msgstr "меню" #: ../plugins/openbox/openbox.c:234 msgid "position" msgstr "позиція" #: ../plugins/openbox/openbox.c:238 msgid "list" msgstr "перелік" #: ../plugins/openbox/openbox.c:238 msgid "icons" msgstr "значки" #: ../plugins/openbox/openbox.c:238 msgid "none" msgstr "жодного" #: ../plugins/openbox/openbox.c:241 ../plugins/openbox/openbox.c:260 msgid "dialog" msgstr "діалог" #: ../plugins/openbox/openbox.c:242 ../plugins/openbox/openbox.c:261 msgid "bar" msgstr "пенал" #: ../plugins/openbox/openbox.c:243 ../plugins/openbox/openbox.c:262 msgid "raise" msgstr "підняти" #: ../plugins/openbox/openbox.c:244 msgid "allDesktops" msgstr "всі стільниці" #: ../plugins/openbox/openbox.c:245 ../plugins/openbox/openbox.c:263 msgid "panels" msgstr "панелі" #: ../plugins/openbox/openbox.c:246 msgid "desktop" msgstr "стільниця" #: ../plugins/openbox/openbox.c:247 msgid "linear" msgstr "лінійний" #: ../plugins/openbox/openbox.c:248 msgid "interactive" msgstr "інтерактивний" #. TRANSLATORS: finalactions means actions when done #: ../plugins/openbox/openbox.c:250 ../plugins/openbox/openbox.c:265 msgid "finalactions" msgstr "дії по завершенню" #: ../plugins/openbox/openbox.c:254 ../plugins/openbox/openbox.c:271 #: ../plugins/openbox/openbox.c:311 ../plugins/openbox/openbox.c:364 msgid "north" msgstr "північ" #: ../plugins/openbox/openbox.c:254 msgid "northeast" msgstr "північний схід" #: ../plugins/openbox/openbox.c:254 ../plugins/openbox/openbox.c:272 #: ../plugins/openbox/openbox.c:312 ../plugins/openbox/openbox.c:364 msgid "east" msgstr "схід" #: ../plugins/openbox/openbox.c:255 msgid "southeast" msgstr "південний схід" #: ../plugins/openbox/openbox.c:255 ../plugins/openbox/openbox.c:271 #: ../plugins/openbox/openbox.c:311 ../plugins/openbox/openbox.c:364 msgid "south" msgstr "південь" #: ../plugins/openbox/openbox.c:255 msgid "southwest" msgstr "південний захід" #: ../plugins/openbox/openbox.c:256 ../plugins/openbox/openbox.c:272 #: ../plugins/openbox/openbox.c:312 ../plugins/openbox/openbox.c:364 msgid "west" msgstr "захід" #: ../plugins/openbox/openbox.c:256 msgid "northwest" msgstr "північний захід" #: ../plugins/openbox/openbox.c:259 ../plugins/openbox/openbox.c:306 #: ../plugins/openbox/openbox.c:367 msgid "direction" msgstr "напрямок" #: ../plugins/openbox/openbox.c:264 msgid "desktops" msgstr "стільниці" #. TRANSLATORS: these values are in regard to desktop #: ../plugins/openbox/openbox.c:270 ../plugins/openbox/openbox.c:281 #: ../plugins/openbox/openbox.c:310 ../plugins/openbox/openbox.c:331 #: ../plugins/openbox/openbox.c:334 msgid "current" msgstr "поточний" #: ../plugins/openbox/openbox.c:270 ../plugins/openbox/openbox.c:310 #: ../plugins/openbox/openbox.c:334 msgid "next" msgstr "наступний" #: ../plugins/openbox/openbox.c:270 ../plugins/openbox/openbox.c:310 msgid "previous" msgstr "попередній" #: ../plugins/openbox/openbox.c:271 ../plugins/openbox/openbox.c:281 #: ../plugins/openbox/openbox.c:311 msgid "last" msgstr "останній" #: ../plugins/openbox/openbox.c:271 ../plugins/openbox/openbox.c:311 msgid "up" msgstr "вгору" #: ../plugins/openbox/openbox.c:272 ../plugins/openbox/openbox.c:312 msgid "down" msgstr "донизу" #: ../plugins/openbox/openbox.c:272 ../plugins/openbox/openbox.c:312 #: ../plugins/openbox/openbox.c:322 ../plugins/openbox/openbox.c:357 msgid "left" msgstr "ліворуч" #: ../plugins/openbox/openbox.c:273 ../plugins/openbox/openbox.c:313 #: ../plugins/openbox/openbox.c:322 ../plugins/openbox/openbox.c:358 msgid "right" msgstr "праворуч" #: ../plugins/openbox/openbox.c:276 ../plugins/openbox/openbox.c:316 msgid "to" msgstr "до" #: ../plugins/openbox/openbox.c:277 ../plugins/openbox/openbox.c:317 msgid "wrap" msgstr "згорнути" #: ../plugins/openbox/openbox.c:284 msgid "where" msgstr "де" #: ../plugins/openbox/openbox.c:289 msgid "strict" msgstr "жорстко" #: ../plugins/openbox/openbox.c:303 msgid "both" msgstr "обидва" #: ../plugins/openbox/openbox.c:303 msgid "horizontal" msgstr "горизонтально" #: ../plugins/openbox/openbox.c:303 msgid "vertical" msgstr "вертикально" #: ../plugins/openbox/openbox.c:318 msgid "follow" msgstr "слідкувати" #: ../plugins/openbox/openbox.c:322 ../plugins/openbox/openbox.c:359 #: ../plugins/openbox/openbox.c:371 msgid "top" msgstr "верхній" #: ../plugins/openbox/openbox.c:322 ../plugins/openbox/openbox.c:360 #: ../plugins/openbox/openbox.c:371 msgid "bottom" msgstr "нижній" #: ../plugins/openbox/openbox.c:323 msgid "topleft" msgstr "верхній ліворуч" #: ../plugins/openbox/openbox.c:323 msgid "topright" msgstr "верхній праворуч" #: ../plugins/openbox/openbox.c:323 msgid "bottomleft" msgstr "нижній ліворуч" #: ../plugins/openbox/openbox.c:324 msgid "bottomright" msgstr "нижній праворуч" #: ../plugins/openbox/openbox.c:327 msgid "edge" msgstr "край" #. TRANSLATORS: # in config means either pixels, or monitor number #: ../plugins/openbox/openbox.c:331 ../plugins/openbox/openbox.c:346 msgid "#" msgstr "число" #. TRANSLATORS: % in config means some fraction value, usually measured in percents #: ../plugins/openbox/openbox.c:333 msgid "%" msgstr "частка" #: ../plugins/openbox/openbox.c:334 msgid "prev" msgstr "попередній" #: ../plugins/openbox/openbox.c:339 msgid "width" msgstr "ширина" #: ../plugins/openbox/openbox.c:340 msgid "height" msgstr "висота" #: ../plugins/openbox/openbox.c:371 msgid "normal" msgstr "звичайний" #: ../plugins/openbox/openbox.c:374 msgid "layer" msgstr "шар" #: ../plugins/openbox/openbox.c:380 msgid "Execute" msgstr "виконати" #: ../plugins/openbox/openbox.c:381 msgid "ShowMenu" msgstr "показати меню" #: ../plugins/openbox/openbox.c:382 msgid "NextWindow" msgstr "наступне вікно" #: ../plugins/openbox/openbox.c:383 msgid "PreviousWindow" msgstr "попереднє вікно" #: ../plugins/openbox/openbox.c:384 msgid "DirectionalCycleWindows" msgstr "перейти до вікна у напрямку" #: ../plugins/openbox/openbox.c:385 msgid "DirectionalTargetWindow" msgstr "обрати вікно у напрямку" #: ../plugins/openbox/openbox.c:386 msgid "GoToDesktop" msgstr "перейти до стільниці" #: ../plugins/openbox/openbox.c:387 msgid "AddDesktop" msgstr "додати стільницю" #: ../plugins/openbox/openbox.c:388 msgid "RemoveDesktop" msgstr "видалити стільницю" #: ../plugins/openbox/openbox.c:389 msgid "ToggleShowDesktop" msgstr "показати стільницю/вікна" #: ../plugins/openbox/openbox.c:390 msgid "ToggleDockAutohide" msgstr "ввімкнути/вимкнути ховання доку" #: ../plugins/openbox/openbox.c:391 msgid "Reconfigure" msgstr "переконфігурувати" #: ../plugins/openbox/openbox.c:392 msgid "Restart" msgstr "перезапустити" #: ../plugins/openbox/openbox.c:393 msgid "Exit" msgstr "вийти" #: ../plugins/openbox/openbox.c:395 msgid "Focus" msgstr "отримати фокус" #: ../plugins/openbox/openbox.c:396 msgid "Raise" msgstr "підняти" #: ../plugins/openbox/openbox.c:397 msgid "Lower" msgstr "опустити" #: ../plugins/openbox/openbox.c:398 msgid "RaiseLower" msgstr "підняти та опустити" #: ../plugins/openbox/openbox.c:399 msgid "Unfocus" msgstr "залишити фокус" #: ../plugins/openbox/openbox.c:400 msgid "FocusToBottom" msgstr "фокус на нижнє" #: ../plugins/openbox/openbox.c:401 msgid "Iconify" msgstr "згорнути" #: ../plugins/openbox/openbox.c:402 msgid "Close" msgstr "закрити" #: ../plugins/openbox/openbox.c:403 msgid "ToggleShade" msgstr "ввімкнути/вимнути тінь" #: ../plugins/openbox/openbox.c:404 msgid "Shade" msgstr "затінити" #: ../plugins/openbox/openbox.c:405 msgid "Unshade" msgstr "зняти затінення" #: ../plugins/openbox/openbox.c:406 msgid "ToggleOmnipresent" msgstr "ввімкнути/вимкнути \"Показувати всюди\"" #: ../plugins/openbox/openbox.c:407 msgid "ToggleMaximize" msgstr "ввімкнути/вимкнути \"Максимізувати\"" #: ../plugins/openbox/openbox.c:408 msgid "Maximize" msgstr "максимізувати" #: ../plugins/openbox/openbox.c:409 msgid "Unmaximize" msgstr "зняти максимізацію" #: ../plugins/openbox/openbox.c:410 msgid "ToggleFullscreen" msgstr "ввімкнути/вимкнути \"На повний екран\"" #: ../plugins/openbox/openbox.c:411 msgid "ToggleDecorations" msgstr "ввімкнути/вимкнути рамку" #: ../plugins/openbox/openbox.c:412 msgid "Decorate" msgstr "обрамити" #: ../plugins/openbox/openbox.c:413 msgid "Undecorate" msgstr "зняти обрамлення" #: ../plugins/openbox/openbox.c:414 msgid "SendToDesktop" msgstr "надіслати до стільниці" #: ../plugins/openbox/openbox.c:415 msgid "Move" msgstr "перемістити" #: ../plugins/openbox/openbox.c:416 msgid "Resize" msgstr "змінити розмір" #: ../plugins/openbox/openbox.c:417 msgid "MoveResizeTo" msgstr "змінити розмір та перемістити" #: ../plugins/openbox/openbox.c:418 msgid "MoveRelative" msgstr "відносне переміщення" #: ../plugins/openbox/openbox.c:419 msgid "ResizeRelative" msgstr "відносна зміна розміру" #: ../plugins/openbox/openbox.c:420 msgid "MoveToEdge" msgstr "перемістити до краю" #: ../plugins/openbox/openbox.c:421 msgid "GrowToEdge" msgstr "розширити до краю" #: ../plugins/openbox/openbox.c:422 msgid "ShrinkToEdge" msgstr "підрізати по краю" #: ../plugins/openbox/openbox.c:423 msgid "GrowToFill" msgstr "розширити до заповнення" #: ../plugins/openbox/openbox.c:424 msgid "ToggleAlwaysOnTop" msgstr "ввімкнути/вимкнути \"Завжди нагорі\"" #: ../plugins/openbox/openbox.c:425 msgid "ToggleAlwaysOnBottom" msgstr "ввімкнути/вимкнути \"Завжди внизу\"" #: ../plugins/openbox/openbox.c:426 msgid "SendToLayer" msgstr "надіслати до шару" #: ../plugins/openbox/openbox.c:517 msgid "Duplicate section in the rc.xml file." msgstr "Подвійна секція в файлі rc.xml." #: ../plugins/openbox/openbox.c:548 ../plugins/openbox/openbox.c:790 msgid "Internal error." msgstr "Внутрішня помилка." #: ../plugins/openbox/openbox.c:592 msgid "rc.xml error: no key is set for a keybind." msgstr "Помилка у rc.xml: клавішу прив'язки не зазначено." #: ../plugins/openbox/openbox.c:663 msgid "Invalid rc.xml: action with a sub-action." msgstr "Помилка у rc.xml: дія всередині іншої дії." #: ../plugins/openbox/openbox.c:779 msgid "rc.xml error: no name is set for action." msgstr "Помилка у rc.xml: не зазначено назви дії." #: ../plugins/openbox/openbox.c:809 #, c-format msgid "rc.xml error: empty tag <%s> is prohibited." msgstr "Помилка у rc.xml: використання порожнього тегу <%s> заборонено." #: ../plugins/openbox/openbox.c:901 msgid "Could not find the rc.xml file anywhere." msgstr "Ніде не вдалося знайти файл rc.xml." #: ../plugins/openbox/openbox.c:949 ../plugins/openbox/openbox.c:1063 #: ../plugins/openbox/openbox.c:1210 ../plugins/openbox/openbox.c:1228 msgid "No WM configuration is available." msgstr "Не вдалося отримати конфігурацію менеджера вікон." #: ../plugins/openbox/openbox.c:1067 msgid "Keybinding should activate at least one action." msgstr "Прив'язка має активувати щонайменше одну дію." #: ../plugins/openbox/openbox.c:1096 ../plugins/openbox/openbox.c:1106 #: ../plugins/openbox/openbox.c:1262 ../plugins/openbox/openbox.c:1272 #, c-format msgid "Hotkey '%s' is already bound to an action." msgstr "Клавішу '%s' вже прив'язано до іншої дії." #: ../plugins/openbox/openbox.c:1232 msgid "The exec line cannot be empty." msgstr "Командний рядок не може бути порожнім." #: ../plugins/gtk/gtk.c:133 ../plugins/gtk/gtk.c:156 msgid "Cannot delete keybinding: " msgstr "Неможливо видалити прив'язку клавіш: " #. TRANSLATORS: Replace this string with your names, one name per line. #: ../plugins/gtk/gtk.c:176 msgid "translator-credits" msgstr "Андрій Гриценко " #: ../plugins/gtk/gtk.c:184 msgid "Copyright (C) 2016-2025" msgstr "Права застережено (C) 2016-2025" #: ../plugins/gtk/gtk.c:185 msgid "Keyboard shortcuts configurator" msgstr "Зміна прив'язок клавіш" #: ../plugins/gtk/gtk.c:208 msgid "_File" msgstr "_Файл" #: ../plugins/gtk/gtk.c:209 msgid "_Reload" msgstr "_Перезавантажити" #: ../plugins/gtk/gtk.c:210 msgid "" "Drop all unsaved changes and reload all keys from Window Manager " "configuration" msgstr "" "Відкинути всі не збережені зміни та перезавантажити всі прив'язки з " "конфігурації менеджера вікон" #: ../plugins/gtk/gtk.c:213 msgid "Save all changes and apply them to Window Manager configuration" msgstr "Зберегти всі зміни та застосувати їх до конфігурації менеджера вікон" #: ../plugins/gtk/gtk.c:216 msgid "Exit the application without saving" msgstr "Вийти з програми без збереження" #: ../plugins/gtk/gtk.c:217 msgid "_Edit" msgstr "_Редагувати" #: ../plugins/gtk/gtk.c:218 msgid "Create new action" msgstr "Створити нову дію" #: ../plugins/gtk/gtk.c:220 msgid "Remove selected action" msgstr "Видалити обрану дію" #: ../plugins/gtk/gtk.c:222 msgid "Change selected action" msgstr "Змінити параметри обраної дії" #: ../plugins/gtk/gtk.c:224 msgid "_Help" msgstr "_Допомога" #: ../plugins/gtk/gtk.c:441 msgid "Action" msgstr "Дія" #: ../plugins/gtk/gtk.c:444 msgid "Option" msgstr "Параметр" #: ../plugins/gtk/gtk.c:447 ../plugins/gtk/gtk.c:467 ../plugins/gtk/edit.c:1111 msgid "Hotkey 1" msgstr "Прив'язка 1" #: ../plugins/gtk/gtk.c:450 ../plugins/gtk/gtk.c:470 ../plugins/gtk/edit.c:1115 msgid "Hotkey 2" msgstr "Прив'язка 2" #: ../plugins/gtk/gtk.c:458 msgid "Actions" msgstr "Дії" #: ../plugins/gtk/gtk.c:464 msgid "Command" msgstr "Команда" #: ../plugins/gtk/gtk.c:478 msgid "Programs" msgstr "Програми" #: ../plugins/gtk/gtk.c:497 ../plugins/gtk/edit.c:511 msgid "Error" msgstr "Помилка" #: ../plugins/gtk/lxhotkey-gtk.desktop.in.h:1 msgid "Setup Hot Keys" msgstr "Налаштувати гарячі клавіші" #: ../plugins/gtk/lxhotkey-gtk.desktop.in.h:2 msgid "View and change Window Manager global shortcuts" msgstr "Переглянути або змінити глобальні прив'язки клавіш менеджера вікон" #: ../plugins/gtk/lxhotkey-gtk.desktop.in.h:3 msgid "hotkey;shortcut;system;settings;" msgstr "прив'язка;гаряча клавіша;стільниця;налаштування;" #: ../plugins/gtk/edit.c:266 msgid "Apply error: " msgstr "Помилка застосування: " #: ../plugins/gtk/edit.c:281 ../plugins/gtk/edit.c:395 msgid "Add action" msgstr "Додати дію" #: ../plugins/gtk/edit.c:293 ../plugins/gtk/edit.c:397 msgid "Add option" msgstr "Додати параметр" #: ../plugins/gtk/edit.c:355 msgid "Change option" msgstr "Змінити параметр" #: ../plugins/gtk/edit.c:420 msgid "Discard changes" msgstr "Відкинути зміни" #: ../plugins/gtk/edit.c:421 msgid "Accept changes" msgstr "Прийняти зміни" #: ../plugins/gtk/edit.c:422 msgid "Add an action" msgstr "Додати дію" #: ../plugins/gtk/edit.c:423 msgid "Add an option to this command" msgstr "Додати параметр до цієї команди" #: ../plugins/gtk/edit.c:425 msgid "Remove selection" msgstr "Видалити обрану дію або параметр" #: ../plugins/gtk/edit.c:426 msgid "Change selected option" msgstr "Змінити обраний параметр" #: ../plugins/gtk/edit.c:427 msgid "Add an option to selection" msgstr "Додати параметр до обраної дії або параметру" #: ../plugins/gtk/edit.c:508 #, c-format msgid "Key combination '%s' cannot be used as a global hotkey, sorry." msgstr "" "Вибачте, але комбінація клавіш '%s' не може бути використана в якості " "глобальної." #: ../plugins/gtk/edit.c:571 msgid "Click to select, then press a key" msgstr "" #: ../plugins/gtk/edit.c:1128 msgid "Actions:" msgstr "Дії:" #: ../plugins/gtk/edit.c:1136 msgid "Command line:" msgstr "Командний рядок:" #: ../plugins/gtk/edit.c:1147 msgid "Options:" msgstr "Параметри:" #: ../plugins/gtk/edit.c:1169 msgid "Name:" msgstr "Назва:" #: ../plugins/gtk/edit.c:1190 msgid "Value:" msgstr "Значення:" #, c-format #~ msgid " %s show - show the action bound to a key\n" #~ msgstr "" #~ " %s <клавіша> - показати дію, прив'язану до " #~ "клавіші\n" #, c-format #~ msgid "Window manager %s isn't supported now, sorry." #~ msgstr "Вибачте, але менеджер вікон %s не підтримується." lxhotkey-0.1.2/src/000077500000000000000000000000001476256652500141725ustar00rootroot00000000000000lxhotkey-0.1.2/src/Makefile.am000066400000000000000000000006251476256652500162310ustar00rootroot00000000000000## Process this file with automake to produce Makefile.in bin_PROGRAMS = lxhotkey lxhotkey_CPPFLAGS = \ -I$(top_srcdir) \ -DPACKAGE_PLUGINS_DIR=\""$(libdir)/lxhotkey"\" \ -DPACKAGE_LOCALE_DIR=\""$(prefix)/$(DATADIRNAME)/locale"\" \ $(PACKAGE_CFLAGS) lxhotkey_SOURCES = lxhotkey.c lxhotkey_LDADD = $(PACKAGE_LIBS) lxhotkey_includedir = $(includedir)/lxhotkey lxhotkey_include_HEADERS = lxhotkey.h lxhotkey-0.1.2/src/lxhotkey.c000066400000000000000000000611061476256652500162110ustar00rootroot00000000000000/* * Copyright (C) 2016 Andriy Grytsenko * 2023 Ingo Brückl * * This file is a part of LXHotkey project. * * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include "lxhotkey.h" #include #include #include #include #ifdef HAVE_LIBUNISTRING # include # define ulc_printf(...) ulc_fprintf(stdout,__VA_ARGS__) #else # define ulc_printf printf #endif /* for errors */ static GQuark LXKEYS_ERROR; typedef enum { LXKEYS_BAD_ARGS, /* invalid commandline arguments */ LXKEYS_NOT_SUPPORTED /* operation not supported */ } LXHotkeyError; /* simple functions to manage LXHotkeyAttr data type */ static inline LXHotkeyAttr *lxhotkey_attr_new(void) { return g_slice_new0(LXHotkeyAttr); } #define free_actions(acts) g_list_free_full(acts, (GDestroyNotify)lxkeys_attr_free) static void lxkeys_attr_free(LXHotkeyAttr *data) { g_free(data->name); g_list_free_full(data->values, g_free); free_actions(data->subopts); g_free(data->desc); g_slice_free(LXHotkeyAttr, data); } #define NONULL(a) (a) ? ((char *)a) : "" /* this function is taken from wmctrl utility */ #define MAX_PROPERTY_VALUE_LEN 4096 static gchar *get_property (Display *disp, Window win, /*{{{*/ Atom xa_prop_type, gchar *prop_name, unsigned long *size) { Atom xa_prop_name; Atom xa_ret_type; int ret_format; unsigned long ret_nitems; unsigned long ret_bytes_after; unsigned long tmp_size; unsigned char *ret_prop; gchar *ret; xa_prop_name = XInternAtom(disp, prop_name, False); /* MAX_PROPERTY_VALUE_LEN / 4 explanation (XGetWindowProperty manpage): * * long_length = Specifies the length in 32-bit multiples of the * data to be retrieved. * * NOTE: see * http://mail.gnome.org/archives/wm-spec-list/2003-March/msg00067.html * In particular: * * When the X window system was ported to 64-bit architectures, a * rather peculiar design decision was made. 32-bit quantities such * as Window IDs, atoms, etc, were kept as longs in the client side * APIs, even when long was changed to 64 bits. * */ if (XGetWindowProperty(disp, win, xa_prop_name, 0, MAX_PROPERTY_VALUE_LEN / 4, False, xa_prop_type, &xa_ret_type, &ret_format, &ret_nitems, &ret_bytes_after, &ret_prop) != Success) { return NULL; } if (xa_ret_type != xa_prop_type) { XFree(ret_prop); return NULL; } /* null terminate the result to make string handling easier */ tmp_size = (ret_format / 8) * ret_nitems; /* Correct 64 Architecture implementation of 32 bit data */ if(ret_format==32) tmp_size *= sizeof(long)/4; ret = g_malloc(tmp_size + 1); memcpy(ret, ret_prop, tmp_size); ret[tmp_size] = '\0'; if (size) { *size = tmp_size; } XFree(ret_prop); return ret; } /*}}}*/ static gchar *get_wm_info(void) { /* this code is taken from wmctrl utility, adapted Copyright (C) 2003, Tomas Styblo */ Display *disp; Window *sup_window = NULL; gchar *wm_name = NULL; if (!(disp = XOpenDisplay(NULL))) { fputs("Cannot open display.\n", stderr); return NULL; } if (!(sup_window = (Window *)get_property(disp, DefaultRootWindow(disp), XA_WINDOW, "_NET_SUPPORTING_WM_CHECK", NULL))) { if (!(sup_window = (Window *)get_property(disp, DefaultRootWindow(disp), XA_CARDINAL, "_WIN_SUPPORTING_WM_CHECK", NULL))) { fputs("Cannot get window manager info properties.\n" "(_NET_SUPPORTING_WM_CHECK or _WIN_SUPPORTING_WM_CHECK)\n", stderr); return NULL; } } /* WM_NAME */ if (!(wm_name = get_property(disp, *sup_window, XInternAtom(disp, "UTF8_STRING", False), "_NET_WM_NAME", NULL))) { if (!(wm_name = get_property(disp, *sup_window, XA_STRING, "_NET_WM_NAME", NULL))) { fputs("Cannot get name of the window manager (_NET_WM_NAME).\n", stderr); } else { gchar *_wm_name = wm_name; wm_name = g_locale_to_utf8(_wm_name, -1, NULL, NULL, NULL); if (wm_name) g_free(_wm_name); else /* Cannot convert string from locale charset to UTF-8. */ wm_name = _wm_name; } } return wm_name; } /* test if we are called from X which is local */ static gboolean test_X_is_local(void) { const char *display = g_getenv("DISPLAY"); int Xnum; char lockfile[32], socket[32]; if (display) display = strchr(display, ':'); if (!display || display[1] < '0' || display[1] > '9') /* invalid environment */ return FALSE; Xnum = atoi(&display[1]); snprintf(lockfile, sizeof(lockfile), "/tmp/.X%d-lock", Xnum); snprintf(socket, sizeof(socket), "/tmp/.X11-unix/X%d", Xnum); return g_file_test(lockfile, G_FILE_TEST_IS_REGULAR) || (g_file_test(socket, G_FILE_TEST_EXISTS) && !g_file_test(socket, G_FILE_TEST_IS_REGULAR)); } /* WM plugins */ typedef struct LXHotkeyPlugin { struct LXHotkeyPlugin *next; gchar *name; LXHotkeyPluginInit *t; } LXHotkeyPlugin; static LXHotkeyPlugin *plugins = NULL; FM_MODULE_DEFINE_TYPE(lxhotkey, LXHotkeyPluginInit, 1) static gboolean fm_module_callback_lxhotkey(const char *name, gpointer init, int ver) { LXHotkeyPlugin *plugin; /* ignore ver for now, only 1 exists */ /* FIXME: need to check for duplicates? */ plugin = g_new(LXHotkeyPlugin, 1); plugin->next = plugins; plugin->name = g_strdup(name); plugin->t = init; plugins = plugin; return TRUE; } /* GUI plugins */ typedef struct LXHotkeyGUIPlugin { struct LXHotkeyGUIPlugin *next; gchar *name; LXHotkeyGUIPluginInit *t; } LXHotkeyGUIPlugin; static LXHotkeyGUIPlugin *gui_plugins = NULL; FM_MODULE_DEFINE_TYPE(lxhotkey_gui, LXHotkeyGUIPluginInit, 1) static gboolean fm_module_callback_lxhotkey_gui(const char *name, gpointer init, int ver) { LXHotkeyGUIPlugin *plugin; /* ignore ver for now, only 1 exists */ /* FIXME: need to check for duplicates? */ plugin = g_new(LXHotkeyGUIPlugin, 1); plugin->next = gui_plugins; plugin->name = g_strdup(name); plugin->t = init; gui_plugins = plugin; return TRUE; } static int _print_help(const char *cmd) { printf(_("Usage: %s global [] - show keys bound to action(s)\n"), cmd); printf(_(" %s global - bind a key to the action\n"), cmd); printf(_(" %s app [] - show keys bound to exec line\n"), cmd); printf(_(" %s app - bind a key to some exec line\n"), cmd); printf(_(" %s app -- - unbind all keys from exec line\n"), cmd); // printf(_(" %s show - show the action bound to a key\n"), cmd); printf(_(" %s --gui= - start with GUI\n"), cmd); return 0; } /* convert text line to LXHotkeyAttr list text may be formatted like this: startupnotify=yes:attr1=val1:attr2=val2&action=val any ':','&','\' in any value should be escaped with '\' */ static GList *actions_from_str(const char *line, GError **error) { GString *str = g_string_sized_new(16); LXHotkeyAttr *data = NULL, *attr = NULL; GList *list; data = lxhotkey_attr_new(); list = g_list_prepend(NULL, data); for (; *line; line++) { switch (*line) { case '=': if (!data->name) { /* this is new data value */ if (str->len == 0) goto _empty_name; data->name = g_strdup(str->str); g_string_truncate(str, 0); } else if (attr && !attr->name) { /* this is an option */ if (str->len == 0) goto _empty_opt; attr->name = g_strdup(str->str); g_string_truncate(str, 0); } else /* '=' in value, continue processing */ g_string_append_c(str, *line); break; case ':': if (!data->name) { if (str->len == 0) /* empty action name */ goto _empty_name; data->name = g_strdup(str->str); } else if (attr) { /* finish previous attr */ if (!attr->name) { if (str->len == 0) goto _empty_opt; attr->name = g_strdup(str->str); } else attr->values = g_list_prepend(NULL, g_strdup(str->str)); } else /* got value for the action */ data->values = g_list_prepend(NULL, g_strdup(str->str)); g_string_truncate(str, 0); attr = lxhotkey_attr_new(); data->subopts = g_list_prepend(data->subopts, attr); break; case '&': if (!data->name) { if (str->len == 0) /* empty action name */ goto _empty_name; data->name = g_strdup(str->str); } else if (attr) { /* finish last attr */ if (!attr->name) { if (str->len == 0) goto _empty_opt; attr->name = g_strdup(str->str); } else attr->values = g_list_prepend(NULL, g_strdup(str->str)); } else /* got value for the action */ data->values = g_list_prepend(NULL, g_strdup(str->str)); g_string_truncate(str, 0); attr = NULL; /* previous action just finished */ data->subopts = g_list_reverse(data->subopts); data = lxhotkey_attr_new(); list = g_list_prepend(list, data); break; case '\\': /* do nothing, this was an escape char */ break; default: g_string_append_c(str, *line); } } if (!data->name) { if (str->len == 0) /* empty action name */ goto _empty_name; data->name = g_strdup(str->str); } else if (attr) { /* finish last attr */ if (!attr->name) { if (str->len == 0) goto _empty_opt; attr->name = g_strdup(str->str); } else attr->values = g_list_prepend(NULL, g_strdup(str->str)); } else /* got value for the action */ data->values = g_list_prepend(NULL, g_strdup(str->str)); list = g_list_reverse(list); g_string_free(str, TRUE); return list; _empty_opt: g_set_error_literal(error, LXKEYS_ERROR, LXKEYS_BAD_ARGS, _("empty option name.")); goto _failed; _empty_name: g_set_error_literal(error, LXKEYS_ERROR, LXKEYS_BAD_ARGS, _("empty action name.")); _failed: free_actions(list); g_string_free(str, TRUE); return NULL; } /* check if action list matches origin if origin==NULL then error is possibly set already */ static gboolean validate_actions(const GList *act, const GList *origin, const LXHotkeyAttr *action, gchar *wm_name, GError **error) { const LXHotkeyAttr *data, *ordata; const GList *l, *olist; char *endptr; if (!origin) return FALSE; if (action) olist = action->subopts; /* action is ordata on recursion actually */ else olist = origin; while (act) { data = act->data; /* find corresponding descriptor in the origin list */ for (l = olist; l; l = l->next) if (g_strcmp0(data->name, (ordata = l->data)->name) == 0) break; if (l == NULL) { if (action) g_set_error(error, LXKEYS_ERROR, LXKEYS_BAD_ARGS, _("no matching option '%s' found for action '%s'."), data->name, action->name); else g_set_error(error, LXKEYS_ERROR, LXKEYS_BAD_ARGS, _("action '%s' isn't supported by WM %s."), data->name, wm_name); return FALSE; } /* if ordata->values isn't NULL and data->values isn't NULL then it must match, ordata->values==NULL means anything matches */ if (data->values != NULL && ordata->values != NULL) { for (l = ordata->values; l; l = l->next) if (g_strcmp0(data->values->data, l->data) == 0 || /* check for numeric value too */ (strtol(data->values->data, &endptr, 10) < LONG_MAX && ((g_strcmp0(l->data, "#") == 0 && endptr[0] == '\0') || (g_strcmp0(l->data, "%") == 0 && endptr[0] == '%')))) break; if (l == NULL) { if (action) g_set_error(error, LXKEYS_ERROR, LXKEYS_BAD_ARGS, _("value '%s' is not supported for option '%s'."), (char *)data->values->data, data->name); else g_set_error(error, LXKEYS_ERROR, LXKEYS_BAD_ARGS, _("value '%s' is not supported for action '%s'."), (char *)data->values->data, data->name); return FALSE; } } /* for each data->subopts do recursion against ordata->subopts */ if (!data->subopts) ; else if (ordata->has_actions) { /* test against origin actions list, not suboptions */ if (!validate_actions(data->subopts, origin, NULL, wm_name, error)) return FALSE; } else if (!ordata->subopts) { g_set_error(error, LXKEYS_ERROR, LXKEYS_BAD_ARGS, _("action '%s' does not support options."), data->name); return FALSE; } else if (!validate_actions(data->subopts, origin, ordata, wm_name, error)) return FALSE; act = act->next; } return TRUE; } /* convert list to a text line */ //static char *actions_to_str(const GList *act) //{ //} static void print_suboptions(GList *sub, int indent) { indent += 3; while (sub) { LXHotkeyAttr *action = sub->data; if (action->values && action->values->data) printf("%*s%s=%s\n", indent, "", action->name, (char *)action->values->data); else printf("%*s%s\n", indent, "", action->name); print_suboptions(action->subopts, indent); sub = sub->next; } } int main(int argc, char *argv[]) { const char *cmd; gchar *wm_name = NULL; LXHotkeyPlugin *plugin = NULL; LXHotkeyGUIPlugin *gui_plugin = NULL; int ret = 1; /* failure */ gpointer config = NULL; GError *error = NULL; gboolean do_gui = FALSE; /* init localizations */ #ifdef ENABLE_NLS bindtextdomain(GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR); bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8"); textdomain(GETTEXT_PACKAGE); setlocale(LC_MESSAGES, ""); #endif /* parse args first, show help if "help" "-h" or "--help" */ if (argc < 2) cmd = "--gui=gtk"; else cmd = argv[1]; if (cmd[0] == '-' && cmd[1] == '-') /* skip leading "--" if given */ cmd += 2; if (strcmp(cmd, "help") == 0 || (cmd[0] == '-' && cmd[1] == 'h')) return _print_help(argv[0]); if (memcmp(cmd, "gui=", 4) == 0) { do_gui = TRUE; cmd += 4; } /* init LibFM and FmModule */ fm_init(NULL); fm_modules_add_directory(PACKAGE_PLUGINS_DIR); fm_module_register_lxhotkey(); if (do_gui) fm_module_register_lxhotkey_gui(); LXKEYS_ERROR = g_quark_from_static_string("lxhotkey-error"); CHECK_MODULES(); if (do_gui) /* load GUI plugin if requested */ for (gui_plugin = gui_plugins; gui_plugin; gui_plugin = gui_plugin->next) if (g_ascii_strcasecmp(gui_plugin->name, cmd) == 0) break; /* initialize GUI before error may be reported */ if (gui_plugin && gui_plugin->t->init) gui_plugin->t->init(argc, argv); if (!test_X_is_local()) { g_set_error_literal(&error, LXKEYS_ERROR, LXKEYS_NOT_SUPPORTED, _("Sorry, cannot configure keys remotely.")); goto _exit; } /* detect current WM and find a module for it */ wm_name = get_wm_info(); if (!wm_name) { g_set_error_literal(&error, LXKEYS_ERROR, LXKEYS_NOT_SUPPORTED, _("Could not determine window manager running.")); goto _exit; } for (plugin = plugins; plugin; plugin = plugin->next) if (g_ascii_strcasecmp(plugin->name, wm_name) == 0) break; if (!plugin) { g_set_error(&error, LXKEYS_ERROR, LXKEYS_NOT_SUPPORTED, _("Could not find a plugin for window manager %s."), wm_name); goto _exit; } /* load the found module */ config = plugin->t->load(NULL, &error); if (!config) { g_prefix_error(&error, _("Problems loading configuration: ")); goto _exit; } if (do_gui) { if (gui_plugin && gui_plugin->t->run) gui_plugin->t->run(wm_name, plugin->t, &config, &error); else g_set_error(&error, LXKEYS_ERROR, LXKEYS_NOT_SUPPORTED, _("GUI type %s currently isn't supported."), cmd); goto _exit; } /* doing commandline: call module function depending on args */ if (strcmp(argv[1], "global") == 0) { /* lxhotkey global ... */ if (argc > 3) { /* set */ LXHotkeyGlobal data; if (plugin->t->set_wm_key == NULL) goto _not_supported; /* parse and validate actions */ data.actions = actions_from_str(argv[2], &error); if (error || (plugin->t->get_wm_actions != NULL && !validate_actions(data.actions, plugin->t->get_wm_actions(config, &error), NULL, wm_name, &error))) { /* invalid request */ g_prefix_error(&error, _("Invalid request: ")); goto _exit; } // FIXME: validate key data.accel1 = argv[3]; data.accel2 = NULL; if (argc > 4) data.accel2 = argv[4]; if (!plugin->t->set_wm_key(config, &data, &error) || !plugin->t->save(config, &error)) { g_prefix_error(&error, _("Problems saving configuration: ")); free_actions(data.actions); goto _exit; } free_actions(data.actions); } else { /* show by mask */ const char *mask = NULL; GList *keys, *key; LXHotkeyGlobal *data; GList *act; LXHotkeyAttr *action; if (plugin->t->get_wm_keys == NULL) goto _not_supported; if (argc > 2) mask = argv[2]; /* mask given */ keys = plugin->t->get_wm_keys(config, mask, NULL); ulc_printf(" %-24s %s\n", _("ACTION(s)"), _("KEY(s)")); for (key = keys; key; key = key->next) { data = key->data; for (act = data->actions; act; act = act->next) { action = act->data; if (act != data->actions) printf("+ %s\n", action->name); else if (data->accel2) ulc_printf("%-24s %s %s\n", action->name, data->accel1, data->accel2); else ulc_printf("%-24s %s\n", action->name, data->accel1); print_suboptions(action->subopts, 0); } } g_list_free(keys); } } else if (strcmp(argv[1], "app") == 0) { /* lxhotkey app ... */ if (argc > 3) { /* set */ GList *keys = NULL; LXHotkeyApp data; if (plugin->t->set_app_key == NULL) goto _not_supported; /* check if exec already has a key */ if (plugin->t->get_app_keys != NULL) keys = plugin->t->get_app_keys(config, argv[2], NULL); if (keys && keys->next) /* mask in exec line isn't supported */ goto _not_supported; // FIXME: validate key data.accel2 = NULL; if (strcmp(argv[3], "--") == 0) { /* remove all bindings */ data.accel1 = NULL; } else if (keys && ((LXHotkeyApp *)keys->data)->accel1) { data.accel1 = ((LXHotkeyApp *)keys->data)->accel1; data.accel2 = argv[3]; } else { data.accel1 = argv[3]; } g_list_free(keys); cmd = strchr(argv[2], '&'); if (cmd) { data.options = actions_from_str(&cmd[1], &error); if (error || (plugin->t->get_app_options != NULL && !validate_actions(data.options, plugin->t->get_app_options(config, &error), NULL, wm_name, &error))) { /* invalid request */ g_prefix_error(&error, _("Invalid request: ")); free_actions(data.options); goto _exit; } data.exec = g_strndup(argv[2], cmd - argv[2]); } else { data.options = NULL; data.exec = g_strdup(argv[2]); } // FIXME: validate exec if (!plugin->t->set_app_key(config, &data, &error) || !plugin->t->save(config, &error)) { g_prefix_error(&error, _("Problems saving configuration: ")); free_actions(data.options); g_free(data.exec); goto _exit; } free_actions(data.options); g_free(data.exec); } else { /* show by mask */ const char *mask = NULL; GList *keys, *key; LXHotkeyApp *data; if (plugin->t->get_app_keys == NULL) goto _not_supported; if (argc > 2) mask = argv[2]; /* mask given */ keys = plugin->t->get_app_keys(config, mask, NULL); ulc_printf(" %-48s %s\n", _("EXEC"), _("KEY(s)")); for (key = keys; key; key = key->next) { data = key->data; if (data->accel2) ulc_printf("%-48s %s %s\n", data->exec, data->accel1, data->accel2); else ulc_printf("%-48s %s\n", data->exec, data->accel1); print_suboptions(data->options, 0); } g_list_free(keys); } } else if (strcmp(argv[1], "show") == 0) { /* lxhotkey show ... */ // FIXME: TODO! // then: uncomment line in _print_help() } else goto _exit; ret = 0; /* success */ goto _exit; _not_supported: g_set_error_literal(&error, LXKEYS_ERROR, LXKEYS_NOT_SUPPORTED, _("Requested operation isn't supported.")); /* release resources */ _exit: if (config) plugin->t->free(config); if (error) { /* if do_gui then show an alert window instead of stderr */ if (gui_plugin && gui_plugin->t->alert) gui_plugin->t->alert(error); else fprintf(stderr, "LXHotkey: %s\n", error->message); g_error_free(error); } fm_module_unregister_type("lxhotkey"); if (do_gui) fm_module_unregister_type("lxhotkey_gui"); while (plugins) { plugin = plugins; plugins = plugin->next; g_free(plugin->name); g_free(plugin); } while (gui_plugins) { gui_plugin = gui_plugins; gui_plugins = gui_plugin->next; g_free(gui_plugin->name); g_free(gui_plugin); } g_free(wm_name); return ret; } lxhotkey-0.1.2/src/lxhotkey.h000066400000000000000000000204711476256652500162160ustar00rootroot00000000000000/* * Copyright (C) 2016 Andriy Grytsenko * * This file is a part of LXHotkey project. * * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef _LXKEYS_H_ #define _LXKEYS_H_ 1 #include G_BEGIN_DECLS /** * LXHotkeyAttr: * @name: action or option name * @values: (element-type char *): option value * @subopts: (element-type LXHotkeyAttr): (allow-none): list of suboptions * @desc: (allow-none): action or option description * @has_actions: %TRUE if @subopts contains actions, %FALSE if @subopts contains options * @has_value: %TRUE if option has value even if @subopts isn't %NULL * * Data descriptor for actions and options. Actions are ativated by keybinding. * Each action may contain arbitrary number of options that alter its execution. * * This data is also used in a result on LXHotkeyPluginInit:get_wm_actions() or * LXHotkeyPluginInit:get_app_options() call. In that case for each option the * @values list should be either %NULL if option accepts any value, or list of * acceptable values for the option ("#" value has a special meaning: integer * value matches it, the same as "%" for percent value). For such purpose it is * advisable to make @name and @values translateable constants because GUI might * represent them in target locale which might be convenient for users. * * The @desc appears in data returned by LXHotkeyPluginInit:get_wm_actions() or * LXHotkeyPluginInit:get_app_options() call, it has human-readable descriptions * for option or action which can be used in GUI tooltip. */ typedef struct { gchar *name; GList *values; GList *subopts; gchar *desc; gboolean has_actions; gboolean has_value; } LXHotkeyAttr; #ifdef WANT_OPTIONS_EQUAL static gboolean values_equal(GList *vals1, GList *vals2) { while (vals1 && vals2) { if (g_strcmp0(vals1->data, vals2->data) != 0) return FALSE; vals1 = vals1->next; vals2 = vals2->next; } return (vals1 == NULL && vals2 == NULL); } /** * options_equal * @opts1: (element-type LXHotkeyAttr): list of options * @opts2: (element-type LXHotkeyAttr): list of options * * Recursively compare two lists of options. * * Returns: %TRUE if two lists are equal. */ static gboolean options_equal(GList *opts1, GList *opts2) { while (opts1 && opts2) { LXHotkeyAttr *attr1 = opts1->data, *attr2 = opts2->data; if (g_strcmp0(attr1->name, attr2->name) != 0) return FALSE; if (!values_equal(attr1->values, attr2->values)) return FALSE; if (!options_equal(attr1->subopts, attr2->subopts)) return FALSE; opts1 = opts1->next; opts2 = opts2->next; } return (opts1 == NULL && opts2 == NULL); } #endif /* WANT_OPTIONS_EQUAL */ /** * LXHotkeyGlobal: * @actions: (element-type LXHotkeyAttr): list of actions * @accel1: a keybinding to activate @actions, in GDK accelerator format * @accel2: optional alternate keybinding to activate @actions * @data1: a pointer for using by WM plugin * @data2: a pointer for using by WM plugin * * Descriptor of a keybinding which isn't a single command line action. * The keybinding string is in format that looks like "a" or * "F1" or "z" (note that not each WM supports last one * variant). */ typedef struct { GList *actions; gchar *accel1; gchar *accel2; gpointer data1; gpointer data2; } LXHotkeyGlobal; /** * LXHotkeyApp: * @exec: a command line to execute * @options: (element-type LXHotkeyAttr): (allow-none): list of options * @accel1: a keybinding to activate @exec, in GDK accelerator format * @accel2: optional alternate keybinding to activate @exec * @data1: a pointer for using by WM plugin * @data2: a pointer for using by WM plugin * * Descriptor of a keybinding for a single command line action. The command * execution may be altered by some @options. See also #LXHotkeyGlobal. */ typedef struct { gchar *exec; GList *options; gchar *accel1; gchar *accel2; gpointer data1; gpointer data2; } LXHotkeyApp; /* WM support plugins */ #define FM_MODULE_lxhotkey_VERSION 1 /* version of this API */ /** * LXHotkeyPluginInit: * @load: callback to (re)load bindings from WM configuration * @save: callback to save bindings to WM configuration and apply them * @free: callback to release allocated resources * @get_wm_keys: (allow-none): callback to get global keys by provided mask * @set_wm_key: (allow-none): callback to set a global key by provided data * @get_wm_actions: (allow-none): callback to get global actions list provided by WM * @get_app_keys: (allow-none): callback to get keys bound to commands * @set_app_key: (allow-none): callback to set a key for a command * @get_app_options: (allow-none): callback to get possible actions for commands * * Callbacks @get_wm_keys and @get_app_keys return list which should be freed * by caller (transfer container). * Callbacks @get_wm_actions and @get_app_options return list that should be * not modified nor freed by caller (transfer none). * Callback @get_wm_keys returns list of keybindings by @mask which is a shell * style pattern for keys. * Callback @set_wm_key changes a keybinding for list of actions provided. If * @data::accel1 is %NULL then all keybindings for @data::actions will be * cleared, otherwise keybindings will be changed accordingly. */ typedef struct { /*< public >*/ gpointer (*load)(gpointer config, GError **error); gboolean (*save)(gpointer config, GError **error); void (*free)(gpointer config); GList *(*get_wm_keys)(gpointer config, const char *mask, GError **error); gboolean (*set_wm_key)(gpointer config, LXHotkeyGlobal *data, GError **error); GList *(*get_wm_actions)(gpointer config, GError **error); GList *(*get_app_keys)(gpointer config, const char *mask, GError **error); gboolean (*set_app_key)(gpointer config, LXHotkeyApp *data, GError **error); GList *(*get_app_options)(gpointer config, GError **error); /*< private >*/ gpointer _reserved1; gpointer _reserved2; gpointer _reserved3; } LXHotkeyPluginInit; /** * This descriptor instance should be defined in each plugin code as main * entry point for plugin creation. Primitive plugin example follows: * * #include * * gpointer test_load(gpointer config, GError **error) * { * if (config == NULL) * config = g_strdup(""); * return config; * } * * gboolean test_save(gpointer config, GError **error) * { * return FALSE; * } * * FM_DEFINE_MODULE(lxhotkey, NoWM) * * LXHotkeyPluginInit fm_module_init_lxhotkey = { * .load = test_load, * .save = test_save, * .free = g_free * } */ extern LXHotkeyPluginInit fm_module_init_lxhotkey; /* GUI plugins */ #define FM_MODULE_lxhotkey_gui_VERSION 1 /* version of this API */ /** * LXHotkeyGUIPluginInit: * @run: callback to run GUI * @alert: callback to show an error message * * The @run callback receives name of WM, pointer to callbacks, and pointer to * pointer to the config data which is already succesfully loaded and ready to * use. Config may be reloaded by plugin if needed. */ typedef struct { /*< public >*/ void (*run)(const gchar *wm, const LXHotkeyPluginInit *cb, gpointer *config, GError **error); void (*alert)(GError *error); void (*init)(int argc, char **argv); /*< private >*/ gpointer _reserved1; gpointer _reserved2; gpointer _reserved3; } LXHotkeyGUIPluginInit; /** * This descriptor instance should be defined in each plugin code as main * entry point for a GUI plugin creation. */ extern LXHotkeyGUIPluginInit fm_module_init_lxhotkey_gui; G_END_DECLS #endif /* _LXKEYS_H_ */