ukwm/0000755000175000017500000000000013624745310010466 5ustar fengfengukwm/configure.ac0000644000175000017500000004046613624745310012766 0ustar fengfengAC_PREREQ(2.62) m4_define([ukwm_major_version], [1]) m4_define([ukwm_minor_version], [1]) m4_define([ukwm_micro_version], [4]) m4_define([ukwm_version], [ukwm_major_version.ukwm_minor_version.ukwm_micro_version]) m4_define([ukwm_plugin_api_version], [3]) m4_define([libukwm_api_version], [1]) AC_INIT([ukwm], [ukwm_version], [https://github.com/ukui/ukwm/issues]) AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_AUX_DIR([build-aux]) AC_CONFIG_SRCDIR(src/core/display.c) AC_CONFIG_HEADERS(config.h) AC_CONFIG_SUBDIRS([cogl clutter]) AM_INIT_AUTOMAKE([1.11 foreign no-dist-gzip dist-xz tar-ustar subdir-objects]) m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])],) AM_MAINTAINER_MODE([enable]) AC_GNU_SOURCE UKWM_MAJOR_VERSION=ukwm_major_version UKWM_MINOR_VERSION=ukwm_minor_version UKWM_MICRO_VERSION=ukwm_micro_version UKWM_VERSION=ukwm_version UKWM_PLUGIN_API_VERSION=ukwm_plugin_api_version LIBUKWM_API_VERSION=libukwm_api_version AC_SUBST(UKWM_MAJOR_VERSION) AC_SUBST(UKWM_MINOR_VERSION) AC_SUBST(UKWM_MICRO_VERSION) AC_SUBST(UKWM_PLUGIN_API_VERSION) AC_SUBST(UKWM_VERSION) AC_SUBST(LIBUKWM_API_VERSION) # Make the ukwm versions visible to the cogl and clutter subdirs export LIBUKWM_API_VERSION UKWM_VERSION UKWM_PLUGIN_DIR="$libdir/$PACKAGE/plugins" AC_SUBST(UKWM_PLUGIN_DIR) # Honor aclocal flags AC_SUBST(ACLOCAL_AMFLAGS, "\${ACLOCAL_FLAGS}") GETTEXT_PACKAGE=ukwm AC_SUBST(GETTEXT_PACKAGE) AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE,"$GETTEXT_PACKAGE",[Name of default gettext domain]) AM_GNU_GETTEXT_VERSION([0.19.6]) AM_GNU_GETTEXT([external]) LT_PREREQ([2.2.6]) LT_INIT([disable-static]) # Debian / Ubuntu set this flag to 'no' in libtool, causing linking errors # (i.e when linking against ukwm-clutter). Not to explicitly redefine such # deps, we enable this flag for everybody. link_all_deplibs=yes link_all_deplibs_CXX=yes AC_PROG_CC AC_PROG_CC_C_O AC_PROG_INSTALL AC_PROG_SED AC_HEADER_STDC PKG_PROG_PKG_CONFIG([0.21]) # Sets GLIB_GENMARSHAL and GLIB_MKENUMS AM_PATH_GLIB_2_0([2.53.2]) CANBERRA_GTK=libcanberra-gtk3 CANBERRA_GTK_VERSION=0.26 LIBWACOM_VERSION=0.13 UKWM_PC_MODULES=" egl gtk+-3.0 >= 3.19.8 gio-unix-2.0 >= 2.35.1 pango >= 1.2.0 cairo >= 1.10.0 gsettings-desktop-schemas >= 3.21.4 json-glib-1.0 upower-glib >= 0.99.0 gnome-desktop-3.0 xcomposite >= 0.2 xcursor xdamage xext xfixes xi >= 1.6.0 xkbfile xkeyboard-config xkbcommon >= 0.4.3 xkbcommon-x11 xrender x11-xcb xcb-randr xcb-res " GLIB_GSETTINGS AC_ARG_ENABLE(verbose-mode, AC_HELP_STRING([--disable-verbose-mode], [disable ukwm's ability to do verbose logging, for embedded/size-sensitive custom builds]),, enable_verbose_mode=yes) if test x$enable_verbose_mode = xyes; then AC_DEFINE(WITH_VERBOSE_MODE,1,[Build with verbose mode support]) fi AC_ARG_ENABLE(sm, AC_HELP_STRING([--disable-sm], [disable ukwm's session management support, for embedded/size-sensitive custom non-GNOME builds]),, enable_sm=auto) AC_ARG_ENABLE(startup-notification, AC_HELP_STRING([--disable-startup-notification], [disable ukwm's startup notification support, for embedded/size-sensitive custom non-GNOME builds]),, enable_startup_notification=auto) AC_ARG_WITH(libcanberra, AC_HELP_STRING([--without-libcanberra], [disable the use of libcanberra for playing sounds]),, with_libcanberra=auto) AC_ARG_WITH(libwacom, AC_HELP_STRING([--without-libwacom], [disable the use of libwacom for advanced tablet management]),, with_libwacom=auto) AC_ARG_WITH(gudev, AC_HELP_STRING([--without-gudev], [disable the use of gudev for device type detection]),, with_gudev=auto) AC_ARG_WITH([xwayland-path], [AS_HELP_STRING([--with-xwayland-path], [Absolute path for an X Wayland server])], [XWAYLAND_PATH="$withval"], [XWAYLAND_PATH="$bindir/Xwayland"]) AC_ARG_ENABLE(installed_tests, AS_HELP_STRING([--enable-installed-tests], [Install test programs (default: no)]),, [enable_installed_tests=no]) AM_CONDITIONAL(BUILDOPT_INSTALL_TESTS, test x$enable_installed_tests = xyes) ## here we get the flags we'll actually use # Unconditionally use this dir to avoid a circular dep with gnomecc GNOME_KEYBINDINGS_KEYSDIR="${datadir}/gnome-control-center/keybindings" AC_SUBST(GNOME_KEYBINDINGS_KEYSDIR) STARTUP_NOTIFICATION_VERSION=0.7 AC_MSG_CHECKING([Startup notification library >= $STARTUP_NOTIFICATION_VERSION]) if $PKG_CONFIG --atleast-version $STARTUP_NOTIFICATION_VERSION libstartup-notification-1.0; then have_startup_notification=yes else have_startup_notification=no fi AC_MSG_RESULT($have_startup_notification) if test x$enable_startup_notification = xyes; then have_startup_notification=yes echo "startup-notification support forced on" elif test x$enable_startup_notification = xauto; then true else have_startup_notification=no fi if test x$have_startup_notification = xyes; then echo "Building with libstartup-notification" UKWM_PC_MODULES="$UKWM_PC_MODULES libstartup-notification-1.0 >= $STARTUP_NOTIFICATION_VERSION" AC_DEFINE(HAVE_STARTUP_NOTIFICATION, , [Building with startup notification support]) else echo "Building without libstartup-notification" fi have_libcanberra=no AC_MSG_CHECKING([libcanberra-gtk]) if test x$with_libcanberra = xno ; then AC_MSG_RESULT([disabled]) else if $PKG_CONFIG --exists $CANBERRA_GTK '>=' $CANBERRA_GTK_VERSION; then have_libcanberra=yes AC_MSG_RESULT(yes) UKWM_PC_MODULES="$UKWM_PC_MODULES $CANBERRA_GTK" AC_DEFINE([HAVE_LIBCANBERRA], 1, [Building with libcanberra for playing sounds]) else AC_MSG_RESULT(no) if test x$with_libcanberra = xyes ; then AC_MSG_ERROR([libcanberra forced and libcanberra-gtk was not found]) fi fi fi have_libwacom=no AC_MSG_CHECKING([libwacom]) if test x$with_libwacom = xno ; then AC_MSG_RESULT([disabled]) else if $PKG_CONFIG --exists libwacom '>=' $LIBWACOM_VERSION; then have_libwacom=yes AC_MSG_RESULT(yes) UKWM_PC_MODULES="$UKWM_PC_MODULES libwacom" AC_DEFINE([HAVE_LIBWACOM], 1, [Building with libwacom for advanced tablet management]) else AC_MSG_RESULT(no) if test x$with_libwacom = xyes ; then AC_MSG_ERROR([libwacom forced but not found]) fi fi fi have_gudev=no AC_MSG_CHECKING([gudev]) if test x$with_gudev = xno ; then AC_MSG_RESULT([disabled]) else if $PKG_CONFIG --exists "gudev-1.0 >= 232"; then have_gudev=yes AC_MSG_RESULT(yes) UKWM_PC_MODULES="$UKWM_PC_MODULES gudev-1.0 >= 232" AC_DEFINE([HAVE_LIBGUDEV], 1, [Building with gudev for device type detection]) else AC_MSG_RESULT(no) if test x$with_gudev = xyes ; then AC_MSG_ERROR([gudev forced but not found]) fi fi fi AC_ARG_ENABLE(remote-desktop, AS_HELP_STRING([--enable-remote-desktop], [enable support for remote desktop and screen cast]), enable_remote_desktop=yes, enable_remote_desktop=no ) AS_IF([test "$enable_remote_desktop" = "yes"], [ UKWM_PC_MODULES="$UKWM_PC_MODULES libpipewire-0.1 >= 0.1.4" PKG_CHECK_EXISTS([libpipewire-0.1], [ pw_micro=`$PKG_CONFIG --modversion libpipewire-0.1 | cut -d. -f3` AC_DEFINE_UNQUOTED([PIPEWIRE_VERSION_MICRO],[$pw_micro], [Pipewire micro version used]) ]) AC_DEFINE([HAVE_REMOTE_DESKTOP],[1], [Defined if screen cast and remote desktop support is enabled]) ]) AM_CONDITIONAL([HAVE_REMOTE_DESKTOP],[test "$enable_remote_desktop" = "yes"]) INTROSPECTION_VERSION=0.9.5 GOBJECT_INTROSPECTION_CHECK([$INTROSPECTION_VERSION]) if test x$found_introspection != xno; then AC_DEFINE(HAVE_INTROSPECTION, 1, [Define if GObject introspection is available]) UKWM_PC_MODULES="$UKWM_PC_MODULES gobject-introspection-1.0" fi AC_SUBST(XWAYLAND_PATH) PKG_CHECK_MODULES(UKWM, $UKWM_PC_MODULES) UKWM_NATIVE_BACKEND_MODULES="libdrm libsystemd libinput >= 1.4 gudev-1.0 gbm >= 10.3" AC_ARG_ENABLE(native-backend, AS_HELP_STRING([--disable-native-backend], [disable ukwm native (KMS) backend]),, enable_native_backend=auto ) have_native_backend="no" AS_IF([test "$enable_native_backend" = "yes"], [have_native_backend=yes], [test "$enable_native_backend" = "auto"], PKG_CHECK_EXISTS([$UKWM_NATIVE_BACKEND_MODULES], [have_native_backend=yes])) AS_IF([test "$have_native_backend" = "yes"], [ PKG_CHECK_MODULES([UKWM_NATIVE_BACKEND], [$UKWM_NATIVE_BACKEND_MODULES]) AC_DEFINE([HAVE_NATIVE_BACKEND],[1], [Define if you want to enable the native (KMS) backend based on systemd]) ]) AM_CONDITIONAL([HAVE_NATIVE_BACKEND],[test "$have_native_backend" = "yes"]) AC_ARG_ENABLE(egl-device, AS_HELP_STRING([--enable-egl-device], [enable support for EGLDevice on top of KMS]), enable_egl_device=yes, enable_egl_device=no ) AS_IF([test "$enable_egl_device" = "yes"], [ AC_DEFINE([HAVE_EGL_DEVICE],[1], [Defined if EGLDevice support is enabled]) ]) UKWM_WAYLAND_MODULES="wayland-server >= 1.13.0" AC_ARG_ENABLE(wayland, AS_HELP_STRING([--disable-wayland], [disable ukwm on wayland support]),, enable_wayland=auto ) AS_IF([test "$enable_wayland" = "yes"], [have_wayland=yes], [test "$enable_wayland" = "auto"], PKG_CHECK_EXISTS([$UKWM_WAYLAND_MODULES], [have_wayland=yes])) AS_IF([test "$have_wayland" = "yes"], [ PKG_CHECK_MODULES([UKWM_WAYLAND], [$UKWM_WAYLAND_MODULES]) AC_PATH_PROG([WAYLAND_SCANNER],[wayland-scanner],[no]) AS_IF([test $WAYLAND_SCANNER = "no"], [AC_MSG_ERROR([Could not find wayland-scanner in your PATH, required for parsing wayland extension protocols])]) AC_SUBST([WAYLAND_SCANNER]) AC_DEFINE([HAVE_WAYLAND],[1],[Define if you want to enable Wayland support]) PKG_CHECK_MODULES(WAYLAND_PROTOCOLS, [wayland-protocols >= 1.9], [ac_wayland_protocols_pkgdatadir=`$PKG_CONFIG --variable=pkgdatadir wayland-protocols`]) AC_SUBST(WAYLAND_PROTOCOLS_DATADIR, $ac_wayland_protocols_pkgdatadir) ]) AM_CONDITIONAL([HAVE_WAYLAND],[test "$have_wayland" = "yes"]) PKG_CHECK_EXISTS([xi >= 1.6.99.1], AC_DEFINE([HAVE_XI23],[1],[Define if you have support for XInput 2.3 or greater])) AC_PATH_XTRA ALL_X_LIBS="$X_LIBS $X_PRE_LIBS -lX11 $X_EXTRA_LIBS" # Check for Xinerama extension - we only support the "XFree86" style, # and not the older Solaris-only version; recent Solaris supports the # XFree86 style. ukwm_save_cppflags="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $X_CFLAGS" have_xinerama=yes AC_CHECK_LIB(Xinerama, XineramaQueryExtension, [AC_CHECK_HEADER(X11/extensions/Xinerama.h, [X_EXTRA_LIBS="-lXinerama $X_EXTRA_LIBS" if test -z "`echo $ALL_X_LIBS | grep "\-lXext" 2> /dev/null`"; then X_EXTRA_LIBS="-lXext $X_EXTRA_LIBS" fi], have_xinerama=no, [#include ])], have_xinerama=no, -lXext $ALL_X_LIBS) AC_MSG_CHECKING(for Xinerama support) AC_MSG_RESULT($have_xinerama) CPPFLAGS="$ukwm_save_cppflags" if test x$have_xinerama = xno; then AC_MSG_ERROR([Xinerama extension was not found]) fi AC_DEFINE_UNQUOTED([XKB_BASE], ["`$PKG_CONFIG --variable xkb_base xkeyboard-config`"], [XKB base dir]) RANDR_LIBS= found_randr=no AC_CHECK_LIB(Xrandr, XRRUpdateConfiguration, [AC_CHECK_HEADER(X11/extensions/Xrandr.h, RANDR_LIBS=-lXrandr found_randr=yes,, [#include ])], , -lXext $ALL_X_LIBS) if test "x$found_randr" = "xyes"; then AC_DEFINE(HAVE_RANDR, , [Have the Xrandr extension library]) PKG_CHECK_EXISTS([xrandr >= 1.5.0], AC_DEFINE([HAVE_XRANDR15],[1],[Define if you have support for XRandR 1.5 or greater])) fi UKWM_LIBS="$UKWM_LIBS $RANDR_LIBS $X_LIBS $X_PRE_LIBS -lX11 $X_EXTRA_LIBS -lm" found_sm=no case "$UKWM_LIBS" in *-lSM*) found_sm=yes ;; *) AC_CHECK_LIB(SM, SmcSaveYourselfDone, [AC_CHECK_HEADERS(X11/SM/SMlib.h, UKWM_LIBS="-lSM -lICE $UKWM_LIBS" found_sm=yes)], , $UKWM_LIBS) ;; esac if test x$enable_sm = xno; then found_sm=no fi if test x$enable_sm = xyes; then if test "$found_sm" = "no"; then AC_MSG_ERROR([--enable-sm forced and -lSM not found]) exit 1 fi fi if test "$found_sm" = "yes"; then AC_DEFINE(HAVE_SM, , [Building with SM support]) fi AM_CONDITIONAL(HAVE_SM, test "$found_sm" = "yes") AC_ARG_ENABLE(debug, [ --enable-debug enable debugging],, enable_debug=no) if test "x$enable_debug" = "xyes"; then CFLAGS="$CFLAGS -g -O" fi AC_CHECK_DECL([GL_EXT_x11_sync_object], [], [AC_MSG_ERROR([GL_EXT_x11_sync_object definition not found, please update your GL headers])], [#include ]) AC_PATH_PROG([CVT],[cvt],[]) #### Warnings (last since -Werror can disturb other tests) # Stay command-line compatible with the gnome-common configure option. Here # minimum/yes/maximum are the same, however. AC_ARG_ENABLE(compile_warnings, AS_HELP_STRING([--enable-compile-warnings=@<:@no/minimum/yes/maximum/error@:>@],[Turn on compiler warnings]),, enable_compile_warnings=error) changequote(,)dnl if test "$enable_compile_warnings" != no ; then if test "x$GCC" = "xyes"; then case " $CFLAGS " in *[\ \ ]-Wall[\ \ ]*) ;; *) CFLAGS="$CFLAGS -Wall" ;; esac # case " $CFLAGS " in # *[\ \ ]-Wshadow[\ \ ]*) ;; # *) CFLAGS="$CFLAGS -Wshadow" ;; # esac case " $CFLAGS " in *[\ \ ]-Wchar-subscripts[\ \ ]*) ;; *) CFLAGS="$CFLAGS -Wchar-subscripts" ;; esac case " $CFLAGS " in *[\ \ ]-Wmissing-declarations[\ \ ]*) ;; *) CFLAGS="$CFLAGS -Wmissing-declarations" ;; esac case " $CFLAGS " in *[\ \ ]-Wmissing-prototypes[\ \ ]*) ;; *) CFLAGS="$CFLAGS -Wmissing-prototypes" ;; esac case " $CFLAGS " in *[\ \ ]-Wnested-externs[\ \ ]*) ;; *) CFLAGS="$CFLAGS -Wnested-externs" ;; esac case " $CFLAGS " in *[\ \ ]-Wpointer-arith[\ \ ]*) ;; *) CFLAGS="$CFLAGS -Wpointer-arith" ;; esac case " $CFLAGS " in *[\ \ ]-Wcast-align[\ \ ]*) ;; *) CFLAGS="$CFLAGS -Wcast-align" ;; esac case " $CFLAGS " in *[\ \ ]-Wsign-compare[\ \ ]*) ;; *) CFLAGS="$CFLAGS -Wsign-compare" ;; esac if test "$enable_compile_warnings" = error; then case " $CFLAGS " in *[\ \ ]-Werror[\ \ ]*) ;; *) CFLAGS="$CFLAGS -Werror -Wno-error=deprecated-declarations" ;; esac fi fi fi changequote([,])dnl AC_CONFIG_FILES([ Makefile data/Makefile doc/Makefile doc/man/Makefile src/Makefile src/libukwm-$LIBUKWM_API_VERSION.pc:src/libukwm.pc.in src/compositor/plugins/Makefile src/meta/meta-version.h po/Makefile.in ]) AC_OUTPUT # Check that cogl and clutter have their .pc files regenerated with the correct version COGL_PC_VERSION=$(grep Version: cogl/cogl/ukwm-cogl-$LIBUKWM_API_VERSION.pc|awk '{ print $2; }') AS_IF([test "x$COGL_PC_VERSION" != "x$UKWM_VERSION"], [AC_MSG_ERROR([ukwm-cogl pkg-config file not updated, rerun ./configure])]) CLUTTER_PC_VERSION=$(grep Version: clutter/clutter/ukwm-clutter-$LIBUKWM_API_VERSION.pc|awk '{ print $2; }') AS_IF([test "x$CLUTTER_PC_VERSION" != "x$UKWM_VERSION"], [AC_MSG_ERROR([ukwm-clutter pkg-config file not updated, rerun ./configure])]) if test x$enable_verbose_mode = xno; then echo "*** WARNING WARNING WARNING WARNING WARNING" echo "*** Building without verbose mode" echo "*** This means there's no way to debug ukwm problems." echo "*** Please build normal desktop versions of ukwm" echo "*** with verbose mode enabled so users can use it when they report bugs." fi dnl ========================================================================== echo " ukwm-$VERSION prefix: ${prefix} source code location: ${srcdir} compiler: ${CC} Startup notification: ${have_startup_notification} libcanberra: ${have_libcanberra} libwacom: ${have_libwacom} gudev ${have_gudev} Introspection: ${found_introspection} Session management: ${found_sm} Wayland: ${have_wayland} Native (KMS) backend: ${have_native_backend} EGLDevice: ${enable_egl_device} Remote desktop: ${enable_remote_desktop} " UKWM_MINOR_VERSION=ukwm_minor_version if expr $UKWM_MINOR_VERSION % 2 > /dev/null ; then stable_version=`expr $UKWM_MINOR_VERSION - 1` echo "This is the UNSTABLE branch of ukwm" echo -n "Use 3.$stable_version.x for stable " echo "(gnome-3-$stable_version branch in git)" else echo "This is the stable branch of ukwm" fi ukwm/doc/0000755000175000017500000000000013624745310011233 5ustar fengfengukwm/doc/man/0000755000175000017500000000000013624745310012006 5ustar fengfengukwm/doc/man/Makefile.am0000644000175000017500000000005413624745310014041 0ustar fengfengman_MANS = ukwm.1 EXTRA_DIST = $(man_MANS) ukwm/doc/man/ukwm.10000644000175000017500000000505613624745310013061 0ustar fengfeng.\" Hey, EMACS: -*- nroff -*- .\" First parameter, NAME, should be all caps .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection .\" other parameters are allowed: see man(7), man(1) .TH Ukwm 1 "11 February 2006" .\" Please adjust this date whenever revising the manpage. .\" .\" Some roff macros, for reference: .\" .nh disable hyphenation .\" .hy enable hyphenation .\" .ad l left justify .\" .ad b justify to both left and right margins .\" .nf disable filling .\" .fi enable filling .\" .br insert line break .\" .sp insert n+1 empty lines .\" for manpage-specific macros, see man(7) .SH NAME Ukwm \- Clutter based compositing GTK2 Window Manager .SH SYNOPSIS .B ukwm [\-\-display=\fIDISPLAY\fP] [\-\-replace] [\-\-sm\-client\-id=\fIID\fP] [\-\-sm\-disable] [\-\-sm\-save\-file=\fIFILENAME\fP] [\-\-version] [\-\-help] .SH DESCRIPTION This manual page documents briefly .B ukwm\fP. .PP .\" TeX users may be more comfortable with the \fB\fP and .\" \fI\fP escape sequences to invode bold face and italics, .\" respectively. \fBukwm\fP is a minimal X window manager aimed at nontechnical users and is designed to integrate well with the GNOME desktop. \fBukwm\fP lacks some features that may be expected by traditional UNIX or other technical users; these users may want to investigate other available window managers for use with GNOME or standalone. .SH OPTIONS .TP .B \-\-display=DISPLAY Connect to X display \fIDISPLAY\fP. .TP .B \-\-replace a window manager which is running is replaced by \fBukwm\fP. Users are encouraged to change the GNOME window manager by running the new WM with the --replace or -replace option, and subsequently saving the session. .TP .B \-\-sm\-client\-id=ID Specify a session management \fIID\fP. .TP .B \-\-sm\-disable Disable the session management. .TP .B \-\-sm\-save\-file=FILENAME Load a session from \fIFILENAME\fP. .TP .B \-\-version Print the version number. .TP .B \-?, \-\-help Show summary of options. .SH CONFIGURATION \fBukwm\fP configuration can be found under \fIPreferences\fP->\fIWindows\fP and \fIPreferences\fP->\fIKeyboard Shortcuts\fP on the menu-panel. Advanced configuration can be achieved directly through gsettings. .SH SEE ALSO .BR ukwm-message (1) .SH AUTHOR The original manual page was written by Thom May . It was updated by Akira TAGOH for the Debian GNU/Linux system (with permission to use by others), and then updated by Luke Morton and Philip O'Brien for inclusion in ukwm. ukwm/doc/Makefile.am0000644000175000017500000000014713624745310013271 0ustar fengfengSUBDIRS = man EXTRA_DIST = dialogs.txt code-overview.txt \ how-to-get-focus-right.txt rationales.txt ukwm/doc/dialogs.txt0000644000175000017500000000152613624745310013422 0ustar fengfengDialogs which have no transient parent or root window being their tranisent parent are the ones which will be visible in the tasklist. All such dialogs will be *always* on top of the window group i.e they would transients for the whole group. 1) Modal dialogs * If you wish to open another window from a modal dialog open *only* a modal dialog and set it's transient parent. 2) Normal dialog without transient parent * If you wish to open another window from a normal dialog open either a normal dialog or a modal dialog only. Set the transient parent for the child dialog if you do not want them to be transient for all the other windows in the group. with transient parent * If you wish to open another window from a normal dialog you could open any type of window. ukwm/doc/how-to-get-focus-right.txt0000644000175000017500000003414013624745310016220 0ustar fengfengTo make choice of focus window consistent for each focus method, a number of guidelines should be followed. (For purposes of discussion here, I'm excluding things like the panel and the desktop from "windows". It is technically incorrect to do this, but I'm lazy and "windows" is shorter than something like "normal windows". See the end of the discussion for how these special cases are handled.) The basics are easy: Focus method Behavior click When a user clicks on a window, focus it sloppy When an EnterNotify is received, focus the window mouse Same as sloppy, but also defocus when mouse enters DESKTOP window Note that these choices (along with the choice that clicking on a window raises it for the click focus method) introduces the following invariants for focus from mouse activity: Focus method Invariant click The window on top is focused sloppy If the mouse is in a window, then it is focused; if the mouse is not in a window, then the most recently used window is focused. mouse If the mouse is in a non-DESKTOP window, then it is focused; otherwise, the designated "no_focus_window" is focused However, there are a number of cases where the current focus window becomes invalid and another should be chosen. Some examples are when a focused window is closed or minimized, or when the user changes workspaces. In these cases, there needs to be a rule consistent with the above about the new window to choose. Focus method Behavior click Focus the window on top sloppy Focus the window containing the pointer if there is such a window, otherwise focus the most recently used window. mouse Focus the non-DESKTOP window containing the pointer if there is one, otherwise focus the designated "no_focus_window". Note that "most recently used window", as used here, has a slightly different connotation than "most recent to have keyboard focus". This is because when a user activates a window that is a transient, its ancestor(s) should be considered to be more recently used than other windows that have had the keyboard focus more recently. (See bug 157360; this may mean that the alt-tab order should also change simultaneously, although the current implementation does not do that.) Also, sometimes a new window will be mapped (e.g. unminimizing a window or launching a new application). Most users want to interact with new windows right away, so these should typically be focused. This does conflict with the invariants for sloppy and mouse focus modes, so this wouldn't be true for a strict-pointer-focus mode. For all other modes (non-strict-pointer-focus modes), there are only two cases in which a new window shouldn't be focused: 1) If the window takes a while to launch and the user starts interacting with a different application, the new window should not take focus. 2) If the window that will appear was not launched by the user (error dialogs, instant messaging windows, etc.), then the window should not take focus when it appears. To handle these cases, Metacity compares timestamps of the event that caused the launch and the timestamp of the last interaction with the focused window. (Case 2 is handled by the application providing a special timestamp of 0 for the launch time, which ensures that the window that appears doesn't get focus) If the newly launched window isn't focused, some things should be done to alert the user that there is a window to work with: 1) The _NET_WM_DEMANDS_ATTENTION hint should be set 2) If the new window isn't modal for the focused window, it should appear below the focused window so that it doesn't obscure the focused window that the user is interacting with. 3) If the new window is modal to the focused window, the currently focused window should lose focus but the modal window should appear on top. Additionally, the user may decide to use the keyboard instead of the mouse to navigate between windows (referred to as "keynav"). This poses no problems for click-to-focus (because the same invariant can be maintained), but for sloppy and mouse focus it requires extra work to attempt to handle the INHERENTLY CONFLICTING CONSTRAINTS. Metacity does this by having a mouse_mode boolean used to determine which of the two sets of invariants holds. This mode is set according to which method was most recently used to choose a focus window: 1) When receiving EnterNotify events from mouse movement, set mouse_mode to TRUE. 2) When using keynav to choose a focus window (e.g. alt-tab, alt-esc, alt-f2, move-window-to-workspace keybindings), set mouse_mode to FALSE. 3) When handling events that don't choose a focus window but rather need a focus_window chosen for them (e.g. switch-to-workspace keybindings), don't change the mouse_mode and just use the current value. Note that grabs present a special case since they can generate EnterNotify and LeaveNotify events without using the mouse, thus these events should be ignored when the crossing mode is NotifyGrab or NotifyUngrab. THIS MOUSENAV/KEYNAV MODERATION METHOD IS NOT PERFECT--there are corner cases when trying to mix-and-match between mousenav and keynav simultaneously that cause problems; but it appears to be the most reasonable tradeoff and works well in most cases, especially if the user sticks to just mousenav for a long time or just keynav for a long time. Finally, windows of type WM_DOCK or WM_DESKTOP (e.g. the desktop and the panel) present a special case, at least partially due to the lack of decorations. For WM_DESKTOP windows, we only focus them if the user explicitly requests it (e.g. clicks on the window, uses Ctrl-Alt-Tab to navigate to it, uses a keybinding to show the desktop, etc.). For WM_DOCK windows, we do not focus unless we receive a very explicit request (e.g. Ctrl-Alt-Tab or a _NET_ACTIVE_WINDOW message; not normal clicks). To read more about the bugs that inspired these choices: - When a focused window becomes invalid and another should be chosen http://bugzilla.gnome.org/show_bug.cgi?id=135810 - When a new window is mapped http://bugzilla.gnome.org/show_bug.cgi?id=118372 Also, the EWMH spec, especially the parts relating to _NET_WM_USER_TIME - Modal vs. non-modal dialogs that get denied focus when mapped http://bugzilla.gnome.org/show_bug.cgi?id=151996 - Mousenav vs. Keynav in mouse and sloppy focus modes http://bugzilla.gnome.org/show_bug.cgi?id=167545 http://bugzilla.gnome.org/show_bug.cgi?id=101190 http://bugzilla.gnome.org/show_bug.cgi?id=357695 - Not focusing panels http://bugzilla.gnome.org/show_bug.cgi?id=160470 http://bugzilla.gnome.org/show_bug.cgi?id=120100 There were many bugs which had to be fixed to get all the above working; they helped form these policies and/or show the difficulties in implementing this policy (my apologies in advance for producing a list heavily lopsided to what I've done; it's just that these bugs are the ones I'm the most familiar with): bug 72314 ignore LeaveNotify events from grabs bug 82921 focus windows on map bug 87531 only show focus for sticky windows on active workspace (pager) bug 94545 focus window on workspace switch is non-deterministic bug 95747 should ignore EnterNotify events with NotifyInferior detail set bug 97635 sticky windows always keep focus when switching workspaces bug 102665 a window unminimized from the tasklist should be focused bug 107347 focus windows that manually position themselves too bug 108643 focus in MRU order instead of stack order bug 110970 moving a window to another workspace loses focus bug 112031 closing a dialog can result in a strange focus window bug 115650 add _NET_WM_USER_TIME support to gtk+ (see also 150502) bug 120100 panel shouldn't be focused after workspace applet usage bug 123803 need final EnterNotify after workspace switch (see also 124798) bug 124981 focus clicked window in pager only if on current workspace bug 125492 catch the xserver unfocusing everything and fix its braindeadedness bug 128200 focus correct window on libwnck window minimize (see 107681 too) bug 131582 fix race condition on window minimize/close bug 133120 wrong window focused when changing workspaces bug 135024 _NET_ACTIVE_WINDOW messages need timestamps bug 135786 middle-clicking on focused window to lower it should defocus too bug 136581 window minimization vs. activation for mouse focus bug 144900 fix focus choice on "un-showing" the desktop bug 147475 don't lock keyboard on workspace change bug 148364 DEMANDS_ATTENTION support for metacity & libwnck (and other stuff) bug 149028 focus-stealing-prevention for metacity-dialog (and other stuff) bug 149366 windows denied focus on map occur in wrong order in alt-tab list bug 149543 consistent focus window when unshowing desktop bug 149589 race in focus choice from libwnck messages bug 150271 make sure "run application" dialog gets focused bug 150668 update gtk+ _NET_ACTIVE_WINDOW support bug 151245 application startup notification forwarding (partially rejected) bug 151984 Soeren's idea--backup timestamp when startup notification not used bug 151990 prevent focus inconsistencies by only providing one focus method bug 151996 modal dialogs denied focus should not be lowered bug 152000 fix race on window close followed by rapid mouse movement bug 152004 ways to handle new window versus mouse invariants bug 153220 catch the root window getting focus and reset to default window bug 157360 focus parents of dismissed transient windows in preference to the window that most recently had focus bug 159257 focus the desktop when showing it bug 160470 don't focus panels on click bug 163450 correct highlighting in workspace switcher popup bug 164716 refuse to focus a window with a modal transient, and focus the transient instead bug 166524 avoid new windows being obscured by the focus window bug 167545 mousenav vs. keynav in mouse and sloppy focus modes Addendum on sloppy and mouse focus You may occasionally hear people refer to sloppy or mouse focus modes as inherently buggy. This is what they mean by that: 1) Keynav doesn't maintain the same invariants as mouse navigation for these focus modes; switching back and forth between navigation methods, therefore, may have or appear to have inconsistencies. Examples: a) If the user uses Alt-Tab to change the window with focus, then starts to move the mouse, at that moment the window where the mouse is does not have focus. b) Users expect that a workspace they previously used will not change when the return to it. This means things like window position and stacking order, but also the focus window. Unfortunately, using the original focus window (which would be the most recently used window on that workspace) will sometimes conflict with the invariants for mouse and sloppy focus modes. Users are much more surprised by the invariant being broken than by having the focus window changed (see bug 94545 and probably others), so we maintain the invariant. This only matters when using Ctrl-Alt-Arrow to switch workspaces instead of clicking in the workspace switcher, so this really is a keynav vs mouse issue. Either that, or a windows-are-being-mapped exception. ;-) c) Opening a menu, then moving the mouse to a different window, and then pressing escape to dismiss the menu will result in the window containing the mouse not being focused. This is actually correct behavior (because pressing escape shows that the user is using key navigation to interact with the window containing the menu) but is one of those hard-to-get-right keynav and mouse focus mixture cases. (See bug 101190 for more details) d) Similar to (c), moving the mouse off the menu doesn't immediately focus the window that the mouse goes over, due to an application grab (we couldn't change this and wouldn't want to, but technically it does break the invariant). e) If mouse_mode is off and the user does something to cause focus to change (e.g. switch workspaces, close or minimize a window, etc.) and simultaneously tries to move the mouse, the choice of which window to focus is inherently race-y. (You probably can't satisfy both keynav and mousenav invariants simultaneously...) 2) The sloppy/mouse invariants are often not strictly maintained; for example, we provide an exception to the invariant for newly mapped windows. (Most find that not allowing this exception is confusing) 3) There are an awful lot of little cases to handle to get any focus mode right, even for click-to-focus. Since mouse and sloppy focus have sometimes been hard to even determine what correct behavior is, it is much harder to get them completely right. Plus mouse and sloppy focus users are a minority, decreasing the motivation of window manager implementors to get those focus modes right. 4) Because of -1-, -2-, and -3-, implementations are often buggy or inconsistent and people form their opinions from usage of these implementations. 5) Sloppy focus suffers from a bit of a discoverability problem (for example, I have seen a scientist sit down to a computer for which sloppy focus was in use and take a few minutes before figuring out how window activation worked; granted the layout of the windows in that situation was a bit unusual but it still illustrates that sloppy focus is harder than it should be to figure out). Mouse focus solves this problem; however, people that have experience with other computing environments are accustomed to being able to move their mouse outside the window they are working with and still continue interacting with that window, which conflicts with mouse focus. ukwm/doc/rationales.txt0000644000175000017500000000574613624745310014151 0ustar fengfeng History ==== Focus issues: see doc/how-to-get-focus-right.txt Keep panel always on top: http://bugzilla.gnome.org/show_bug.cgi?id=81551 Edge flipping: http://bugzilla.gnome.org/show_bug.cgi?id=82917 Opaque resize: http://bugzilla.gnome.org/show_bug.cgi?id=92618 Alt+click to move/resize: http://bugzilla.gnome.org/show_bug.cgi?id=101151 https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=80918 minimized windows in Alt+tab: http://bugzilla.gnome.org/show_bug.cgi?id=89416 dialogs above entire app group: http://bugzilla.gnome.org/show_bug.cgi?id=88926 display window size/position: http://bugzilla.gnome.org/show_bug.cgi?id=85213 http://bugzilla.gnome.org/show_bug.cgi?id=106645 http://bugzilla.gnome.org/show_bug.cgi?id=130821 configure click actions, alt+click: http://bugzilla.gnome.org/show_bug.cgi?id=83210 system modal dialogs: http://bugzilla.gnome.org/show_bug.cgi?id=83357 workspace wrapping: http://bugzilla.gnome.org/show_bug.cgi?id=89315 raise windows on click: http://bugzilla.gnome.org/show_bug.cgi?id=326156 http://bugzilla.gnome.org/show_bug.cgi?id=86108 http://bugzilla.gnome.org/show_bug.cgi?id=115072 http://bugzilla.gnome.org/show_bug.cgi?id=115753 Pointer warping: http://bugzilla.gnome.org/show_bug.cgi?id=134353 http://bugzilla.gnome.org/show_bug.cgi?id=134352 (Think about tasklist & window selector too; this would be a very bad idea) Bugs for easy dupe-finding that seem to be hard to find otherwise: === Applications opening in wrong workspace: http://bugzilla.gnome.org/show_bug.cgi?id=160687 Tracking bugs ==== revise theme format: http://bugzilla.gnome.org/show_bug.cgi?id=102547 session management: http://bugzilla.gnome.org/show_bug.cgi?id=107063 focus-stealing-prevention: http://bugzilla.gnome.org/show_bug.cgi?id=149028 other focus bugs: http://bugzilla.gnome.org/show_bug.cgi?id=155450 drag-and-drop: http://bugzilla.gnome.org/show_bug.cgi?id=155451 raising/stacking: http://bugzilla.gnome.org/show_bug.cgi?id=155452 tasklist/workspace switcher: http://bugzilla.gnome.org/show_bug.cgi?id=155453 window/workspace selection: http://bugzilla.gnome.org/show_bug.cgi?id=155456 key/mouse-binding actions: http://bugzilla.gnome.org/show_bug.cgi?id=155457 moving/resizing (constraints): http://bugzilla.gnome.org/show_bug.cgi?id=155458 window placement: http://bugzilla.gnome.org/show_bug.cgi?id=155460 logout/system-monitor keys: http://bugzilla.gnome.org/show_bug.cgi?id=155462 modal dialogs: http://bugzilla.gnome.org/show_bug.cgi?id=164841 multi-head sans xinerama: http://bugzilla.gnome.org/show_bug.cgi?id=324772 xinerama: http://bugzilla.gnome.org/show_bug.cgi?id=324773 output-only windows: http://bugzilla.gnome.org/show_bug.cgi?id=340584 allowed actions/window-type: http://bugzilla.gnome.org/show_bug.cgi?id=340682 EWMH/ICCCM compliance: http://bugzilla.gnome.org/show_bug.cgi?id=340691 ukwm/doc/code-overview.txt0000644000175000017500000001712013624745310014553 0ustar fengfengThis is not meant to be comprehensive by any means. Rather it is meant as just a brief overview of some of the bigger structures and files, with guides for a variety of task categories providing places to start looking in the code and things to look for. Overview Jobs of various files Major data structures and their relationships Getting started -- where to look Jobs of various files src/window.c is where all the guts of the window manager live. This is basically the only remotely scary file. src/frames.c is the GtkWidget that handles drawing window frames. src/core.h defines the interface used by the GTK portion of the window manager to talk to the other portions. There's some cruft in here that's unused, since nearly all window operations have moved out of this file so frameless apps can have window operations. src/ui.h defines the interface the plain Xlib portion of the window manager uses to talk to the GTK portion. src/theme.c and src/theme-parser.c have the theme system; this is well-modularized from the rest of the code, since the theme viewer app links to these files in addition to the WM itself. Major data structures and their relationships Major structs have a "Meta" prefix, thus MetaDisplay, MetaScreen, MetaWindow, etc. This serves as a way of namespacing in C. It also has the side effect of avoiding conflicts with common names that X already uses such as Display, Screen, Window, etc. Note that when I refer to a display below, I'm meaning a MetaDisplay and not a Display. Don't confuse displays and screens. While Metacity can run with multiple displays, it is kind of useless since you might as well just run two copies of Metacity. However, having multiple screens per display is useful and increasingly common (known as "multiscreen" and "xinerama" setups, where users make use of more than one monitor). You should basically think of a display as a combination of one or more monitors with a single keyboard (...and usually only one mouse). There is also a significant difference between multiscreen and xinerama as well. Basically, each MetaScreen is a root window (root node in the tree of windows). With Xinerama, a single root window appears to span multiple monitors, whereas with multiscreen a root window is confined to a single monitor. To re-emphasize the distinction between a display and a screen, the pointer and keyboard are shared between all root windows for a given display. The display keeps track of a lot of various global quantities, but in particular has a compositor and a list (GList) of screens. A compositor is an opaque structure (only defined in compositor.c), meaning that you'll only reference the API for it. It handles (or will handle) cool stuff with the new X extensions, such as smooth resizing and alpha transparency. A screen keeps track of a number of quantities as well, in particular a stack and a list of workspaces. A stack is basically a list of windows, and the depth order they have relative to each other (which thus determines which windows are on top and which are obscured). A workspace mostly contains a list of windows for the workspace, but also has a few other quantities as well (a list of struts which are areas where windows should not be placed and an mru_list or "most recently used window list"). A window has a huge list of quantities for keeping track of things about a window on the screen. (We want to avoid making this list larger because the memory for all these quantities is per window.) One item in particular that a window has, though, is a frame. A frame is the decorations that surround the window (i.e. the titlebar and the minimize and close buttons and the part that you can use to resize), and contains a handful of variables related to that, but no other major structures. Getting started -- where to look Getting started on developing free software projects can often be like being dropped off in a town that is unknown to you and being told to make a map, when various road and building signs are missing or fading. To try to alleviate that initial difficulty in orientation, below I list a variety of general task categories with file, function, variable, and x property names that may be useful to fixing bugs or writing features that fall within that category. First, though, it's useful to note that most event and message passing goes through display.c:event_callback(), so that's often a good place to start reading for general familiarity with the code (actually, I'd suggest skipping down to the first switch statement within that function). Of course, not all events go through that function, as there are a few other places that handle events too such as frames.c. Anyway, without further ado, here are the categories and (hopefully) useful things to look at for each: Focus issues (i.e. issues with which window is active): doc/how-to-get-focus-right.txt meta_workspace_focus_default_window _NET_ACTIVE_WINDOW _NET_WM_USER_TIME meta_window_focus meta_display_(set_input|focus_the_no)_focus_window XSetInputFocus (only for purposes of understanding how X focus/input works) CurrentTime (mostly, you should just think "Bad; don't use it") Compositor stuff (X extension for eye candy like transparency): compositor.c The luminocity module in CVS Window depth (i.e. stacking or lowering/raising) issues: stack.c _NET_CLIENT_LIST_STACKING transient_for WM_TRANSIENT_FOR meta_window_(raise|lower) _NET_WM_WINDOW_TYPE _NET_WM_MOUSE_ACTION/_NET_WM_TAKE_ACTIVITY? (aren't yet in EWMH) Window placement issues: place.c constraints.c _NET_WM_STRUT WM_SIZE_HINTS Moving and resizing issues: constraints.c update_move update_resize meta_window_handle_mouse_grab_op_event _NET_MOVERESIZE_WINDOW _NET_WM_STRUT Drag and drop issues: the XDND protocol (see http://www.newplanetsoftware.com/xdnd/ and http://freedesktop.org/Standards/XDND) _NET_WM_MOUSE_ACTION/_NET_WM_TAKE_ACTIVITY (aren't yet in EWMH) A general pointer: what causes the difficulty here is that when the application receives a mouse click to start a drag, it does a grab so that the window manager doesn't get any further events; thus correcting things require standards so that applications and window managers can collaborate correctly Theme issues: ??? doc/theme-format.txt theme.c theme-parser.c (ui.c, core.c, frames.c, frame.c? I dunno...) Session management issues: ??? session.c http://www.x.org/X11R6.8.1/doc/SM/xsmp.pdf ? http://www.x.org/X11R6.8.1/doc/SM/SMlib.pdf ? meta_window_apply_session_info Tasklist and Workspace switcher issues: window-props.c various functions in screen.c (especially ones using XChangeProperty) xprops.c The libwnck module in cvs meta_window_client_message Lots of the EWMH Window and workspace selection/changing issues: tabpopup.c keybindings.c, functions: *_workspace*, *_tab_* meta_screen_ensure_*_popup display.c, functions: *_tab* Key and mouse binding actions: keybindings.c meta_frames_button_(press|release)_event display.c: event_callback, but only the (Key|Button)_(Press|Release) cases Xinerama and multiscreen: ??? In general, just search for Xinerama, but in particular see screen.c window.c place.c constraints.c ukwm/po/0000755000175000017500000000000013624745310011104 5ustar fengfengukwm/po/vi.po0000644000175000017500000013577413624745310012103 0ustar fengfeng# Vietnamese translation for Metacity. # Copyright © 2016 GNOME i18n Project for Vietnamese. # This file is distributed under the same license as the Metacity package. # Nguyễn Thái Ngọc Duy , 2002-2004, 2007, 2008, 2011-2013. # Clytie Siddall , 2005-2009. # Trần Ngọc Quân , 2014, 2015, 2016, 2017. # msgid "" msgstr "" "Project-Id-Version: metacity master\n" "Report-Msgid-Bugs-To: https://github.com/ukui/ukwm/issues\n" "POT-Creation-Date: 2019-12-13 09:56+0800\n" "PO-Revision-Date: 2017-09-09 08:26+0700\n" "Last-Translator: Trần Ngọc Quân \n" "Language-Team: Vietnamese \n" "Language: vi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Gtranslator 2.91.7\n" #: data/ukwm.desktop.in:4 msgid "Ukwm" msgstr "Ukwm" #: data/org.ukui.ukwm.gschema.xml.in:7 msgid "Modifier to use for extended window management operations" msgstr "Phím bổ trợ dùng cho chức năng quản lý cửa sổ mở rộng" #: data/org.ukui.ukwm.gschema.xml.in:8 msgid "" "This key will initiate the “overlay”, which is a combination window overview " "and application launching system. The default is intended to be the “Windows " "key” on PC hardware. It’s expected that this binding either the default or " "set to the empty string." msgstr "" "Phím này khởi tạo “overlay”, nơi mà tổ hợp tổng quát cửa sổ và hệ thống chạy " "ứng dụng. Mặc định là \"phím Windows\" trên phần cứng PC. Nó được kỳ vọng " "rằng tổ hợp hoặc là mặc định, hoặc chuỗi rỗng." #: data/org.ukui.ukwm.gschema.xml.in:20 msgid "Attach modal dialogs" msgstr "Gắn hộp thoại cách thức" #: data/org.ukui.ukwm.gschema.xml.in:21 msgid "" "When true, instead of having independent titlebars, modal dialogs appear " "attached to the titlebar of the parent window and are moved together with " "the parent window." msgstr "" "Nếu được đặt, thay vì hiện thanh tiêu đề độc lập, hộp thoại cách thức sẽ " "xuất hiện gắn với thanh tiêu đề của cửa sổ cha và được di chuyển cùng với " "cửa sổ cha." #: data/org.ukui.ukwm.gschema.xml.in:30 msgid "Enable edge tiling when dropping windows on screen edges" msgstr "Bật lợp cạnh khi thả cửa sổ trên cạnh màn hình" #: data/org.ukui.ukwm.gschema.xml.in:31 msgid "" "If enabled, dropping windows on vertical screen edges maximizes them " "vertically and resizes them horizontally to cover half of the available " "area. Dropping windows on the top screen edge maximizes them completely." msgstr "" "Nếu bật, thả cửa sổ trên cạnh dọc màn hình sẽ phóng tối đa cửa sổ theo chiều " "dọc và điều chỉnh chiều ngang phủ hết nửa màn hình. Thả cửa sổ trên đỉnh màn " "hình sẽ phóng to toàn màn hình." #: data/org.ukui.ukwm.gschema.xml.in:40 msgid "Workspaces are managed dynamically" msgstr "Không gian làm việc được quản lý động" #: data/org.ukui.ukwm.gschema.xml.in:41 msgid "" "Determines whether workspaces are managed dynamically or whether there’s a " "static number of workspaces (determined by the num-workspaces key in org." "gnome.desktop.wm.preferences)." msgstr "" "Xác định không gian làm việc được quản lý động, hay cố định số không gian " "làm việc (xác định bởi khóa num-workspaces trong org.gnome.desktop.wm." "preferences)." #: data/org.ukui.ukwm.gschema.xml.in:50 msgid "Workspaces only on primary" msgstr "Không gian làm việc chỉ trên màn hình chính" #: data/org.ukui.ukwm.gschema.xml.in:51 msgid "" "Determines whether workspace switching should happen for windows on all " "monitors or only for windows on the primary monitor." msgstr "" "Xác định chuyển không gian làm việc cho cửa sổ trên mọi màn hình hay chỉ " "trên màn hình chính." #: data/org.ukui.ukwm.gschema.xml.in:59 msgid "No tab popup" msgstr "Không tab popup" #: data/org.ukui.ukwm.gschema.xml.in:60 msgid "" "Determines whether the use of popup and highlight frame should be disabled " "for window cycling." msgstr "Xác định có bỏ qua popup và khung tô sáng khi xoay vòng cửa sổ không." #: data/org.ukui.ukwm.gschema.xml.in:68 msgid "Delay focus changes until the pointer stops moving" msgstr "Khoảng chờ con trỏ dừng di chuyển trước khi thay đổi tiêu điểm" #: data/org.ukui.ukwm.gschema.xml.in:69 msgid "" "If set to true, and the focus mode is either “sloppy” or “mouse” then the " "focus will not be changed immediately when entering a window, but only after " "the pointer stops moving." msgstr "" "Nếu bật, và chế độ kích hoạt là “sloppy” hay “mouse” thì sự kích hoạt sẽ " "không thay đổi tức thì khi vào cửa sổ, mà chỉ sau khi con trỏ ngừng di " "chuyển." #: data/org.ukui.ukwm.gschema.xml.in:79 msgid "Draggable border width" msgstr "Độ rộng biên có thể kéo" #: data/org.ukui.ukwm.gschema.xml.in:80 msgid "" "The amount of total draggable borders. If the theme’s visible borders are " "not enough, invisible borders will be added to meet this value." msgstr "" "Kích thước biên có thể kéo. Nếu biên thấy được của chủ đề không đủ, biên vô " "hình sẽ được thêm vào để thỏa mãn giá trị này." #: data/org.ukui.ukwm.gschema.xml.in:89 msgid "Auto maximize nearly monitor sized windows" msgstr "Tự động phóng to cửa sổ gần bằng màn hình" #: data/org.ukui.ukwm.gschema.xml.in:90 msgid "" "If enabled, new windows that are initially the size of the monitor " "automatically get maximized." msgstr "Nếu bật, sẽ tự động phóng to cửa sổ mới với kích thước tối đa." #: data/org.ukui.ukwm.gschema.xml.in:98 msgid "Place new windows in the center" msgstr "Đặt cửa sổ mới ở chính giữa" #: data/org.ukui.ukwm.gschema.xml.in:99 msgid "" "When true, the new windows will always be put in the center of the active " "screen of the monitor." msgstr "" "Nếu chọn, các cửa sổ mới sẽ luôn được đặt tại trung tâm của màn hình đang " "hoạt động của màn hình." #: data/org.ukui.ukwm.gschema.xml.in:107 msgid "Enable experimental features" msgstr "Bật các tính băng thử nghiệm" #: data/org.ukui.ukwm.gschema.xml.in:108 msgid "" "To enable experimental features, add the feature keyword to the list. " "Whether the feature requires restarting the compositor depends on the given " "feature. Any experimental feature is not required to still be available, or " "configurable. Don’t expect adding anything in this setting to be future " "proof. Currently possible keywords: • “scale-monitor-framebuffer” — makes " "ukwm default to layout logical monitors in a logical pixel coordinate space, " "while scaling monitor framebuffers instead of window content, to manage " "HiDPI monitors. Does not require a restart. • “remote-desktop” — enables " "remote desktop support. To support remote desktop with screen sharing, " "“screen-cast” must also be enabled. • “screen-cast” — enables screen cast " "support." msgstr "" "Để bật các tính năng thử nghiệm, thêm các từ khóa tính năng vào danh sách. " "Việc tính năng mới có yêu cầu khởi động lại hay không là phụ thuộc vào tính " "năng đã cho. Bất kỳ tính năng thử nghiệp nào không được yêu cầu vẫn sẵn " "sàng, hoặc cấu hình được. Đừng cho rằng thêm bất kỳ thứ gì trong cài đặt này " "thử nghiệm trong tương lai. Các từ khóa hiện có thể là: • “scale-monitor-" "framebuffer” — làm cho ukwm default to layout logical monitors trong một " "không gian tọa độ điểm ảnh lôgíc, trong khi while scaling monitor " "framebuffers instead of window content, để quản lý các màn hình HiDPI. Không " "yêu cầu khởi động lại. • “remote-desktop” — cho phép điều khiển màn hình từ " "xa. Để hỗ trợ điều khiển màn hình từ xa bằng cách chia sẻ màn hình, “screen-" "cast” cũng phải được bật. • “screen-cast” — bật hỗ trợ chia sẻ màn hình." #: data/org.ukui.ukwm.gschema.xml.in:145 msgid "Select window from tab popup" msgstr "Chọn cửa sổ từ thanh nổi lên" #: data/org.ukui.ukwm.gschema.xml.in:150 msgid "Cancel tab popup" msgstr "Hủy thanh nổi lên" #: data/org.ukui.ukwm.gschema.xml.in:155 msgid "Switch monitor configurations" msgstr "Chuyển các cấu hình màn hình" #: data/org.ukui.ukwm.gschema.xml.in:160 msgid "Rotates the built-in monitor configuration" msgstr "Quay cấu hình màn hình tích hợp" #: data/org.ukui.ukwm.wayland.gschema.xml.in:6 msgid "Switch to VT 1" msgstr "Chuyển sang VT 1" #: data/org.ukui.ukwm.wayland.gschema.xml.in:10 msgid "Switch to VT 2" msgstr "Chuyển sang VT 2" #: data/org.ukui.ukwm.wayland.gschema.xml.in:14 msgid "Switch to VT 3" msgstr "Chuyển sang VT 3" #: data/org.ukui.ukwm.wayland.gschema.xml.in:18 msgid "Switch to VT 4" msgstr "Chuyển sang VT 4" #: data/org.ukui.ukwm.wayland.gschema.xml.in:22 msgid "Switch to VT 5" msgstr "Chuyển sang VT 5" #: data/org.ukui.ukwm.wayland.gschema.xml.in:26 msgid "Switch to VT 6" msgstr "Chuyển sang VT 6" #: data/org.ukui.ukwm.wayland.gschema.xml.in:30 msgid "Switch to VT 7" msgstr "Chuyển sang VT 7" #: data/org.ukui.ukwm.wayland.gschema.xml.in:34 msgid "Switch to VT 8" msgstr "Chuyển sang VT 8" #: data/org.ukui.ukwm.wayland.gschema.xml.in:38 msgid "Switch to VT 9" msgstr "Chuyển sang VT 9" #: data/org.ukui.ukwm.wayland.gschema.xml.in:42 msgid "Switch to VT 10" msgstr "Chuyển sang VT 10" #: data/org.ukui.ukwm.wayland.gschema.xml.in:46 msgid "Switch to VT 11" msgstr "Chuyển sang VT 11" #: data/org.ukui.ukwm.wayland.gschema.xml.in:50 msgid "Switch to VT 12" msgstr "Chuyển sang VT 12" #: data/org.ukui.ukwm.wayland.gschema.xml.in:54 msgid "Re-enable shortcuts" msgstr "Bật-lại phím tắt" #. TRANSLATORS: This string refers to a button that switches between #. * different modes. #. #: src/backends/meta-input-settings.c:2168 #, c-format msgid "Mode Switch (Group %d)" msgstr "Chuyển chế độ(Nhóm %d)" #. TRANSLATORS: This string refers to an action, cycles drawing tablets' #. * mapping through the available outputs. #. #: src/backends/meta-input-settings.c:2191 msgid "Switch monitor" msgstr "Chuyển màn hình" #: src/backends/meta-input-settings.c:2193 msgid "Show on-screen help" msgstr "Hiển thị trợ giúp trên-màn-hình" #: src/backends/meta-monitor-manager.c:916 msgid "Built-in display" msgstr "Màn hình tích hợp" #: src/backends/meta-monitor-manager.c:939 msgid "Unknown" msgstr "Không rõ" #: src/backends/meta-monitor-manager.c:941 msgid "Unknown Display" msgstr "Không hiểu màn hình" #. TRANSLATORS: this is a monitor vendor name, followed by a #. * size in inches, like 'Dell 15"' #. #: src/backends/meta-monitor-manager.c:949 #, c-format msgid "%s %s" msgstr "%s %s" #. This probably means that a non-WM compositor like xcompmgr is running; #. * we have no way to get it to exit #: src/compositor/compositor.c:476 #, c-format msgid "" "Another compositing manager is already running on screen %i on display “%s”." msgstr "" "Bộ quản lý cửa sổ đã đang chạy trên Màn hình %i trên bộ trình bày “%s”." #: src/core/bell.c:195 msgid "Bell event" msgstr "Sự kiện chuông" #: src/core/display.c:609 #, c-format msgid "Failed to open X Window System display “%s”\n" msgstr "Gặp lỗi khi mở bộ trình bày Hệ thống Cửa sổ X “%s”\n" #: src/core/main.c:190 msgid "Disable connection to session manager" msgstr "Vô hiệu hóa kết nối với bộ quản lý phiên làm việc" #: src/core/main.c:196 msgid "Replace the running window manager" msgstr "Thay thế bộ quản lý cửa sổ đang chạy" #: src/core/main.c:202 msgid "Specify session management ID" msgstr "Ghi rõ mã số quản lý phiên làm việc" #: src/core/main.c:207 msgid "X Display to use" msgstr "Bộ trình bày X cần dùng" #: src/core/main.c:213 msgid "Initialize session from savefile" msgstr "Khởi động phiên làm việc từ tập tin lưu" #: src/core/main.c:219 msgid "Make X calls synchronous" msgstr "Khiến các cú gọi X đồng bộ với nhau" #: src/core/main.c:226 msgid "Run as a wayland compositor" msgstr "Chạy như là một “wayland compositor”" #: src/core/main.c:232 msgid "Run as a nested compositor" msgstr "Chạy như là một “nested compositor”" #: src/core/main.c:240 msgid "Run as a full display server, rather than nested" msgstr "Chạy như là một dịch vụ hiển thị đầy đủ, thay cho lồng nhau" #. Translators: %s is a window title #: src/core/meta-close-dialog-default.c:148 #, c-format msgid "“%s” is not responding." msgstr "“%s” không trả lời." #: src/core/meta-close-dialog-default.c:150 msgid "Application is not responding." msgstr "Ứng dụng không trả lời." #: src/core/meta-close-dialog-default.c:155 msgid "" "You may choose to wait a short while for it to continue or force the " "application to quit entirely." msgstr "" "Bạn có thể chọn chờ một lúc cho nó tiếp tục hoặc buộc chấm dứt hoàn toàn ứng " "dụng." #: src/core/meta-close-dialog-default.c:162 msgid "_Force Quit" msgstr "_Buộc thoát" #: src/core/meta-close-dialog-default.c:162 msgid "_Wait" msgstr "_Chờ" #: src/core/ukwm.c:41 #, c-format msgid "" "ukwm %s\n" "Copyright © 2001-%d Havoc Pennington, Red Hat, Inc., and others\n" "This is free software; see the source for copying conditions.\n" "There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A " "PARTICULAR PURPOSE.\n" msgstr "" "ukwm %s\n" "Tác quyền © 2001-%d của Havoc Pennington, Red Hat, Inc., và những người " "khác.\n" "Chương trình này là phần mềm tự do; xem mã nguồn để tìm điều kiện sao chép.\n" "KHÔNG CÓ BẢO HÀNH GÌ CẢ, THẬM CHÍ KHÔNG CÓ BẢO ĐẢM ĐƯỢC NGỤ Ý KHẢ NĂNG BÁN " "HAY KHẢ NĂNG LÀM ĐƯỢC VIỆC DỨT KHOÁT.\n" #: src/core/ukwm.c:55 msgid "Print version" msgstr "Hiển thị phiên bản" #: src/core/ukwm.c:61 msgid "Ukwm plugin to use" msgstr "Phần bổ sung Ukwm cần dùng" #: src/core/prefs.c:2033 #, c-format msgid "Workspace %d" msgstr "Không gian làm việc %d" #: src/core/screen.c:584 #, c-format msgid "" "Display “%s” already has a window manager; try using the --replace option to " "replace the current window manager." msgstr "" "Màn hình “%s” đã có bộ quản lý cửa sổ rồi; hãy thử dùng tùy chọn --replace " "để thay thế bộ quản lý cửa sổ đang dùng." #: src/core/screen.c:669 #, c-format msgid "Screen %d on display “%s” is invalid\n" msgstr "Màn hình %d trên bộ trình bày “%s” không hợp lệ.\n" #: src/core/util.c:121 msgid "Ukwm was compiled without support for verbose mode\n" msgstr "Ukwm đã được biên dịch không hỗ trợ chế độ chi tiết\n" #: src/wayland/meta-wayland-tablet-pad.c:563 #, c-format msgid "Mode Switch: Mode %d" msgstr "Chuyển chế độ: Chế độ %d" #: src/x11/session.c:1816 msgid "" "These windows do not support “save current setup” and will have to be " "restarted manually next time you log in." msgstr "" "Những cửa sổ này không hỗ trợ “lưu cài đặt hiện tại” và sẽ phải khởi động " "lại bằng tay lần kế bạn đăng nhập." #: src/x11/window-props.c:560 #, c-format msgid "%s (on %s)" msgstr "%s (trên %s)" #~ msgid "Navigation" #~ msgstr "Điều hướng" #~ msgid "Move window to workspace 1" #~ msgstr "Chuyển cửa sổ sang không gian làm việc 1" #~ msgid "Move window to workspace 2" #~ msgstr "Chuyển cửa sổ sang không gian làm việc 2" #~ msgid "Move window to workspace 3" #~ msgstr "Chuyển cửa sổ sang không gian làm việc 3" #~ msgid "Move window to workspace 4" #~ msgstr "Chuyển cửa sổ sang không gian làm việc 4" #~ msgid "Move window to last workspace" #~ msgstr "Chuyển cửa sổ sang không gian làm việc cuối" #~ msgid "Move window one workspace to the left" #~ msgstr "Chuyển cửa sổ sang không gian làm việc bên trái" #~ msgid "Move window one workspace to the right" #~ msgstr "Chuyển cửa sổ sang không gian làm việc bên phải" #~ msgid "Move window one workspace up" #~ msgstr "Chuyển cửa sổ lên một không gian làm việc" #~ msgid "Move window one workspace down" #~ msgstr "Chuyển cửa sổ xuống một không gian làm việc" #~ msgid "Move window one monitor to the left" #~ msgstr "Chuyển cửa sổ sang trái một màn hình" #~ msgid "Move window one monitor to the right" #~ msgstr "Chuyển cửa sổ sang phải một màn hình" #~ msgid "Move window one monitor up" #~ msgstr "Chuyển cửa sổ lên một màn hình" #~ msgid "Move window one monitor down" #~ msgstr "Chuyển cửa sổ xuống một màn hình" #~ msgid "Switch applications" #~ msgstr "Chuyển ứng dụng" #~ msgid "Switch to previous application" #~ msgstr "Chuyển sang ứng dụng kế trước" #~ msgid "Switch windows" #~ msgstr "Chuyển cửa sổ" #~ msgid "Switch to previous window" #~ msgstr "Chuyển sang cửa sổ kế trước" #~ msgid "Switch windows of an application" #~ msgstr "Chuyển cửa sổ của một ứng dụng" #~ msgid "Switch to previous window of an application" #~ msgstr "Chuyển sang cửa sổ kế trước của một ứng dụng" #~ msgid "Switch system controls" #~ msgstr "Chuyển điều khiển hệ thống" #~ msgid "Switch to previous system control" #~ msgstr "Chuyển đến điều khiển hệ thống kế trước" #~ msgid "Switch windows directly" #~ msgstr "Chuyển cửa sổ trực tiếp" #~ msgid "Switch directly to previous window" #~ msgstr "Chuyển trực tiếp đến cửa sổ kế trước" #~ msgid "Switch windows of an app directly" #~ msgstr "Chuyển trực tiếp cửa sổ của một ứng dụng" #~ msgid "Switch directly to previous window of an app" #~ msgstr "Chuyển trực tiếp đến cửa sổ kế trước của một ứng dụng" #~ msgid "Switch system controls directly" #~ msgstr "Chuyển điều khiển hệ thống trực tiếp" #~ msgid "Switch directly to previous system control" #~ msgstr "Chuyển trực tiếp đến điều khiển hệ thống kế trước" #~ msgid "Hide all normal windows" #~ msgstr "Ẩn mọi cửa sổ thường" #~ msgid "Switch to workspace 1" #~ msgstr "Chuyển sang không gian làm việc 1" #~ msgid "Switch to workspace 2" #~ msgstr "Chuyển sang không gian làm việc 2" #~ msgid "Switch to workspace 3" #~ msgstr "Chuyển sang không gian làm việc 3" #~ msgid "Switch to workspace 4" #~ msgstr "Chuyển sang không gian làm việc 4" #~ msgid "Switch to last workspace" #~ msgstr "Chuyển sang không gian làm việc cuối" #~ msgid "Move to workspace left" #~ msgstr "Chuyển sang không gian làm việc trái" #~ msgid "Move to workspace right" #~ msgstr "Chuyển sang không gian làm việc phải" #~ msgid "Move to workspace above" #~ msgstr "Chuyển sang không gian làm việc trên" #~ msgid "Move to workspace below" #~ msgstr "Chuyển sang không gian làm việc dưới" #~ msgid "System" #~ msgstr "Hệ thống" #~ msgid "Show the run command prompt" #~ msgstr "Hiện dấu nhắc dòng lệnh" #~ msgid "Show the activities overview" #~ msgstr "Hiện tổng quan hoạt động" #~ msgid "Windows" #~ msgstr "Cửa sổ" #~ msgid "Activate the window menu" #~ msgstr "Kích hoạt trình đơn cửa sổ" #~ msgid "Toggle fullscreen mode" #~ msgstr "Bật/tắt toàn màn hình" #~ msgid "Toggle maximization state" #~ msgstr "Bật/tắt trạng thái to hết cỡ" #~ msgid "Maximize window" #~ msgstr "Phóng to cửa sổ hết cỡ" #~ msgid "Restore window" #~ msgstr "Phục hồi cửa sổ" #~ msgid "Toggle shaded state" #~ msgstr "Bật tắt trạng thái đánh bóng" #~ msgid "Close window" #~ msgstr "Đóng cửa sổ" #~ msgid "Hide window" #~ msgstr "Ẩn cửa sổ" #~ msgid "Move window" #~ msgstr "Di chuyển cửa sổ" #~ msgid "Resize window" #~ msgstr "Co giãn cửa sổ" #~ msgid "Toggle window on all workspaces or one" #~ msgstr "Dùng cửa sổ trên một/mọi không gian làm việc" #~ msgid "Raise window if covered, otherwise lower it" #~ msgstr "Nâng cửa sổ nếu bị che, không thì hạ xuống" #~ msgid "Raise window above other windows" #~ msgstr "Nâng cửa sổ trên các cửa sổ khác" #~ msgid "Lower window below other windows" #~ msgstr "Hạ cửa sổ dưới các cửa sổ khác" #~ msgid "Maximize window vertically" #~ msgstr "Phóng to cửa sổ theo chiều dọc" #~ msgid "Maximize window horizontally" #~ msgstr "Phóng to cửa sổ theo chiều ngang" #~ msgid "View split on left" #~ msgstr "Phân đôi bên trái" #~ msgid "View split on right" #~ msgstr "Phân đôi bên phải" #~ msgid "Failed to scan themes directory: %s\n" #~ msgstr "Gặp lỗi khi quét thư mục lưu chủ đề: %s\n" #~ msgid "" #~ "Could not find a theme! Be sure %s exists and contains the usual themes.\n" #~ msgstr "" #~ "Không tìm thấy chủ đề nào cả! Hãy bảo đảm %s tồn tại và chứa những chủ đề " #~ "thông thường.\n" #~ msgid "Screen %d on display \"%s\" already has a window manager\n" #~ msgstr "Màn hình %d trên bộ trình bày \"%s\" đã có bộ quản lý cửa sổ.\n" #~ msgid "%d x %d" #~ msgstr "%d x %d" #~ msgid "top" #~ msgstr "đỉnh" #~ msgid "bottom" #~ msgstr "đáy" #~ msgid "left" #~ msgstr "trái" #~ msgid "right" #~ msgstr "phải" #~ msgid "frame geometry does not specify \"%s\" dimension" #~ msgstr "tọa độ khung không xác định chiều \"%s\"." #~ msgid "frame geometry does not specify dimension \"%s\" for border \"%s\"" #~ msgstr "tọa độ khung không xác định chiều \"%s\" cho biên \"%s\"." #~ msgid "Button aspect ratio %g is not reasonable" #~ msgstr "Tỷ lệ hình thể nút “%g” không hợp lý." #~ msgid "Frame geometry does not specify size of buttons" #~ msgstr "Tọa độ khung không xác định kích thước nút." #~ msgid "Gradients should have at least two colors" #~ msgstr "Thang độ nên có ít nhất hai màu." #~ msgid "" #~ "GTK custom color specification must have color name and fallback in " #~ "parentheses, e.g. gtk:custom(foo,bar); could not parse \"%s\"" #~ msgstr "" #~ "Đặc tả màu tự chọn GTK phải có tên màu nằm và fallback trong dấu ngoặc, " #~ "ví dụ gtk:custom(foo,bar); không thể phân tích \"%s\"" #~ msgid "" #~ "Invalid character '%c' in color_name parameter of gtk:custom, only A-Za-" #~ "z0-9-_ are valid" #~ msgstr "" #~ "Ký tự không hợp lệ “%c” trong tham số color_name của gtk:custom, chỉ chấp " #~ "nhận A-Za-z0-9-_" #~ msgid "" #~ "Gtk:custom format is \"gtk:custom(color_name,fallback)\", \"%s\" does not " #~ "fit the format" #~ msgstr "" #~ "Định dạng Gtk:custom là \"gtk:custom(color_name,fallback)\", \"%s\" không " #~ "tuân theo định dạng này" #~ msgid "" #~ "GTK color specification must have the state in brackets, e.g. gtk:" #~ "fg[NORMAL] where NORMAL is the state; could not parse \"%s\"" #~ msgstr "" #~ "Lời ghi rõ màu GTK phải có trạng thái nằm trong ngoặc, v.d. “gtk:" #~ "fg[NORMAL]”, NORMAL (bình thường) là trạng thái; không thể phân tích \"%s" #~ "\"." #~ msgid "" #~ "GTK color specification must have a close bracket after the state, e.g. " #~ "gtk:fg[NORMAL] where NORMAL is the state; could not parse \"%s\"" #~ msgstr "" #~ "Lời ghi rõ màu GTK phải có dấu đóng ngoặc sau trạng thái, v.d. " #~ "“fg[NORMAL]”, NORMAL (bình thường) là trạng thái; không thể phân tích \"%s" #~ "\"." #~ msgid "Did not understand state \"%s\" in color specification" #~ msgstr "Không hiểu trạng thái \"%s\" trong đặc tả màu." #~ msgid "Did not understand color component \"%s\" in color specification" #~ msgstr "Không hiểu thành phần màu \"%s\" trong đặc tả màu." #~ msgid "" #~ "Blend format is \"blend/bg_color/fg_color/alpha\", \"%s\" does not fit " #~ "the format" #~ msgstr "" #~ "Dạng pha trộn là “blend/bg_color/fg_color/alpha”, \"%s\" không tuân theo " #~ "dạng thức đó." #~ msgid "Could not parse alpha value \"%s\" in blended color" #~ msgstr "Không thể phân tích giá trị alpha \"%s\" trong màu pha trộn." #~ msgid "Alpha value \"%s\" in blended color is not between 0.0 and 1.0" #~ msgstr "Giá trị alpha \"%s\" trong màu pha trộn không nằm giữa 0.0 và 1.0." #~ msgid "" #~ "Shade format is \"shade/base_color/factor\", \"%s\" does not fit the " #~ "format" #~ msgstr "" #~ "Dạng thức bóng là \"shade/base_color/factor\" (bóng/màu cơ bản/hệ số), " #~ "“%s” không tuân theo dạng thức đó." #~ msgid "Could not parse shade factor \"%s\" in shaded color" #~ msgstr "Không thể phân tích hệ số bóng \"%s\" trong màu bóng." #~ msgid "Shade factor \"%s\" in shaded color is negative" #~ msgstr "Có hệ số bóng âm \"%s\" trong màu bóng." #~ msgid "Could not parse color \"%s\"" #~ msgstr "Không thể phân tích màu \"%s\"." #~ msgid "Coordinate expression contains character '%s' which is not allowed" #~ msgstr "Biểu thức tọa độ chứa ký tự \"%s\" không được phép." #~ msgid "" #~ "Coordinate expression contains floating point number '%s' which could not " #~ "be parsed" #~ msgstr "" #~ "Biểu thức tọa độ chứa số với điểm phù động \"%s\" không thể phân tích." #~ msgid "" #~ "Coordinate expression contains integer '%s' which could not be parsed" #~ msgstr "Biểu thức tọa độ chứa số nguyên \"%s\" không thể phân tích." #~ msgid "" #~ "Coordinate expression contained unknown operator at the start of this " #~ "text: \"%s\"" #~ msgstr "Biểu thức tọa độ chứa toán tử lạ tại đầu văn bản: \"%s\"" #~ msgid "Coordinate expression was empty or not understood" #~ msgstr "Biểu thức tọa độ rỗng hoặc không thể hiểu" #~ msgid "Coordinate expression results in division by zero" #~ msgstr "Biểu thức tọa độ gây ra lỗi chia cho không" #~ msgid "" #~ "Coordinate expression tries to use mod operator on a floating-point number" #~ msgstr "Biểu thức tọa độ thử dùng toán tử “mod” với số thực dấu chấm động" #~ msgid "" #~ "Coordinate expression has an operator \"%s\" where an operand was expected" #~ msgstr "" #~ "Biểu thức tọa độ có toán tử \"%s\", nơi lẽ ra phải là một toán hạng." #~ msgid "Coordinate expression had an operand where an operator was expected" #~ msgstr "Biểu thức tọa đổ có toán hạng nơi lẽ ra phải là toán tử." #~ msgid "Coordinate expression ended with an operator instead of an operand" #~ msgstr "" #~ "Biểu thức tọa độ kết thúc bằng toán tử trong khi lẽ ra phải là toán hạng." #~ msgid "" #~ "Coordinate expression has operator \"%c\" following operator \"%c\" with " #~ "no operand in between" #~ msgstr "" #~ "Biểu thức tọa độ có toán tử “%c” theo sau toán tử “%c” mà không có toán " #~ "hạng ở giữa." #~ msgid "Coordinate expression had unknown variable or constant \"%s\"" #~ msgstr "Biểu thức tọa độ có biến hoặc hằng lạ \"%s\"." #~ msgid "Coordinate expression parser overflowed its buffer." #~ msgstr "Bộ phân tích biểu thức tọa độ đã tràn bộ đệm." #~ msgid "" #~ "Coordinate expression had a close parenthesis with no open parenthesis" #~ msgstr "Biểu thức tọa độ có dấu đóng ngoặc mà thiếu dấu mở ngoặc." #~ msgid "" #~ "Coordinate expression had an open parenthesis with no close parenthesis" #~ msgstr "Biểu thức tọa độ có dấu mở ngoặc nhưng thiếu dấu đóng ngoặc." #~ msgid "Coordinate expression doesn't seem to have any operators or operands" #~ msgstr "Biểu thức tọa độ không có bất kỳ toán tử hay toán hạng nào." #~ msgid "Theme contained an expression that resulted in an error: %s\n" #~ msgstr "Chủ đề chứa một biểu thức gây ra lỗi: %s\n" #~ msgid "" #~ "